summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmbecker69@gmx.de>2016-08-21 17:39:23 +0200
committerChristoph M. Becker <cmbecker69@gmx.de>2016-08-21 17:39:23 +0200
commitd65adac2be2c9b32d9ad9bd00399c99d492502f5 (patch)
tree92631fdc31e37ba16cb0e46a7310557bd1da4485
parent9eb5bbd8bd89caa29ba4fbeb2db27d3e4e05ed79 (diff)
downloadphp-git-d65adac2be2c9b32d9ad9bd00399c99d492502f5.tar.gz
Fix #72913: imagecopy() loses single-color transparency on palette images
The proper code to handle true-color to palette copies is already contained in gdImageCopy(), so we can simply remove the buggy duplicated code.
-rw-r--r--NEWS2
-rw-r--r--ext/gd/libgd/gd.c20
-rw-r--r--ext/gd/tests/bug72913.phpt29
3 files changed, 31 insertions, 20 deletions
diff --git a/NEWS b/NEWS
index 676760ef6f..fb5a07cfbe 100644
--- a/NEWS
+++ b/NEWS
@@ -16,6 +16,8 @@ PHP NEWS
- GD:
. Fixed bug #66005 (imagecopy does not support 1bit transparency on truecolor
images). (cmb)
+ . Fixed bug #72913 (imagecopy() loses single-color transparency on palette
+ images). (cmb)
- JSON:
. Fixed bug #72787 (json_decode reads out of bounds). (Jakub Zelenka)
diff --git a/ext/gd/libgd/gd.c b/ext/gd/libgd/gd.c
index 364697338e..0b4b42fa27 100644
--- a/ext/gd/libgd/gd.c
+++ b/ext/gd/libgd/gd.c
@@ -2266,26 +2266,6 @@ void gdImageCopy (gdImagePtr dst, gdImagePtr src, int dstX, int dstY, int srcX,
return;
}
- /* Destination is palette based */
- if (src->trueColor) { /* But source is truecolor (Ouch!) */
- toy = dstY;
- for (y = srcY; (y < (srcY + h)); y++) {
- tox = dstX;
- for (x = srcX; x < (srcX + w); x++) {
- int nc;
- c = gdImageGetPixel (src, x, y);
-
- /* Get best match possible. */
- nc = gdImageColorResolveAlpha(dst, gdTrueColorGetRed(c), gdTrueColorGetGreen(c), gdTrueColorGetBlue(c), gdTrueColorGetAlpha(c));
-
- gdImageSetPixel(dst, tox, toy, nc);
- tox++;
- }
- toy++;
- }
- return;
- }
-
/* Palette based to palette based */
for (i = 0; i < gdMaxColors; i++) {
colorMap[i] = (-1);
diff --git a/ext/gd/tests/bug72913.phpt b/ext/gd/tests/bug72913.phpt
new file mode 100644
index 0000000000..0ad03a7d3c
--- /dev/null
+++ b/ext/gd/tests/bug72913.phpt
@@ -0,0 +1,29 @@
+--TEST--
+Bug #72913 (imagecopy() loses single-color transparency on palette images)
+--SKIPIF--
+<?php
+if (!extension_loaded('gd')) die('skip gd extension not available');
+?>
+--FILE--
+<?php
+$base64 = 'iVBORw0KGgoAAAANSUhEUgAAADIAAAAyCAIAAACRXR/mAAAABnRSTlMAAAAAAABu'
+ . 'pgeRAAAAVklEQVRYw+3UQQqAMBAEwf3/p9eTBxEPiWAmWMU8oGFJqgAAuOpzWTX3'
+ . 'xQUti+uRJTZ9V5aY1bOTFZLV7yZr9zt6ibv/qPXfrMpsGipbIy7oqQ8AYJED1plD'
+ . 'y5PCu2sAAAAASUVORK5CYII=';
+$src = imagecreatefromstring(base64_decode($base64));
+
+$dst = imagecreate(50, 50);
+$transparent = imagecolorallocatealpha($dst, 255, 255, 255, 127);
+imagealphablending($dst, false);
+imagesavealpha($dst, true);
+
+imagecopy($dst, $src, 0,0, 0,0, 50,50);
+
+ob_start();
+imagegd($dst);
+echo md5(ob_get_clean()), PHP_EOL;
+?>
+==DONE==
+--EXPECT--
+f03c27f20710e21debd7090c660f1a1e
+==DONE==