summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTakeshi Abe <tabe@php.net>2009-03-18 15:30:37 +0000
committerTakeshi Abe <tabe@php.net>2009-03-18 15:30:37 +0000
commit3e3721be589072757c4336523875c69ade8cd532 (patch)
treee7bf8b15517f8fdf58bf3947ad29b5ad1230d438
parentdaac1a6273af126a27dd76d9284c81099d6b202a (diff)
downloadphp-git-3e3721be589072757c4336523875c69ade8cd532.tar.gz
MFH: Fixed libgd #186 (Tiling true colour with palette image does not work)
-rw-r--r--ext/gd/libgd/gd.c20
-rw-r--r--ext/gd/tests/libgd00186.phpt36
2 files changed, 48 insertions, 8 deletions
diff --git a/ext/gd/libgd/gd.c b/ext/gd/libgd/gd.c
index ac54d12002..7760fecf20 100644
--- a/ext/gd/libgd/gd.c
+++ b/ext/gd/libgd/gd.c
@@ -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
index 0000000000..cb1686b5ac
--- /dev/null
+++ b/ext/gd/tests/libgd00186.phpt
@@ -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