]> granicus.if.org Git - php/commitdiff
Fixed Bug #64962 imagerotate produce corrupted image
authorRemi Collet <remi@php.net>
Mon, 3 Jun 2013 13:01:48 +0000 (15:01 +0200)
committerRemi Collet <remi@php.net>
Mon, 3 Jun 2013 13:01:48 +0000 (15:01 +0200)
See https://bitbucket.org/libgd/gd-libgd/issue/67/problem-with-gdrotate

This computation need to be done in signed range.

NEWS
ext/gd/libgd/gd_interpolation.c

diff --git a/NEWS b/NEWS
index c09b009c7bb2837010aaa3afd47fdd9368c3695a..25e3b205bba1af1471fc74297810f40d0bd34548 100644 (file)
--- a/NEWS
+++ b/NEWS
@@ -7,6 +7,7 @@ PHP                                                                        NEWS
 
 - GD:
   . Fixed Bug #64961 (segfault in imagesetinterpolation). (Remi)
+  . Fixed Bug #64962 (imagerotate produces corrupted image). (Remi)
 
 - Hash:
   . Fixed Bug #64745 (hash_pbkdf2() truncates data when using default length
index bcd76e97078ab195914a0716e8334735c283e8cd..9652a3a18acaa9212e52e9c86d20173d97343cd7 100644 (file)
@@ -1690,8 +1690,8 @@ gdImagePtr gdImageRotateNearestNeighbour(gdImagePtr src, const float degrees, co
                unsigned int j;
                dst_offset_x = 0;
                for (j = 0; j < new_width; j++) {
-                       gdFixed f_i = gd_itofx(i - new_height/2);
-                       gdFixed f_j = gd_itofx(j-new_width/2);
+                       gdFixed f_i = gd_itofx((int)i - (int)new_height/2);
+                       gdFixed f_j = gd_itofx((int)j - (int)new_width/2);
                        gdFixed f_m = gd_mulfx(f_j,f_sin) + gd_mulfx(f_i,f_cos) + f_0_5 + f_H;
                        gdFixed f_n = gd_mulfx(f_j,f_cos) - gd_mulfx(f_i,f_sin) + f_0_5 + f_W;
                        long m = gd_fxtoi(f_m);
@@ -1753,8 +1753,8 @@ gdImagePtr gdImageRotateGeneric(gdImagePtr src, const float degrees, const int b
                unsigned int j;
                dst_offset_x = 0;
                for (j = 0; j < new_width; j++) {
-                       gdFixed f_i = gd_itofx(i - new_height/ 2);
-                       gdFixed f_j = gd_itofx(j  -new_width / 2);
+                       gdFixed f_i = gd_itofx((int)i - (int)new_height/ 2);
+                       gdFixed f_j = gd_itofx((int)j - (int)new_width / 2);
                        gdFixed f_m = gd_mulfx(f_j,f_sin) + gd_mulfx(f_i,f_cos) + f_0_5 + f_H;
                        gdFixed f_n = gd_mulfx(f_j,f_cos) - gd_mulfx(f_i,f_sin) + f_0_5 + f_W;
                        long m = gd_fxtoi(f_m);
@@ -1814,8 +1814,8 @@ gdImagePtr gdImageRotateBilinear(gdImagePtr src, const float degrees, const int
                dst_offset_x = 0;
 
                for (j=0; j < new_width; j++) {
-                       const gdFixed f_i = gd_itofx(i-new_height/2);
-                       const gdFixed f_j = gd_itofx(j-new_width/2);
+                       const gdFixed f_i = gd_itofx((int)i - (int)new_height/2);
+                       const gdFixed f_j = gd_itofx((int)j - (int)new_width/2);
                        const gdFixed f_m = gd_mulfx(f_j,f_sin) + gd_mulfx(f_i,f_cos) + f_0_5 + f_H;
                        const gdFixed f_n = gd_mulfx(f_j,f_cos) - gd_mulfx(f_i,f_sin) + f_0_5 + f_W;
                        const unsigned int m = gd_fxtoi(f_m);
@@ -1941,8 +1941,8 @@ gdImagePtr gdImageRotateBicubicFixed(gdImagePtr src, const float degrees, const
                dst_offset_x = 0;
 
                for (j=0; j < new_width; j++) {
-                       const gdFixed f_i = gd_itofx(i-new_height/2);
-                       const gdFixed f_j = gd_itofx(j-new_width/2);
+                       const gdFixed f_i = gd_itofx((int)i - (int)new_height/2);
+                       const gdFixed f_j = gd_itofx((int)j - (int)new_width/2);
                        const gdFixed f_m = gd_mulfx(f_j,f_sin) + gd_mulfx(f_i,f_cos) + f_0_5 + f_H;
                        const gdFixed f_n = gd_mulfx(f_j,f_cos) - gd_mulfx(f_i,f_sin) + f_0_5 + f_W;
                        const int m = gd_fxtoi(f_m);