Subversion Repositories AndroidProjects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
244 chris 1
{
2
	double aCos = cos(theRot);
3
	double aSin = sin(theRot);
4
 
5
	int aCosLong = (int) (aCos * 0x10000);
6
	int aSinLong = (int) (aSin * 0x10000);
7
 
8
 
9
	ulong* aDestPixelsRow = GetBits() + ((int)aDestRect.mY * mWidth) + (int)aDestRect.mX;
10
	int aDestPixelsPitch = mWidth;
11
 
12
	if (theColor == Color::White)
13
	{
14
		#define DEST_PIXEL_TYPE ulong
15
		#define WRITE_PIXEL\
16
		{\
17
			int a = a1+a2+a3+a4;			\
18
			if(a==0) /* transparent */ \
19
				aDestPixels++; \
20
			else \
21
			{ \
22
				ulong r = (((((src1&0xFF0000)*a1)) + (((src2&0xFF0000)*a2)) + (((src3&0xFF0000)*a3)) + (((src4&0xFF0000)*a4)))&0xFF000000); \
23
				ulong g = (((((src1&0x00FF00)*a1)) + (((src2&0x00FF00)*a2)) + (((src3&0x00FF00)*a3)) + (((src4&0x00FF00)*a4)))&0x00FF0000); \
24
				ulong b = (((((src1&0x0000FF)*a1)) + (((src2&0x0000FF)*a2)) + (((src3&0x0000FF)*a3)) + (((src4&0x0000FF)*a4)))&0x0000FF00); \
25
				if(a > 250) /* opaque */ \
26
					*aDestPixels++ = 0xFF000000 | (r>>8) | (g>>8) | (b>>8);\
27
				else /* blend */ \
28
				{\
29
					ulong destPixel = *aDestPixels; \
30
					ulong da = destPixel >> 24;\
31
					\
32
					ulong dr = (((destPixel&0xFF0000)*da)>>8) & 0xFF0000;\
33
					ulong dg = (((destPixel&0x00FF00)*da)>>8) & 0x00FF00;\
34
					ulong db = (((destPixel&0x0000FF)*da)>>8) & 0x0000FF;\
35
					\
36
					int finalAlpha = 256 - (((256 - a)*(256 - da))>>8);\
37
					r = ((r + (256-a)*dr)/finalAlpha) & 0xFF0000;\
38
					g = ((g + (256-a)*dg)/finalAlpha) & 0x00FF00;\
39
					b = ((b + (256-a)*db)/finalAlpha) & 0x0000FF;\
40
					\
41
					*aDestPixels++ = ((finalAlpha-1)<<24) | r | g | b;					\
42
				}\
43
			}	\
44
		}
45
 
46
		#include "BltRotatedHelper.inc"
47
 
48
		#undef WRITE_PIXEL
49
		#undef DEST_PIXEL_TYPE
50
 
51
 
52
	}
53
	else
54
	{
55
		int ca = theColor.mAlpha;
56
		int cr = theColor.mRed + 1;
57
		int cg = theColor.mGreen + 1;
58
		int cb = theColor.mBlue + 1;
59
 
60
		#define DEST_PIXEL_TYPE ulong
61
		#define WRITE_PIXEL\
62
		{\
63
			a1 = (a1*ca)>>8; a2 = (a2*ca)>>8; a3 = (a3*ca)>>8; a4 = (a4*ca)>>8; \
64
			int a = a1+a2+a3+a4;			\
65
			\
66
			if(a==0) /* transparent */ \
67
				aDestPixels++; \
68
			else \
69
			{ \
70
				ulong r = (cr * (((((src1&0xFF0000)*a1)) + (((src2&0xFF0000)*a2)) + (((src3&0xFF0000)*a3)) + (((src4&0xFF0000)*a4)))>>8)) & 0xFF000000 ; \
71
				ulong g = ((((((src1&0x00FF00)*a1)) + (((src2&0x00FF00)*a2)) + (((src3&0x00FF00)*a3)) + (((src4&0x00FF00)*a4)))&0x00FF0000) * cg) & 0xFF000000; \
72
				ulong b = ((((((src1&0x0000FF)*a1)) + (((src2&0x0000FF)*a2)) + (((src3&0x0000FF)*a3)) + (((src4&0x0000FF)*a4)))&0x0000FF00) * cb) & 0x00FF0000; \
73
				if(a > 250) /* opaque */ \
74
					*aDestPixels++ = 0xFF000000 | (r>>8) | (g>>16) | (b>>16);\
75
				else /* blend */ \
76
				{\
77
					ulong destPixel = *aDestPixels; \
78
					ulong da = destPixel >> 24;\
79
					\
80
					ulong dr = (((destPixel&0xFF0000)*da)>>8) & 0xFF0000;\
81
					ulong dg = (((destPixel&0x00FF00)*da)>>8) & 0x00FF00;\
82
					ulong db = (((destPixel&0x0000FF)*da)>>8) & 0x0000FF;\
83
					\
84
					int finalAlpha = 256 - (((256 - a)*(256 - da))>>8);\
85
					r = ((r + (256-a)*dr)/finalAlpha) & 0xFF0000;\
86
					g = (((g>>8) + (256-a)*dg)/finalAlpha) & 0x00FF00;\
87
					b = (((b>>8) + (256-a)*db)/finalAlpha) & 0x0000FF;\
88
					\
89
					*aDestPixels++ = ((finalAlpha-1)<<24) | r | g | b;					\
90
				}\
91
			}	\
92
		}
93
 
94
		#include "BltRotatedHelper.inc"
95
 
96
		#undef WRITE_PIXEL
97
		#undef DEST_PIXEL_TYPE
98
 
99
 
100
	}
101
}