diff --git a/src/examples/images/test.tvg b/src/examples/images/test.tvg index 9c42fae9..4c628e3f 100644 Binary files a/src/examples/images/test.tvg and b/src/examples/images/test.tvg differ diff --git a/src/lib/tvgBinaryDesc.h b/src/lib/tvgBinaryDesc.h index 8760ffc6..4ef59af5 100644 --- a/src/lib/tvgBinaryDesc.h +++ b/src/lib/tvgBinaryDesc.h @@ -63,7 +63,7 @@ using TvgBinFlag = TvgBinByte; //Scene -#define TVG_FLAG_SCENE_RESERVEDCNT (TvgBinTag)0x30 +#define TVG_TAG_SCENE_RESERVEDCNT (TvgBinTag)0x30 //Shape diff --git a/src/loaders/tvg/tvgTvgBinInterpreter.cpp b/src/loaders/tvg/tvgTvgBinInterpreter.cpp index 1950eb2d..b688eafa 100644 --- a/src/loaders/tvg/tvgTvgBinInterpreter.cpp +++ b/src/loaders/tvg/tvgTvgBinInterpreter.cpp @@ -109,14 +109,12 @@ static bool _parseScene(TvgBinBlock block, Paint *paint) { auto scene = static_cast(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); diff --git a/src/savers/tvg/tvgTvgSaver.cpp b/src/savers/tvg/tvgTvgSaver.cpp index 4e07651d..26a2e9d2 100644 --- a/src/savers/tvg/tvgTvgSaver.cpp +++ b/src/savers/tvg/tvgTvgSaver.cpp @@ -380,14 +380,14 @@ TvgBinCounter TvgSaver::serializeScene(const Scene* scene, const Matrix* pTransf //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(); - auto cnt = serializeChildren(it, &transform) + serializePaint(scene, pTransform); + auto cnt = serializeChildren(it, &transform, true) + serializePaint(scene, pTransform); delete(it); @@ -592,7 +592,7 @@ TvgBinCounter TvgSaver::serializePicture(const Picture* picture, const Matrix* p } 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); @@ -647,7 +647,7 @@ TvgBinCounter TvgSaver::serializeComposite(const Paint* cmpTarget, CompositeMeth } -TvgBinCounter TvgSaver::serializeChildren(Iterator* it, const Matrix* pTransform) +TvgBinCounter TvgSaver::serializeChildren(Iterator* it, const Matrix* pTransform, bool reserved) { TvgBinCounter cnt = 0; @@ -669,6 +669,11 @@ TvgBinCounter TvgSaver::serializeChildren(Iterator* it, const Matrix* pTransform children.push(child); } + //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) { diff --git a/src/savers/tvg/tvgTvgSaver.h b/src/savers/tvg/tvgTvgSaver.h index 727c18f5..155f3500 100644 --- a/src/savers/tvg/tvgTvgSaver.h +++ b/src/savers/tvg/tvgTvgSaver.h @@ -61,7 +61,7 @@ private: 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: