tvg: support radial gradient focal properties

properly store/restore the radial gradient focal properties
from the tvg loader and saver
This commit is contained in:
Hermet Park 2023-09-26 11:25:23 +09:00 committed by Hermet Park
parent ed23b432bb
commit 74b67919e0
3 changed files with 31 additions and 2 deletions

View file

@ -32,6 +32,7 @@
#include "tvgTvgCommon.h"
#include "tvgShape.h"
#include "tvgFill.h"
/************************************************************************/
@ -188,6 +189,25 @@ static unique_ptr<Fill> _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<RadialGradient*>(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;

View file

@ -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

View file

@ -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<const RadialGradient*>(fill);
float args[3];
static_cast<const RadialGradient*>(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];