Browse Source

Fixed bug #23792 (8 bit graphics don't rotate properly)

Patch by: pajoye@php.net
PEAR_1_4DEV
Ilia Alshanetsky 23 years ago
parent
commit
c7a45fc9da
  1. 125
      ext/gd/libgd/gd.c

125
ext/gd/libgd/gd.c

@ -2475,7 +2475,7 @@ void gdImageSkewX (gdImagePtr dst, gdImagePtr src, int uRow, int iOffset, double
f = gdImageGetTrueColorPixel; f = gdImageGetTrueColorPixel;
} else { } else {
pxlOldLeft = clrBack; pxlOldLeft = clrBack;
clrBackR = gdImageRed(src, clrBack);
clrBackR = gdImageRed(src, clrBack);
clrBackG = gdImageGreen(src, clrBack); clrBackG = gdImageGreen(src, clrBack);
clrBackB = gdImageBlue(src, clrBack); clrBackB = gdImageBlue(src, clrBack);
clrBackA = gdImageAlpha(src, clrBack); clrBackA = gdImageAlpha(src, clrBack);
@ -2500,30 +2500,30 @@ void gdImageSkewX (gdImagePtr dst, gdImagePtr src, int uRow, int iOffset, double
a = (int)(gdImageAlpha(src,pxlSrc) * dWeight); a = (int)(gdImageAlpha(src,pxlSrc) * dWeight);
pxlLeft = gdImageColorAllocateAlpha(src, r, g, b, a); pxlLeft = gdImageColorAllocateAlpha(src, r, g, b, a);
if (pxlLeft == -1) { if (pxlLeft == -1) {
pxlLeft = gdImageColorClosestAlpha(src, r, g, b, a); pxlLeft = gdImageColorClosestAlpha(src, r, g, b, a);
} }
r = gdImageRed(src,pxlSrc) - (gdImageRed(src,pxlLeft) - gdImageRed(src,pxlOldLeft)); r = gdImageRed(src,pxlSrc) - (gdImageRed(src,pxlLeft) - gdImageRed(src,pxlOldLeft));
g = gdImageGreen(src,pxlSrc) - (gdImageGreen(src,pxlLeft) - gdImageGreen(src,pxlOldLeft)); g = gdImageGreen(src,pxlSrc) - (gdImageGreen(src,pxlLeft) - gdImageGreen(src,pxlOldLeft));
b = gdImageBlue(src,pxlSrc) - (gdImageBlue(src,pxlLeft) - gdImageBlue(src,pxlOldLeft)); b = gdImageBlue(src,pxlSrc) - (gdImageBlue(src,pxlLeft) - gdImageBlue(src,pxlOldLeft));
a = gdImageAlpha(src,pxlSrc) - (gdImageAlpha(src,pxlLeft) - gdImageAlpha(src,pxlOldLeft)); a = gdImageAlpha(src,pxlSrc) - (gdImageAlpha(src,pxlLeft) - gdImageAlpha(src,pxlOldLeft));
if (r>255) {
r = 255;
}
if (r>255) {
r = 255;
}
if (g>255) { if (g>255) {
g = 255; g = 255;
}
if(b>255) {
b = 255;
}
}
if (b>255) {
b = 255;
}
if (a>127) { if (a>127) {
b = 127;
a = 127;
} }
pxlSrc = gdImageColorAllocateAlpha(dst, r, g, b, a); pxlSrc = gdImageColorAllocateAlpha(dst, r, g, b, a);
@ -2540,7 +2540,7 @@ void gdImageSkewX (gdImagePtr dst, gdImagePtr src, int uRow, int iOffset, double
} }
i += iOffset; i += iOffset;
if (i < dst->sx) { if (i < dst->sx) {
gdImageSetPixel (dst, i, uRow, pxlLeft); gdImageSetPixel (dst, i, uRow, pxlLeft);
} }
@ -2567,46 +2567,50 @@ void gdImageSkewY (gdImagePtr dst, gdImagePtr src, int uCol, int iOffset, double
f = gdImageGetPixel; f = gdImageGetPixel;
} }
for (i = 0; i<iOffset; i++) {
for (i = 0; i<=iOffset; i++) {
gdImageSetPixel (dst, uCol, i, clrBack); gdImageSetPixel (dst, uCol, i, clrBack);
} }
r = (int)((double)gdImageRed(src,clrBack) * dWeight);
g = (int)((double)gdImageGreen(src,clrBack) * dWeight);
b = (int)((double)gdImageBlue(src,clrBack) * dWeight);
a = (int)((double)gdImageAlpha(src,clrBack) * dWeight);
pxlOldLeft = clrBack;
pxlOldLeft = gdImageColorAllocateAlpha(dst, r, g, b, a);
for (i = 0; i < src->sy; i++) { for (i = 0; i < src->sy; i++) {
pxlSrc = f (src, uCol, i); pxlSrc = f (src, uCol, i);
iYPos = i + iOffset; iYPos = i + iOffset;
r = (int)(gdImageRed(src,pxlSrc) * dWeight);
g = (int)(gdImageGreen(src,pxlSrc) * dWeight);
b = (int)(gdImageBlue(src,pxlSrc) * dWeight);
a = (int)(gdImageAlpha(src,pxlSrc) * dWeight);
r = (int)((double)gdImageRed(src,pxlSrc) * dWeight);
g = (int)((double)gdImageGreen(src,pxlSrc) * dWeight);
b = (int)((double)gdImageBlue(src,pxlSrc) * dWeight);
a = (int)((double)gdImageAlpha(src,pxlSrc) * dWeight);
pxlLeft = gdImageColorAllocateAlpha(src, r, g, b, a); pxlLeft = gdImageColorAllocateAlpha(src, r, g, b, a);
if (pxlLeft == -1) { if (pxlLeft == -1) {
pxlLeft = gdImageColorClosestAlpha(src, r, g, b, a); pxlLeft = gdImageColorClosestAlpha(src, r, g, b, a);
} }
r = gdImageRed(src,pxlSrc) - (gdImageRed(src,pxlLeft) - gdImageRed(src,pxlOldLeft));
r = gdImageRed(src,pxlSrc) - (gdImageRed(src,pxlLeft) - gdImageRed(src,pxlOldLeft));
g = gdImageGreen(src,pxlSrc) - (gdImageGreen(src,pxlLeft) - gdImageGreen(src,pxlOldLeft)); g = gdImageGreen(src,pxlSrc) - (gdImageGreen(src,pxlLeft) - gdImageGreen(src,pxlOldLeft));
b = gdImageBlue(src,pxlSrc) - (gdImageBlue(src,pxlLeft) - gdImageBlue(src,pxlOldLeft)); b = gdImageBlue(src,pxlSrc) - (gdImageBlue(src,pxlLeft) - gdImageBlue(src,pxlOldLeft));
a = gdImageAlpha(src,pxlSrc) - (gdImageAlpha(src,pxlLeft) - gdImageAlpha(src,pxlOldLeft)); a = gdImageAlpha(src,pxlSrc) - (gdImageAlpha(src,pxlLeft) - gdImageAlpha(src,pxlOldLeft));
if (r>255) { if (r>255) {
r = 255; r = 255;
}
}
if (g>255) { if (g>255) {
g = 255; g = 255;
}
if(b>255) {
b = 255;
}
}
if (b>255) {
b = 255;
}
if (a>127) { if (a>127) {
b = 127;
a = 127;
} }
pxlSrc = gdImageColorAllocateAlpha(dst, r, g, b, a); pxlSrc = gdImageColorAllocateAlpha(dst, r, g, b, a);
@ -2618,7 +2622,7 @@ void gdImageSkewY (gdImagePtr dst, gdImagePtr src, int uCol, int iOffset, double
if ((iYPos >= 0) && (iYPos < dst->sy)) { if ((iYPos >= 0) && (iYPos < dst->sy)) {
gdImageSetPixel (dst, uCol, iYPos, pxlSrc); gdImageSetPixel (dst, uCol, iYPos, pxlSrc);
} }
pxlOldLeft = pxlLeft; pxlOldLeft = pxlLeft;
} }
@ -2651,7 +2655,7 @@ gdImagePtr gdImageRotate90 (gdImagePtr src)
if (dst != NULL) { if (dst != NULL) {
gdImagePaletteCopy (dst, src); gdImagePaletteCopy (dst, src);
for (uY = 0; uY<src->sy; uY++) { for (uY = 0; uY<src->sy; uY++) {
for (uX = 0; uX<src->sx; uX++) { for (uX = 0; uX<src->sx; uX++) {
c = f (src, uX, uY); c = f (src, uX, uY);
@ -2666,7 +2670,7 @@ gdImagePtr gdImageRotate90 (gdImagePtr src)
} }
} }
} }
return dst; return dst;
} }
@ -2688,7 +2692,7 @@ gdImagePtr gdImageRotate180 (gdImagePtr src)
if (dst != NULL) { if (dst != NULL) {
gdImagePaletteCopy (dst, src); gdImagePaletteCopy (dst, src);
for (uY = 0; uY<src->sy; uY++) { for (uY = 0; uY<src->sy; uY++) {
for (uX = 0; uX<src->sx; uX++) { for (uX = 0; uX<src->sx; uX++) {
c = f (src, uX, uY); c = f (src, uX, uY);
@ -2725,7 +2729,7 @@ gdImagePtr gdImageRotate270 ( gdImagePtr src )
if (dst != NULL) { if (dst != NULL) {
gdImagePaletteCopy (dst, src); gdImagePaletteCopy (dst, src);
for (uY = 0; uY<src->sy; uY++) { for (uY = 0; uY<src->sy; uY++) {
for (uX = 0; uX<src->sx; uX++) { for (uX = 0; uX<src->sx; uX++) {
c = f (src, uX, uY); c = f (src, uX, uY);
@ -2740,7 +2744,7 @@ gdImagePtr gdImageRotate270 ( gdImagePtr src )
} }
} }
} }
return dst; return dst;
} }
@ -2774,13 +2778,14 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack)
if (dst1 == NULL) { if (dst1 == NULL) {
return NULL; return NULL;
} }
dst1->alphaBlendingFlag = gdEffectReplace;
if (dAngle == 0.0) { if (dAngle == 0.0) {
/* Returns copy of src */ /* Returns copy of src */
gdImageCopy (dst1, src,0,0,0,0,src->sx,src->sy); gdImageCopy (dst1, src,0,0,0,0,src->sx,src->sy);
return dst1; return dst1;
} }
gdImagePaletteCopy (dst1, src); gdImagePaletteCopy (dst1, src);
dRadAngle = dAngle * ROTATE_DEG2RAD; /* Angle in radians */ dRadAngle = dAngle * ROTATE_DEG2RAD; /* Angle in radians */
@ -2795,7 +2800,6 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack)
} }
iShear = (int)floor(dShear); iShear = (int)floor(dShear);
gdImageSkewX(dst1, src, u, iShear, (dShear - iShear), clrBack); gdImageSkewX(dst1, src, u, iShear, (dShear - iShear), clrBack);
} }
@ -2803,21 +2807,23 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack)
The 1st shear may use the original clrBack as color index The 1st shear may use the original clrBack as color index
Convert it once here 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);
if(!src->trueColor) {
clrBackR = gdImageRed(src, clrBack);
clrBackG = gdImageGreen(src, clrBack);
clrBackB = gdImageBlue(src, clrBack);
clrBackA = gdImageAlpha(src, clrBack);
clrBack = gdTrueColorAlpha(clrBackR, clrBackG, clrBackB, clrBackA);
}
/* 2nd shear */ /* 2nd shear */
newx = dst1->sx; newx = dst1->sx;
if (dSinE > 0.0) { if (dSinE > 0.0) {
dOffset = (src->sx ) * dSinE;
dOffset = (src->sx-1) * dSinE;
} else { } else {
dOffset = -dSinE * (src->sx - newx); dOffset = -dSinE * (src->sx - newx);
} }
newy = (int) ((double) src->sx * fabs( dSinE ) + (double) src->sy * cos (dRadAngle));
newy = (int) ((double) src->sx * fabs( dSinE ) + (double) src->sy * cos (dRadAngle))+1;
if (src->trueColor) { if (src->trueColor) {
f = gdImageGetTrueColorPixel; f = gdImageGetTrueColorPixel;
@ -2829,10 +2835,11 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack)
gdImageDestroy(dst1); gdImageDestroy(dst1);
return NULL; return NULL;
} }
dst2->alphaBlendingFlag = gdEffectReplace;
for (u = 0; u < dst2->sx; u++, dOffset -= dSinE) { for (u = 0; u < dst2->sx; u++, dOffset -= dSinE) {
iShear = (int)floor (dOffset); iShear = (int)floor (dOffset);
gdImageSkewY(dst2, dst1, u, iShear, (dOffset - iShear), clrBack);
gdImageSkewY(dst2, dst1, u, iShear, (dOffset - (double)iShear), clrBack);
} }
/* 3rd shear */ /* 3rd shear */
@ -2840,13 +2847,13 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack)
newx = (int) ((double)src->sy * fabs (dSinE) + (double)src->sx * cos (dRadAngle)) + 1; newx = (int) ((double)src->sy * fabs (dSinE) + (double)src->sx * cos (dRadAngle)) + 1;
newy = dst2->sy; newy = dst2->sy;
if (src->trueColor) { if (src->trueColor) {
f = gdImageGetTrueColorPixel; f = gdImageGetTrueColorPixel;
} else { } else {
f = gdImageGetPixel; f = gdImageGetPixel;
} }
dst3 = gdImageCreateTrueColor(newx, newy);
dst3 = gdImageCreateTrueColor(newx, newy);
if (dst3 == NULL) { if (dst3 == NULL) {
gdImageDestroy(dst2); gdImageDestroy(dst2);
return NULL; return NULL;
@ -2863,7 +2870,7 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack)
} }
gdImageDestroy(dst2); gdImageDestroy(dst2);
return dst3; return dst3;
} }
@ -2871,7 +2878,7 @@ gdImagePtr gdImageRotate (gdImagePtr src, double dAngle, int clrBack)
{ {
gdImagePtr pMidImg; gdImagePtr pMidImg;
gdImagePtr rotatedImg; gdImagePtr rotatedImg;
int r,g,b,a;
if (src == NULL) { if (src == NULL) {
return NULL; return NULL;
} }
@ -2887,7 +2894,7 @@ gdImagePtr gdImageRotate (gdImagePtr src, double dAngle, int clrBack)
while (dAngle < 0) { while (dAngle < 0) {
dAngle += 360.0; dAngle += 360.0;
} }
if (dAngle == 90.00) { if (dAngle == 90.00) {
return gdImageRotate90(src); return gdImageRotate90(src);
} }
@ -2910,14 +2917,14 @@ gdImagePtr gdImageRotate (gdImagePtr src, double dAngle, int clrBack)
} else { } else {
return gdImageRotate45 (src, dAngle, clrBack); return gdImageRotate45 (src, dAngle, clrBack);
} }
if (pMidImg == NULL) { if (pMidImg == NULL) {
return NULL; return NULL;
} }
rotatedImg = gdImageRotate45 (pMidImg, dAngle, clrBack); rotatedImg = gdImageRotate45 (pMidImg, dAngle, clrBack);
gdImageDestroy(pMidImg); gdImageDestroy(pMidImg);
return rotatedImg; return rotatedImg;
} }
/* End Rotate function */ /* End Rotate function */

Loading…
Cancel
Save