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.
This commit is contained in:
Christoph M. Becker 2015-07-13 01:29:01 +02:00
parent ecd32e437e
commit d87a3312e3
2 changed files with 31 additions and 6 deletions

View File

@ -2093,12 +2093,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);
}
}
}

View File

@ -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)