From 075e3e6b2a58e96ef181d9ba299cb4be57487575 Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 13 Jun 2023 14:01:29 +0900 Subject: [PATCH] tvg: support stroke miterlimit property. implement the miterlimit property that was introduced by 44a750ee5db79008388ae18c853e54365130cdba @Issue: https://github.com/thorvg/thorvg/issues/1490 --- src/lib/tvgBinaryDesc.h | 6 ++++-- src/loaders/tvg/tvgTvgBinInterpreter.cpp | 7 +++++++ src/savers/tvg/tvgTvgSaver.cpp | 8 ++++++++ 3 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/lib/tvgBinaryDesc.h b/src/lib/tvgBinaryDesc.h index a587c0f4..eb677d4f 100644 --- a/src/lib/tvgBinaryDesc.h +++ b/src/lib/tvgBinaryDesc.h @@ -71,14 +71,16 @@ using TvgBinFlag = TvgBinByte; #define TVG_TAG_SHAPE_FILL (TvgBinTag)0x42 #define TVG_TAG_SHAPE_COLOR (TvgBinTag)0x43 #define TVG_TAG_SHAPE_FILLRULE (TvgBinTag)0x44 -#define TVG_TAG_SHAPE_STROKE_CAP (TvgBinTag)0x50 -#define TVG_TAG_SHAPE_STROKE_JOIN (TvgBinTag)0x51 + //Stroke +#define TVG_TAG_SHAPE_STROKE_CAP (TvgBinTag)0x50 +#define TVG_TAG_SHAPE_STROKE_JOIN (TvgBinTag)0x51 #define TVG_TAG_SHAPE_STROKE_WIDTH (TvgBinTag)0x52 #define TVG_TAG_SHAPE_STROKE_COLOR (TvgBinTag)0x53 #define TVG_TAG_SHAPE_STROKE_FILL (TvgBinTag)0x54 #define TVG_TAG_SHAPE_STROKE_DASHPTRN (TvgBinTag)0x55 +#define TVG_TAG_SHAPE_STROKE_MITERLIMIT (TvgBinTag)0x56 //Fill diff --git a/src/loaders/tvg/tvgTvgBinInterpreter.cpp b/src/loaders/tvg/tvgTvgBinInterpreter.cpp index 41e3b2b9..8389cf59 100644 --- a/src/loaders/tvg/tvgTvgBinInterpreter.cpp +++ b/src/loaders/tvg/tvgTvgBinInterpreter.cpp @@ -309,6 +309,13 @@ static bool _parseShapeStroke(const char *ptr, const char *end, Shape *shape) if (!_parseShapeStrokeDashPattern(block.data, block.end, shape)) return false; break; } + case TVG_TAG_SHAPE_STROKE_MITERLIMIT: { + if (block.length != SIZE(float)) return false; + float miterlimit; + READ_FLOAT(&miterlimit, block.data); + shape->strokeMiterlimit(miterlimit); + 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/savers/tvg/tvgTvgSaver.cpp b/src/savers/tvg/tvgTvgSaver.cpp index ecc5e007..1f28937a 100644 --- a/src/savers/tvg/tvgTvgSaver.cpp +++ b/src/savers/tvg/tvgTvgSaver.cpp @@ -115,6 +115,8 @@ static bool _merge(Shape* from, Shape* to) if (from->strokeDash(nullptr) > 0 || to->strokeDash(nullptr) > 0) return false; if (from->strokeFill() || to->strokeFill()) return false; + if (fabsf(from->strokeMiterlimit() - to->strokeMiterlimit()) > FLT_EPSILON) return false; + //fill rule if (from->fillRule() != to->fillRule()) return false; @@ -476,6 +478,12 @@ TvgBinCounter TvgSaver::serializeStroke(const Shape* shape, const Matrix* pTrans cnt += SIZE(TvgBinTag) + SIZE(TvgBinCounter); } + //miterlimit (the default value is 4) + auto miterlimit = shape->strokeMiterlimit(); + if (fabsf(miterlimit - 4.0f) > FLT_EPSILON) { + cnt += writeTagProperty(TVG_TAG_SHAPE_STROKE_MITERLIMIT, SIZE(miterlimit), &miterlimit); + } + writeReservedCount(cnt); return SERIAL_DONE(cnt);