rendered paste bodygdImagePtr gdImageRotate45 (gdImagePtr src, double dAngle, int clrBack, int ignoretransparent){ typedef int (*FuncPtr)(gdImagePtr, int, int); gdImagePtr dst1,dst2,dst3; FuncPtr f; 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 */ dSinE = sin (dRadAngle); dTan = tan (dRadAngle / 2.0); newx = (int)(src->sx + src->sy * fabs(dTan)); newy = src->sy; /* 1st shear */ if (src->trueColor) { f = gdImageGetTrueColorPixel; } else { f = gdImageGetPixel; } dst1 = gdImageCreateTrueColor(newx, newy); /******* Perform 1st shear (horizontal) ******/ 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); 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); for (u = 0; u < dst1->sy; u++) { if (dTan >= 0.0) { dShear = ((double)(u + 0.5)) * dTan; } else { dShear = ((double)(u - dst1->sy) + 0.5) * dTan; } iShear = (int)floor(dShear); gdImageSkewX(dst1, src, u, iShear, (dShear - iShear), clrBack, ignoretransparent); } /* The 1st shear may use the original clrBack as color index Convert it once here */ 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-1) * dSinE; } else { dOffset = -dSinE * (src->sx - newx); } newy = (int) ((double) src->sx * fabs( dSinE ) + (double) src->sy * cos (dRadAngle))+1; if (src->trueColor) { f = gdImageGetTrueColorPixel; } else { f = gdImageGetPixel; } dst2 = gdImageCreateTrueColor(newx, newy); if (dst2 == NULL) { gdImageDestroy(dst1); 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, ignoretransparent); } /* 3rd shear */ gdImageDestroy(dst1); 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); if (dst3 == NULL) { 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 { dOffset = dTan * ((double)(src->sx - 1) * -dSinE + (double)(1 - newy)); } for (u = 0; u < dst3->sy; u++, dOffset += dTan) { int iShear = (int)floor(dOffset); gdImageSkewX(dst3, dst2, u, iShear, (dOffset - iShear), clrBack, ignoretransparent); } gdImageDestroy(dst2); return dst3;}