From: Takeshi Abe <tabe@php.net> Date: Wed, 20 Jan 2010 09:39:06 +0000 (+0000) Subject: fix libgd FS100 (spurious horizontal line drawn by gdImageFilledPolygon) X-Git-Tag: php-5.4.0alpha1~416 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=bea0320749d5cef45b12a2c2f3f07fd29f99a76f;p=php fix libgd FS100 (spurious horizontal line drawn by gdImageFilledPolygon) --- diff --git a/ext/gd/libgd/gd.c b/ext/gd/libgd/gd.c index bbdfbe250b..e4e2e0f1ab 100644 --- a/ext/gd/libgd/gd.c +++ b/ext/gd/libgd/gd.c @@ -2614,7 +2614,7 @@ void gdImageFilledPolygon (gdImagePtr im, gdPointPtr p, int n, int c) { int i; int y; - int miny, maxy; + int miny, maxy, pmaxy; int x1, y1; int x2, y2; int ind1, ind2; @@ -2658,7 +2658,7 @@ void gdImageFilledPolygon (gdImagePtr im, gdPointPtr p, int n, int c) maxy = p[i].y; } } - + pmaxy = maxy; /* 2.0.16: Optimization by Ilia Chipitsine -- don't waste time offscreen */ if (miny < 0) { miny = 0; @@ -2700,13 +2700,13 @@ void gdImageFilledPolygon (gdImagePtr im, gdPointPtr p, int n, int c) */ if (y >= y1 && y < y2) { im->polyInts[ints++] = (float) ((y - y1) * (x2 - x1)) / (float) (y2 - y1) + 0.5 + x1; - } else if (y == maxy && y > y1 && y <= y2) { - im->polyInts[ints++] = (float) ((y - y1) * (x2 - x1)) / (float) (y2 - y1) + 0.5 + x1; + } else if (y == pmaxy && y == y2) { + im->polyInts[ints++] = x2; } } qsort(im->polyInts, ints, sizeof(int), gdCompareInt); - for (i = 0; i < ints; i += 2) { + for (i = 0; i < ints - 1; i += 2) { gdImageLine(im, im->polyInts[i], y, im->polyInts[i + 1], y, fill_color); } } diff --git a/ext/gd/tests/libgd00100.phpt b/ext/gd/tests/libgd00100.phpt new file mode 100644 index 0000000000..abf4ee3339 --- /dev/null +++ b/ext/gd/tests/libgd00100.phpt @@ -0,0 +1,119 @@ +--TEST-- +libgd #100 (spurious horizontal line drawn by gdImageFilledPolygon) +--SKIPIF-- +<?php + if (!extension_loaded('gd')) die("skip gd extension not available\n"); + if (!GD_BUNDLED) die("skip requires bundled GD library\n"); +?> +--FILE-- +<?php +$im = imagecreatetruecolor(256, 256); + +$white = imagecolorallocatealpha($im, 255, 255, 255, 10); +$black = imagecolorallocatealpha($im, 0, 0, 0, 10); +$red = imagecolorallocatealpha($im, 255, 0, 0, 10); +$green = imagecolorallocatealpha($im, 0, 255, 0, 10); +$blue = imagecolorallocatealpha($im, 0, 0, 255, 10); +$yellow = imagecolorallocatealpha($im, 255, 255, 0, 10); +$cyan = imagecolorallocatealpha($im, 0, 255, 255, 10); +$magenta = imagecolorallocatealpha($im, 255, 0, 255, 10); +$purple = imagecolorallocatealpha($im, 100, 0, 100, 10); + +imagefilledrectangle($im, 0, 0, 255, 255, $white); + +// M (bridge) +$top = 240; +$bot = 255; +$d = 30; +$x = 100; +$points = array( + $x, $top, + $x+2*$d, $top, + $x+2*$d, $bot, + $x+$d, ($top+$bot)/2, + $x, $bot +); +imagefilledpolygon($im, $points, 5, $yellow); + +// left-facing M not on baseline +$top = 40; +$bot = 70; +$left = 120; +$right = 180; +$points = array( + $left, $top, + $right, $top, + $right, $bot, + $left, $bot, + ($left+$right)/2, ($top+$bot)/2 +); +imagefilledpolygon($im, $points, 5, $purple); + +// left-facing M on baseline +$top = 240; +$bot = 270; +$left = 20; +$right = 80; +$points = array( + $left, $top, + $right, $top, + $right, $bot, + $left, $bot, + ($left+$right)/2, ($top+$bot)/2 +); +imagefilledpolygon($im, $points, 5, $magenta); + +// left-facing M on ceiling +$top = -15; +$bot = 15; +$left = 20; +$right = 80; +$points = array( + $left, $top, + $right, $top, + $right, $bot, + $left, $bot, + ($left+$right)/2, ($top+$bot)/2 +); +imagefilledpolygon($im, $points, 5, $blue); + +$d = 30; +$x = 150; +$y = 150; +$diamond = array($x-$d, $y, $x, $y+$d, $x+$d, $y, $x, $y-$d); +imagefilledpolygon($im, $diamond, 4, $green); + +$x = 180; +$y = 225; +$diamond = array($x-$d, $y, $x, $y+$d, $x+$d, $y, $x, $y-$d); +imagefilledpolygon($im, $diamond, 4, $red); + +$x = 225; +$y = 255; +$diamond = array($x-$d, $y, $x, $y+$d, $x+$d, $y, $x, $y-$d); +imagefilledpolygon($im, $diamond, 4, $cyan); + +// M (bridge) not touching bottom boundary +$top = 100; +$bot = 150; +$x = 30; +$points = array( + $x, $top, + $x+2*$d, $top, + $x+2*$d, $bot, + $x+$d, ($top+$bot)/2, + $x, $bot +); +imagefilledpolygon($im, $points, 5, $black); + +ob_start(); +imagepng($im); +$png = ob_get_contents(); +ob_end_clean(); + +echo md5($png); + +imagedestroy($im); +?> +--EXPECTF-- +2e6cf558bb4dadf60c8b608d5f8cda4e