mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-07 21:23:32 +00:00
sw_engine: support trimmed fill
Until now, only stroke trimming was possible, but the Lottie standard requires support for trimming both (if present), stroke and fill. This commit changes the API behavior. @Issue: https://github.com/thorvg/thorvg/issues/3118
This commit is contained in:
parent
b939a60bfa
commit
c4747e6802
2 changed files with 8 additions and 14 deletions
|
@ -288,7 +288,7 @@ struct SwMpool
|
||||||
{
|
{
|
||||||
SwOutline* outline;
|
SwOutline* outline;
|
||||||
SwOutline* strokeOutline;
|
SwOutline* strokeOutline;
|
||||||
SwOutline* dashOutline; //Trimming treated as a special case of dashing
|
SwOutline* dashOutline;
|
||||||
unsigned allocSize;
|
unsigned allocSize;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -374,7 +374,7 @@ static SwOutline* _genOutline(SwShape* shape, const RenderShape* rshape, const M
|
||||||
//No actual shape data
|
//No actual shape data
|
||||||
if (cmdCnt == 0 || ptsCnt == 0) return nullptr;
|
if (cmdCnt == 0 || ptsCnt == 0) return nullptr;
|
||||||
|
|
||||||
auto outline = trimmed ? mpoolReqDashOutline(mpool, tid) : mpoolReqOutline(mpool, tid);
|
auto outline = mpoolReqOutline(mpool, tid);
|
||||||
auto closed = false;
|
auto closed = false;
|
||||||
|
|
||||||
//Generate Outlines
|
//Generate Outlines
|
||||||
|
@ -412,7 +412,7 @@ static SwOutline* _genOutline(SwShape* shape, const RenderShape* rshape, const M
|
||||||
tvg::free(trimmedCmds);
|
tvg::free(trimmedCmds);
|
||||||
tvg::free(trimmedPts);
|
tvg::free(trimmedPts);
|
||||||
|
|
||||||
if (!trimmed) shape->fastTrack = (!hasComposite && _axisAlignedRect(outline));
|
shape->fastTrack = (!hasComposite && _axisAlignedRect(outline));
|
||||||
return outline;
|
return outline;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -421,9 +421,9 @@ static SwOutline* _genOutline(SwShape* shape, const RenderShape* rshape, const M
|
||||||
/* External Class Implementation */
|
/* External Class Implementation */
|
||||||
/************************************************************************/
|
/************************************************************************/
|
||||||
|
|
||||||
bool shapePrepare(SwShape* shape, const RenderShape* rshape, const Matrix& transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid, bool hasComposite)
|
bool shapePrepare(SwShape* shape, const RenderShape* rshape, const Matrix& transform, const SwBBox& clipRegion, SwBBox& renderRegion, SwMpool* mpool, unsigned tid, bool hasComposite)
|
||||||
{
|
{
|
||||||
if (auto out = _genOutline(shape, rshape, transform, mpool, tid, hasComposite)) shape->outline = out;
|
if (auto out = _genOutline(shape, rshape, transform, mpool, tid, hasComposite, rshape->trimpath())) shape->outline = out;
|
||||||
else return false;
|
else return false;
|
||||||
if (!mathUpdateOutlineBBox(shape->outline, clipRegion, renderRegion, shape->fastTrack)) return false;
|
if (!mathUpdateOutlineBBox(shape->outline, clipRegion, renderRegion, shape->fastTrack)) return false;
|
||||||
|
|
||||||
|
@ -510,20 +510,14 @@ bool shapeGenStrokeRle(SwShape* shape, const RenderShape* rshape, const Matrix&
|
||||||
auto ret = true;
|
auto ret = true;
|
||||||
|
|
||||||
//Dash style with/without trimming
|
//Dash style with/without trimming
|
||||||
auto trimmed = rshape->trimpath();
|
|
||||||
if (rshape->stroke->dashCnt > 0) {
|
if (rshape->stroke->dashCnt > 0) {
|
||||||
shapeOutline = _genDashOutline(rshape, transform, mpool, tid, trimmed);
|
shapeOutline = _genDashOutline(rshape, transform, mpool, tid, rshape->trimpath());
|
||||||
if (!shapeOutline) return false;
|
if (!shapeOutline) return false;
|
||||||
dashStroking = true;
|
dashStroking = true;
|
||||||
//Trimming
|
//Trimming & Normal style
|
||||||
} else if (trimmed) {
|
|
||||||
shapeOutline = _genOutline(shape, rshape, transform, mpool, tid, false, true);
|
|
||||||
if (!shapeOutline) return false;
|
|
||||||
dashStroking = true;
|
|
||||||
//Normal style
|
|
||||||
} else {
|
} else {
|
||||||
if (!shape->outline) {
|
if (!shape->outline) {
|
||||||
if (auto out = _genOutline(shape, rshape, transform, mpool, tid, false)) shape->outline = out;
|
if (auto out = _genOutline(shape, rshape, transform, mpool, tid, false, rshape->trimpath())) shape->outline = out;
|
||||||
else return false;
|
else return false;
|
||||||
}
|
}
|
||||||
shapeOutline = shape->outline;
|
shapeOutline = shape->outline;
|
||||||
|
|
Loading…
Add table
Reference in a new issue