cvs: php4 /ext/gd/libgd gd.c
| From: | Tim Toohey | Date: | Mon, 30 Sep 2002 07:23:34 +0000 |
| Subject: | cvs: php4 /ext/gd/libgd gd.c | ||
| Groups: | php.cvs | ||
| Request: | Send a blank email to php-cvs+get-14351@lists.php.net to get a copy of this message | ||
ttoohey Mon Sep 30 03:23:34 2002 EDT
Modified files:
/php4/ext/gd/libgd gd.c
Log:
fix gdImageCopyResampled() for non-constant alpha layer
Index: php4/ext/gd/libgd/gd.c
diff -u php4/ext/gd/libgd/gd.c:1.16 php4/ext/gd/libgd/gd.c:1.17
--- php4/ext/gd/libgd/gd.c:1.16 Sun Sep 29 10:45:57 2002
+++ php4/ext/gd/libgd/gd.c Mon Sep 30 03:23:34 2002
@@ -2047,6 +2047,7 @@
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 @@
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 @@
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)
{