pajoye Sun Mar 27 18:43:52 2005 EDT Modified files: /php-src/ext/gd gd.c /php-src/ext/gd/libgd gd.c gd.h Log: - allow to keep or ignore the transparent color in imagerotate (thx Ken Coar to report this "bug") - be sure to restore alphablending in imagefill - use zend_parse_parameter in imagerotate
http://cvs.php.net/diff.php/php-src/ext/gd/gd.c?r1=1.306&r2=1.307&ty=u Index: php-src/ext/gd/gd.c diff -u php-src/ext/gd/gd.c:1.306 php-src/ext/gd/gd.c:1.307 --- php-src/ext/gd/gd.c:1.306 Mon Jan 17 12:07:28 2005 +++ php-src/ext/gd/gd.c Sun Mar 27 18:43:51 2005 @@ -18,7 +18,7 @@ +----------------------------------------------------------------------+ */ -/* $Id: gd.c,v 1.306 2005/01/17 17:07:28 sniper Exp $ */ +/* $Id: gd.c,v 1.307 2005/03/27 23:43:51 pajoye Exp $ */ /* gd 1.2 is copyright 1994, 1995, Quest Protein Database Center, Cold Spring Harbor Labs. */ @@ -1208,23 +1208,19 @@ Rotate an image using a custom angle */ PHP_FUNCTION(imagerotate) { - zval **SIM, **ANGLE, **BGDCOLOR; + zval *SIM; gdImagePtr im_dst, im_src; double degrees; long color; + long ignoretransparent = 0; - if (ZEND_NUM_ARGS() != 3 || zend_get_parameters_ex(3, &SIM, &ANGLE, &BGDCOLOR) == FAILURE) { - ZEND_WRONG_PARAM_COUNT(); + if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "rdl|l", &SIM, °rees, &color, &ignoretransparent) == FAILURE) { + RETURN_FALSE; } - ZEND_FETCH_RESOURCE(im_src, gdImagePtr, SIM, -1, "Image", le_gd); - - convert_to_long_ex(BGDCOLOR); - color = Z_LVAL_PP(BGDCOLOR); + ZEND_FETCH_RESOURCE(im_src, gdImagePtr, &SIM, -1, "Image", le_gd); - convert_to_double_ex(ANGLE); - degrees = Z_DVAL_PP(ANGLE); - im_dst = gdImageRotate(im_src, degrees, color); + im_dst = gdImageRotate(im_src, degrees, color, ignoretransparent); if (im_dst != NULL) { ZEND_REGISTER_RESOURCE(return_value, im_dst, le_gd); http://cvs.php.net/diff.php/php-src/ext/gd/libgd/gd.c?r1=1.83&r2=1.84&ty=u Index: php-src/ext/gd/libgd/gd.c diff -u php-src/ext/gd/libgd/gd.c:1.83 php-src/ext/gd/libgd/gd.c:1.84 --- php-src/ext/gd/libgd/gd.c:1.83 Wed Nov 17 15:19:35 2004 +++ php-src/ext/gd/libgd/gd.c Sun Mar 27 18:43:52 2005 @@ -1890,6 +1890,7 @@ if (nc==gdTiled){ _gdImageFillTiled(im,x,y,nc); + im->alphaBlendingFlag = alphablending_bak; return; } @@ -2192,7 +2193,7 @@ int tox, toy; int ncR, ncG, ncB; toy = dstY; - +printf("srccpopy:%X", src->transparent); for (y = srcY; y < (srcY + h); y++) { tox = dstX; for (x = srcX; x < (srcX + w); x++) { @@ -2493,7 +2494,7 @@ #endif /* ROTATE_PI */ #define ROTATE_DEG2RAD 3.1415926535897932384626433832795/180 -void gdImageSkewX (gdImagePtr dst, gdImagePtr src, int uRow, int iOffset, double dWeight, int clrBack) +void gdImageSkewX (gdImagePtr dst, gdImagePtr src, int uRow, int iOffset, double dWeight, int clrBack, int ignoretransparent) { typedef int (*FuncPtr)(gdImagePtr, int, int); int i, r, g, b, a, clrBackR, clrBackG, clrBackB, clrBackA; @@ -2558,10 +2559,14 @@ a = 127; } - pxlSrc = gdImageColorAllocateAlpha(dst, r, g, b, a); + if (ignoretransparent && pxlSrc == dst->transparent) { + pxlSrc = dst->transparent; + } else { + pxlSrc = gdImageColorAllocateAlpha(dst, r, g, b, a); - if (pxlSrc == -1) { - pxlSrc = gdImageColorClosestAlpha(dst, r, g, b, a); + if (pxlSrc == -1) { + pxlSrc = gdImageColorClosestAlpha(dst, r, g, b, a); + } } if ((i + iOffset >= 0) && (i + iOffset < dst->sx)) { @@ -2586,7 +2591,7 @@ } } -void gdImageSkewY (gdImagePtr dst, gdImagePtr src, int uCol, int iOffset, double dWeight, int clrBack) +void gdImageSkewY (gdImagePtr dst, gdImagePtr src, int uCol, int iOffset, double dWeight, int clrBack, int ignoretransparent) { typedef int (*FuncPtr)(gdImagePtr, int, int); int i, iYPos=0, r, g, b, a; @@ -2645,10 +2650,14 @@ a = 127; } - pxlSrc = gdImageColorAllocateAlpha(dst, r, g, b, a); + if (ignoretransparent && pxlSrc == dst->transparent) { + pxlSrc = dst->transparent; + } else { + pxlSrc = gdImageColorAllocateAlpha(dst, r, g, b, a); - if (pxlSrc == -1) { - pxlSrc = gdImageColorClosestAlpha(dst, r, g, b, a); + if (pxlSrc == -1) { + pxlSrc = gdImageColorClosestAlpha(dst, r, g, b, a); + } } if ((iYPos >= 0) && (iYPos < dst->sy)) { @@ -2670,7 +2679,7 @@ } /* Rotates an image by 90 degrees (counter clockwise) */ -gdImagePtr gdImageRotate90 (gdImagePtr src) +gdImagePtr gdImageRotate90 (gdImagePtr src, int ignoretransparent) { int uY, uX; int c,r,g,b,a; @@ -2684,6 +2693,7 @@ f = gdImageGetPixel; } dst = gdImageCreateTrueColor(src->sy, src->sx); + dst->transparent = src->transparent; if (dst != NULL) { gdImagePaletteCopy (dst, src); @@ -2698,7 +2708,11 @@ a = gdImageAlpha(src,c); c = gdTrueColorAlpha(r, g, b, a); } - gdImageSetPixel(dst, uY, (dst->sy - uX - 1), c); + if (ignoretransparent && c == dst->transparent) { + gdImageSetPixel(dst, uY, (dst->sy - uX - 1), dst->transparent); + } else { + gdImageSetPixel(dst, uY, (dst->sy - uX - 1), c); + } } } } @@ -2707,7 +2721,7 @@ } /* Rotates an image by 180 degrees (counter clockwise) */ -gdImagePtr gdImageRotate180 (gdImagePtr src) +gdImagePtr gdImageRotate180 (gdImagePtr src, int ignoretransparent) { int uY, uX; int c,r,g,b,a; @@ -2721,6 +2735,7 @@ f = gdImageGetPixel; } dst = gdImageCreateTrueColor(src->sx, src->sy); + dst->transparent = src->transparent; if (dst != NULL) { gdImagePaletteCopy (dst, src); @@ -2735,7 +2750,11 @@ a = gdImageAlpha(src,c); c = gdTrueColorAlpha(r, g, b, a); } - gdImageSetPixel(dst, (dst->sx - uX - 1), (dst->sy - uY - 1), c); + if (ignoretransparent && c == dst->transparent) { + gdImageSetPixel(dst, uY, (dst->sy - uX - 1), dst->transparent); + } else { + gdImageSetPixel(dst, uY, (dst->sy - uX - 1), c); + } } } } @@ -2744,7 +2763,7 @@ } /* Rotates an image by 270 degrees (counter clockwise) */ -gdImagePtr gdImageRotate270 ( gdImagePtr src ) +gdImagePtr gdImageRotate270 (gdImagePtr src, int ignoretransparent) { int uY, uX; int c,r,g,b,a; @@ -2758,6 +2777,7 @@ f = gdImageGetPixel; } dst = gdImageCreateTrueColor (src->sy, src->sx); + dst->transparent = src->transparent; if (dst != NULL) { gdImagePaletteCopy (dst, src); @@ -2772,7 +2792,11 @@ a = gdImageAlpha(src,c); c = gdTrueColorAlpha(r, g, b, a); } - gdImageSetPixel(dst, (dst->sx - uY - 1), uX, c); + if (ignoretransparent && c == dst->transparent) { + gdImageSetPixel(dst, uY, (dst->sy - uX - 1), dst->transparent); + } else { + gdImageSetPixel(dst, uY, (dst->sy - uX - 1), c); + } } } } @@ -2780,7 +2804,7 @@ return dst; } -gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack) +gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack, int ignoretransparent) { typedef int (*FuncPtr)(gdImagePtr, int, int); gdImagePtr dst1,dst2,dst3; @@ -2820,6 +2844,15 @@ gdImagePaletteCopy (dst1, src); + if (ignoretransparent) { + if (gdImageTrueColor(src)) { + dst1->transparent = src->transparent; + } else { + + dst1->transparent = gdTrueColorAlpha(gdImageRed(src, src->transparent), gdImageBlue(src, src->transparent), gdImageGreen(src, src->transparent), 127); + } + } + dRadAngle = dAngle * ROTATE_DEG2RAD; /* Angle in radians */ dSinE = sin (dRadAngle); dTan = tan (dRadAngle / 2.0); @@ -2832,7 +2865,7 @@ } iShear = (int)floor(dShear); - gdImageSkewX(dst1, src, u, iShear, (dShear - iShear), clrBack); + gdImageSkewX(dst1, src, u, iShear, (dShear - iShear), clrBack, ignoretransparent); } /* @@ -2868,10 +2901,13 @@ return NULL; } dst2->alphaBlendingFlag = gdEffectReplace; + if (ignoretransparent) { + dst2->transparent = dst1->transparent; + } for (u = 0; u < dst2->sx; u++, dOffset -= dSinE) { iShear = (int)floor (dOffset); - gdImageSkewY(dst2, dst1, u, iShear, (dOffset - (double)iShear), clrBack); + gdImageSkewY(dst2, dst1, u, iShear, (dOffset - (double)iShear), clrBack, ignoretransparent); } /* 3rd shear */ @@ -2890,6 +2926,12 @@ gdImageDestroy(dst2); return NULL; } + + dst3->alphaBlendingFlag = gdEffectReplace; + if (ignoretransparent) { + dst3->transparent = dst2->transparent; + } + if (dSinE >= 0.0) { dOffset = (double)(src->sx - 1) * dSinE * -dTan; } else { @@ -2897,8 +2939,8 @@ } for (u = 0; u < dst3->sy; u++, dOffset += dTan) { - int iShear = (int)floor(dOffset); - gdImageSkewX(dst3, dst2, u, iShear, (dOffset - iShear), clrBack); + int iShear = (int)floor(dOffset); + gdImageSkewX(dst3, dst2, u, iShear, (dOffset - iShear), clrBack, ignoretransparent); } gdImageDestroy(dst2); @@ -2906,7 +2948,7 @@ return dst3; } -gdImagePtr gdImageRotate (gdImagePtr src, double dAngle, int clrBack) +gdImagePtr gdImageRotate (gdImagePtr src, double dAngle, int clrBack, int ignoretransparent) { gdImagePtr pMidImg; gdImagePtr rotatedImg; @@ -2928,33 +2970,33 @@ } if (dAngle == 90.00) { - return gdImageRotate90(src); + return gdImageRotate90(src, ignoretransparent); } if (dAngle == 180.00) { - return gdImageRotate180(src); + return gdImageRotate180(src, ignoretransparent); } if(dAngle == 270.00) { - return gdImageRotate270 ( src); + return gdImageRotate270 (src, ignoretransparent); } if ((dAngle > 45.0) && (dAngle <= 135.0)) { - pMidImg = gdImageRotate90 (src); + pMidImg = gdImageRotate90 (src, ignoretransparent); dAngle -= 90.0; } else if ((dAngle > 135.0) && (dAngle <= 225.0)) { - pMidImg = gdImageRotate180 (src); + pMidImg = gdImageRotate180 (src, ignoretransparent); dAngle -= 180.0; } else if ((dAngle > 225.0) && (dAngle <= 315.0)) { - pMidImg = gdImageRotate270 (src); + pMidImg = gdImageRotate270 (src, ignoretransparent); dAngle -= 270.0; } else { - return gdImageRotate45 (src, dAngle, clrBack); + return gdImageRotate45 (src, dAngle, clrBack, ignoretransparent); } if (pMidImg == NULL) { return NULL; } - rotatedImg = gdImageRotate45 (pMidImg, dAngle, clrBack); + rotatedImg = gdImageRotate45 (pMidImg, dAngle, clrBack, ignoretransparent); gdImageDestroy(pMidImg); return rotatedImg; http://cvs.php.net/diff.php/php-src/ext/gd/libgd/gd.h?r1=1.25&r2=1.26&ty=u Index: php-src/ext/gd/libgd/gd.h diff -u php-src/ext/gd/libgd/gd.h:1.25 php-src/ext/gd/libgd/gd.h:1.26 --- php-src/ext/gd/libgd/gd.h:1.25 Tue Aug 31 12:41:29 2004 +++ php-src/ext/gd/libgd/gd.h Sun Mar 27 18:43:52 2005 @@ -536,11 +536,11 @@ substituted automatically. */ void gdImageCopyResampled(gdImagePtr dst, gdImagePtr src, int dstX, int dstY, int srcX, int srcY, int dstW, int dstH, int srcW, int srcH); -gdImagePtr gdImageRotate90(gdImagePtr src); -gdImagePtr gdImageRotate180(gdImagePtr src); -gdImagePtr gdImageRotate270(gdImagePtr src); -gdImagePtr gdImageRotate45(gdImagePtr src, double dAngle, int clrBack); -gdImagePtr gdImageRotate (gdImagePtr src, double dAngle, int clrBack); +gdImagePtr gdImageRotate90(gdImagePtr src, int ignoretransparent); +gdImagePtr gdImageRotate180(gdImagePtr src, int ignoretransparent); +gdImagePtr gdImageRotate270(gdImagePtr src, int ignoretransparent); +gdImagePtr gdImageRotate45(gdImagePtr src, double dAngle, int clrBack, int ignoretransparent); +gdImagePtr gdImageRotate (gdImagePtr src, double dAngle, int clrBack, int ignoretransparent); void gdImageSetBrush(gdImagePtr im, gdImagePtr brush); void gdImageSetTile(gdImagePtr im, gdImagePtr tile);
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php