Subversion Repositories AndroidProjects

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
244 chris 1
{
2
	aMemoryImage->CommitBits();
3
 
4
	RECT aDestRect = {theX, theY, theX + theSrcRect.mWidth, theY + theSrcRect.mHeight};
5
	RECT aSrcRect = {theSrcRect.mX, theSrcRect.mY, theSrcRect.mX + theSrcRect.mWidth, theSrcRect.mY + theSrcRect.mHeight};
6
 
7
	if (!LockSurface())
8
		return;
9
 
10
	uchar* aSrcRLAdditiveData = aMemoryImage->GetRLAdditiveData(mDDInterface);
11
 
12
	if (mLockedSurfaceDesc.ddpfPixelFormat.dwRGBBitCount == 16)
13
	{
14
		ushort* aDestPixelsRow = ((ushort*) mLockedSurfaceDesc.lpSurface) + (theY * mLockedSurfaceDesc.lPitch/2) + theX;
15
 
16
		uchar* aRLAdditiveDataRow = aSrcRLAdditiveData + (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
		int aMaxR = (1<<mDDInterface->mRedBits) - 1;
23
		int aMaxG = (1<<mDDInterface->mGreenBits) - 1;
24
		int aMaxB = (1<<mDDInterface->mBlueBits) - 1;
25
 
26
		int aRedShift = mDDInterface->mRedShift;
27
		int aGreenShift = mDDInterface->mGreenShift;
28
		int aBlueShift = mDDInterface->mBlueShift;
29
 
30
		int* aMaxRedTable = mDDInterface->mRedAddTable;
31
		int* aMaxGreenTable = mDDInterface->mGreenAddTable;
32
		int* aMaxBlueTable = mDDInterface->mBlueAddTable;
33
 
34
		if (theColor == Color::White)
35
		{
36
			for (int y = 0; y < theSrcRect.mHeight; y++)
37
			{
38
				ushort* aDestPixels = aDestPixelsRow;
39
				uchar* aRLAdditiveData = aRLAdditiveDataRow;
40
 
41
				aSrcPixels = aSrcPixelsRow;
42
 
43
				for (int aSpanLeft = theSrcRect.mWidth; aSpanLeft > 0; )
44
				{
45
					ulong src = PEEK_SRC_COLOR;
46
					uchar rl = *aRLAdditiveData;
47
 
48
					if (rl > aSpanLeft)
49
						rl = aSpanLeft;
50
 
51
					if ((src & 0xFFFFFF) == 0) // A run of black
52
					{
53
						aSrcPixels += rl;
54
						aDestPixels _PLUSEQUALS rl;
55
					}
56
					else
57
					{
58
						for (int i = 0; i < rl; i++)
59
						{
60
							src = NEXT_SRC_COLOR;
61
							ulong dest = *aDestPixels;
62
 
63
							int r = aMaxRedTable[((dest & aRMask) + (src & aRMask)) >> aRedShift];
64
							int g = aMaxGreenTable[((dest & aGMask) + (src & aGMask)) >> aGreenShift];
65
							int b = aMaxBlueTable[((dest & aBMask) + (src & aBMask)) >> aBlueShift];
66
 
67
							*(aDestPixels _PLUSPLUS) =
68
								(r << aRedShift) |
69
								(g << aGreenShift) |
70
								(b << aBlueShift);
71
						}
72
					}
73
 
74
					aRLAdditiveData += rl;
75
					aSpanLeft -= rl;
76
				}
77
 
78
				aDestPixelsRow += mLockedSurfaceDesc.lPitch/2;
79
				aSrcPixelsRow += theImage->mWidth;
80
				aRLAdditiveDataRow += theImage->mWidth;
81
			}
82
		}
83
		else
84
		{
85
			int ca = theColor.mAlpha;
86
			int cr = (theColor.mRed * ca) / 255;
87
			int cg = (theColor.mGreen * ca) / 255;
88
			int cb = (theColor.mBlue * ca) / 255;
89
 
90
			for (int y = 0; y < theSrcRect.mHeight; y++)
91
			{
92
				ushort* aDestPixels = aDestPixelsRow;
93
				uchar* aRLAdditiveData = aRLAdditiveDataRow;
94
 
95
				aSrcPixels = aSrcPixelsRow;
96
 
97
				for (int aSpanLeft = theSrcRect.mWidth; aSpanLeft > 0; )
98
				{
99
					ulong src = PEEK_SRC_COLOR;
100
					uchar rl = *aRLAdditiveData;
101
 
102
					if (rl > aSpanLeft)
103
						rl = aSpanLeft;
104
 
105
					if ((src & 0xFFFFFF) == 0) // A run of black
106
					{
107
						aSrcPixels += rl;
108
						aDestPixels _PLUSEQUALS rl;
109
					}
110
					else
111
					{
112
						for (int i = 0; i < rl; i++)
113
						{
114
							src = NEXT_SRC_COLOR;
115
							ulong dest = *aDestPixels;
116
 
117
							int r = aMaxRedTable[((dest & aRMask) >> aRedShift) + ((((src & aRMask) >> aRedShift) * cr) >> 8)];
118
							int g = aMaxGreenTable[((dest & aGMask) >> aGreenShift) + ((((src & aGMask) >> aGreenShift) * cg) >> 8)];
119
							int b = aMaxBlueTable[((dest & aBMask) >> aBlueShift) + ((((src & aBMask) >> aBlueShift) * cb) >> 8)];
120
 
121
							*(aDestPixels _PLUSPLUS) =
122
								(r << aRedShift) |
123
								(g << aGreenShift) |
124
								(b << aBlueShift);
125
						}
126
					}
127
 
128
					aRLAdditiveData += rl;
129
					aSpanLeft -= rl;
130
				}
131
 
132
				aDestPixelsRow += mLockedSurfaceDesc.lPitch/2;
133
				aSrcPixelsRow += theImage->mWidth;
134
				aRLAdditiveDataRow += theImage->mWidth;
135
			}
136
		}
137
	}
138
	else if (mLockedSurfaceDesc.ddpfPixelFormat.dwRGBBitCount == 32)
139
	{
140
		ulong* aDestPixelsRow = ((ulong*) mLockedSurfaceDesc.lpSurface) + (theY * mLockedSurfaceDesc.lPitch/4) + theX;
141
		uchar* aRLAdditiveDataRow = aSrcRLAdditiveData + (theSrcRect.mY * theImage->mWidth) + theSrcRect.mX;
142
 
143
		ulong aRMask = mLockedSurfaceDesc.ddpfPixelFormat.dwRBitMask;
144
		ulong aGMask = mLockedSurfaceDesc.ddpfPixelFormat.dwGBitMask;
145
		ulong aBMask = mLockedSurfaceDesc.ddpfPixelFormat.dwBBitMask;
146
 
147
		int aMaxR = (1<<mDDInterface->mRedBits) - 1;
148
		int aMaxG = (1<<mDDInterface->mGreenBits) - 1;
149
		int aMaxB = (1<<mDDInterface->mBlueBits) - 1;
150
 
151
		int aRedShift = mDDInterface->mRedShift;
152
		int aGreenShift = mDDInterface->mGreenShift;
153
		int aBlueShift = mDDInterface->mBlueShift;
154
 
155
		int* aMaxRedTable = mDDInterface->mRedAddTable;
156
		int* aMaxGreenTable = mDDInterface->mGreenAddTable;
157
		int* aMaxBlueTable = mDDInterface->mBlueAddTable;
158
 
159
		if (theColor == Color::White)
160
		{
161
			for (int y = 0; y < theSrcRect.mHeight; y++)
162
			{
163
				ulong* aDestPixels = aDestPixelsRow;
164
				uchar* aRLAdditiveData = aRLAdditiveDataRow;
165
 
166
				aSrcPixels = aSrcPixelsRow;
167
 
168
				for (int aSpanLeft = theSrcRect.mWidth; aSpanLeft > 0; )
169
				{
170
					ulong src = PEEK_SRC_COLOR;
171
					uchar rl = *aRLAdditiveData;
172
 
173
					if (rl > aSpanLeft)
174
						rl = aSpanLeft;
175
 
176
					if ((src & 0xFFFFFF) == 0) // A run of black
177
					{
178
						aSrcPixels += rl;
179
						aDestPixels _PLUSEQUALS rl;
180
					}
181
					else
182
					{
183
						for (int i = 0; i < rl; i++)
184
						{
185
							src = NEXT_SRC_COLOR;
186
							ulong dest = *aDestPixels;
187
 
188
							int r = aMaxRedTable[((dest & aRMask) + (src & aRMask)) >> aRedShift];
189
							int g = aMaxGreenTable[((dest & aGMask) + (src & aGMask)) >> aGreenShift];
190
							int b = aMaxBlueTable[((dest & aBMask) + (src & aBMask)) >> aBlueShift];
191
 
192
							*(aDestPixels _PLUSPLUS) =
193
								(r << aRedShift) |
194
								(g << aGreenShift) |
195
								(b << aBlueShift);
196
						}
197
					}
198
 
199
					aRLAdditiveData += rl;
200
					aSpanLeft -= rl;
201
				}
202
 
203
				aDestPixelsRow += mLockedSurfaceDesc.lPitch/4;
204
				aSrcPixelsRow += theImage->mWidth;
205
				aRLAdditiveDataRow += theImage->mWidth;
206
			}
207
		}
208
		else
209
		{
210
			int ca = theColor.mAlpha;
211
			int cr = (theColor.mRed * ca) / 255;
212
			int cg = (theColor.mGreen * ca) / 255;
213
			int cb = (theColor.mBlue * ca) / 255;
214
 
215
			for (int y = 0; y < theSrcRect.mHeight; y++)
216
			{
217
				ulong* aDestPixels = aDestPixelsRow;
218
				uchar* aRLAdditiveData = aRLAdditiveDataRow;
219
 
220
				aSrcPixels = aSrcPixelsRow;
221
 
222
				for (int aSpanLeft = theSrcRect.mWidth; aSpanLeft > 0; )
223
				{
224
					ulong src = PEEK_SRC_COLOR;
225
					uchar rl = *aRLAdditiveData;
226
 
227
					if (rl > aSpanLeft)
228
						rl = aSpanLeft;
229
 
230
					if ((src & 0xFFFFFF) == 0) // A run of black
231
					{
232
						aSrcPixels += rl;
233
						aDestPixels _PLUSEQUALS rl;
234
					}
235
					else
236
					{
237
						for (int i = 0; i < rl; i++)
238
						{
239
							src = NEXT_SRC_COLOR;
240
							ulong dest = *aDestPixels;
241
 
242
							int r = aMaxRedTable[((dest & aRMask) >> aRedShift) + ((((src & aRMask) >> aRedShift) * cr) >> 8)];
243
							int g = aMaxGreenTable[((dest & aGMask) >> aGreenShift) + ((((src & aGMask) >> aGreenShift) * cg) >> 8)];
244
							int b = aMaxBlueTable[((dest & aBMask) >> aBlueShift) + ((((src & aBMask) >> aBlueShift) * cb) >> 8)];
245
 
246
							*(aDestPixels _PLUSPLUS) =
247
								(r << aRedShift) |
248
								(g << aGreenShift) |
249
								(b << aBlueShift);
250
						}
251
					}
252
 
253
					aRLAdditiveData += rl;
254
					aSpanLeft -= rl;
255
				}
256
 
257
				aDestPixelsRow += mLockedSurfaceDesc.lPitch/4;
258
				aSrcPixelsRow += theImage->mWidth;
259
				aRLAdditiveDataRow += theImage->mWidth;
260
			}
261
		}
262
	}
263
 
264
	UnlockSurface();
265
}