diff --git a/ext/gd/libgd/gd.c b/ext/gd/libgd/gd.c index 5170f4f8c04..89c7dbdd585 100644 --- a/ext/gd/libgd/gd.c +++ b/ext/gd/libgd/gd.c @@ -1051,11 +1051,13 @@ void gdImageAABlend (gdImagePtr im) } } +static void _gdImageFilledHRectangle (gdImagePtr im, int x1, int y1, int x2, int y2, int color); + static void gdImageHLine(gdImagePtr im, int y, int x1, int x2, int col) { if (im->thick > 1) { int thickhalf = im->thick >> 1; - gdImageFilledRectangle(im, x1, y - thickhalf, x2, y + im->thick - thickhalf - 1, col); + _gdImageFilledHRectangle(im, x1, y - thickhalf, x2, y + im->thick - thickhalf - 1, col); } else { if (x2 < x1) { int t = x2; @@ -2120,10 +2122,53 @@ void gdImageRectangle (gdImagePtr im, int x1, int y1, int x2, int y2, int color) } } -void gdImageFilledRectangle (gdImagePtr im, int x1, int y1, int x2, int y2, int color) +static void _gdImageFilledHRectangle (gdImagePtr im, int x1, int y1, int x2, int y2, int color) { int x, y; + if (x1 == x2 && y1 == y2) { + gdImageSetPixel(im, x1, y1, color); + return; + } + + if (x1 > x2) { + x = x1; + x1 = x2; + x2 = x; + } + + if (y1 > y2) { + y = y1; + y1 = y2; + y2 = y; + } + + if (x1 < 0) { + x1 = 0; + } + + if (x2 >= gdImageSX(im)) { + x2 = gdImageSX(im) - 1; + } + + if (y1 < 0) { + y1 = 0; + } + + if (y2 >= gdImageSY(im)) { + y2 = gdImageSY(im) - 1; + } + + for (x = x1; (x <= x2); x++) { + for (y = y1; (y <= y2); y++) { + gdImageSetPixel (im, x, y, color); + } + } +} + +static void _gdImageFilledVRectangle (gdImagePtr im, int x1, int y1, int x2, int y2, int color) +{ + int x, y; if (x1 == x2 && y1 == y2) { gdImageSetPixel(im, x1, y1, color); @@ -2165,6 +2210,11 @@ void gdImageFilledRectangle (gdImagePtr im, int x1, int y1, int x2, int y2, int } } +void gdImageFilledRectangle (gdImagePtr im, int x1, int y1, int x2, int y2, int color) +{ + _gdImageFilledVRectangle(im, x1, y1, x2, y2, color); +} + void gdImageCopy (gdImagePtr dst, gdImagePtr src, int dstX, int dstY, int srcX, int srcY, int w, int h) { int c; diff --git a/ext/gd/tests/bug43475.phpt b/ext/gd/tests/bug43475.phpt new file mode 100644 index 00000000000..b29b9800a58 --- /dev/null +++ b/ext/gd/tests/bug43475.phpt @@ -0,0 +1,59 @@ +--TEST-- +Bug #43475 (Thick styled lines have scrambled patterns) +--SKIPIF-- + +--FILE-- + +--EXPECT-- +bool(true) diff --git a/ext/gd/tests/bug43475.png b/ext/gd/tests/bug43475.png new file mode 100644 index 00000000000..774270f63db Binary files /dev/null and b/ext/gd/tests/bug43475.png differ