From: Pierre Joye Date: Wed, 9 Jul 2003 10:15:13 +0000 (+0000) Subject: - "Fix" #23792, imagerotate returns always truecolor images now X-Git-Tag: BEFORE_ARG_INFO~309 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=e1f163b053c825e1e470473e2e72aa69cf20c8a0;p=php - "Fix" #23792, imagerotate returns always truecolor images now (the destination image is a truecolor, no more limited palette problems) - Clean the cast in gdImageCopyMerge --- diff --git a/ext/gd/libgd/gd.c b/ext/gd/libgd/gd.c index 5dce696113..4aaf350c16 100644 --- a/ext/gd/libgd/gd.c +++ b/ext/gd/libgd/gd.c @@ -2075,9 +2075,9 @@ void gdImageCopyMerge (gdImagePtr dst, gdImagePtr src, int dstX, int dstY, int s } else { dc = gdImageGetPixel(dst, tox, toy); - ncR = (int)gdImageRed (src, c) * (pct / 100.0) + gdImageRed (dst, dc) * ((100 - pct) / 100.0); - ncG = (int)gdImageGreen (src, c) * (pct / 100.0) + (int)gdImageGreen (dst, dc) * ((100 - pct) / 100.0); - ncB = (int)gdImageBlue (src, c) * (pct / 100.0) + gdImageBlue (dst, dc) * ((100 - pct) / 100.0); + ncR = (int)(gdImageRed (src, c) * (pct / 100.0) + gdImageRed (dst, dc) * ((100 - pct) / 100.0)); + ncG = (int)(gdImageGreen (src, c) * (pct / 100.0) + gdImageGreen (dst, dc) * ((100 - pct) / 100.0)); + ncB = (int)(gdImageBlue (src, c) * (pct / 100.0) + gdImageBlue (dst, dc) * ((100 - pct) / 100.0)); /* Find a reasonable color */ nc = gdImageColorResolve (dst, ncR, ncG, ncB); @@ -2368,14 +2368,22 @@ void gdImageCopyResampled (gdImagePtr dst, gdImagePtr src, int dstX, int dstY, i void gdImageSkewX (gdImagePtr dst, gdImagePtr src, int uRow, int iOffset, double dWeight, int clrBack) { typedef int (*FuncPtr)(gdImagePtr, int, int); - int i, r, g, b, a; + int i, r, g, b, a, clrBackR, clrBackG, clrBackB, clrBackA; FuncPtr f; int pxlOldLeft, pxlLeft=0, pxlSrc; + /* Keep clrBack as color index if required */ if (src->trueColor) { + pxlOldLeft = clrBack; f = gdImageGetTrueColorPixel; } else { + pxlOldLeft = clrBack; + clrBackR = gdImageRed(src, clrBack); + clrBackG = gdImageGreen(src, clrBack); + clrBackB = gdImageBlue(src, clrBack); + clrBackA = gdImageAlpha(src, clrBack); + clrBack = gdTrueColorAlpha(clrBackR, clrBackG, clrBackB, clrBackA); f = gdImageGetPixel; } @@ -2387,8 +2395,6 @@ void gdImageSkewX (gdImagePtr dst, gdImagePtr src, int uRow, int iOffset, double gdImageSetPixel (dst, i, uRow, clrBack); } - pxlOldLeft = clrBack; - for (i = 0; i < src->sx; i++) { pxlSrc = f (src,i,uRow); @@ -2541,10 +2547,8 @@ gdImagePtr gdImageRotate90 (gdImagePtr src) FuncPtr f; if (src->trueColor) { - dst = gdImageCreateTrueColor(src->sy, src->sx); f = gdImageGetTrueColorPixel; } else { - dst = gdImageCreate (src->sy, src->sx); f = gdImageGetPixel; } @@ -2632,6 +2636,7 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack) double dRadAngle, dSinE, dTan, dShear; double dOffset; /* Variable skew offset */ int u, iShear, newx, newy; + int clrBackR, clrBackG, clrBackB, clrBackA; /* See GEMS I for the algorithm details */ dRadAngle = dAngle * ROTATE_DEG2RAD; /* Angle in radians */ @@ -2662,6 +2667,7 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack) } gdImagePaletteCopy (dst1, src); + dRadAngle = dAngle * ROTATE_DEG2RAD; /* Angle in radians */ dSinE = sin (dRadAngle); dTan = tan (dRadAngle / 2.0); @@ -2678,6 +2684,15 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack) gdImageSkewX(dst1, src, u, iShear, (dShear - iShear), clrBack); } + /* + The 1st shear may use the original clrBack as color index + Convert it once here + */ + clrBackR = gdImageRed(src, clrBack); + clrBackG = gdImageGreen(src, clrBack); + clrBackB = gdImageBlue(src, clrBack); + clrBackA = gdImageAlpha(src, clrBack); + clrBack = gdTrueColorAlpha(clrBackR, clrBackG, clrBackB, clrBackA); /* 2nd shear */ newx = dst1->sx; @@ -2690,13 +2705,11 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack) newy = (int) ((double) src->sx * fabs( dSinE ) + (double) src->sy * cos (dRadAngle)); if (src->trueColor) { - dst2 = gdImageCreateTrueColor (newx, newy); f = gdImageGetTrueColorPixel; } else { - dst2 = gdImageCreate (newx, newy); f = gdImageGetPixel; } - + dst2 = gdImageCreateTrueColor(newx, newy); if (dst2 == NULL) { gdImageDestroy(dst1); return NULL; @@ -2714,13 +2727,11 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack) newy = dst2->sy; if (src->trueColor) { - dst3 = gdImageCreateTrueColor (newx, newy); f = gdImageGetTrueColorPixel; } else { - dst3 = gdImageCreate (newx, newy); f = gdImageGetPixel; } - + dst3 = gdImageCreateTrueColor(newx, newy); if (dst3 == NULL) { gdImageDestroy(dst2); return NULL; @@ -2750,6 +2761,12 @@ gdImagePtr gdImageRotate (gdImagePtr src, double dAngle, int clrBack) return NULL; } + clrBackR = gdImageRed(src, clrBack); + clrBackG = gdImageGreen(src, clrBack); + clrBackB = gdImageBlue(src, clrBack); + clrBackA = gdImageAlpha(src, clrBack); + clrBack = gdIlmageColorAllocateAlpha(pMidImg, clrBackR, clrBackG, clrBackB, clrBackA); + while (dAngle >= 360.0) { dAngle -= 360.0; } @@ -2784,7 +2801,8 @@ gdImagePtr gdImageRotate (gdImagePtr src, double dAngle, int clrBack) if (pMidImg == NULL) { return NULL; } - + + rotatedImg = gdImageRotate45 (pMidImg, dAngle, clrBack); gdImageDestroy(pMidImg);