mirror of
https://github.com/thorvg/thorvg.git
synced 2025-06-08 13:43:43 +00:00
lottie: try packing data compactly.
This commit is contained in:
parent
71e3124469
commit
1823305ea3
4 changed files with 19 additions and 23 deletions
|
@ -1191,14 +1191,14 @@ static void _updateMaskings(LottieLayer* layer, float frameNo, LottieExpressions
|
||||||
|
|
||||||
static bool _updateMatte(LottieLayer* root, LottieLayer* layer, float frameNo, LottieExpressions* exps)
|
static bool _updateMatte(LottieLayer* root, LottieLayer* layer, float frameNo, LottieExpressions* exps)
|
||||||
{
|
{
|
||||||
auto target = layer->matte.target;
|
auto target = layer->matteTarget;
|
||||||
if (!target) return true;
|
if (!target) return true;
|
||||||
|
|
||||||
_updateLayer(root, target, frameNo, exps);
|
_updateLayer(root, target, frameNo, exps);
|
||||||
|
|
||||||
if (target->scene) {
|
if (target->scene) {
|
||||||
layer->scene->composite(cast(target->scene), layer->matte.type);
|
layer->scene->composite(cast(target->scene), layer->matteType);
|
||||||
} else if (layer->matte.type == CompositeMethod::AlphaMask || layer->matte.type == CompositeMethod::LumaMask) {
|
} else if (layer->matteType == CompositeMethod::AlphaMask || layer->matteType == CompositeMethod::LumaMask) {
|
||||||
//matte target is not exist. alpha blending definitely bring an invisible result
|
//matte target is not exist. alpha blending definitely bring an invisible result
|
||||||
delete(layer->scene);
|
delete(layer->scene);
|
||||||
layer->scene = nullptr;
|
layer->scene = nullptr;
|
||||||
|
@ -1228,7 +1228,7 @@ static void _updateLayer(LottieLayer* root, LottieLayer* layer, float frameNo, L
|
||||||
|
|
||||||
layer->scene->transform(layer->cache.matrix);
|
layer->scene->transform(layer->cache.matrix);
|
||||||
|
|
||||||
if (layer->matte.target && layer->masks.count > 0) TVGERR("LOTTIE", "FIXME: Matte + Masking??");
|
if (layer->matteTarget && layer->masks.count > 0) TVGERR("LOTTIE", "FIXME: Matte + Masking??");
|
||||||
|
|
||||||
if (!_updateMatte(root, layer, frameNo, exps)) return;
|
if (!_updateMatte(root, layer, frameNo, exps)) return;
|
||||||
|
|
||||||
|
@ -1283,8 +1283,8 @@ static void _bulidHierarchy(LottieGroup* parent, LottieLayer* child)
|
||||||
{
|
{
|
||||||
if (child->pidx == -1) return;
|
if (child->pidx == -1) return;
|
||||||
|
|
||||||
if (child->matte.target && child->pidx == child->matte.target->idx) {
|
if (child->matteTarget && child->pidx == child->matteTarget->idx) {
|
||||||
child->parent = child->matte.target;
|
child->parent = child->matteTarget;
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1295,8 +1295,8 @@ static void _bulidHierarchy(LottieGroup* parent, LottieLayer* child)
|
||||||
child->parent = parent;
|
child->parent = parent;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
if (parent->matte.target && parent->matte.target->idx == child->pidx) {
|
if (parent->matteTarget && parent->matteTarget->idx == child->pidx) {
|
||||||
child->parent = parent->matte.target;
|
child->parent = parent->matteTarget;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1335,25 +1335,25 @@ static bool _buildComposition(LottieComposition* comp, LottieGroup* parent)
|
||||||
//attach the precomp layer.
|
//attach the precomp layer.
|
||||||
if (child->rid) _buildReference(comp, child);
|
if (child->rid) _buildReference(comp, child);
|
||||||
|
|
||||||
if (child->matte.type != CompositeMethod::None) {
|
if (child->matteType != CompositeMethod::None) {
|
||||||
//no index of the matte layer is provided: the layer above is used as the matte source
|
//no index of the matte layer is provided: the layer above is used as the matte source
|
||||||
if (child->mid == -1) {
|
if (child->mid == -1) {
|
||||||
if (c > parent->children.begin()) {
|
if (c > parent->children.begin()) {
|
||||||
child->matte.target = static_cast<LottieLayer*>(*(c - 1));
|
child->matteTarget = static_cast<LottieLayer*>(*(c - 1));
|
||||||
}
|
}
|
||||||
//matte layer is specified by an index.
|
//matte layer is specified by an index.
|
||||||
} else {
|
} else {
|
||||||
if (auto matte = comp->layer(child->mid)) {
|
if (auto matte = comp->layerByIdx(child->mid)) {
|
||||||
child->matte.target = matte;
|
child->matteTarget = matte;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (child->matte.target) {
|
if (child->matteTarget) {
|
||||||
//parenting
|
//parenting
|
||||||
_bulidHierarchy(parent, child->matte.target);
|
_bulidHierarchy(parent, child->matteTarget);
|
||||||
//precomp referencing
|
//precomp referencing
|
||||||
if (child->matte.target->rid) _buildReference(comp, child->matte.target);
|
if (child->matteTarget->rid) _buildReference(comp, child->matteTarget);
|
||||||
}
|
}
|
||||||
_bulidHierarchy(parent, child);
|
_bulidHierarchy(parent, child);
|
||||||
|
|
||||||
|
|
|
@ -351,7 +351,6 @@ LottieLayer::~LottieLayer()
|
||||||
delete(*m);
|
delete(*m);
|
||||||
}
|
}
|
||||||
|
|
||||||
matte.target = nullptr;
|
|
||||||
delete(transform);
|
delete(transform);
|
||||||
free(name);
|
free(name);
|
||||||
}
|
}
|
||||||
|
|
|
@ -541,19 +541,14 @@ struct LottieLayer : LottieGroup
|
||||||
void prepare();
|
void prepare();
|
||||||
float remap(float frameNo, LottieExpressions* exp);
|
float remap(float frameNo, LottieExpressions* exp);
|
||||||
|
|
||||||
struct {
|
|
||||||
CompositeMethod type = CompositeMethod::None;
|
|
||||||
LottieLayer* target = nullptr;
|
|
||||||
} matte;
|
|
||||||
|
|
||||||
char* name = nullptr;
|
char* name = nullptr;
|
||||||
BlendMethod blendMethod = BlendMethod::Normal;
|
|
||||||
LottieLayer* parent = nullptr;
|
LottieLayer* parent = nullptr;
|
||||||
LottieFloat timeRemap = 0.0f;
|
LottieFloat timeRemap = 0.0f;
|
||||||
LottieComposition* comp = nullptr;
|
LottieComposition* comp = nullptr;
|
||||||
LottieTransform* transform = nullptr;
|
LottieTransform* transform = nullptr;
|
||||||
Array<LottieMask*> masks;
|
Array<LottieMask*> masks;
|
||||||
RGB24 color; //used by Solid layer
|
RGB24 color; //used by Solid layer
|
||||||
|
LottieLayer* matteTarget = nullptr;
|
||||||
|
|
||||||
float timeStretch = 1.0f;
|
float timeStretch = 1.0f;
|
||||||
float w = 0.0f, h = 0.0f;
|
float w = 0.0f, h = 0.0f;
|
||||||
|
@ -571,6 +566,8 @@ struct LottieLayer : LottieGroup
|
||||||
uint8_t opacity;
|
uint8_t opacity;
|
||||||
} cache;
|
} cache;
|
||||||
|
|
||||||
|
CompositeMethod matteType = CompositeMethod::None;
|
||||||
|
BlendMethod blendMethod = BlendMethod::Normal;
|
||||||
Type type = Null;
|
Type type = Null;
|
||||||
bool autoOrient = false;
|
bool autoOrient = false;
|
||||||
bool matteSrc = false;
|
bool matteSrc = false;
|
||||||
|
|
|
@ -1216,7 +1216,7 @@ LottieLayer* LottieParser::parseLayer()
|
||||||
else if (KEY_AS("w") || KEY_AS("sw")) getLayerSize(layer->w);
|
else if (KEY_AS("w") || KEY_AS("sw")) getLayerSize(layer->w);
|
||||||
else if (KEY_AS("h") || KEY_AS("sh")) getLayerSize(layer->h);
|
else if (KEY_AS("h") || KEY_AS("sh")) getLayerSize(layer->h);
|
||||||
else if (KEY_AS("sc")) layer->color = getColor(getString());
|
else if (KEY_AS("sc")) layer->color = getColor(getString());
|
||||||
else if (KEY_AS("tt")) layer->matte.type = getMatteType();
|
else if (KEY_AS("tt")) layer->matteType = getMatteType();
|
||||||
else if (KEY_AS("tp")) layer->mid = getInt();
|
else if (KEY_AS("tp")) layer->mid = getInt();
|
||||||
else if (KEY_AS("masksProperties")) parseMasks(layer);
|
else if (KEY_AS("masksProperties")) parseMasks(layer);
|
||||||
else if (KEY_AS("hd")) layer->hidden = getBool();
|
else if (KEY_AS("hd")) layer->hidden = getBool();
|
||||||
|
|
Loading…
Add table
Reference in a new issue