]> granicus.if.org Git - php/commitdiff
MFH: Fixed libgd #186 (Tiling true colour with palette image does not work)
authorTakeshi Abe <tabe@php.net>
Wed, 18 Mar 2009 15:30:37 +0000 (15:30 +0000)
committerTakeshi Abe <tabe@php.net>
Wed, 18 Mar 2009 15:30:37 +0000 (15:30 +0000)
ext/gd/libgd/gd.c
ext/gd/tests/libgd00186.phpt [new file with mode: 0644]

index ac54d120022939cd13626c05c2aafa665f686aae..7760fecf20b90d912d40da856099320f31f11444 100644 (file)
@@ -860,23 +860,27 @@ static void gdImageBrushApply (gdImagePtr im, int x, int y)
 
 static void gdImageTileApply (gdImagePtr im, int x, int y)
 {
+       gdImagePtr tile = im->tile;
        int srcx, srcy;
        int p;
-       if (!im->tile) {
+       if (!tile) {
                return;
        }
-       srcx = x % gdImageSX(im->tile);
-       srcy = y % gdImageSY(im->tile);
+       srcx = x % gdImageSX(tile);
+       srcy = y % gdImageSY(tile);
        if (im->trueColor) {
-               p = gdImageGetTrueColorPixel(im->tile, srcx, srcy);
-               if (p != gdImageGetTransparent (im->tile)) {
+               p = gdImageGetPixel(tile, srcx, srcy);
+               if (p != gdImageGetTransparent (tile)) {
+                       if (!tile->trueColor) {
+                               p = gdTrueColorAlpha(tile->red[p], tile->green[p], tile->blue[p], tile->alpha[p]);
+                       }
                        gdImageSetPixel(im, x, y, p);
                }
        } else {
-               p = gdImageGetPixel(im->tile, srcx, srcy);
+               p = gdImageGetPixel(tile, srcx, srcy);
                /* Allow for transparency */
-               if (p != gdImageGetTransparent(im->tile)) {
-                       if (im->tile->trueColor) {
+               if (p != gdImageGetTransparent(tile)) {
+                       if (tile->trueColor) {
                                /* Truecolor tile. Very slow on a palette destination. */
                                gdImageSetPixel(im, x, y, gdImageColorResolveAlpha(im,
                                                                                        gdTrueColorGetRed(p),
diff --git a/ext/gd/tests/libgd00186.phpt b/ext/gd/tests/libgd00186.phpt
new file mode 100644 (file)
index 0000000..cb1686b
--- /dev/null
@@ -0,0 +1,36 @@
+--TEST--
+libgd #186 (Tiling true colour with palette image does not work)
+--SKIPIF--
+<?php
+       if (!extension_loaded('gd')) die("skip gd extension not available\n");
+?>
+--FILE--
+<?php
+$im = imagecreatetruecolor(10,10);
+$tile = imagecreate(10,10);
+$red   = imagecolorallocate($tile,0xff,0,0);
+$green = imagecolorallocate($tile,0,0xff,0);
+$blue  = imagecolorallocate($tile,0,0,0xff);
+$other = imagecolorallocate($tile,0,0,0x2);
+imagefilledrectangle($tile,0,0,2,10,$red);
+imagefilledrectangle($tile,3,0,4,10,$green);
+imagefilledrectangle($tile,5,0,7,10,$blue);
+imagefilledrectangle($tile,8,0,9,10,$other);
+imagecolortransparent($tile,$blue);
+imagesettile($im,$tile);
+for ($i=0; $i<10; $i++) {
+  imagesetpixel($im,$i,$i,IMG_COLOR_TILED);
+}
+$index = imagecolorat($im,9,9);
+$arr = imagecolorsforindex($im, $index);
+if ($arr['blue'] == 2) {
+  $r = "Ok";
+} else {
+  $r = "Failed";
+}
+imagedestroy($tile);
+imagedestroy($im);
+echo $r;
+?>
+--EXPECT--
+Ok