Bug 441780. Fix radial gradient clamping to be more aggressive. r=jwatt,sr=roc

--HG--
extra : rebase_source : 477e5305530e86348a3526a8157f5f93340c644b
This commit is contained in:
Robert Longson 2008-12-17 20:28:33 +13:00
parent 00576b552f
commit bda2871a94
4 changed files with 74 additions and 2 deletions

View File

@ -0,0 +1,34 @@
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/licenses/publicdomain/
-->
<svg xmlns="http://www.w3.org/2000/svg" >
<title>Reference for gradient</title>
<!-- From https://bugzilla.mozilla.org/show_bug.cgi?id=441780 -->
<defs>
<radialGradient id="gradient1" fx="0.002">
<stop offset="0" stop-color="lime" />
<stop offset="1" stop-color="red"/>
</radialGradient>
<radialGradient id="gradient2" r="0.4" fx="0.104">
<stop offset="0" stop-color="lime" />
<stop offset="1" stop-color="red"/>
</radialGradient>
<radialGradient id="gradient3" fx="0.998">
<stop offset="0" stop-color="lime" />
<stop offset="1" stop-color="red"/>
</radialGradient>
<radialGradient id="gradient4" r="0.7" fx="1.197">
<stop offset="0" stop-color="lime" />
<stop offset="1" stop-color="red"/>
</radialGradient>
</defs>
<circle cx="100" cy="100" r="50" fill="url(#gradient1)"/>
<circle cx="100" cy="200" r="50" fill="url(#gradient2)"/>
<circle cx="200" cy="100" r="50" fill="url(#gradient3)"/>
<circle cx="200" cy="200" r="50" fill="url(#gradient4)"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -0,0 +1,34 @@
<!--
Any copyright is dedicated to the Public Domain.
http://creativecommons.org/licenses/publicdomain/
-->
<svg xmlns="http://www.w3.org/2000/svg" >
<title>Testcase for gradient</title>
<!-- From https://bugzilla.mozilla.org/show_bug.cgi?id=441780 -->
<defs>
<radialGradient id="gradient1" fx="0">
<stop offset="0" stop-color="lime" />
<stop offset="1" stop-color="red"/>
</radialGradient>
<radialGradient id="gradient2" r="0.4" fx="0.1">
<stop offset="0" stop-color="lime" />
<stop offset="1" stop-color="red"/>
</radialGradient>
<radialGradient id="gradient3" fx="1">
<stop offset="0" stop-color="lime" />
<stop offset="1" stop-color="red"/>
</radialGradient>
<radialGradient id="gradient4" r="0.7" fx="1.3">
<stop offset="0" stop-color="lime" />
<stop offset="1" stop-color="red"/>
</radialGradient>
</defs>
<circle cx="100" cy="100" r="50" fill="url(#gradient1)"/>
<circle cx="100" cy="200" r="50" fill="url(#gradient2)"/>
<circle cx="200" cy="100" r="50" fill="url(#gradient3)"/>
<circle cx="200" cy="200" r="50" fill="url(#gradient4)"/>
</svg>

After

Width:  |  Height:  |  Size: 1.2 KiB

View File

@ -81,6 +81,7 @@ random-if(MOZ_WIDGET_TOOLKIT=="cocoa") == opacity-and-gradient-01.svg pass.svg
== pseudo-classes-02.svg pseudo-classes-02-ref.svg
== radialGradient-basic-01.svg pass.svg
== radialGradient-basic-02.svg pass.svg
== radialGradient-basic-03.svg radialGradient-basic-03-ref.svg
== rect-01.svg pass.svg
== rect-with-rx-and-ry-01.svg pass.svg
== rect-with-rx-or-ry-01.svg rect-with-rx-or-ry-01-ref.svg

View File

@ -563,11 +563,14 @@ nsSVGRadialGradientFrame::CreateGradient()
// The focal point (fFx and fFy) must be clamped to be *inside* - not on -
// the circumference of the gradient or we'll get rendering anomalies. We
// calculate the distance from the focal point to the gradient center and
// make sure it is *less* than the gradient radius. 0.999 is used as the
// make sure it is *less* than the gradient radius. 0.99 is used as the
// factor of the radius because it's close enough to 1 that we won't get a
// fringe at the edge of the gradient if we clamp, but not so close to 1
// that rounding error will give us the same results as using fR itself.
double dMax = 0.999 * r;
// Also note that .99 < 255/256/2 which is the limit of the fractional part
// of cairo's 24.8 fixed point representation divided by 2 to ensure that
// we get different cairo fractions
double dMax = 0.99 * r;
float dx = fx - cx;
float dy = fy - cy;
double d = sqrt((dx * dx) + (dy * dy));