]> granicus.if.org Git - php/commitdiff
Fix #53156: imagerectangle problem with point ordering
authorChristoph M. Becker <cmbecker69@gmx.de>
Mon, 20 Jul 2015 00:11:18 +0000 (02:11 +0200)
committerChristoph M. Becker <cmbecker69@gmx.de>
Mon, 20 Jul 2015 00:14:29 +0000 (02:14 +0200)
Contrary to imagefilledrectangle(), imagerectangle() has the documented
limitation that the given points have to be the upper left and the lower right
corner, respectively. However, libgd already caters to upper right / lower left
pairs, and not catering to the other two combinations seems to be an oversight.

ext/gd/libgd/gd.c
ext/gd/tests/bug53156.phpt [new file with mode: 0644]

index c75c985c4ef8f05f3732f6551741b2d892aa2a7a..f03fd0278a63b0adff0e459817cfa512abd29167 100644 (file)
@@ -2044,7 +2044,9 @@ void gdImageRectangle (gdImagePtr im, int x1, int y1, int x2, int y2, int color)
                t=y1;
                y1 = y2;
                y2 = t;
-
+       }
+       
+       if (x2 < x1) {
                t = x1;
                x1 = x2;
                x2 = t;
diff --git a/ext/gd/tests/bug53156.phpt b/ext/gd/tests/bug53156.phpt
new file mode 100644 (file)
index 0000000..a269369
--- /dev/null
@@ -0,0 +1,59 @@
+--TEST--\r
+Bug #53156 (imagerectangle problem with point ordering)\r
+--SKIPIF--\r
+<?php\r
+if (!extension_loaded('gd')) die('skip gd extension not available');\r
+?>\r
+--FILE--\r
+<?php\r
+function draw_and_check_pixel($x, $y)\r
+{\r
+    global $img, $black, $red;\r
+    \r
+    echo (imagecolorat($img, $x, $y) === $black) ? '+' : '-';\r
+    imagesetpixel($img, $x, $y, $red);\r
+}\r
+\r
+function draw_and_check_rectangle($x1, $y1, $x2, $y2)\r
+{\r
+    global $img, $black;\r
+    \r
+    echo 'Rectangle: ';\r
+    imagerectangle($img, $x1, $y1, $x2, $y2, $black);\r
+    draw_and_check_pixel(($x1 + $x2) / 2, $y1);\r
+    draw_and_check_pixel($x1, ($y1 + $y2) / 2);\r
+    draw_and_check_pixel(($x1 + $x2) / 2, $y2);\r
+    draw_and_check_pixel($x2, ($y1 + $y2) / 2);\r
+    echo PHP_EOL;\r
+}\r
+\r
+$img = imagecreate(110, 210);\r
+$bgnd  = imagecolorallocate($img, 255, 255, 255);\r
+$black = imagecolorallocate($img, 0, 0, 0);\r
+$red = imagecolorallocate($img, 255, 0, 0);\r
+\r
+draw_and_check_rectangle(10, 10, 50, 50);\r
+draw_and_check_rectangle(50, 60, 10, 100);\r
+draw_and_check_rectangle(50, 150, 10, 110);\r
+draw_and_check_rectangle(10, 200, 50, 160);\r
+imagesetthickness($img, 4);\r
+draw_and_check_rectangle(60, 10, 100, 50);\r
+draw_and_check_rectangle(100, 60, 60, 100);\r
+draw_and_check_rectangle(100, 150, 60, 110);\r
+draw_and_check_rectangle(60, 200, 100, 160);\r
+\r
+imagepng($img, __DIR__ . '/bug53156.png');\r
+?>\r
+--CLEAN--\r
+<?php\r
+@unlink(__DIR__ . '/bug53156.png');\r
+?>\r
+--EXPECT--\r
+Rectangle: ++++\r
+Rectangle: ++++\r
+Rectangle: ++++\r
+Rectangle: ++++\r
+Rectangle: ++++\r
+Rectangle: ++++\r
+Rectangle: ++++\r
+Rectangle: ++++\r