File: MI_BltRotated.inc

package info (click to toggle)
libtuxcap 1.4.0.dfsg2-1.1
  • links: PTS, VCS
  • area: main
  • in suites: squeeze
  • size: 4,172 kB
  • ctags: 5,897
  • sloc: cpp: 43,203; ansic: 3,095; python: 774; objc: 242; makefile: 100; xml: 87
file content (102 lines) | stat: -rw-r--r-- 3,305 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
{
	double aCos = cos(theRot);
	double aSin = sin(theRot);

	int aCosLong = (int) (aCos * 0x10000);
	int aSinLong = (int) (aSin * 0x10000);	


	uint32_t* aDestPixelsRow = GetBits() + ((int)aDestRect.mY * mWidth) + (int)aDestRect.mX;		
	int aDestPixelsPitch = mWidth;

	if (theColor == Color::White)
	{
		#define DEST_PIXEL_TYPE uint32_t
		#define WRITE_PIXEL\
		{\
			int a = a1+a2+a3+a4;			\
			if(a==0) /* transparent */ \
				aDestPixels++; \
			else \
			{ \
				uint32_t r = (((((src1&0xFF0000)*a1)) + (((src2&0xFF0000)*a2)) + (((src3&0xFF0000)*a3)) + (((src4&0xFF0000)*a4)))&0xFF000000); \
				uint32_t g = (((((src1&0x00FF00)*a1)) + (((src2&0x00FF00)*a2)) + (((src3&0x00FF00)*a3)) + (((src4&0x00FF00)*a4)))&0x00FF0000); \
				uint32_t b = (((((src1&0x0000FF)*a1)) + (((src2&0x0000FF)*a2)) + (((src3&0x0000FF)*a3)) + (((src4&0x0000FF)*a4)))&0x0000FF00); \
				if(a > 250) /* opaque */ \
					*aDestPixels++ = 0xFF000000 | (r>>8) | (g>>8) | (b>>8);\
				else /* blend */ \
				{\
					uint32_t destPixel = *aDestPixels; \
					uint32_t da = destPixel >> 24;\
					\
					uint32_t dr = (((destPixel&0xFF0000)*da)>>8) & 0xFF0000;\
					uint32_t dg = (((destPixel&0x00FF00)*da)>>8) & 0x00FF00;\
					uint32_t db = (((destPixel&0x0000FF)*da)>>8) & 0x0000FF;\
					\
					int finalAlpha = 256 - (((256 - a)*(256 - da))>>8);\
					r = ((r + (256-a)*dr)/finalAlpha) & 0xFF0000;\
					g = ((g + (256-a)*dg)/finalAlpha) & 0x00FF00;\
					b = ((b + (256-a)*db)/finalAlpha) & 0x0000FF;\
					\
					*aDestPixels++ = ((finalAlpha-1)<<24) | r | g | b;					\
				}\
			}	\
		}
		
		#include "BltRotatedHelper.inc"		
		
		#undef WRITE_PIXEL
		#undef DEST_PIXEL_TYPE
		
		
	}
	else
	{
		int ca = theColor.mAlpha;
		int cr = theColor.mRed + 1;
		int cg = theColor.mGreen + 1;
		int cb = theColor.mBlue + 1;
	
		#define DEST_PIXEL_TYPE uint32_t
		#define WRITE_PIXEL\
		{\
			a1 = (a1*ca)>>8; a2 = (a2*ca)>>8; a3 = (a3*ca)>>8; a4 = (a4*ca)>>8; \
			int a = a1+a2+a3+a4;			\
			\
			if(a==0) /* transparent */ \
				aDestPixels++; \
			else \
			{ \
				uint32_t r = (cr * (((((src1&0xFF0000)*a1)) + (((src2&0xFF0000)*a2)) + (((src3&0xFF0000)*a3)) + (((src4&0xFF0000)*a4)))>>8)) & 0xFF000000 ; \
				uint32_t g = ((((((src1&0x00FF00)*a1)) + (((src2&0x00FF00)*a2)) + (((src3&0x00FF00)*a3)) + (((src4&0x00FF00)*a4)))&0x00FF0000) * cg) & 0xFF000000; \
				uint32_t b = ((((((src1&0x0000FF)*a1)) + (((src2&0x0000FF)*a2)) + (((src3&0x0000FF)*a3)) + (((src4&0x0000FF)*a4)))&0x0000FF00) * cb) & 0x00FF0000; \
				if(a > 250) /* opaque */ \
					*aDestPixels++ = 0xFF000000 | (r>>8) | (g>>16) | (b>>16);\
				else /* blend */ \
				{\
					uint32_t destPixel = *aDestPixels; \
					uint32_t da = destPixel >> 24;\
					\
					uint32_t dr = (((destPixel&0xFF0000)*da)>>8) & 0xFF0000;\
					uint32_t dg = (((destPixel&0x00FF00)*da)>>8) & 0x00FF00;\
					uint32_t db = (((destPixel&0x0000FF)*da)>>8) & 0x0000FF;\
					\
					int finalAlpha = 256 - (((256 - a)*(256 - da))>>8);\
					r = ((r + (256-a)*dr)/finalAlpha) & 0xFF0000;\
					g = (((g>>8) + (256-a)*dg)/finalAlpha) & 0x00FF00;\
					b = (((b>>8) + (256-a)*db)/finalAlpha) & 0x0000FF;\
					\
					*aDestPixels++ = ((finalAlpha-1)<<24) | r | g | b;					\
				}\
			}	\
		}
		
		#include "BltRotatedHelper.inc"		
		
		#undef WRITE_PIXEL
		#undef DEST_PIXEL_TYPE
		
		
	}
}