diff --git a/ext/gd/libgd/gd_interpolation.c b/ext/gd/libgd/gd_interpolation.c index ca0352d1af4..ac55dd43b64 100644 --- a/ext/gd/libgd/gd_interpolation.c +++ b/ext/gd/libgd/gd_interpolation.c @@ -755,8 +755,8 @@ static int getPixelInterpolateWeight(gdImagePtr im, const double x, const double */ int getPixelInterpolated(gdImagePtr im, const double x, const double y, const int bgColor) { - const int xi=(int)((x) < 0 ? x - 1: x); - const int yi=(int)((y) < 0 ? y - 1: y); + const int xi=(int)(x); + const int yi=(int)(y); int yii; int i; double kernel, kernel_cache_y; @@ -1702,13 +1702,6 @@ gdImageRotateGeneric(gdImagePtr src, const float degrees, const int bgColor) int new_width, new_height; gdRect bbox; - const gdFixed f_slop_y = f_sin; - const gdFixed f_slop_x = f_cos; - const gdFixed f_slop = f_slop_x > 0 && f_slop_y > 0 ? - (f_slop_x > f_slop_y ? gd_divfx(f_slop_y, f_slop_x) : gd_divfx(f_slop_x, f_slop_y)) - : 0; - - if (bgColor < 0) { return NULL; } @@ -1734,15 +1727,10 @@ gdImageRotateGeneric(gdImagePtr src, const float degrees, const int bgColor) long m = gd_fxtoi(f_m); long n = gd_fxtoi(f_n); - if ((n <= 0) || (m <= 0) || (m >= src_h) || (n >= src_w)) { + if (m < -1 || n < -1 || m >= src_h || n >= src_w ) { dst->tpixels[dst_offset_y][dst_offset_x++] = bgColor; - } else if ((n <= 1) || (m <= 1) || (m >= src_h - 1) || (n >= src_w - 1)) { - register int c = getPixelInterpolated(src, n, m, bgColor); - c = c | (( gdTrueColorGetAlpha(c) + ((int)(127* gd_fxtof(f_slop)))) << 24); - - dst->tpixels[dst_offset_y][dst_offset_x++] = _color_blend(bgColor, c); } else { - dst->tpixels[dst_offset_y][dst_offset_x++] = getPixelInterpolated(src, n, m, bgColor); + dst->tpixels[dst_offset_y][dst_offset_x++] = getPixelInterpolated(src, gd_fxtod(f_n), gd_fxtod(f_m), bgColor); } } dst_offset_y++; diff --git a/ext/gd/tests/gd223.phpt b/ext/gd/tests/gd223.phpt new file mode 100644 index 00000000000..c378ab199ac --- /dev/null +++ b/ext/gd/tests/gd223.phpt @@ -0,0 +1,26 @@ +--TEST-- +libgd bug 223 (gdImageRotateGeneric() does not properly interpolate) +--EXTENSIONS-- +gd +--SKIPIF-- + +--FILE-- + +--EXPECT-- +The images are equal. diff --git a/ext/gd/tests/gd223.png b/ext/gd/tests/gd223.png new file mode 100644 index 00000000000..02e10e2cc3a Binary files /dev/null and b/ext/gd/tests/gd223.png differ