]> granicus.if.org Git - php/commitdiff
fix #65070, bgcolor does not use the same format as the input image with imagerotate
authorPierre Joye <pierre.php@gmail.com>
Thu, 20 Jun 2013 20:19:33 +0000 (22:19 +0200)
committerPierre Joye <pierre.php@gmail.com>
Thu, 20 Jun 2013 20:19:33 +0000 (22:19 +0200)
ext/gd/libgd/gd.c
ext/gd/libgd/gd_interpolation.c

index 81eba52c826b9578b676441f7320bc6933c106dd..7ed6617c57bcc4a3f48b191990be7a7b45621046 100644 (file)
@@ -3044,7 +3044,7 @@ int gdImagePaletteToTrueColor(gdImagePtr src)
                        for (x = 0; x < sx; x++) {
                                const unsigned char c = *(src_row + x);
                                if (c == src->transparent) {
-                                       *(dst_row + x) = gdTrueColorAlpha(0, 0, 0, 127);;
+                                       *(dst_row + x) = gdTrueColorAlpha(0, 0, 0, 127);
                                } else {
                                        *(dst_row + x) = gdTrueColorAlpha(src->red[c], src->green[c], src->blue[c], src->alpha[c]);
                                }
@@ -3061,6 +3061,12 @@ int gdImagePaletteToTrueColor(gdImagePtr src)
        src->pixels = NULL;
        src->alphaBlendingFlag = 0;
        src->saveAlphaFlag = 1;
+
+       if (src->transparent >= 0) {
+               const unsigned char c = src->transparent;
+               src->transparent =  gdTrueColorAlpha(src->red[c], src->green[c], src->blue[c], src->alpha[c]);
+       }
+
        return 1;
 
 clean_on_error:
index 9652a3a18acaa9212e52e9c86d20173d97343cd7..e3247a78c1bf7517a8dc471b4248f6764fcba15a 100644 (file)
@@ -1674,13 +1674,6 @@ gdImagePtr gdImageRotateNearestNeighbour(gdImagePtr src, const float degrees, co
        unsigned int i;
        gdImagePtr dst;
 
-       /* impact perf a bit, but not that much. Implementation for palette
-          images can be done at a later point.
-       */
-       if (src->trueColor == 0) {
-               gdImagePaletteToTrueColor(src);
-       }
-
        dst = gdImageCreateTrueColor(new_width, new_height);
        if (!dst) {
                return NULL;
@@ -1736,12 +1729,6 @@ gdImagePtr gdImageRotateGeneric(gdImagePtr src, const float degrees, const int b
                                                        f_slop_x > f_slop_y ? gd_divfx(f_slop_y, f_slop_x) : gd_divfx(f_slop_x, f_slop_y)
                                                : 0;
 
-       /* impact perf a bit, but not that much. Implementation for palette
-          images can be done at a later point.
-       */
-       if (src->trueColor == 0) {
-               gdImagePaletteToTrueColor(src);
-       }
 
        dst = gdImageCreateTrueColor(new_width, new_height);
        if (!dst) {
@@ -1796,13 +1783,6 @@ gdImagePtr gdImageRotateBilinear(gdImagePtr src, const float degrees, const int
        unsigned int src_offset_x, src_offset_y;
        gdImagePtr dst;
 
-       /* impact perf a bit, but not that much. Implementation for palette
-          images can be done at a later point.
-       */
-       if (src->trueColor == 0) {
-               gdImagePaletteToTrueColor(src);
-       }
-
        dst = gdImageCreateTrueColor(new_width, new_height);
        if (dst == NULL) {
                return NULL;
@@ -1922,13 +1902,6 @@ gdImagePtr gdImageRotateBicubicFixed(gdImagePtr src, const float degrees, const
        unsigned int i;
        gdImagePtr dst;
 
-       /* impact perf a bit, but not that much. Implementation for palette
-          images can be done at a later point.
-       */
-       if (src->trueColor == 0) {
-               gdImagePaletteToTrueColor(src);
-       }
-
        dst = gdImageCreateTrueColor(new_width, new_height);
 
        if (dst == NULL) {
@@ -2177,11 +2150,21 @@ 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);
-       
+
        if (bgcolor < 0) {
                return NULL;
        }
 
+       /* impact perf a bit, but not that much. Implementation for palette
+          images can be done at a later point.
+       */
+       if (src->trueColor == 0) {
+               if (bgcolor >= 0) {
+                       bgcolor =  gdTrueColorAlpha(src->red[bgcolor], src->green[bgcolor], src->blue[bgcolor], src->alpha[bgcolor]);
+               }
+               gdImagePaletteToTrueColor(src);
+       }
+
        /* no interpolation needed here */
        switch (angle_rounded) {
                case 9000: