diff --git a/AUTHORS b/AUTHORS index be3f4093..da584810 100644 --- a/AUTHORS +++ b/AUTHORS @@ -26,3 +26,4 @@ SergeyLebedkin Jinny You Nattu Adnan Gabor Kiss-Vamosi +Lorcán Mc Donagh diff --git a/src/examples/resources/radial_gradient_focal_outside_circle.svg b/src/examples/resources/radial_gradient_focal_outside_circle.svg new file mode 100644 index 00000000..8d0bd78f --- /dev/null +++ b/src/examples/resources/radial_gradient_focal_outside_circle.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + \ No newline at end of file diff --git a/src/renderer/sw_engine/tvgSwFill.cpp b/src/renderer/sw_engine/tvgSwFill.cpp index 8956cd9f..60763068 100644 --- a/src/renderer/sw_engine/tvgSwFill.cpp +++ b/src/renderer/sw_engine/tvgSwFill.cpp @@ -201,7 +201,13 @@ bool _prepareRadial(SwFill* fill, const RadialGradient* radial, const Matrix* tr fill->radial.fy = cy + r * (fy - cy) / dist; fill->radial.dx = cx - fill->radial.fx; fill->radial.dy = cy - fill->radial.fy; - fill->radial.a = fill->radial.dr * fill->radial.dr - fill->radial.dx * fill->radial.dx - fill->radial.dy * fill->radial.dy; + // Prevent loss of precision on Apple Silicon when dr=dy and dx=0 due to FMA + // https://github.com/thorvg/thorvg/issues/2014 + auto dr2 = fill->radial.dr * fill->radial.dr; + auto dx2 = fill->radial.dx * fill->radial.dx; + auto dy2 = fill->radial.dy * fill->radial.dy; + + fill->radial.a = dr2 - dx2 - dy2; } if (fill->radial.a > 0) fill->radial.invA = 1.0f / fill->radial.a;