summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristoph M. Becker <cmb@php.net>2015-07-13 01:29:01 +0200
committerChristoph M. Becker <cmb@php.net>2015-07-13 01:33:00 +0200
commit094decc3c0b62a72bacebaf85c6269049bf12885 (patch)
tree893b5edf3e8af0df52a5d5030b48f159b43526df
parent591fd4cdc3429931951ec08c7e5edd7af6e1c916 (diff)
downloadphp-git-094decc3c0b62a72bacebaf85c6269049bf12885.tar.gz
Fix #53154: Zero-height rectangle has whiskers
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.
-rw-r--r--ext/gd/libgd/gd.c16
-rw-r--r--ext/gd/tests/bug53154.phpt21
2 files changed, 31 insertions, 6 deletions
diff --git a/ext/gd/libgd/gd.c b/ext/gd/libgd/gd.c
index d73f0943af..c75c985c4e 100644
--- a/ext/gd/libgd/gd.c
+++ b/ext/gd/libgd/gd.c
@@ -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
index 0000000000..6cbae2016c
--- /dev/null
+++ b/ext/gd/tests/bug53154.phpt
@@ -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)