loader/lottie: code refactoring

moved clipping logic to the coherent precomp method.
This commit is contained in:
Hermet Park 2023-09-15 18:18:52 +09:00 committed by Hermet Park
parent 42d7a5faed
commit 81599a14a0

View file

@ -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));
}