]> granicus.if.org Git - php/commitdiff
Fix #53154: Zero-height rectangle has whiskers
authorChristoph M. Becker <cmb@php.net>
Sun, 12 Jul 2015 23:29:01 +0000 (01:29 +0200)
committerChristoph M. Becker <cmb@php.net>
Sun, 12 Jul 2015 23:33:00 +0000 (01:33 +0200)
To avoid drawing the corner pixels twice, gdImageRectangle() draws the vertical
lines 2 points shorter than the actual side of the rectangle. However, this
causes "whiskers" for rectangles with height 0. This patch fixes this issue and
at the same time optimizes the algorithm by drawing only a single line for zero
height and zero width rectangles.

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

index d73f0943af8f3ab694d0c8834ef7604760ba54e6..c75c985c4ef8f05f3732f6551741b2d892aa2a7a 100644 (file)
@@ -2095,12 +2095,16 @@ void gdImageRectangle (gdImagePtr im, int x1, int y1, int x2, int y2, int color)
 
                return;
        } else {
-               y1v = y1h + 1;
-               y2v = y2h - 1;
-               gdImageLine(im, x1h, y1h, x2h, y1h, color);
-               gdImageLine(im, x1h, y2h, x2h, y2h, color);
-               gdImageLine(im, x1v, y1v, x1v, y2v, color);
-               gdImageLine(im, x2v, y1v, x2v, y2v, color);
+               if (x1 == x2 || y1 == y2) {
+                       gdImageLine(im, x1, y1, x2, y2, color);
+               } else {
+                       y1v = y1h + 1;
+                       y2v = y2h - 1;
+                       gdImageLine(im, x1h, y1h, x2h, y1h, color);
+                       gdImageLine(im, x1h, y2h, x2h, y2h, color);
+                       gdImageLine(im, x1v, y1v, x1v, y2v, color);
+                       gdImageLine(im, x2v, y1v, x2v, y2v, color);
+               }
        }
 }
 
diff --git a/ext/gd/tests/bug53154.phpt b/ext/gd/tests/bug53154.phpt
new file mode 100644 (file)
index 0000000..6cbae20
--- /dev/null
@@ -0,0 +1,21 @@
+--TEST--
+Bug #53154 (Zero-height rectangle has whiskers)
+--SKIPIF--
+<?php
+if (!extension_loaded('gd')) die('skip gd extension not available');
+?>
+--FILE--
+<?php
+$im = imagecreatetruecolor(100, 10);
+$red = imagecolorallocate($im, 255, 0, 0);
+imagerectangle($im, 5, 5, 95, 5, $red);
+var_dump(imagecolorat($im, 5, 4) !== $red);
+var_dump(imagecolorat($im, 5, 6) !== $red);
+var_dump(imagecolorat($im, 95, 4) !== $red);
+var_dump(imagecolorat($im, 95, 6) !== $red);
+?>
+--EXPECT--
+bool(true)
+bool(true)
+bool(true)
+bool(true)