From e59ba67b7c3ae6d3108597ce671fe33eee0ae0ea Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Thu, 29 Jul 2021 20:25:49 +0900 Subject: [PATCH] tvg_format: optimize data format This reduces tvg binary format size by converting PathCommand to more compact size. This optimization increase +12% compress rate with our example: 195,668 => 174,071 (sum of all converted tvgs from svgs) @Issues: https://github.com/Samsung/thorvg/issues/639 --- src/examples/images/test.tvg | Bin 310002 -> 302268 bytes src/loaders/tvg/tvgTvgLoadParser.cpp | 27 ++++++++++++++++++--------- src/savers/tvg/tvgTvgSaver.cpp | 9 ++++++++- 3 files changed, 26 insertions(+), 10 deletions(-) diff --git a/src/examples/images/test.tvg b/src/examples/images/test.tvg index 80e55768b02e34b969813afe592ccc2ed80c808a..5a61851b499660427290f7aa54b3e2ff95bc5ef2 100644 GIT binary patch delta 9962 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 end) return false; - shape->appendPath(cmds, cmdCnt, pts, ptsCnt); + /* Recover to PathCommand(4 bytes) from TvgBinFlag(1 byte) */ + PathCommand inCmds[cmdCnt]; + for (uint32_t i = 0; i < cmdCnt; ++i) { + inCmds[i] = static_cast(cmds[i]); + } + + shape->appendPath(inCmds, cmdCnt, pts, ptsCnt); + return true; } diff --git a/src/savers/tvg/tvgTvgSaver.cpp b/src/savers/tvg/tvgTvgSaver.cpp index 5a8ed420..131d9b5c 100644 --- a/src/savers/tvg/tvgTvgSaver.cpp +++ b/src/savers/tvg/tvgTvgSaver.cpp @@ -273,9 +273,16 @@ TvgBinCounter TvgSaver::serializePath(const Shape* shape) writeTag(TVG_TAG_SHAPE_PATH); reserveCount(); + /* Reduce the binary size. + Convert PathCommand(4 bytes) to TvgBinFlag(1 byte) */ + TvgBinFlag outCmds[cmdCnt]; + for (uint32_t i = 0; i < cmdCnt; ++i) { + outCmds[i] = static_cast(cmds[i]); + } + auto cnt = writeData(&cmdCnt, SIZE(cmdCnt)); cnt += writeData(&ptsCnt, SIZE(ptsCnt)); - cnt += writeData(cmds, cmdCnt * SIZE(cmds[0])); + cnt += writeData(outCmds, SIZE(outCmds)); cnt += writeData(pts, ptsCnt * SIZE(pts[0])); writeReservedCount(cnt);