mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-14 12:04:29 +00:00
loader/lottie: code refactoring
moved clipping logic to the coherent precomp method.
This commit is contained in:
parent
42d7a5faed
commit
81599a14a0
1 changed files with 24 additions and 24 deletions
|
@ -724,6 +724,18 @@ static void _updatePrecomp(LottieLayer* precomp, int32_t frameNo)
|
|||
for (auto child = precomp->children.end() - 1; child >= precomp->children.data; --child) {
|
||||
_updateLayer(precomp, static_cast<LottieLayer*>(*child), frameNo);
|
||||
}
|
||||
|
||||
//clip the layer viewport
|
||||
if (precomp->w > 0 && precomp->h > 0) {
|
||||
//TODO: remove the intermediate scene....
|
||||
auto cscene = Scene::gen();
|
||||
auto clipper = Shape::gen();
|
||||
clipper->appendRect(0, 0, precomp->w, precomp->h);
|
||||
clipper->transform(precomp->cache.matrix);
|
||||
cscene->composite(std::move(clipper), CompositeMethod::ClipPath);
|
||||
cscene->push(cast<Scene>(precomp->scene));
|
||||
precomp->scene = cscene.release();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -798,6 +810,18 @@ static void _updateLayer(LottieLayer* root, LottieLayer* layer, int32_t frameNo)
|
|||
|
||||
layer->scene->transform(layer->cache.matrix);
|
||||
|
||||
if (layer->matte.target && layer->masks.count > 0) {
|
||||
TVGERR("LOTTIE", "FIXME: Matte + Masking??");
|
||||
}
|
||||
|
||||
//matte masking layer
|
||||
if (layer->matte.target) {
|
||||
_updateLayer(root, layer->matte.target, frameNo);
|
||||
if (layer->matte.target->scene) layer->scene->composite(cast<Scene>(layer->matte.target->scene), layer->matte.type);
|
||||
}
|
||||
|
||||
_updateMaskings(layer, frameNo);
|
||||
|
||||
switch (layer->type) {
|
||||
case LottieLayer::Precomp: {
|
||||
_updatePrecomp(layer, frameNo);
|
||||
|
@ -814,30 +838,6 @@ static void _updateLayer(LottieLayer* root, LottieLayer* layer, int32_t frameNo)
|
|||
}
|
||||
}
|
||||
|
||||
if (layer->matte.target && layer->masks.count > 0) {
|
||||
TVGERR("LOTTIE", "FIXME: Matte + Masking??");
|
||||
}
|
||||
|
||||
//matte masking layer
|
||||
if (layer->matte.target) {
|
||||
_updateLayer(root, layer->matte.target, frameNo);
|
||||
if (layer->matte.target->scene) layer->scene->composite(cast<Scene>(layer->matte.target->scene), layer->matte.type);
|
||||
}
|
||||
|
||||
_updateMaskings(layer, frameNo);
|
||||
|
||||
//clip the layer viewport
|
||||
if (layer->refId && layer->w > 0 && layer->h > 0) {
|
||||
//TODO: remove the intermediate scene....
|
||||
auto cscene = Scene::gen();
|
||||
auto clipper = Shape::gen();
|
||||
clipper->appendRect(0, 0, layer->w, layer->h);
|
||||
clipper->transform(layer->cache.matrix);
|
||||
cscene->composite(std::move(clipper), CompositeMethod::ClipPath);
|
||||
cscene->push(cast<Scene>(layer->scene));
|
||||
layer->scene = cscene.release();
|
||||
}
|
||||
|
||||
//the given matte source was composited by the target earlier.
|
||||
if (!layer->matteSrc) root->scene->push(cast<Scene>(layer->scene));
|
||||
}
|
||||
|
|
Loading…
Add table
Reference in a new issue