This reserved count was just missed,
Aside from it, tvg_loader logic is not well organized (hard to expect)
We can refine it by recovering the data tree structure in the reverse order.
@Issues: https://github.com/Samsung/thorvg/issues/768
-#define TVG_FLAG_SCENE_RESERVEDCNT (TvgBinTag)0x30
+#define TVG_TAG_SCENE_RESERVEDCNT (TvgBinTag)0x30
{
auto scene = static_cast<Scene*>(paint);
{
auto scene = static_cast<Scene*>(paint);
- switch (block.type) {
- case TVG_FLAG_SCENE_RESERVEDCNT: {
- if (block.length != SIZE(uint32_t)) return false;
- uint32_t reservedCnt;
- READ_UI32(&reservedCnt, block.data);
- scene->reserve(reservedCnt);
- return true;
- }
+ if (block.type == TVG_TAG_SCENE_RESERVEDCNT) {
+ if (block.length != SIZE(uint32_t)) return false;
+ uint32_t reservedCnt;
+ READ_UI32(&reservedCnt, block.data);
+ scene->reserve(reservedCnt);
+ return true;
}
if (_paintProperty(block)) return _parsePaintProperty(block, scene);
}
if (_paintProperty(block)) return _parsePaintProperty(block, scene);
//Case - Delegator Scene: This scene is just a delegator, we can skip this:
if (scene->composite(nullptr) == CompositeMethod::None && scene->opacity() == 255) {
//Case - Delegator Scene: This scene is just a delegator, we can skip this:
if (scene->composite(nullptr) == CompositeMethod::None && scene->opacity() == 255) {
- return serializeChildren(it, &transform);
+ return serializeChildren(it, &transform, false);
}
//Case - Serialize Scene & its children
writeTag(TVG_TAG_CLASS_SCENE);
reserveCount();
}
//Case - Serialize Scene & its children
writeTag(TVG_TAG_CLASS_SCENE);
reserveCount();
- auto cnt = serializeChildren(it, &transform) + serializePaint(scene, pTransform);
+ auto cnt = serializeChildren(it, &transform, true) + serializePaint(scene, pTransform);
} else {
writeTag(TVG_TAG_CLASS_SCENE);
reserveCount();
} else {
writeTag(TVG_TAG_CLASS_SCENE);
reserveCount();
- auto cnt = serializeChildren(it, &transform) + serializePaint(picture, pTransform);
+ auto cnt = serializeChildren(it, &transform, true) + serializePaint(picture, pTransform);
writeReservedCount(cnt);
}
delete(it);
writeReservedCount(cnt);
}
delete(it);
-TvgBinCounter TvgSaver::serializeChildren(Iterator* it, const Matrix* pTransform)
+TvgBinCounter TvgSaver::serializeChildren(Iterator* it, const Matrix* pTransform, bool reserved)
+ //The children of a reserved scene
+ if (reserved && children.count > 1) {
+ cnt += writeTagProperty(TVG_TAG_SCENE_RESERVEDCNT, SIZE(children.count), &children.count);
+ }
+
//Serialize merged children.
auto child = children.data;
for (uint32_t i = 0; i < children.count; ++i, ++child) {
//Serialize merged children.
auto child = children.data;
for (uint32_t i = 0; i < children.count; ++i, ++child) {
TvgBinCounter serializeStroke(const Shape* shape, const Matrix* pTransform);
TvgBinCounter serializePath(const Shape* shape, const Matrix* pTransform);
TvgBinCounter serializeComposite(const Paint* cmpTarget, CompositeMethod cmpMethod, const Matrix* pTransform);
TvgBinCounter serializeStroke(const Shape* shape, const Matrix* pTransform);
TvgBinCounter serializePath(const Shape* shape, const Matrix* pTransform);
TvgBinCounter serializeComposite(const Paint* cmpTarget, CompositeMethod cmpMethod, const Matrix* pTransform);
- TvgBinCounter serializeChildren(Iterator* it, const Matrix* transform);
+ TvgBinCounter serializeChildren(Iterator* it, const Matrix* transform, bool reserved);
TvgBinCounter serializeChild(const Paint* parent, const Paint* child, const Matrix* pTransform);
public:
TvgBinCounter serializeChild(const Paint* parent, const Paint* child, const Matrix* pTransform);
public: