diff --git a/src/lib/tvgFill.cpp b/src/lib/tvgFill.cpp index b3fbc736..757f78b9 100644 --- a/src/lib/tvgFill.cpp +++ b/src/lib/tvgFill.cpp @@ -90,4 +90,4 @@ FillSpread Fill::spread() const noexcept Fill* Fill::duplicate() const noexcept { return pImpl->duplicate(); -} \ No newline at end of file +} diff --git a/src/loaders/svg/tvgSvgSceneBuilder.cpp b/src/loaders/svg/tvgSvgSceneBuilder.cpp index ec0d8a5c..4cfb1341 100644 --- a/src/loaders/svg/tvgSvgSceneBuilder.cpp +++ b/src/loaders/svg/tvgSvgSceneBuilder.cpp @@ -73,6 +73,7 @@ static unique_ptr _applyLinearGradientProperty(SvgStyleGradient* if (stopCount > 0) { stops = (Fill::ColorStop*)calloc(stopCount, sizeof(Fill::ColorStop)); if (!stops) return fillGrad; + auto prevOffset = 0.0f; for (uint32_t i = 0; i < g->stops.count; ++i) { auto colorStop = g->stops.data[i]; //Use premultiplied color @@ -81,6 +82,10 @@ static unique_ptr _applyLinearGradientProperty(SvgStyleGradient* stops[i].b = colorStop->b; stops[i].a = (colorStop->a * fillOpacity) / 255.0f; stops[i].offset = colorStop->offset; + // check the offset corner cases - refer to: https://svgwg.org/svg2-draft/pservers.html#StopNotes + if (colorStop->offset < prevOffset) stops[i].offset = prevOffset; + else if (colorStop->offset > 1) stops[i].offset = 1; + prevOffset = stops[i].offset; } fillGrad->colorStops(stops, stopCount); free(stops); @@ -136,6 +141,7 @@ static unique_ptr _applyRadialGradientProperty(SvgStyleGradient* if (stopCount > 0) { stops = (Fill::ColorStop*)calloc(stopCount, sizeof(Fill::ColorStop)); if (!stops) return fillGrad; + auto prevOffset = 0.0f; for (uint32_t i = 0; i < g->stops.count; ++i) { auto colorStop = g->stops.data[i]; //Use premultiplied color @@ -144,6 +150,10 @@ static unique_ptr _applyRadialGradientProperty(SvgStyleGradient* stops[i].b = colorStop->b; stops[i].a = (colorStop->a * fillOpacity) / 255.0f; stops[i].offset = colorStop->offset; + // check the offset corner cases - refer to: https://svgwg.org/svg2-draft/pservers.html#StopNotes + if (colorStop->offset < prevOffset) stops[i].offset = prevOffset; + else if (colorStop->offset > 1) stops[i].offset = 1; + prevOffset = stops[i].offset; } fillGrad->colorStops(stops, stopCount); free(stops);