From 74b67919e0bb93a92f92c11369738de6c40c869d Mon Sep 17 00:00:00 2001 From: Hermet Park Date: Tue, 26 Sep 2023 11:25:23 +0900 Subject: [PATCH] tvg: support radial gradient focal properties properly store/restore the radial gradient focal properties from the tvg loader and saver --- src/loaders/tvg/tvgTvgBinInterpreter.cpp | 20 ++++++++++++++++++++ src/renderer/tvgBinaryDesc.h | 2 +- src/savers/tvg/tvgTvgSaver.cpp | 11 ++++++++++- 3 files changed, 31 insertions(+), 2 deletions(-) diff --git a/src/loaders/tvg/tvgTvgBinInterpreter.cpp b/src/loaders/tvg/tvgTvgBinInterpreter.cpp index eb3f0136..76ab2133 100644 --- a/src/loaders/tvg/tvgTvgBinInterpreter.cpp +++ b/src/loaders/tvg/tvgTvgBinInterpreter.cpp @@ -32,6 +32,7 @@ #include "tvgTvgCommon.h" #include "tvgShape.h" +#include "tvgFill.h" /************************************************************************/ @@ -188,6 +189,25 @@ static unique_ptr _parseShapeFill(const char *ptr, const char *end) fillGrad = std::move(fillGradRadial); break; } + case TVG_TAG_FILL_RADIAL_GRADIENT_FOCAL: { + if (block.length != 3 * SIZE(float)) return nullptr; + + auto ptr = block.data; + float x, y, radius; + + READ_FLOAT(&x, ptr); + ptr += SIZE(float); + READ_FLOAT(&y, ptr); + ptr += SIZE(float); + READ_FLOAT(&radius, ptr); + + if (auto fillGradRadial = static_cast(fillGrad.get())) { + P(fillGradRadial)->fx = x; + P(fillGradRadial)->fy = y; + P(fillGradRadial)->fr = radius; + } + break; + } case TVG_TAG_FILL_LINEAR_GRADIENT: { if (block.length != 4 * SIZE(float)) return nullptr; diff --git a/src/renderer/tvgBinaryDesc.h b/src/renderer/tvgBinaryDesc.h index 42969cbc..6766af0b 100644 --- a/src/renderer/tvgBinaryDesc.h +++ b/src/renderer/tvgBinaryDesc.h @@ -91,7 +91,7 @@ using TvgBinFlag = TvgBinByte; #define TVG_TAG_FILL_COLORSTOPS (TvgBinTag)0x62 #define TVG_TAG_FILL_FILLSPREAD (TvgBinTag)0x63 #define TVG_TAG_FILL_TRANSFORM (TvgBinTag)0x64 - +#define TVG_TAG_FILL_RADIAL_GRADIENT_FOCAL (TvgBinTag)0x65 //Picture #define TVG_TAG_PICTURE_RAW_IMAGE (TvgBinTag)0x70 diff --git a/src/savers/tvg/tvgTvgSaver.cpp b/src/savers/tvg/tvgTvgSaver.cpp index da1dc4ad..e1d4f917 100644 --- a/src/savers/tvg/tvgTvgSaver.cpp +++ b/src/savers/tvg/tvgTvgSaver.cpp @@ -26,6 +26,7 @@ #include "tvgTvgSaver.h" #include "tvgCompressor.h" #include "tvgShape.h" +#include "tvgFill.h" #include "tvgPicture.h" #ifdef _WIN32 @@ -411,9 +412,17 @@ TvgBinCounter TvgSaver::serializeFill(const Fill* fill, TvgBinTag tag, const Mat //radial fill if (fill->identifier() == TVG_CLASS_ID_RADIAL) { + const RadialGradient* radial = static_cast(fill); float args[3]; - static_cast(fill)->radial(args, args + 1, args + 2); + radial->radial(args, args + 1, args + 2); cnt += writeTagProperty(TVG_TAG_FILL_RADIAL_GRADIENT, SIZE(args), args); + //focal + if (!mathZero(P(radial)->fx)|| !mathZero(P(radial)->fy) || P(radial)->fr > 0.0f) { + args[0] = P(radial)->fx; + args[1] = P(radial)->fy; + args[2] = P(radial)->fr; + cnt += writeTagProperty(TVG_TAG_FILL_RADIAL_GRADIENT_FOCAL, SIZE(args), args); + } //linear fill } else { float args[4];