lottie: code refactoring & size reduction

- introduced a pasing logic for duplicates.
- renamed internal varaible, no logical changes.
- removed null checks after memory alloc fails.
- reduced 1kb size.
This commit is contained in:
Hermet Park 2024-05-30 00:03:47 +09:00
parent d319765bc7
commit 53818b41f2
5 changed files with 43 additions and 65 deletions

View file

@ -1281,9 +1281,9 @@ static void _buildReference(LottieComposition* comp, LottieLayer* layer)
static void _bulidHierarchy(LottieGroup* parent, LottieLayer* child) static void _bulidHierarchy(LottieGroup* parent, LottieLayer* child)
{ {
if (child->pid == -1) return; if (child->pidx == -1) return;
if (child->matte.target && child->pid == child->matte.target->id) { if (child->matte.target && child->pidx == child->matte.target->idx) {
child->parent = child->matte.target; child->parent = child->matte.target;
return; return;
} }
@ -1291,11 +1291,11 @@ static void _bulidHierarchy(LottieGroup* parent, LottieLayer* child)
for (auto p = parent->children.begin(); p < parent->children.end(); ++p) { for (auto p = parent->children.begin(); p < parent->children.end(); ++p) {
auto parent = static_cast<LottieLayer*>(*p); auto parent = static_cast<LottieLayer*>(*p);
if (child == parent) continue; if (child == parent) continue;
if (child->pid == parent->id) { if (child->pidx == parent->idx) {
child->parent = parent; child->parent = parent;
break; break;
} }
if (parent->matte.target && parent->matte.target->id == child->pid) { if (parent->matte.target && parent->matte.target->idx == child->pidx) {
child->parent = parent->matte.target; child->parent = parent->matte.target;
break; break;
} }

View file

@ -130,7 +130,7 @@ static void _buildLayer(jerry_value_t context, LottieLayer* layer, LottieComposi
jerry_object_set_sz(context, EXP_HEIGHT, height); jerry_object_set_sz(context, EXP_HEIGHT, height);
jerry_value_free(height); jerry_value_free(height);
auto index = jerry_number(layer->id); auto index = jerry_number(layer->idx);
jerry_object_set_sz(context, EXP_INDEX, index); jerry_object_set_sz(context, EXP_INDEX, index);
jerry_value_free(index); jerry_value_free(index);

View file

@ -562,8 +562,8 @@ struct LottieLayer : LottieGroup
float startFrame = 0.0f; float startFrame = 0.0f;
char* refId = nullptr; //pre-composition reference. char* refId = nullptr; //pre-composition reference.
int16_t mid = -1; //id of the matte layer. int16_t mid = -1; //id of the matte layer.
int16_t pid = -1; //id of the parent layer. int16_t pidx = -1; //index of the parent layer.
int16_t id = -1; //id of the current layer. int16_t idx = -1; //index of the current layer.
//cached data //cached data
struct { struct {
@ -644,11 +644,11 @@ struct LottieComposition
return nullptr; return nullptr;
} }
LottieLayer* layer(int16_t id) LottieLayer* layer(int16_t idx)
{ {
for (auto child = root->children.begin(); child < root->children.end(); ++child) { for (auto child = root->children.begin(); child < root->children.end(); ++child) {
auto layer = static_cast<LottieLayer*>(*child); auto layer = static_cast<LottieLayer*>(*child);
if (layer->id == id) return layer; if (layer->idx == idx) return layer;
} }
return nullptr; return nullptr;
} }

View file

@ -512,19 +512,29 @@ void LottieParser::parseProperty(T& prop, LottieObject* obj)
} }
bool LottieParser::parseCommon(LottieObject* obj, const char* key)
{
if (KEY_AS("nm")) {
obj->name = getStringCopy();
return true;
} else if (KEY_AS("hd")) {
obj->hidden = getBool();
return true;
} else return false;
}
LottieRect* LottieParser::parseRect() LottieRect* LottieParser::parseRect()
{ {
auto rect = new LottieRect; auto rect = new LottieRect;
if (!rect) return nullptr;
context.parent = rect; context.parent = rect;
while (auto key = nextObjectKey()) { while (auto key = nextObjectKey()) {
if (KEY_AS("s")) parseProperty<LottieProperty::Type::Point>(rect->size); if (parseCommon(rect, key)) continue;
else if (KEY_AS("s")) parseProperty<LottieProperty::Type::Point>(rect->size);
else if (KEY_AS("p"))parseProperty<LottieProperty::Type::Position>(rect->position); else if (KEY_AS("p"))parseProperty<LottieProperty::Type::Position>(rect->position);
else if (KEY_AS("r")) parseProperty<LottieProperty::Type::Float>(rect->radius); else if (KEY_AS("r")) parseProperty<LottieProperty::Type::Float>(rect->radius);
else if (KEY_AS("nm")) rect->name = getStringCopy();
else if (KEY_AS("hd")) rect->hidden = getBool();
else skip(key); else skip(key);
} }
rect->prepare(); rect->prepare();
@ -535,15 +545,13 @@ LottieRect* LottieParser::parseRect()
LottieEllipse* LottieParser::parseEllipse() LottieEllipse* LottieParser::parseEllipse()
{ {
auto ellipse = new LottieEllipse; auto ellipse = new LottieEllipse;
if (!ellipse) return nullptr;
context.parent = ellipse; context.parent = ellipse;
while (auto key = nextObjectKey()) { while (auto key = nextObjectKey()) {
if (KEY_AS("nm")) ellipse->name = getStringCopy(); if (parseCommon(ellipse, key)) continue;
else if (KEY_AS("p")) parseProperty<LottieProperty::Type::Position>(ellipse->position); else if (KEY_AS("p")) parseProperty<LottieProperty::Type::Position>(ellipse->position);
else if (KEY_AS("s")) parseProperty<LottieProperty::Type::Point>(ellipse->size); else if (KEY_AS("s")) parseProperty<LottieProperty::Type::Point>(ellipse->size);
else if (KEY_AS("hd")) ellipse->hidden = getBool();
else skip(key); else skip(key);
} }
ellipse->prepare(); ellipse->prepare();
@ -554,7 +562,6 @@ LottieEllipse* LottieParser::parseEllipse()
LottieTransform* LottieParser::parseTransform(bool ddd) LottieTransform* LottieParser::parseTransform(bool ddd)
{ {
auto transform = new LottieTransform; auto transform = new LottieTransform;
if (!transform) return nullptr;
context.parent = transform; context.parent = transform;
@ -564,7 +571,8 @@ LottieTransform* LottieParser::parseTransform(bool ddd)
} }
while (auto key = nextObjectKey()) { while (auto key = nextObjectKey()) {
if (KEY_AS("p")) if (parseCommon(transform, key)) continue;
else if (KEY_AS("p"))
{ {
enterObject(); enterObject();
while (auto key = nextObjectKey()) { while (auto key = nextObjectKey()) {
@ -584,7 +592,6 @@ LottieTransform* LottieParser::parseTransform(bool ddd)
else if (transform->rotationEx && KEY_AS("rx")) parseProperty<LottieProperty::Type::Float>(transform->rotationEx->x); else if (transform->rotationEx && KEY_AS("rx")) parseProperty<LottieProperty::Type::Float>(transform->rotationEx->x);
else if (transform->rotationEx && KEY_AS("ry")) parseProperty<LottieProperty::Type::Float>(transform->rotationEx->y); else if (transform->rotationEx && KEY_AS("ry")) parseProperty<LottieProperty::Type::Float>(transform->rotationEx->y);
else if (transform->rotationEx && KEY_AS("rz")) parseProperty<LottieProperty::Type::Float>(transform->rotation); else if (transform->rotationEx && KEY_AS("rz")) parseProperty<LottieProperty::Type::Float>(transform->rotation);
else if (KEY_AS("nm")) transform->name = getStringCopy();
else if (KEY_AS("sk")) parseProperty<LottieProperty::Type::Float>(transform->skewAngle); else if (KEY_AS("sk")) parseProperty<LottieProperty::Type::Float>(transform->skewAngle);
else if (KEY_AS("sa")) parseProperty<LottieProperty::Type::Float>(transform->skewAxis); else if (KEY_AS("sa")) parseProperty<LottieProperty::Type::Float>(transform->skewAxis);
else skip(key); else skip(key);
@ -597,17 +604,15 @@ LottieTransform* LottieParser::parseTransform(bool ddd)
LottieSolidFill* LottieParser::parseSolidFill() LottieSolidFill* LottieParser::parseSolidFill()
{ {
auto fill = new LottieSolidFill; auto fill = new LottieSolidFill;
if (!fill) return nullptr;
context.parent = fill; context.parent = fill;
while (auto key = nextObjectKey()) { while (auto key = nextObjectKey()) {
if (KEY_AS("nm")) fill->name = getStringCopy(); if (parseCommon(fill, key)) continue;
else if (KEY_AS("c")) parseProperty<LottieProperty::Type::Color>(fill->color, fill); else if (KEY_AS("c")) parseProperty<LottieProperty::Type::Color>(fill->color, fill);
else if (KEY_AS("o")) parseProperty<LottieProperty::Type::Opacity>(fill->opacity, fill); else if (KEY_AS("o")) parseProperty<LottieProperty::Type::Opacity>(fill->opacity, fill);
else if (KEY_AS("fillEnabled")) fill->hidden |= !getBool(); else if (KEY_AS("fillEnabled")) fill->hidden |= !getBool();
else if (KEY_AS("r")) fill->rule = getFillRule(); else if (KEY_AS("r")) fill->rule = getFillRule();
else if (KEY_AS("hd")) fill->hidden = getBool();
else skip(key); else skip(key);
} }
fill->prepare(); fill->prepare();
@ -638,19 +643,17 @@ void LottieParser::parseStrokeDash(LottieStroke* stroke)
LottieSolidStroke* LottieParser::parseSolidStroke() LottieSolidStroke* LottieParser::parseSolidStroke()
{ {
auto stroke = new LottieSolidStroke; auto stroke = new LottieSolidStroke;
if (!stroke) return nullptr;
context.parent = stroke; context.parent = stroke;
while (auto key = nextObjectKey()) { while (auto key = nextObjectKey()) {
if (KEY_AS("c")) parseProperty<LottieProperty::Type::Color>(stroke->color, stroke); if (parseCommon(stroke, key)) continue;
else if (KEY_AS("c")) parseProperty<LottieProperty::Type::Color>(stroke->color, stroke);
else if (KEY_AS("o")) parseProperty<LottieProperty::Type::Opacity>(stroke->opacity, stroke); else if (KEY_AS("o")) parseProperty<LottieProperty::Type::Opacity>(stroke->opacity, stroke);
else if (KEY_AS("w")) parseProperty<LottieProperty::Type::Float>(stroke->width, stroke); else if (KEY_AS("w")) parseProperty<LottieProperty::Type::Float>(stroke->width, stroke);
else if (KEY_AS("lc")) stroke->cap = getStrokeCap(); else if (KEY_AS("lc")) stroke->cap = getStrokeCap();
else if (KEY_AS("lj")) stroke->join = getStrokeJoin(); else if (KEY_AS("lj")) stroke->join = getStrokeJoin();
else if (KEY_AS("ml")) stroke->miterLimit = getFloat(); else if (KEY_AS("ml")) stroke->miterLimit = getFloat();
else if (KEY_AS("nm")) stroke->name = getStringCopy();
else if (KEY_AS("hd")) stroke->hidden = getBool();
else if (KEY_AS("fillEnabled")) stroke->hidden |= !getBool(); else if (KEY_AS("fillEnabled")) stroke->hidden |= !getBool();
else if (KEY_AS("d")) parseStrokeDash(stroke); else if (KEY_AS("d")) parseStrokeDash(stroke);
else skip(key); else skip(key);
@ -681,12 +684,10 @@ void LottieParser::getPathSet(LottiePathSet& path)
LottiePath* LottieParser::parsePath() LottiePath* LottieParser::parsePath()
{ {
auto path = new LottiePath; auto path = new LottiePath;
if (!path) return nullptr;
while (auto key = nextObjectKey()) { while (auto key = nextObjectKey()) {
if (KEY_AS("nm")) path->name = getStringCopy(); if (parseCommon(path, key)) continue;
else if (KEY_AS("ks")) getPathSet(path->pathset); else if (KEY_AS("ks")) getPathSet(path->pathset);
else if (KEY_AS("hd")) path->hidden = getBool();
else skip(key); else skip(key);
} }
path->prepare(); path->prepare();
@ -697,12 +698,11 @@ LottiePath* LottieParser::parsePath()
LottiePolyStar* LottieParser::parsePolyStar() LottiePolyStar* LottieParser::parsePolyStar()
{ {
auto star = new LottiePolyStar; auto star = new LottiePolyStar;
if (!star) return nullptr;
context.parent = star; context.parent = star;
while (auto key = nextObjectKey()) { while (auto key = nextObjectKey()) {
if (KEY_AS("nm")) star->name = getStringCopy(); if (parseCommon(star, key)) continue;
else if (KEY_AS("p")) parseProperty<LottieProperty::Type::Position>(star->position); else if (KEY_AS("p")) parseProperty<LottieProperty::Type::Position>(star->position);
else if (KEY_AS("pt")) parseProperty<LottieProperty::Type::Float>(star->ptsCnt); else if (KEY_AS("pt")) parseProperty<LottieProperty::Type::Float>(star->ptsCnt);
else if (KEY_AS("ir")) parseProperty<LottieProperty::Type::Float>(star->innerRadius); else if (KEY_AS("ir")) parseProperty<LottieProperty::Type::Float>(star->innerRadius);
@ -711,7 +711,6 @@ LottiePolyStar* LottieParser::parsePolyStar()
else if (KEY_AS("os")) parseProperty<LottieProperty::Type::Float>(star->outerRoundness); else if (KEY_AS("os")) parseProperty<LottieProperty::Type::Float>(star->outerRoundness);
else if (KEY_AS("r")) parseProperty<LottieProperty::Type::Float>(star->rotation); else if (KEY_AS("r")) parseProperty<LottieProperty::Type::Float>(star->rotation);
else if (KEY_AS("sy")) star->type = (LottiePolyStar::Type) getInt(); else if (KEY_AS("sy")) star->type = (LottiePolyStar::Type) getInt();
else if (KEY_AS("hd")) star->hidden = getBool();
else skip(key); else skip(key);
} }
star->prepare(); star->prepare();
@ -722,14 +721,12 @@ LottiePolyStar* LottieParser::parsePolyStar()
LottieRoundedCorner* LottieParser::parseRoundedCorner() LottieRoundedCorner* LottieParser::parseRoundedCorner()
{ {
auto corner = new LottieRoundedCorner; auto corner = new LottieRoundedCorner;
if (!corner) return nullptr;
context.parent = corner; context.parent = corner;
while (auto key = nextObjectKey()) { while (auto key = nextObjectKey()) {
if (KEY_AS("nm")) corner->name = getStringCopy(); if (parseCommon(corner, key)) continue;
else if (KEY_AS("r")) parseProperty<LottieProperty::Type::Float>(corner->radius); else if (KEY_AS("r")) parseProperty<LottieProperty::Type::Float>(corner->radius);
else if (KEY_AS("hd")) corner->hidden = getBool();
else skip(key); else skip(key);
} }
corner->prepare(); corner->prepare();
@ -761,14 +758,12 @@ void LottieParser::parseGradient(LottieGradient* gradient, const char* key)
LottieGradientFill* LottieParser::parseGradientFill() LottieGradientFill* LottieParser::parseGradientFill()
{ {
auto fill = new LottieGradientFill; auto fill = new LottieGradientFill;
if (!fill) return nullptr;
context.parent = fill; context.parent = fill;
while (auto key = nextObjectKey()) { while (auto key = nextObjectKey()) {
if (KEY_AS("nm")) fill->name = getStringCopy(); if (parseCommon(fill, key)) continue;
else if (KEY_AS("r")) fill->rule = getFillRule(); else if (KEY_AS("r")) fill->rule = getFillRule();
else if (KEY_AS("hd")) fill->hidden = getBool();
else parseGradient(fill, key); else parseGradient(fill, key);
} }
@ -781,16 +776,14 @@ LottieGradientFill* LottieParser::parseGradientFill()
LottieGradientStroke* LottieParser::parseGradientStroke() LottieGradientStroke* LottieParser::parseGradientStroke()
{ {
auto stroke = new LottieGradientStroke; auto stroke = new LottieGradientStroke;
if (!stroke) return nullptr;
context.parent = stroke; context.parent = stroke;
while (auto key = nextObjectKey()) { while (auto key = nextObjectKey()) {
if (KEY_AS("nm")) stroke->name = getStringCopy(); if (parseCommon(stroke, key)) continue;
else if (KEY_AS("lc")) stroke->cap = getStrokeCap(); else if (KEY_AS("lc")) stroke->cap = getStrokeCap();
else if (KEY_AS("lj")) stroke->join = getStrokeJoin(); else if (KEY_AS("lj")) stroke->join = getStrokeJoin();
else if (KEY_AS("ml")) stroke->miterLimit = getFloat(); else if (KEY_AS("ml")) stroke->miterLimit = getFloat();
else if (KEY_AS("hd")) stroke->hidden = getBool();
else if (KEY_AS("w")) parseProperty<LottieProperty::Type::Float>(stroke->width); else if (KEY_AS("w")) parseProperty<LottieProperty::Type::Float>(stroke->width);
else if (KEY_AS("d")) parseStrokeDash(stroke); else if (KEY_AS("d")) parseStrokeDash(stroke);
else parseGradient(stroke, key); else parseGradient(stroke, key);
@ -804,17 +797,15 @@ LottieGradientStroke* LottieParser::parseGradientStroke()
LottieTrimpath* LottieParser::parseTrimpath() LottieTrimpath* LottieParser::parseTrimpath()
{ {
auto trim = new LottieTrimpath; auto trim = new LottieTrimpath;
if (!trim) return nullptr;
context.parent = trim; context.parent = trim;
while (auto key = nextObjectKey()) { while (auto key = nextObjectKey()) {
if (KEY_AS("nm")) trim->name = getStringCopy(); if (parseCommon(trim, key)) continue;
else if (KEY_AS("s")) parseProperty<LottieProperty::Type::Float>(trim->start); else if (KEY_AS("s")) parseProperty<LottieProperty::Type::Float>(trim->start);
else if (KEY_AS("e")) parseProperty<LottieProperty::Type::Float>(trim->end); else if (KEY_AS("e")) parseProperty<LottieProperty::Type::Float>(trim->end);
else if (KEY_AS("o")) parseProperty<LottieProperty::Type::Float>(trim->offset); else if (KEY_AS("o")) parseProperty<LottieProperty::Type::Float>(trim->offset);
else if (KEY_AS("m")) trim->type = static_cast<LottieTrimpath::Type>(getInt()); else if (KEY_AS("m")) trim->type = static_cast<LottieTrimpath::Type>(getInt());
else if (KEY_AS("hd")) trim->hidden = getBool();
else skip(key); else skip(key);
} }
trim->prepare(); trim->prepare();
@ -826,12 +817,11 @@ LottieTrimpath* LottieParser::parseTrimpath()
LottieRepeater* LottieParser::parseRepeater() LottieRepeater* LottieParser::parseRepeater()
{ {
auto repeater = new LottieRepeater; auto repeater = new LottieRepeater;
if (!repeater) return nullptr;
context.parent = repeater; context.parent = repeater;
while (auto key = nextObjectKey()) { while (auto key = nextObjectKey()) {
if (KEY_AS("nm")) repeater->name = getStringCopy(); if (parseCommon(repeater, key)) continue;
else if (KEY_AS("c")) parseProperty<LottieProperty::Type::Float>(repeater->copies); else if (KEY_AS("c")) parseProperty<LottieProperty::Type::Float>(repeater->copies);
else if (KEY_AS("o")) parseProperty<LottieProperty::Type::Float>(repeater->offset); else if (KEY_AS("o")) parseProperty<LottieProperty::Type::Float>(repeater->offset);
else if (KEY_AS("m")) repeater->inorder = getInt(); else if (KEY_AS("m")) repeater->inorder = getInt();
@ -848,7 +838,6 @@ LottieRepeater* LottieParser::parseRepeater()
else skip(key); else skip(key);
} }
} }
else if (KEY_AS("hd")) repeater->hidden = getBool();
else skip(key); else skip(key);
} }
repeater->prepare(); repeater->prepare();
@ -1056,12 +1045,10 @@ void LottieParser::parseFonts()
LottieObject* LottieParser::parseGroup() LottieObject* LottieParser::parseGroup()
{ {
auto group = new LottieGroup; auto group = new LottieGroup;
if (!group) return nullptr;
while (auto key = nextObjectKey()) { while (auto key = nextObjectKey()) {
if (KEY_AS("nm")) { if (parseCommon(group, key)) continue;
group->name = getStringCopy(); else if (KEY_AS("it")) {
} else if (KEY_AS("it")) {
enterArray(); enterArray();
while (nextArrayValue()) parseObject(group->children); while (nextArrayValue()) parseObject(group->children);
} else skip(key); } else skip(key);
@ -1169,7 +1156,6 @@ void LottieParser::getLayerSize(float& val)
LottieMask* LottieParser::parseMask() LottieMask* LottieParser::parseMask()
{ {
auto mask = new LottieMask; auto mask = new LottieMask;
if (!mask) return nullptr;
enterObject(); enterObject();
while (auto key = nextObjectKey()) { while (auto key = nextObjectKey()) {
@ -1197,7 +1183,6 @@ void LottieParser::parseMasks(LottieLayer* layer)
LottieLayer* LottieParser::parseLayer() LottieLayer* LottieParser::parseLayer()
{ {
auto layer = new LottieLayer; auto layer = new LottieLayer;
if (!layer) return nullptr;
layer->comp = comp; layer->comp = comp;
context.layer = layer; context.layer = layer;
@ -1208,7 +1193,7 @@ LottieLayer* LottieParser::parseLayer()
while (auto key = nextObjectKey()) { while (auto key = nextObjectKey()) {
if (KEY_AS("ddd")) ddd = getInt(); //3d layer if (KEY_AS("ddd")) ddd = getInt(); //3d layer
else if (KEY_AS("ind")) layer->id = getInt(); else if (KEY_AS("ind")) layer->idx = getInt();
else if (KEY_AS("ty")) layer->type = (LottieLayer::Type) getInt(); else if (KEY_AS("ty")) layer->type = (LottieLayer::Type) getInt();
else if (KEY_AS("nm")) layer->name = getStringCopy(); else if (KEY_AS("nm")) layer->name = getStringCopy();
else if (KEY_AS("sr")) layer->timeStretch = getFloat(); else if (KEY_AS("sr")) layer->timeStretch = getFloat();
@ -1223,7 +1208,7 @@ LottieLayer* LottieParser::parseLayer()
else if (KEY_AS("op")) layer->outFrame = getFloat(); else if (KEY_AS("op")) layer->outFrame = getFloat();
else if (KEY_AS("st")) layer->startFrame = getFloat(); else if (KEY_AS("st")) layer->startFrame = getFloat();
else if (KEY_AS("bm")) layer->blendMethod = getBlendMethod(); else if (KEY_AS("bm")) layer->blendMethod = getBlendMethod();
else if (KEY_AS("parent")) layer->pid = getInt(); else if (KEY_AS("parent")) layer->pidx = getInt();
else if (KEY_AS("tm")) parseTimeRemap(layer); else if (KEY_AS("tm")) parseTimeRemap(layer);
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);
@ -1243,12 +1228,6 @@ LottieLayer* LottieParser::parseLayer()
else skip(key); else skip(key);
} }
//Not a valid layer
if (!layer->transform) {
delete(layer);
return nullptr;
}
layer->prepare(); layer->prepare();
return layer; return layer;
@ -1258,14 +1237,13 @@ LottieLayer* LottieParser::parseLayer()
LottieLayer* LottieParser::parseLayers() LottieLayer* LottieParser::parseLayers()
{ {
auto root = new LottieLayer; auto root = new LottieLayer;
if (!root) return nullptr;
root->type = LottieLayer::Precomp; root->type = LottieLayer::Precomp;
root->comp = comp; root->comp = comp;
enterArray(); enterArray();
while (nextArrayValue()) { while (nextArrayValue()) {
if (auto layer = parseLayer()) root->children.push(layer); root->children.push(parseLayer());
} }
root->prepare(); root->prepare();
@ -1354,7 +1332,6 @@ bool LottieParser::parse()
if (comp) delete(comp); if (comp) delete(comp);
comp = new LottieComposition; comp = new LottieComposition;
if (!comp) return false;
Array<LottieGlyph*> glyphes; Array<LottieGlyph*> glyphes;

View file

@ -94,6 +94,7 @@ private:
LottieFont* parseFont(); LottieFont* parseFont();
LottieMarker* parseMarker(); LottieMarker* parseMarker();
bool parseCommon(LottieObject* obj, const char* key);
void parseObject(Array<LottieObject*>& parent); void parseObject(Array<LottieObject*>& parent);
void parseShapes(Array<LottieObject*>& parent); void parseShapes(Array<LottieObject*>& parent);
void parseText(Array<LottieObject*>& parent); void parseText(Array<LottieObject*>& parent);