]> granicus.if.org Git - php/commitdiff
- fix regression bug24155.phpt and bug39366.phpt
authorPierre Joye <pierre.php@gmail.com>
Fri, 22 Mar 2013 08:21:11 +0000 (09:21 +0100)
committerPierre Joye <pierre.php@gmail.com>
Fri, 22 Mar 2013 08:21:11 +0000 (09:21 +0100)
ext/gd/gd.c
ext/gd/libgd/gd.h
ext/gd/libgd/gd_interpolation.c

index e291793fd774f5ffd0c4e99ab6641632cc3826e2..58027d7d0d6216e1a31111cee3cd9326057a6fff 100644 (file)
@@ -2271,7 +2271,7 @@ PHP_FUNCTION(imagerotate)
 
        ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd);
 
-       im_dst = gdImageRotateGeneric(im_src, (float)degrees, color);
+       im_dst = gdImageRotateInterpolated(im_src, (const float)degrees, color);
 
        if (im_dst != NULL) {
                ZEND_REGISTER_RESOURCE(return_value, im_dst, le_gd);
index 28c8562f66e6d7c5fdf53e6dedd9c84c93d65531..44c7c8a327bcf779d29d56c6795b58d9ce5f511c 100644 (file)
@@ -844,8 +844,7 @@ gdImagePtr gdImageRotateNearestNeighbour(gdImagePtr src, const float degrees, co
 gdImagePtr gdImageRotateBilinear(gdImagePtr src, const float degrees, const int bgColor);
 gdImagePtr gdImageRotateBicubicFixed(gdImagePtr src, const float degrees, const int bgColor);
 gdImagePtr gdImageRotateGeneric(gdImagePtr src, const float degrees, const int bgColor);
-
-
+gdImagePtr gdImageRotateInterpolated(const gdImagePtr src, const float angle, int bgcolor);
 
 typedef enum {
        GD_AFFINE_TRANSLATE = 0,
index c44f5041067620c66af71ae3a687b9c5dd624a2d..0215c23369cb64104c267e64ec6785d706d14db6 100644 (file)
@@ -1729,6 +1729,7 @@ gdImagePtr gdImageRotateNearestNeighbour(gdImagePtr src, const float degrees, co
 gdImagePtr gdImageRotateGeneric(gdImagePtr src, const float degrees, const int bgColor)
 {
        float _angle = ((float) (-degrees / 180.0f) * (float)M_PI);
+       const int angle_rounded = (int)floor(degrees * 100);
        const int src_w  = gdImageSX(src);
        const int src_h = gdImageSY(src);
        const unsigned int new_width = (unsigned int)(abs((int)(src_w * cos(_angle))) + abs((int)(src_h * sin(_angle))) + 0.5f);
@@ -2194,6 +2195,16 @@ gdImagePtr gdImageRotateBicubicFixed(gdImagePtr src, const float degrees, const
 
 gdImagePtr gdImageRotateInterpolated(const gdImagePtr src, const float angle, int bgcolor)
 {
+       const int angle_rounded = (int)floor(angle * 100);
+
+       switch (angle_rounded) {
+               case 9000:
+                       return gdImageRotate90(src, 0);
+               case 18000:
+                       return gdImageRotate180(src, 0);
+               case 27000:
+                       return gdImageRotate270(src, 0);
+       }
 
        if (src == NULL || src->interpolation_id < 1 || src->interpolation_id > GD_METHOD_COUNT) {
                return NULL;
@@ -2208,47 +2219,12 @@ gdImagePtr gdImageRotateInterpolated(const gdImagePtr src, const float angle, in
                        return gdImageRotateBilinear(src, angle, bgcolor);
                        break;
 
-               case GD_BICUBIC:
-                       return gdImageRotateBicubicFixed(src, angle, bgcolor);
-                       break;
-
                case GD_BICUBIC_FIXED:
-                       return gdImageRotateNearestNeighbour(src, angle, bgcolor);
-                       break;
-
-               case GD_WEIGHTED4:
-                       return gdImageRotateNearestNeighbour(src, angle, bgcolor);
-                       break;
-
-               case GD_BSPLINE:
-                       return gdImageRotateNearestNeighbour(src, angle, bgcolor);
-                       break;
-
-               case GD_BOX:
-                       return gdImageRotateNearestNeighbour(src, angle, bgcolor);
-                       break;
-
-               case GD_HERMITE:
-                       return gdImageRotateNearestNeighbour(src, angle, bgcolor);
+                       return gdImageRotateBicubicFixed(src, angle, bgcolor);
                        break;
 
-               case GD_HAMMING:
-               break;
-               case GD_SINC:
-               break;
-               case GD_BLACKMAN:
-               break;
-
-               case GD_GAUSSIAN:
-               break;
-               case GD_QUADRATIC:
-               break;
-               case GD_MITCHELL:
-               break;
-               case GD_CATMULLROM:
-               break;
-               case GD_POWER:
-               break;
+               default:
+                       gdImageRotateGeneric(src, angle, bgcolor);
        }
        return NULL;
 }