diff options
author | Martin Capitanio <capnm@capitanio.org> | 2023-10-13 13:09:33 +0200 |
---|---|---|
committer | Martin Capitanio <capnm@capitanio.org> | 2023-10-16 13:48:22 +0200 |
commit | 0983022e0c51557cc45a5b205c9055c64c44cf1e (patch) | |
tree | c646bbb5ddef1bc9aa8ef494c3f61056b75c648f /thirdparty/thorvg/src/renderer/sw_engine/tvgSwShape.cpp | |
parent | 1ab77f410e5a21dbedb019cdbf723470459e5dbe (diff) | |
download | redot-engine-0983022e0c51557cc45a5b205c9055c64c44cf1e.tar.gz |
ThorVG: Update to v0.11.1
https://github.com/thorvg/thorvg/releases/tag/v0.11.1
Godot related:
+ [SwEngine] Enhanced the quality of the dash line corners.
+ [SVG] Fixed a regression bug related to maskContentUnit,
userSpaceOnUse/objectBoundingBox.
Fixes #82982 icons.
Fixes #83198 svg ← png/jpg.
Diffstat (limited to 'thirdparty/thorvg/src/renderer/sw_engine/tvgSwShape.cpp')
-rw-r--r-- | thirdparty/thorvg/src/renderer/sw_engine/tvgSwShape.cpp | 58 |
1 files changed, 42 insertions, 16 deletions
diff --git a/thirdparty/thorvg/src/renderer/sw_engine/tvgSwShape.cpp b/thirdparty/thorvg/src/renderer/sw_engine/tvgSwShape.cpp index 159898c750..4f66cdacc0 100644 --- a/thirdparty/thorvg/src/renderer/sw_engine/tvgSwShape.cpp +++ b/thirdparty/thorvg/src/renderer/sw_engine/tvgSwShape.cpp @@ -121,7 +121,10 @@ static void _dashLineTo(SwDashStroke& dash, const Point* to, const Matrix* trans if (len < dash.curLen) { dash.curLen -= len; if (!dash.curOpGap) { - _outlineMoveTo(*dash.outline, &dash.ptCur, transform); + if (dash.move) { + _outlineMoveTo(*dash.outline, &dash.ptCur, transform); + dash.move = false; + } _outlineLineTo(*dash.outline, to, transform); } } else { @@ -131,7 +134,10 @@ static void _dashLineTo(SwDashStroke& dash, const Point* to, const Matrix* trans len -= dash.curLen; _lineSplitAt(cur, dash.curLen, left, right); if (!dash.curOpGap) { - _outlineMoveTo(*dash.outline, &left.pt1, transform); + if (dash.move || dash.pattern[dash.curIdx] - dash.curLen < FLT_EPSILON) { + _outlineMoveTo(*dash.outline, &left.pt1, transform); + dash.move = false; + } _outlineLineTo(*dash.outline, &left.pt2, transform); } } else { @@ -142,11 +148,15 @@ static void _dashLineTo(SwDashStroke& dash, const Point* to, const Matrix* trans dash.curOpGap = !dash.curOpGap; cur = right; dash.ptCur = cur.pt1; + dash.move = true; } //leftovers dash.curLen -= len; if (!dash.curOpGap) { - _outlineMoveTo(*dash.outline, &cur.pt1, transform); + if (dash.move) { + _outlineMoveTo(*dash.outline, &cur.pt1, transform); + dash.move = false; + } _outlineLineTo(*dash.outline, &cur.pt2, transform); } if (dash.curLen < 1 && TO_SWCOORD(len) > 1) { @@ -168,21 +178,22 @@ static void _dashCubicTo(SwDashStroke& dash, const Point* ctrl1, const Point* ct if (len < dash.curLen) { dash.curLen -= len; if (!dash.curOpGap) { - _outlineMoveTo(*dash.outline, &dash.ptCur, transform); + if (dash.move) { + _outlineMoveTo(*dash.outline, &dash.ptCur, transform); + dash.move = false; + } _outlineCubicTo(*dash.outline, ctrl1, ctrl2, to, transform); } } else { - bool begin = true; //starting with move_to while (len > dash.curLen) { Bezier left, right; if (dash.curLen > 0) { len -= dash.curLen; bezSplitAt(cur, dash.curLen, left, right); if (!dash.curOpGap) { - // leftovers from a previous command don't require moveTo - if (begin || dash.pattern[dash.curIdx] - dash.curLen < FLT_EPSILON) { + if (dash.move || dash.pattern[dash.curIdx] - dash.curLen < FLT_EPSILON) { _outlineMoveTo(*dash.outline, &left.start, transform); - begin = false; + dash.move = false; } _outlineCubicTo(*dash.outline, &left.ctrl1, &left.ctrl2, &left.end, transform); } @@ -194,11 +205,15 @@ static void _dashCubicTo(SwDashStroke& dash, const Point* ctrl1, const Point* ct dash.curOpGap = !dash.curOpGap; cur = right; dash.ptCur = right.start; + dash.move = true; } //leftovers dash.curLen -= len; if (!dash.curOpGap) { - _outlineMoveTo(*dash.outline, &cur.start, transform); + if (dash.move) { + _outlineMoveTo(*dash.outline, &cur.start, transform); + dash.move = false; + } _outlineCubicTo(*dash.outline, &cur.ctrl1, &cur.ctrl2, &cur.end, transform); } if (dash.curLen < 1 && TO_SWCOORD(len) > 1) { @@ -212,6 +227,22 @@ static void _dashCubicTo(SwDashStroke& dash, const Point* ctrl1, const Point* ct } +static void _dashClose(SwDashStroke& dash, const Matrix* transform) +{ + _dashLineTo(dash, &dash.ptStart, transform); +} + + +static void _dashMoveTo(SwDashStroke& dash, uint32_t offIdx, float offset, const Point* pts, const Matrix* transform) +{ + dash.curIdx = offIdx % dash.cnt; + dash.curLen = dash.pattern[dash.curIdx] - offset; + dash.curOpGap = offIdx % 2; + dash.ptStart = dash.ptCur = *pts; + dash.move = true; +} + + static SwOutline* _genDashOutline(const RenderShape* rshape, const Matrix* transform, float length, SwMpool* mpool, unsigned tid) { const PathCommand* cmds = rshape->path.cmds.data; @@ -261,7 +292,6 @@ static SwOutline* _genDashOutline(const RenderShape* rshape, const Matrix* trans trimmed = true; //just a dasy style. } else { - if (dash.cnt == 0) return nullptr; } @@ -303,15 +333,11 @@ static SwOutline* _genDashOutline(const RenderShape* rshape, const Matrix* trans while (cmdCnt-- > 0) { switch (*cmds) { case PathCommand::Close: { - _dashLineTo(dash, &dash.ptStart, transform); + _dashClose(dash, transform); break; } case PathCommand::MoveTo: { - //reset the dash - dash.curIdx = offIdx % dash.cnt; - dash.curLen = dash.pattern[dash.curIdx] - offset; - dash.curOpGap = offIdx % 2; - dash.ptStart = dash.ptCur = *pts; + _dashMoveTo(dash, offIdx, offset, pts, transform); ++pts; break; } |