poppler/Gfx.cc | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-)
New commits: commit 0294d6e50691a3e40fad0d6e4fa9056944a91efd Author: Thomas Freitag <[email protected]> Date: Thu Dec 23 15:56:32 2010 +0000 Be more correct when drawing radial shadings Fixes 32349 diff --git a/poppler/Gfx.cc b/poppler/Gfx.cc index 6b80e90..09c5381 100644 --- a/poppler/Gfx.cc +++ b/poppler/Gfx.cc @@ -2924,17 +2924,24 @@ void Gfx::doRadialShFill(GfxRadialShading *shading) { tb = t0 + sb * (t1 - t0); getShadingColorRadialHelper(t0, t1, tb, shading, &colorB); while (ib - ia > 1) { - if (isSameGfxColor(colorB, colorA, nComps, radialColorDelta) && ib < radialMaxSplits) { + if (isSameGfxColor(colorB, colorA, nComps, radialColorDelta)) { // The shading is not necessarily lineal so having two points with the // same color does not mean all the areas in between have the same color too - // Do another bisection to be a bit more sure we are not doing something wrong - GfxColor colorC; - int ic = (ia + ib) / 2; - double sc = sMin + ((double)ic / (double)radialMaxSplits) * (sMax - sMin); - double tc = t0 + sc * (t1 - t0); - getShadingColorRadialHelper(t0, t1, tc, shading, &colorC); - if (isSameGfxColor(colorC, colorA, nComps, radialColorDelta)) - break; + int ic = ia + 1; + for (; ic <= ib; ic++) { + GfxColor colorC; + const double sc = sMin + ((double)ic / (double)radialMaxSplits) * (sMax - sMin); + const double tc = t0 + sc * (t1 - t0); + getShadingColorRadialHelper(t0, t1, tc, shading, &colorC); + if (!isSameGfxColor(colorC, colorA, nComps, radialColorDelta)) { + break; + } + } + ib = (ic > ia + 1) ? ic - 1 : ia + 1; + sb = sMin + ((double)ib / (double)radialMaxSplits) * (sMax - sMin); + tb = t0 + sb * (t1 - t0); + getShadingColorRadialHelper(t0, t1, tb, shading, &colorB); + break; } ib = (ia + ib) / 2; sb = sMin + ((double)ib / (double)radialMaxSplits) * (sMax - sMin); _______________________________________________ poppler mailing list [email protected] http://lists.freedesktop.org/mailman/listinfo/poppler
