All pastes #408216 Raw Edit

Mine

public cpp v1 · immutable
#408216 ·published 2007-03-24 18:01 UTC
rendered paste body
gdImagePtr 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;}