Commit:    f05972ddbf703da35ae9bde5c89d6f55f178b939
Author:    Pierre Joye <pierre....@gmail.com>         Fri, 22 Mar 2013 09:21:11 
+0100
Parents:   4e6d54f5a7003b73f12d86d7f5cba0a37ce40930
Branches:  master

Link:       
http://git.php.net/?p=php-src.git;a=commitdiff;h=f05972ddbf703da35ae9bde5c89d6f55f178b939

Log:
- fix regression bug24155.phpt and bug39366.phpt

Bugs:
https://bugs.php.net/24155
https://bugs.php.net/39366

Changed paths:
  M  ext/gd/gd.c
  M  ext/gd/libgd/gd.h
  M  ext/gd/libgd/gd_interpolation.c


Diff:
diff --git a/ext/gd/gd.c b/ext/gd/gd.c
index e291793..58027d7 100644
--- a/ext/gd/gd.c
+++ b/ext/gd/gd.c
@@ -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);
diff --git a/ext/gd/libgd/gd.h b/ext/gd/libgd/gd.h
index 28c8562..44c7c8a 100644
--- a/ext/gd/libgd/gd.h
+++ b/ext/gd/libgd/gd.h
@@ -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,
diff --git a/ext/gd/libgd/gd_interpolation.c b/ext/gd/libgd/gd_interpolation.c
index c44f504..0215c23 100644
--- a/ext/gd/libgd/gd_interpolation.c
+++ b/ext/gd/libgd/gd_interpolation.c
@@ -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;
 }


--
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to