diff options
author | Christoph M. Becker <cmbecker69@gmx.de> | 2016-09-25 10:30:48 +0200 |
---|---|---|
committer | Christoph M. Becker <cmbecker69@gmx.de> | 2016-09-25 10:34:03 +0200 |
commit | c696bc8cfac64a66bb69dffe96d312a621fcdab7 (patch) | |
tree | 5cf87334b08fb64434e003aa83e68fde288f4ed6 | |
parent | c596b02a5b451ad95987f7a8c86b0ba313efa5a8 (diff) | |
download | php-git-c696bc8cfac64a66bb69dffe96d312a621fcdab7.tar.gz |
Fix test_image_equals_file() wrt. palette images
The recently introduced test_image_equals_file() doesn't properly work for
palette images, because in this case only the palette indexes are compared,
what can lead to false positives and negatives as shown in the added test.
To fix that we convert palette images to truecolor, what is supposed to be
faster than calling imagecolorsforindex() for each pixel.
We furthermore rely on PHP's refcounting to free unused images; after all,
this is not C.
-rw-r--r-- | ext/gd/tests/func.inc | 23 | ||||
-rw-r--r-- | ext/gd/tests/test_image_equals_file_palette.phpt | 42 |
2 files changed, 63 insertions, 2 deletions
diff --git a/ext/gd/tests/func.inc b/ext/gd/tests/func.inc index 01ba83102e..708fccd3d1 100644 --- a/ext/gd/tests/func.inc +++ b/ext/gd/tests/func.inc @@ -82,7 +82,9 @@ function test_image_equals_file($filename, $actual) save_actual_image($actual);
return;
}
+ $actual = test_to_truecolor($actual);
$expected = imagecreatefrompng($filename);
+ $expected = test_to_truecolor($expected);
$exp_x = imagesx($expected);
$exp_y = imagesy($expected);
$act_x = imagesx($actual);
@@ -90,7 +92,6 @@ function test_image_equals_file($filename, $actual) if ($exp_x != $act_x || $exp_y != $act_y) {
echo "The image size differs: expected {$exp_x}x{$exp_y}, got {$act_x}x{$act_y}.\n";
save_actual_image($actual);
- imagedestroy($expected);
return;
}
$pixels_changed = 0;
@@ -109,7 +110,25 @@ function test_image_equals_file($filename, $actual) echo "The images differ in {$pixels_changed} pixels.\n";
save_actual_image($actual);
}
- imagedestroy($expected);
+}
+
+/**
+ * Returns the truecolor version of an image.
+ *
+ * @param resource $image
+ * @return resource
+ */
+function test_to_truecolor($image)
+{
+ if (imageistruecolor($image)) {
+ return $image;
+ } else {
+ $width = imagesx($image);
+ $height = imagesy($image);
+ $result = imagecreatetruecolor($width, $height);
+ imagecopy($result, $image, 0,0, 0,0, $width, $height);
+ return $result;
+ }
}
/**
diff --git a/ext/gd/tests/test_image_equals_file_palette.phpt b/ext/gd/tests/test_image_equals_file_palette.phpt new file mode 100644 index 0000000000..130fa43202 --- /dev/null +++ b/ext/gd/tests/test_image_equals_file_palette.phpt @@ -0,0 +1,42 @@ +--TEST--
+test_image_equals_file(): comparing palette images
+--SKIPIF--
+<?php
+if (!extension_loaded('gd')) die('skip gd extension not available');
+?>
+--FILE--
+<?php
+require_once __DIR__ . DIRECTORY_SEPARATOR . 'func.inc';
+
+$im = imagecreate(10, 10);
+imagecolorallocate($im, 255, 255, 255);
+$red = imagecolorallocate($im, 255, 0, 0);
+imagefilledrectangle($im, 3,3, 7,7, $red);
+
+$filename = __DIR__ . DIRECTORY_SEPARATOR . 'test_image_equals_file_palette.png';
+imagepng($im, $filename);
+
+$im = imagecreate(10, 10);
+imagecolorallocate($im, 255, 255, 255);
+$blue = imagecolorallocate($im, 0, 0, 255);
+imagefilledrectangle($im, 3,3, 7,7, $blue);
+
+test_image_equals_file($filename, $im);
+
+$im = imagecreate(10, 10);
+imagecolorallocate($im, 255, 255, 255);
+imagecolorallocate($im, 0, 0, 0);
+$red = imagecolorallocate($im, 255, 0, 0);
+imagefilledrectangle($im, 3,3, 7,7, $red);
+
+test_image_equals_file($filename, $im);
+?>
+===DONE===
+--EXPECT--
+The images differ in 25 pixels.
+The images are equal.
+===DONE===
+--CLEAN--
+<?php
+unlink(__DIR__ . DIRECTORY_SEPARATOR . 'test_image_equals_file_palette.png');
+?>
|