From ed23b432bbb1c4b6a87d0318eeeeaaf22b45a166 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 26 Sep 2023 11:08:12 +0900 Subject: [PATCH] tvg: support dash offset property properly store/restore the dash offset property from the tvg loader and saver Issue: https://github.com/thorvg/thorvg/issues/1617 --- src/loaders/tvg/tvgTvgBinInterpreter.cpp | 7 +++++++ src/renderer/tvgBinaryDesc.h | 1 + src/savers/tvg/tvgTvgSaver.cpp | 8 +++++++- 3 files changed, 15 insertions(+), 1 deletion(-) diff --git a/src/loaders/tvg/tvgTvgBinInterpreter.cpp b/src/loaders/tvg/tvgTvgBinInterpreter.cpp index e246af60..eb3f0136 100644 --- a/src/loaders/tvg/tvgTvgBinInterpreter.cpp +++ b/src/loaders/tvg/tvgTvgBinInterpreter.cpp @@ -322,6 +322,13 @@ static bool _parseShapeStroke(const char *ptr, const char *end, Shape *shape) shape->strokeMiterlimit(miterlimit); break; } + case TVG_TAG_SHAPE_STROKE_DASH_OFFSET: { + if (block.length != SIZE(float)) return false; + float offset; + READ_FLOAT(&offset, block.data); + P(shape)->rs.stroke->dashOffset = offset; + break; + } default: { TVGLOG("TVG", "Unsupported tag %d (0x%x) used as one of stroke properties, %d bytes skipped", block.type, block.type, block.length); break; diff --git a/src/renderer/tvgBinaryDesc.h b/src/renderer/tvgBinaryDesc.h index 3b9dbe89..42969cbc 100644 --- a/src/renderer/tvgBinaryDesc.h +++ b/src/renderer/tvgBinaryDesc.h @@ -82,6 +82,7 @@ using TvgBinFlag = TvgBinByte; #define TVG_TAG_SHAPE_STROKE_DASHPTRN (TvgBinTag)0x55 #define TVG_TAG_SHAPE_STROKE_MITERLIMIT (TvgBinTag)0x56 #define TVG_TAG_SHAPE_STROKE_ORDER (TvgBinTag)0x57 +#define TVG_TAG_SHAPE_STROKE_DASH_OFFSET (TvgBinTag)0x58 //Fill diff --git a/src/savers/tvg/tvgTvgSaver.cpp b/src/savers/tvg/tvgTvgSaver.cpp index fa80f611..da1dc4ad 100644 --- a/src/savers/tvg/tvgTvgSaver.cpp +++ b/src/savers/tvg/tvgTvgSaver.cpp @@ -469,7 +469,8 @@ TvgBinCounter TvgSaver::serializeStroke(const Shape* shape, const Matrix* pTrans //dash const float* dashPattern = nullptr; - auto dashCnt = shape->strokeDash(&dashPattern); + float offset = 0.0f; + auto dashCnt = P(shape)->rs.strokeDash(&dashPattern, &offset); if (dashPattern && dashCnt > 0) { TvgBinCounter dashCntSize = SIZE(dashCnt); TvgBinCounter dashPtrnSize = dashCnt * SIZE(dashPattern[0]); @@ -487,6 +488,11 @@ TvgBinCounter TvgSaver::serializeStroke(const Shape* shape, const Matrix* pTrans cnt += writeTagProperty(TVG_TAG_SHAPE_STROKE_MITERLIMIT, SIZE(miterlimit), &miterlimit); } + //dash offset + if (!mathZero(offset)) { + cnt += writeTagProperty(TVG_TAG_SHAPE_STROKE_DASH_OFFSET, SIZE(offset), &offset); + } + writeReservedCount(cnt); return SERIAL_DONE(cnt);