From: Tim Toohey Date: Mon, 30 Sep 2002 07:23:34 +0000 (+0000) Subject: fix gdImageCopyResampled() for non-constant alpha layer X-Git-Tag: MODERN_SYMMETRIC_SESSION_BEHAVIOUR_20021003~67 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=6a952f0856d6688139d944df034c3f0c586c23dc;p=php fix gdImageCopyResampled() for non-constant alpha layer --- diff --git a/ext/gd/libgd/gd.c b/ext/gd/libgd/gd.c index 5a439e7a03..ff6d4425cf 100644 --- a/ext/gd/libgd/gd.c +++ b/ext/gd/libgd/gd.c @@ -2047,6 +2047,7 @@ gdImageCopyResampled (gdImagePtr dst, float sx, sy; float spixels = 0.0f; float red = 0.0f, green = 0.0f, blue = 0.0f, alpha = 0.0f; + float alpha_factor, alpha_sum = 0.0f, contrib_sum = 0.0f; sy1 = ((float)(y - dstY)) * (float)srcH / (float)dstH; sy2 = ((float)(y + 1 - dstY)) * (float) srcH / @@ -2104,10 +2105,13 @@ gdImageCopyResampled (gdImagePtr dst, src, (int) sx + srcX, (int) sy + srcY); - red += gdTrueColorGetRed (p) * pcontribution; - green += gdTrueColorGetGreen (p) * pcontribution; - blue += gdTrueColorGetBlue (p) * pcontribution; + alpha_factor = ((gdAlphaMax - gdTrueColorGetAlpha(p))) * pcontribution; + red += gdTrueColorGetRed (p) * alpha_factor; + green += gdTrueColorGetGreen (p) * alpha_factor; + blue += gdTrueColorGetBlue (p) * alpha_factor; alpha += gdTrueColorGetAlpha (p) * pcontribution; + alpha_sum += alpha_factor; + contrib_sum += pcontribution; spixels += xportion * yportion; sx += 1.0f; } @@ -2122,6 +2126,13 @@ gdImageCopyResampled (gdImagePtr dst, blue /= spixels; alpha /= spixels; } + if ( alpha_sum != 0.0f) + { + if( contrib_sum != 0.0f ) alpha_sum /= contrib_sum; + red /= alpha_sum; + green /= alpha_sum; + blue /= alpha_sum; + } /* Clamping to allow for rounding errors above */ if (red > 255.0f) {