Subversion Repositories AndroidProjects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
244 chris 1
{
2
	if (mNoLock)
3
		return;
4
 
5
	// Special path that avoids generating cached native alpha data
6
 
7
	LPDIRECTDRAWSURFACE aSurface = GetSurface();
8
 
9
	if (!LockSurface())
10
		return;
11
 
12
	if (mLockedSurfaceDesc.ddpfPixelFormat.dwRGBBitCount == 16)
13
	{
14
		ushort* aDestPixelsRow = ((ushort*) mLockedSurfaceDesc.lpSurface) + (theY * mLockedSurfaceDesc.lPitch/2) + theX;
15
		SRC_TYPE* aSrcPixelsRow = aSrcBits +
16
			(theSrcRect.mY * theImage->mWidth) + theSrcRect.mX;
17
 
18
		ulong aRMask = mLockedSurfaceDesc.ddpfPixelFormat.dwRBitMask;
19
		ulong aGMask = mLockedSurfaceDesc.ddpfPixelFormat.dwGBitMask;
20
		ulong aBMask = mLockedSurfaceDesc.ddpfPixelFormat.dwBBitMask;
21
 
22
		ulong aRRoundAdd = aRMask >> 1;
23
		ulong aGRoundAdd = aGMask >> 1;
24
		ulong aBRoundAdd = aBMask >> 1;
25
 
26
#ifdef OPTIMIZE_SOFTWARE_DRAWING
27
		bool performNormalBlit = true;
28
		if (gOptimizeSoftwareDrawing) // we know the ordering of the bit masks.
29
		{
30
			if (aGMask == 0x7E0)
31
			{
32
				performNormalBlit = false;
33
				for (int y = 0; y < theSrcRect.mHeight; y++)
34
				{
35
					ushort* aDestPixels = aDestPixelsRow;
36
					SRC_TYPE* aSrcPixels = aSrcPixelsRow;
37
 
38
					for (int x = 0; x < theSrcRect.mWidth; x++)
39
					{
40
						ulong src = NEXT_SRC_COLOR;
41
						ulong dest = *aDestPixels;
42
 
43
						int a = src >> 27;
44
						//int oma = 256 - a;
45
 
46
						src = ((src & 0xFC00) << 11) + ((src >> 8) & 0xF800) + ((src >> 3) & 0x1F);
47
						dest = (dest | (dest << 16)) & 0x7E0F81F;
48
						dest += ((src - dest) * a) >> 5;
49
						dest &= 0x7E0F81F;
50
						*(aDestPixels++) = dest | (dest >> 16);
51
							//(((((dest & aBMask) * oma) + (((src & 0x000000FF) * a * aBMask) >> 8) + aBRoundAdd) >> 8) & aBMask) +
52
							//(((((dest & aGMask) * oma) + ((((src & 0x0000FF00) >> 8) * a * aGMask) >> 8) + aGRoundAdd) >> 8) & aGMask) +
53
							//(((((dest & aRMask) * oma) + ((((src & 0x00FF0000) >> 16) * a * aRMask) >> 8) + aRRoundAdd) >> 8) & aRMask);
54
					}
55
 
56
					aDestPixelsRow += mLockedSurfaceDesc.lPitch/2;
57
					aSrcPixelsRow += theImage->mWidth;
58
				}
59
			}
60
			else if (aGMask == 0x3E0)
61
			{
62
				performNormalBlit = false;
63
				for (int y = 0; y < theSrcRect.mHeight; y++)
64
				{
65
					ushort* aDestPixels = aDestPixelsRow;
66
					SRC_TYPE* aSrcPixels = aSrcPixelsRow;
67
 
68
					for (int x = 0; x < theSrcRect.mWidth; x++)
69
					{
70
						ulong src = NEXT_SRC_COLOR;
71
						ulong dest = *aDestPixels;
72
 
73
						int a = src >> 27;
74
						//int oma = 256 - a;
75
 
76
						src = ((src & 0xF800) << 10) + ((src >> 9) & 0x7C00) + ((src >> 3) & 0x1F);
77
						dest = (dest | (dest << 16)) & 0x3E07C1F;
78
						dest += ((src - dest) * a) >> 5;		// 1*d - a*d = (1-a)*d = oma*d :)
79
						dest &= 0x3E07C1F;
80
						*(aDestPixels++) = dest | (dest >> 16);
81
							//(((((dest & aBMask) * oma) + (((src & 0x000000FF) * a * aBMask) >> 8) + aBRoundAdd) >> 8) & aBMask) +
82
							//(((((dest & aGMask) * oma) + ((((src & 0x0000FF00) >> 8) * a * aGMask) >> 8) + aGRoundAdd) >> 8) & aGMask) +
83
							//(((((dest & aRMask) * oma) + ((((src & 0x00FF0000) >> 16) * a * aRMask) >> 8) + aRRoundAdd) >> 8) & aRMask);
84
					}
85
 
86
 
87
					aDestPixelsRow += mLockedSurfaceDesc.lPitch/2;
88
					aSrcPixelsRow += theImage->mWidth;
89
				}
90
			}
91
		}
92
		if (performNormalBlit)
93
#endif
94
		{
95
			for (int y = 0; y < theSrcRect.mHeight; y++)
96
			{
97
				ushort* aDestPixels = aDestPixelsRow;
98
				SRC_TYPE* aSrcPixels = aSrcPixelsRow;
99
 
100
				for (int x = 0; x < theSrcRect.mWidth; x++)
101
				{
102
					ulong src = NEXT_SRC_COLOR;
103
					ulong dest = *aDestPixels;
104
 
105
					int a = src >> 24;
106
					int oma = 256 - a;
107
 
108
					*(aDestPixels++) =
109
						(((((dest & aBMask) * oma) + (((src & 0x000000FF) * a * aBMask) >> 8) + aBRoundAdd) >> 8) & aBMask) +
110
						(((((dest & aGMask) * oma) + ((((src & 0x0000FF00) >> 8) * a * aGMask) >> 8) + aGRoundAdd) >> 8) & aGMask) +
111
						(((((dest & aRMask) * oma) + ((((src & 0x00FF0000) >> 16) * a * aRMask) >> 8) + aRRoundAdd) >> 8) & aRMask);
112
				}
113
 
114
				aDestPixelsRow += mLockedSurfaceDesc.lPitch/2;
115
				aSrcPixelsRow += theImage->mWidth;
116
			}
117
		}
118
	}
119
	else if (mLockedSurfaceDesc.ddpfPixelFormat.dwRGBBitCount == 32)
120
	{
121
		ulong* aDestPixelsRow = ((ulong*) mLockedSurfaceDesc.lpSurface) + (theY * mLockedSurfaceDesc.lPitch/4) + theX;
122
		SRC_TYPE* aSrcPixelsRow = aSrcBits +
123
			(theSrcRect.mY * theImage->mWidth) + theSrcRect.mX;
124
 
125
		ulong aRMask = mLockedSurfaceDesc.ddpfPixelFormat.dwRBitMask;
126
		ulong aGMask = mLockedSurfaceDesc.ddpfPixelFormat.dwGBitMask;
127
		ulong aBMask = mLockedSurfaceDesc.ddpfPixelFormat.dwBBitMask;
128
 
129
		ulong aRRoundAdd = aRMask >> 1;
130
		ulong aGRoundAdd = aGMask >> 1;
131
		ulong aBRoundAdd = aBMask >> 1;
132
 
133
#ifdef OPTIMIZE_SOFTWARE_DRAWING
134
		if (gOptimizeSoftwareDrawing)
135
		{
136
			for (int y = 0; y < theSrcRect.mHeight; y++)
137
			{
138
				ulong* aDestPixels = aDestPixelsRow;
139
				SRC_TYPE* aSrcPixels = aSrcPixelsRow;
140
 
141
				for (int x = 0; x < theSrcRect.mWidth; x++)
142
				{
143
					ulong src = NEXT_SRC_COLOR;
144
					ulong dest = *aDestPixels;
145
 
146
					int a = src >> 24;
147
					//int oma = 256 - a;
148
					ulong srctmp = src & 0xFF00FF;
149
					ulong desttmp = dest & 0xFF00FF;
150
					desttmp = (desttmp + (((srctmp - desttmp) * a) >> 8)) & 0xFF00FF;
151
					src &= 0x00FF00;
152
					dest &= 0x00FF00;
153
					dest = (dest + (((src - dest) * a) >> 8)) & 0x00FF00;
154
 
155
					*(aDestPixels++) = dest | desttmp;
156
						//(((((dest & aBMask) * oma) + ((((src & 0x000000FF) * a) >> 8) * aBMask) + aBRoundAdd) >> 8) & aBMask) +
157
						//(((((dest & aGMask) * oma) + (((((src & 0x0000FF00) >> 8) * a) >> 8) * aGMask) + aGRoundAdd) >> 8) & aGMask) +
158
						//(((((dest & aRMask) * oma) + (((((src & 0x00FF0000) >> 16) * a) >> 8) * aRMask) + aRRoundAdd) >> 8) & aRMask);
159
				}
160
 
161
				aDestPixelsRow += mLockedSurfaceDesc.lPitch/4;
162
				aSrcPixelsRow += theImage->mWidth;
163
			}
164
		}
165
		else
166
#endif
167
		{
168
			for (int y = 0; y < theSrcRect.mHeight; y++)
169
			{
170
				ulong* aDestPixels = aDestPixelsRow;
171
				SRC_TYPE* aSrcPixels = aSrcPixelsRow;
172
 
173
				for (int x = 0; x < theSrcRect.mWidth; x++)
174
				{
175
					ulong src = NEXT_SRC_COLOR;
176
					ulong dest = *aDestPixels;
177
 
178
					int a = src >> 24;
179
					int oma = 256 - a;
180
 
181
					*(aDestPixels++) =
182
						(((((dest & aBMask) * oma) + ((((src & 0x000000FF) * a) >> 8) * aBMask) + aBRoundAdd) >> 8) & aBMask) +
183
						(((((dest & aGMask) * oma) + (((((src & 0x0000FF00) >> 8) * a) >> 8) * aGMask) + aGRoundAdd) >> 8) & aGMask) +
184
						(((((dest & aRMask) * oma) + (((((src & 0x00FF0000) >> 16) * a) >> 8) * aRMask) + aRRoundAdd) >> 8) & aRMask);
185
				}
186
 
187
				aDestPixelsRow += mLockedSurfaceDesc.lPitch/4;
188
				aSrcPixelsRow += theImage->mWidth;
189
			}
190
		}
191
	}
192
 
193
	UnlockSurface();
194
}