From bea0320749d5cef45b12a2c2f3f07fd29f99a76f Mon Sep 17 00:00:00 2001 From: Takeshi Abe Date: Wed, 20 Jan 2010 09:39:06 +0000 Subject: [PATCH] fix libgd FS100 (spurious horizontal line drawn by gdImageFilledPolygon) --- ext/gd/libgd/gd.c | 10 +-- ext/gd/tests/libgd00100.phpt | 119 +++++++++++++++++++++++++++++++++++ 2 files changed, 124 insertions(+), 5 deletions(-) create mode 100644 ext/gd/tests/libgd00100.phpt 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-- + +--FILE-- + +--EXPECTF-- +2e6cf558bb4dadf60c8b608d5f8cda4e -- 2.40.0