From 8aa511f1fc8123bba6107fa856b0b6bf298de87c Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Wed, 15 Jun 2016 20:58:06 +0200 Subject: [PATCH] Fix #43475: Styled thick horizontal lines are scrambled Thick lines are drawn by gdImageFilledRectangle(), which iterates over the x ordinate first (Z order) to apply the style pattern. While this works fine for vertical and diagonal lines, it obviously fails for horizontal lines, which have to be iterated over in N order. To fix this bug, we introduce the helpers gdImageFilled(H|V)Rectangle(), which may be reused for other purposes as well. This is basically the same fix as libgd/libgd/c2b91dbc. --- ext/gd/libgd/gd.c | 54 +++++++++++++++++++++++++++++++-- ext/gd/tests/bug43475.phpt | 59 +++++++++++++++++++++++++++++++++++++ ext/gd/tests/bug43475.png | Bin 0 -> 4697 bytes 3 files changed, 111 insertions(+), 2 deletions(-) create mode 100644 ext/gd/tests/bug43475.phpt create mode 100644 ext/gd/tests/bug43475.png diff --git a/ext/gd/libgd/gd.c b/ext/gd/libgd/gd.c index 5170f4f8c0..89c7dbdd58 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 0000000000..b29b9800a5 --- /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 0000000000000000000000000000000000000000..774270f63db86efd053f126ab9d66a9e50569768 GIT binary patch literal 4697 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 WgTe{iOXy|@=DuZzTQ%)K;(q~-Qc&{% literal 0 HcmV?d00001 -- 2.50.1