summaryrefslogtreecommitdiff
path: root/ext/gd/libgd
diff options
context:
space:
mode:
authorIlia Alshanetsky <iliaa@php.net>2003-07-30 17:34:11 +0000
committerIlia Alshanetsky <iliaa@php.net>2003-07-30 17:34:11 +0000
commitc7a45fc9daf853d1eaa5f6bb41ac46d1b2abc221 (patch)
tree99f612e113999b78af489bdb2524c2fb44f51230 /ext/gd/libgd
parentc0b46739caab84c0cf1aff21c3456de335afe395 (diff)
downloadphp-git-c7a45fc9daf853d1eaa5f6bb41ac46d1b2abc221.tar.gz
Fixed bug #23792 (8 bit graphics don't rotate properly)
Patch by: pajoye@php.net
Diffstat (limited to 'ext/gd/libgd')
-rw-r--r--ext/gd/libgd/gd.c125
1 files changed, 66 insertions, 59 deletions
diff --git a/ext/gd/libgd/gd.c b/ext/gd/libgd/gd.c
index e2624bead3..659bcab3ff 100644
--- a/ext/gd/libgd/gd.c
+++ b/ext/gd/libgd/gd.c
@@ -2475,7 +2475,7 @@ void gdImageSkewX (gdImagePtr dst, gdImagePtr src, int uRow, int iOffset, double
f = gdImageGetTrueColorPixel;
} else {
pxlOldLeft = clrBack;
- clrBackR = gdImageRed(src, clrBack);
+ clrBackR = gdImageRed(src, clrBack);
clrBackG = gdImageGreen(src, clrBack);
clrBackB = gdImageBlue(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);
pxlLeft = gdImageColorAllocateAlpha(src, r, g, b, a);
-
+
if (pxlLeft == -1) {
pxlLeft = gdImageColorClosestAlpha(src, r, g, b, a);
}
-
+
r = gdImageRed(src,pxlSrc) - (gdImageRed(src,pxlLeft) - gdImageRed(src,pxlOldLeft));
g = gdImageGreen(src,pxlSrc) - (gdImageGreen(src,pxlLeft) - gdImageGreen(src,pxlOldLeft));
b = gdImageBlue(src,pxlSrc) - (gdImageBlue(src,pxlLeft) - gdImageBlue(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) {
g = 255;
- }
-
- if(b>255) {
- b = 255;
- }
-
+ }
+
+ if (b>255) {
+ b = 255;
+ }
+
if (a>127) {
- b = 127;
+ a = 127;
}
pxlSrc = gdImageColorAllocateAlpha(dst, r, g, b, a);
@@ -2540,7 +2540,7 @@ void gdImageSkewX (gdImagePtr dst, gdImagePtr src, int uRow, int iOffset, double
}
i += iOffset;
-
+
if (i < dst->sx) {
gdImageSetPixel (dst, i, uRow, pxlLeft);
}
@@ -2567,46 +2567,50 @@ void gdImageSkewY (gdImagePtr dst, gdImagePtr src, int uCol, int iOffset, double
f = gdImageGetPixel;
}
- for (i = 0; i<iOffset; i++) {
+ for (i = 0; i<=iOffset; i++) {
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++) {
pxlSrc = f (src, uCol, i);
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);
-
+
if (pxlLeft == -1) {
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));
b = gdImageBlue(src,pxlSrc) - (gdImageBlue(src,pxlLeft) - gdImageBlue(src,pxlOldLeft));
a = gdImageAlpha(src,pxlSrc) - (gdImageAlpha(src,pxlLeft) - gdImageAlpha(src,pxlOldLeft));
-
+
if (r>255) {
r = 255;
- }
-
+ }
+
if (g>255) {
g = 255;
- }
-
- if(b>255) {
- b = 255;
- }
-
+ }
+
+ if (b>255) {
+ b = 255;
+ }
+
if (a>127) {
- b = 127;
+ a = 127;
}
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)) {
gdImageSetPixel (dst, uCol, iYPos, pxlSrc);
}
-
+
pxlOldLeft = pxlLeft;
}
@@ -2651,7 +2655,7 @@ gdImagePtr gdImageRotate90 (gdImagePtr src)
if (dst != NULL) {
gdImagePaletteCopy (dst, src);
-
+
for (uY = 0; uY<src->sy; uY++) {
for (uX = 0; uX<src->sx; uX++) {
c = f (src, uX, uY);
@@ -2666,7 +2670,7 @@ gdImagePtr gdImageRotate90 (gdImagePtr src)
}
}
}
-
+
return dst;
}
@@ -2688,7 +2692,7 @@ gdImagePtr gdImageRotate180 (gdImagePtr src)
if (dst != NULL) {
gdImagePaletteCopy (dst, src);
-
+
for (uY = 0; uY<src->sy; uY++) {
for (uX = 0; uX<src->sx; uX++) {
c = f (src, uX, uY);
@@ -2725,7 +2729,7 @@ gdImagePtr gdImageRotate270 ( gdImagePtr src )
if (dst != NULL) {
gdImagePaletteCopy (dst, src);
-
+
for (uY = 0; uY<src->sy; uY++) {
for (uX = 0; uX<src->sx; uX++) {
c = f (src, uX, uY);
@@ -2740,7 +2744,7 @@ gdImagePtr gdImageRotate270 ( gdImagePtr src )
}
}
}
-
+
return dst;
}
@@ -2774,13 +2778,14 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack)
if (dst1 == NULL) {
return NULL;
}
+ dst1->alphaBlendingFlag = gdEffectReplace;
if (dAngle == 0.0) {
/* Returns copy of src */
gdImageCopy (dst1, src,0,0,0,0,src->sx,src->sy);
return dst1;
}
-
+
gdImagePaletteCopy (dst1, src);
dRadAngle = dAngle * ROTATE_DEG2RAD; /* Angle in radians */
@@ -2795,7 +2800,6 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack)
}
iShear = (int)floor(dShear);
-
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
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 */
newx = dst1->sx;
-
+
if (dSinE > 0.0) {
- dOffset = (src->sx ) * dSinE;
+ dOffset = (src->sx-1) * dSinE;
} else {
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) {
f = gdImageGetTrueColorPixel;
@@ -2829,10 +2835,11 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack)
gdImageDestroy(dst1);
return NULL;
}
-
+ dst2->alphaBlendingFlag = gdEffectReplace;
+
for (u = 0; u < dst2->sx; u++, dOffset -= dSinE) {
iShear = (int)floor (dOffset);
- gdImageSkewY(dst2, dst1, u, iShear, (dOffset - iShear), clrBack);
+ gdImageSkewY(dst2, dst1, u, iShear, (dOffset - (double)iShear), clrBack);
}
/* 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;
newy = dst2->sy;
-
+
if (src->trueColor) {
f = gdImageGetTrueColorPixel;
} else {
f = gdImageGetPixel;
}
- dst3 = gdImageCreateTrueColor(newx, newy);
+ dst3 = gdImageCreateTrueColor(newx, newy);
if (dst3 == NULL) {
gdImageDestroy(dst2);
return NULL;
@@ -2863,7 +2870,7 @@ gdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack)
}
gdImageDestroy(dst2);
-
+
return dst3;
}
@@ -2871,7 +2878,7 @@ gdImagePtr gdImageRotate (gdImagePtr src, double dAngle, int clrBack)
{
gdImagePtr pMidImg;
gdImagePtr rotatedImg;
-
+ int r,g,b,a;
if (src == NULL) {
return NULL;
}
@@ -2887,7 +2894,7 @@ gdImagePtr gdImageRotate (gdImagePtr src, double dAngle, int clrBack)
while (dAngle < 0) {
dAngle += 360.0;
}
-
+
if (dAngle == 90.00) {
return gdImageRotate90(src);
}
@@ -2910,14 +2917,14 @@ gdImagePtr gdImageRotate (gdImagePtr src, double dAngle, int clrBack)
} else {
return gdImageRotate45 (src, dAngle, clrBack);
}
-
+
if (pMidImg == NULL) {
return NULL;
}
rotatedImg = gdImageRotate45 (pMidImg, dAngle, clrBack);
gdImageDestroy(pMidImg);
-
+
return rotatedImg;
}
/* End Rotate function */