1 |
|
---|
2 | #define _OS2WIN_H
|
---|
3 | #define FAR
|
---|
4 |
|
---|
5 | #include <odin.h>
|
---|
6 | #include <winbase.h>
|
---|
7 | #include <stdlib.h>
|
---|
8 | #include <string.h>
|
---|
9 | #include <memory.h>
|
---|
10 | #define mmioFOURCC( ch0, ch1, ch2, ch3 ) \
|
---|
11 | ( (DWORD)(BYTE)(ch0) | ( (DWORD)(BYTE)(ch1) << 8 ) | \
|
---|
12 | ( (DWORD)(BYTE)(ch2) << 16 ) | ( (DWORD)(BYTE)(ch3) << 24 ) )
|
---|
13 | #include <fourcc.h>
|
---|
14 |
|
---|
15 | #define CINTERFACE
|
---|
16 | #include "ddraw2d.h"
|
---|
17 | #include "clipper.h"
|
---|
18 | #include "palette.h"
|
---|
19 | #include "surface.h"
|
---|
20 | #include "surfacehlp.h"
|
---|
21 | #include "os2util.h"
|
---|
22 | #include "rectangle.h"
|
---|
23 |
|
---|
24 | #include <misc.h>
|
---|
25 | #include "asmutil.h"
|
---|
26 | #include "bltFunc.h"
|
---|
27 | #include "colorconv.h"
|
---|
28 | #include "fillfunc.h"
|
---|
29 | #include <winerror.h>
|
---|
30 | #include <os2win.h>
|
---|
31 | #include <cpuhlp.h>
|
---|
32 | #include "asmutil.h"
|
---|
33 |
|
---|
34 | // ToDo: Move the following 2 defines in the right WINE headers.
|
---|
35 | BYTE DefaultPalette[] = { 0x00,0x00,0x00, // 0
|
---|
36 | 0x80,0x00,0x00, // 1
|
---|
37 | 0x00,0x80,0x00, // 2
|
---|
38 | 0x80,0x80,0x00, // 3
|
---|
39 | 0x00,0x00,0x80, // 4
|
---|
40 | 0x80,0x00,0x80, // 5
|
---|
41 | 0x00,0x80,0x80, // 6
|
---|
42 | 0xC0,0xC0,0xC0, // 7
|
---|
43 | 0xC0,0xDC,0xC0, // 8
|
---|
44 | 0xA6,0xCA,0xF0, // 9
|
---|
45 | 0x04,0x04,0x04, // 10
|
---|
46 | 0x08,0x08,0x08, // 11
|
---|
47 | 0x0C,0x0C,0x0C, // 12
|
---|
48 | 0x11,0x11,0x11, // 13
|
---|
49 | 0x16,0x16,0x16, // 14
|
---|
50 | 0x1C,0x1C,0x1C, // 15
|
---|
51 | 0x22,0x22,0x22, // 16
|
---|
52 | 0x29,0x29,0x29, // 17
|
---|
53 | 0x55,0x55,0x55, // 18
|
---|
54 | 0x4D,0x4D,0x4D,
|
---|
55 | 0x42,0x42,0x42,
|
---|
56 | 0x39,0x39,0x39,
|
---|
57 | 0x81,0x81,0x81,
|
---|
58 | 0x81,0x00,0x00,
|
---|
59 | 0x00,0x81,0x00,
|
---|
60 | 0x81,0x81,0x00,
|
---|
61 | 0x00,0x00,0x81,
|
---|
62 | 0x81,0x00,0x81,
|
---|
63 | 0x00,0x81,0x81,
|
---|
64 | 0x33,0x00,0x00,
|
---|
65 | 0x66,0x00,0x00,
|
---|
66 | 0x99,0x00,0x00,
|
---|
67 | 0xCC,0x00,0x00,
|
---|
68 | 0x00,0x33,0x00,
|
---|
69 | 0x33,0x33,0x00,
|
---|
70 | 0x66,0x33,0x00,
|
---|
71 | 0x99,0x33,0x00,
|
---|
72 | 0xCC,0x33,0x00,
|
---|
73 | 0xFF,0x33,0x00,
|
---|
74 | 0x00,0x66,0x00,
|
---|
75 | 0x33,0x66,0x00,
|
---|
76 | 0x66,0x66,0x00,
|
---|
77 | 0x99,0x66,0x00,
|
---|
78 | 0xCC,0x66,0x00,
|
---|
79 | 0xFF,0x66,0x00,
|
---|
80 | 0x00,0x99,0x00,
|
---|
81 | 0x33,0x99,0x00,
|
---|
82 | 0x66,0x99,0x00,
|
---|
83 | 0x99,0x99,0x00,
|
---|
84 | 0xCC,0x99,0x00,
|
---|
85 | 0xFF,0x99,0x00,
|
---|
86 | 0x00,0xCC,0x00,
|
---|
87 | 0x33,0xCC,0x00,
|
---|
88 | 0x66,0xCC,0x00,
|
---|
89 | 0x99,0xCC,0x00,
|
---|
90 | 0xCC,0xCC,0x00,
|
---|
91 | 0xFF,0xCC,0x00,
|
---|
92 | 0x66,0xFF,0x00,
|
---|
93 | 0x99,0xFF,0x00,
|
---|
94 | 0xCC,0xFF,0x00,
|
---|
95 | 0x00,0x00,0x33,
|
---|
96 | 0x33,0x00,0x33,
|
---|
97 | 0x66,0x00,0x33,
|
---|
98 | 0x99,0x00,0x33,
|
---|
99 | 0xCC,0x00,0x33,
|
---|
100 | 0xFF,0x00,0x33,
|
---|
101 | 0x00,0x33,0x33,
|
---|
102 | 0x33,0x33,0x33,
|
---|
103 | 0x66,0x33,0x33,
|
---|
104 | 0x99,0x33,0x33,
|
---|
105 | 0xCC,0x33,0x33,
|
---|
106 | 0xFF,0x33,0x33,
|
---|
107 | 0x00,0x66,0x33,
|
---|
108 | 0x33,0x66,0x33,
|
---|
109 | 0x66,0x66,0x33,
|
---|
110 | 0x99,0x66,0x33,
|
---|
111 | 0xCC,0x66,0x33,
|
---|
112 | 0xFF,0x66,0x33,
|
---|
113 | 0x00,0x99,0x33,
|
---|
114 | 0x33,0x99,0x33,
|
---|
115 | 0x66,0x99,0x33,
|
---|
116 | 0x99,0x99,0x33,
|
---|
117 | 0xCC,0x99,0x33,
|
---|
118 | 0xFF,0x99,0x33,
|
---|
119 | 0x00,0xCC,0x33,
|
---|
120 | 0x33,0xCC,0x33,
|
---|
121 | 0x66,0xCC,0x33,
|
---|
122 | 0x99,0xCC,0x33,
|
---|
123 | 0xCC,0xCC,0x33,
|
---|
124 | 0xFF,0xCC,0x33,
|
---|
125 | 0x33,0xFF,0x33,
|
---|
126 | 0x66,0xFF,0x33,
|
---|
127 | 0x99,0xFF,0x33,
|
---|
128 | 0xCC,0xFF,0x33,
|
---|
129 | 0xFF,0xFF,0x33,
|
---|
130 | 0x00,0x00,0x66,
|
---|
131 | 0x33,0x00,0x66,
|
---|
132 | 0x66,0x00,0x66,
|
---|
133 | 0x99,0x00,0x66,
|
---|
134 | 0xCC,0x00,0x66,
|
---|
135 | 0xFF,0x00,0x66,
|
---|
136 | 0x00,0x33,0x66,
|
---|
137 | 0x33,0x33,0x66,
|
---|
138 | 0x66,0x33,0x66,
|
---|
139 | 0x99,0x33,0x66,
|
---|
140 | 0xCC,0x33,0x66,
|
---|
141 | 0xFF,0x33,0x66,
|
---|
142 | 0x00,0x66,0x66,
|
---|
143 | 0x33,0x66,0x66,
|
---|
144 | 0x66,0x66,0x66,
|
---|
145 | 0x99,0x66,0x66,
|
---|
146 | 0xCC,0x66,0x66,
|
---|
147 | 0x00,0x99,0x66,
|
---|
148 | 0x33,0x99,0x66,
|
---|
149 | 0x66,0x99,0x66,
|
---|
150 | 0x99,0x99,0x66,
|
---|
151 | 0xCC,0x99,0x66,
|
---|
152 | 0xFF,0x99,0x66,
|
---|
153 | 0x00,0xCC,0x66,
|
---|
154 | 0x33,0xCC,0x66,
|
---|
155 | 0x99,0xCC,0x66,
|
---|
156 | 0xCC,0xCC,0x66,
|
---|
157 | 0xFF,0xCC,0x66,
|
---|
158 | 0x00,0xFF,0x66,
|
---|
159 | 0x33,0xFF,0x66,
|
---|
160 | 0x99,0xFF,0x66,
|
---|
161 | 0xCC,0xFF,0x66,
|
---|
162 | 0xFF,0x00,0xCC,
|
---|
163 | 0xCC,0x00,0xFF,
|
---|
164 | 0x00,0x99,0x99,
|
---|
165 | 0x99,0x33,0x99,
|
---|
166 | 0x99,0x00,0x99,
|
---|
167 | 0xCC,0x00,0x99,
|
---|
168 | 0x00,0x00,0x99,
|
---|
169 | 0x33,0x33,0x99,
|
---|
170 | 0x66,0x00,0x99,
|
---|
171 | 0xCC,0x33,0x99,
|
---|
172 | 0xFF,0x00,0x99,
|
---|
173 | 0x00,0x66,0x99,
|
---|
174 | 0x33,0x33,0x99,
|
---|
175 | 0x33,0x66,0x99,
|
---|
176 | 0x66,0x33,0x99,
|
---|
177 | 0x99,0x33,0x99,
|
---|
178 | 0xCC,0x66,0x99,
|
---|
179 | 0xFF,0x33,0x99,
|
---|
180 | 0x33,0x99,0x99,
|
---|
181 | 0x66,0x99,0x99,
|
---|
182 | 0x99,0x99,0x99,
|
---|
183 | 0xCC,0x99,0x99,
|
---|
184 | 0xFF,0x99,0x99,
|
---|
185 | 0x00,0xCC,0x99,
|
---|
186 | 0x33,0xCC,0x99,
|
---|
187 | 0x66,0xCC,0x66,
|
---|
188 | 0x99,0xCC,0x99,
|
---|
189 | 0xCC,0xCC,0x99,
|
---|
190 | 0xFF,0xCC,0x99,
|
---|
191 | 0x00,0xFF,0x99,
|
---|
192 | 0x33,0xFF,0x99,
|
---|
193 | 0x66,0xCC,0x99,
|
---|
194 | 0x99,0xFF,0x99,
|
---|
195 | 0xCC,0xFF,0x99,
|
---|
196 | 0xFF,0xFF,0x99,
|
---|
197 | 0x00,0x00,0xCC,
|
---|
198 | 0x33,0x00,0x99,
|
---|
199 | 0x66,0x00,0xCC,
|
---|
200 | 0x99,0x00,0xCC,
|
---|
201 | 0xCC,0x00,0xCC,
|
---|
202 | 0x00,0x33,0x99,
|
---|
203 | 0x33,0x33,0xCC,
|
---|
204 | 0x66,0x33,0xCC,
|
---|
205 | 0x99,0x33,0xCC,
|
---|
206 | 0xCC,0x33,0xCC,
|
---|
207 | 0xFF,0x33,0xCC,
|
---|
208 | 0x00,0x66,0xCC,
|
---|
209 | 0x33,0x66,0xCC,
|
---|
210 | 0x66,0x66,0x99,
|
---|
211 | 0x99,0x66,0xCC,
|
---|
212 | 0xCC,0x66,0xCC,
|
---|
213 | 0xFF,0x66,0x99,
|
---|
214 | 0x00,0x99,0xCC,
|
---|
215 | 0x33,0x99,0xCC,
|
---|
216 | 0x66,0x99,0xCC,
|
---|
217 | 0x99,0x99,0xCC,
|
---|
218 | 0xCC,0x99,0xCC,
|
---|
219 | 0xFF,0x99,0xCC,
|
---|
220 | 0x00,0xCC,0xCC,
|
---|
221 | 0x33,0xCC,0xCC,
|
---|
222 | 0x66,0xCC,0xCC,
|
---|
223 | 0x99,0xCC,0xCC,
|
---|
224 | 0xCC,0xCC,0xCC,
|
---|
225 | 0xFF,0xCC,0xCC,
|
---|
226 | 0x00,0xFF,0xCC,
|
---|
227 | 0x33,0xFF,0xCC,
|
---|
228 | 0x66,0xFF,0x99,
|
---|
229 | 0x99,0xFF,0xCC,
|
---|
230 | 0xCC,0xFF,0xCC,
|
---|
231 | 0xFF,0xFF,0xCC,
|
---|
232 | 0x33,0x00,0xCC,
|
---|
233 | 0x66,0x00,0xFF,
|
---|
234 | 0x99,0x00,0xFF,
|
---|
235 | 0x00,0x33,0xCC,
|
---|
236 | 0x33,0x33,0xFF,
|
---|
237 | 0x66,0x33,0xFF,
|
---|
238 | 0x99,0x33,0xFF,
|
---|
239 | 0xCC,0x33,0xFF,
|
---|
240 | 0xFF,0x33,0xFF,
|
---|
241 | 0x00,0x66,0xFF,
|
---|
242 | 0x33,0x66,0xFF,
|
---|
243 | 0x66,0x66,0xCC,
|
---|
244 | 0x99,0x66,0xFF,
|
---|
245 | 0xCC,0x66,0xFF,
|
---|
246 | 0xFF,0x66,0xCC,
|
---|
247 | 0x00,0x99,0xFF,
|
---|
248 | 0x33,0x99,0xFF,
|
---|
249 | 0x66,0x99,0xFF,
|
---|
250 | 0x99,0x99,0xFF,
|
---|
251 | 0xCC,0x99,0xFF,
|
---|
252 | 0xFF,0x99,0xFF,
|
---|
253 | 0x00,0xCC,0xFF,
|
---|
254 | 0x33,0xCC,0xFF,
|
---|
255 | 0x66,0xCC,0xFF,
|
---|
256 | 0x99,0xCC,0xFF,
|
---|
257 | 0xCC,0xCC,0xFF,
|
---|
258 | 0xFF,0xCC,0xFF,
|
---|
259 | 0x33,0xFF,0xFF,
|
---|
260 | 0x66,0xFF,0xCC,
|
---|
261 | 0x99,0xFF,0xFF,
|
---|
262 | 0xCC,0xFF,0xFF,
|
---|
263 | 0xFF,0x66,0x66,
|
---|
264 | 0x66,0xFF,0x66,
|
---|
265 | 0xFF,0xFF,0x66,
|
---|
266 | 0x66,0x66,0xFF,
|
---|
267 | 0xFF,0x66,0xFF,
|
---|
268 | 0x66,0xFF,0xFF,
|
---|
269 | 0xC1,0xC1,0xC1,
|
---|
270 | 0x5F,0x5F,0x5F,
|
---|
271 | 0x77,0x77,0x77,
|
---|
272 | 0x86,0x86,0x86,
|
---|
273 | 0x96,0x96,0x96,
|
---|
274 | 0xCB,0xCB,0xCB,
|
---|
275 | 0xB2,0xB2,0xB2,
|
---|
276 | 0xD7,0xD7,0xD7,
|
---|
277 | 0xDD,0xDD,0xDD,
|
---|
278 | 0xE3,0xE3,0xE3,
|
---|
279 | 0xEA,0xEA,0xEA,
|
---|
280 | 0xF1,0xF1,0xF1,
|
---|
281 | 0xF8,0xF8,0xF8,
|
---|
282 | 0xFF,0xFB,0xF0,
|
---|
283 | 0xA0,0xA0,0xA4,
|
---|
284 | 0x80,0x80,0x80,
|
---|
285 | 0xFF,0x00,0x00,
|
---|
286 | 0x00,0xFF,0x00,
|
---|
287 | 0xFF,0xFF,0x00,
|
---|
288 | 0x00,0x00,0xFF,
|
---|
289 | 0xFF,0x00,0xFF,
|
---|
290 | // 0x00,0xFF,0xFF,
|
---|
291 | 0xFF,0xFF,0xFF};
|
---|
292 |
|
---|
293 | WORD wDefaultPalete16[256];
|
---|
294 | DWORD dwDefaultPalete24[256];
|
---|
295 | BOOL fPalInit=FALSE;
|
---|
296 |
|
---|
297 | #define CBM_CREATEDIB 0x02L /* create DIB bitmap */
|
---|
298 |
|
---|
299 | //#define PERFTEST
|
---|
300 | #ifdef PERFTEST
|
---|
301 | LARGE_INTEGER liStart;
|
---|
302 | LARGE_INTEGER liEnd;
|
---|
303 | ULONG average = 0;
|
---|
304 | #endif
|
---|
305 |
|
---|
306 | #ifdef DEBUG
|
---|
307 |
|
---|
308 | // ******************************************************************************
|
---|
309 | // * internal helper functions from WINE
|
---|
310 | // *
|
---|
311 |
|
---|
312 | void _dump_DDBLTFX(DWORD flagmask) {
|
---|
313 | int i;
|
---|
314 | const struct {
|
---|
315 | DWORD mask;
|
---|
316 | char *name;
|
---|
317 | } flags[] = {
|
---|
318 | #define FE(x) { x, #x},
|
---|
319 | FE(DDBLTFX_ARITHSTRETCHY)
|
---|
320 | FE(DDBLTFX_MIRRORLEFTRIGHT)
|
---|
321 | FE(DDBLTFX_MIRRORUPDOWN)
|
---|
322 | FE(DDBLTFX_NOTEARING)
|
---|
323 | FE(DDBLTFX_ROTATE180)
|
---|
324 | FE(DDBLTFX_ROTATE270)
|
---|
325 | FE(DDBLTFX_ROTATE90)
|
---|
326 | FE(DDBLTFX_ZBUFFERRANGE)
|
---|
327 | FE(DDBLTFX_ZBUFFERBASEDEST)
|
---|
328 | };
|
---|
329 | for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
|
---|
330 | if (flags[i].mask & flagmask) {
|
---|
331 | dprintf(("DDRAW: %s ",flags[i].name));
|
---|
332 | };
|
---|
333 | dprintf(("DDRAW: \n"));
|
---|
334 |
|
---|
335 | }
|
---|
336 |
|
---|
337 | void _dump_DDBLTFAST(DWORD flagmask) {
|
---|
338 | int i;
|
---|
339 | const struct {
|
---|
340 | DWORD mask;
|
---|
341 | char *name;
|
---|
342 | } flags[] = {
|
---|
343 | #define FE(x) { x, #x},
|
---|
344 | FE(DDBLTFAST_NOCOLORKEY)
|
---|
345 | FE(DDBLTFAST_SRCCOLORKEY)
|
---|
346 | FE(DDBLTFAST_DESTCOLORKEY)
|
---|
347 | FE(DDBLTFAST_WAIT)
|
---|
348 | };
|
---|
349 | for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
|
---|
350 | if (flags[i].mask & flagmask)
|
---|
351 | dprintf(("DDRAW: %s ",flags[i].name));
|
---|
352 | dprintf(("DDRAW: \n"));
|
---|
353 | }
|
---|
354 |
|
---|
355 | void _dump_DDBLT(DWORD flagmask) {
|
---|
356 | int i;
|
---|
357 | const struct {
|
---|
358 | DWORD mask;
|
---|
359 | char *name;
|
---|
360 | } flags[] = {
|
---|
361 | #define FE(x) { x, #x},
|
---|
362 | FE(DDBLT_ALPHADEST)
|
---|
363 | FE(DDBLT_ALPHADESTCONSTOVERRIDE)
|
---|
364 | FE(DDBLT_ALPHADESTNEG)
|
---|
365 | FE(DDBLT_ALPHADESTSURFACEOVERRIDE)
|
---|
366 | FE(DDBLT_ALPHAEDGEBLEND)
|
---|
367 | FE(DDBLT_ALPHASRC)
|
---|
368 | FE(DDBLT_ALPHASRCCONSTOVERRIDE)
|
---|
369 | FE(DDBLT_ALPHASRCNEG)
|
---|
370 | FE(DDBLT_ALPHASRCSURFACEOVERRIDE)
|
---|
371 | FE(DDBLT_ASYNC)
|
---|
372 | FE(DDBLT_COLORFILL)
|
---|
373 | FE(DDBLT_DDFX)
|
---|
374 | FE(DDBLT_DDROPS)
|
---|
375 | FE(DDBLT_KEYDEST)
|
---|
376 | FE(DDBLT_KEYDESTOVERRIDE)
|
---|
377 | FE(DDBLT_KEYSRC)
|
---|
378 | FE(DDBLT_KEYSRCOVERRIDE)
|
---|
379 | FE(DDBLT_ROP)
|
---|
380 | FE(DDBLT_ROTATIONANGLE)
|
---|
381 | FE(DDBLT_ZBUFFER)
|
---|
382 | FE(DDBLT_ZBUFFERDESTCONSTOVERRIDE)
|
---|
383 | FE(DDBLT_ZBUFFERDESTOVERRIDE)
|
---|
384 | FE(DDBLT_ZBUFFERSRCCONSTOVERRIDE)
|
---|
385 | FE(DDBLT_ZBUFFERSRCOVERRIDE)
|
---|
386 | FE(DDBLT_WAIT)
|
---|
387 | FE(DDBLT_DEPTHFILL)
|
---|
388 | };
|
---|
389 | for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
|
---|
390 | if (flags[i].mask & flagmask)
|
---|
391 | dprintf(("DDRAW: %s ",flags[i].name));
|
---|
392 | dprintf(("DDRAW: \n"));
|
---|
393 | }
|
---|
394 |
|
---|
395 | void _dump_DDSCAPS(DWORD flagmask) {
|
---|
396 | int i;
|
---|
397 | const struct {
|
---|
398 | DWORD mask;
|
---|
399 | char *name;
|
---|
400 | } flags[] = {
|
---|
401 | #define FE(x) { x, #x},
|
---|
402 | FE(DDSCAPS_RESERVED1)
|
---|
403 | FE(DDSCAPS_ALPHA)
|
---|
404 | FE(DDSCAPS_BACKBUFFER)
|
---|
405 | FE(DDSCAPS_COMPLEX)
|
---|
406 | FE(DDSCAPS_FLIP)
|
---|
407 | FE(DDSCAPS_FRONTBUFFER)
|
---|
408 | FE(DDSCAPS_OFFSCREENPLAIN)
|
---|
409 | FE(DDSCAPS_OVERLAY)
|
---|
410 | FE(DDSCAPS_PALETTE)
|
---|
411 | FE(DDSCAPS_PRIMARYSURFACE)
|
---|
412 | FE(DDSCAPS_PRIMARYSURFACELEFT)
|
---|
413 | FE(DDSCAPS_SYSTEMMEMORY)
|
---|
414 | FE(DDSCAPS_TEXTURE)
|
---|
415 | FE(DDSCAPS_3DDEVICE)
|
---|
416 | FE(DDSCAPS_VIDEOMEMORY)
|
---|
417 | FE(DDSCAPS_VISIBLE)
|
---|
418 | FE(DDSCAPS_WRITEONLY)
|
---|
419 | FE(DDSCAPS_ZBUFFER)
|
---|
420 | FE(DDSCAPS_OWNDC)
|
---|
421 | FE(DDSCAPS_LIVEVIDEO)
|
---|
422 | FE(DDSCAPS_HWCODEC)
|
---|
423 | FE(DDSCAPS_MODEX)
|
---|
424 | FE(DDSCAPS_MIPMAP)
|
---|
425 | FE(DDSCAPS_RESERVED2)
|
---|
426 | FE(DDSCAPS_ALLOCONLOAD)
|
---|
427 | FE(DDSCAPS_VIDEOPORT)
|
---|
428 | FE(DDSCAPS_LOCALVIDMEM)
|
---|
429 | FE(DDSCAPS_NONLOCALVIDMEM)
|
---|
430 | FE(DDSCAPS_STANDARDVGAMODE)
|
---|
431 | FE(DDSCAPS_OPTIMIZED)
|
---|
432 | };
|
---|
433 | for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
|
---|
434 | if (flags[i].mask & flagmask)
|
---|
435 | dprintf(("DDRAW: %s ",flags[i].name));
|
---|
436 | dprintf(("DDRAW: \n"));
|
---|
437 | }
|
---|
438 |
|
---|
439 | void _dump_DDSCAPS2(DWORD flagmask) {
|
---|
440 | int i;
|
---|
441 | const struct {
|
---|
442 | DWORD mask;
|
---|
443 | char *name;
|
---|
444 | } flags[] = {
|
---|
445 | #define FE(x) { x, #x},
|
---|
446 | FE(DDSCAPS2_HARDWAREDEINTERLACE)
|
---|
447 | FE(DDSCAPS2_HINTANTIALIASING)
|
---|
448 | FE(DDSCAPS2_HINTDYNAMIC)
|
---|
449 | FE(DDSCAPS2_HINTSTATIC)
|
---|
450 | FE(DDSCAPS2_OPAQUE)
|
---|
451 | FE(DDSCAPS2_TEXTUREMANAGE)
|
---|
452 | };
|
---|
453 | for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
|
---|
454 | if (flags[i].mask & flagmask)
|
---|
455 | dprintf(("DDRAW: %s ",flags[i].name));
|
---|
456 | dprintf(("DDRAW: \n"));
|
---|
457 | }
|
---|
458 |
|
---|
459 |
|
---|
460 | void _dump_DDSD(DWORD flagmask) {
|
---|
461 | int i;
|
---|
462 | const struct {
|
---|
463 | DWORD mask;
|
---|
464 | char *name;
|
---|
465 | } flags[] = {
|
---|
466 | FE(DDSD_CAPS)
|
---|
467 | FE(DDSD_HEIGHT)
|
---|
468 | FE(DDSD_WIDTH)
|
---|
469 | FE(DDSD_PITCH)
|
---|
470 | FE(DDSD_BACKBUFFERCOUNT)
|
---|
471 | FE(DDSD_ZBUFFERBITDEPTH)
|
---|
472 | FE(DDSD_ALPHABITDEPTH)
|
---|
473 | FE(DDSD_PIXELFORMAT)
|
---|
474 | FE(DDSD_CKDESTOVERLAY)
|
---|
475 | FE(DDSD_CKDESTBLT)
|
---|
476 | FE(DDSD_CKSRCOVERLAY)
|
---|
477 | FE(DDSD_CKSRCBLT)
|
---|
478 | FE(DDSD_MIPMAPCOUNT)
|
---|
479 | FE(DDSD_REFRESHRATE)
|
---|
480 | FE(DDSD_LINEARSIZE)
|
---|
481 | FE(DDSD_LPSURFACE)
|
---|
482 | FE(DDSD_TEXTURESTAGE)
|
---|
483 | };
|
---|
484 | for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
|
---|
485 | if (flags[i].mask & flagmask)
|
---|
486 | dprintf(("DDRAW: %s ",flags[i].name));
|
---|
487 | dprintf(("DDRAW: \n"));
|
---|
488 | }
|
---|
489 |
|
---|
490 | void _dump_DDCOLORKEY(DWORD flagmask) {
|
---|
491 | int i;
|
---|
492 | const struct {
|
---|
493 | DWORD mask;
|
---|
494 | char *name;
|
---|
495 | } flags[] = {
|
---|
496 | #define FE(x) { x, #x},
|
---|
497 | FE(DDCKEY_COLORSPACE)
|
---|
498 | FE(DDCKEY_DESTBLT)
|
---|
499 | FE(DDCKEY_DESTOVERLAY)
|
---|
500 | FE(DDCKEY_SRCBLT)
|
---|
501 | FE(DDCKEY_SRCOVERLAY)
|
---|
502 | };
|
---|
503 | for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
|
---|
504 | if (flags[i].mask & flagmask)
|
---|
505 | dprintf(("DDRAW: %s ",flags[i].name));
|
---|
506 | dprintf(("DDRAW: \n"));
|
---|
507 | }
|
---|
508 |
|
---|
509 | void _dump_DDPIXELFORMAT(DWORD flagmask) {
|
---|
510 | int i;
|
---|
511 | const struct {
|
---|
512 | DWORD mask;
|
---|
513 | char *name;
|
---|
514 | } flags[] = {
|
---|
515 | #define FE(x) { x, #x},
|
---|
516 | FE(DDPF_ALPHAPIXELS)
|
---|
517 | FE(DDPF_ALPHA)
|
---|
518 | FE(DDPF_FOURCC)
|
---|
519 | FE(DDPF_PALETTEINDEXED4)
|
---|
520 | FE(DDPF_PALETTEINDEXEDTO8)
|
---|
521 | FE(DDPF_PALETTEINDEXED8)
|
---|
522 | FE(DDPF_RGB)
|
---|
523 | FE(DDPF_COMPRESSED)
|
---|
524 | FE(DDPF_RGBTOYUV)
|
---|
525 | FE(DDPF_YUV)
|
---|
526 | FE(DDPF_ZBUFFER)
|
---|
527 | FE(DDPF_PALETTEINDEXED1)
|
---|
528 | FE(DDPF_PALETTEINDEXED2)
|
---|
529 | FE(DDPF_ZPIXELS)
|
---|
530 | };
|
---|
531 | for (i=0;i<sizeof(flags)/sizeof(flags[0]);i++)
|
---|
532 | if (flags[i].mask & flagmask)
|
---|
533 | dprintf(("DDRAW: %s ",flags[i].name));
|
---|
534 | dprintf(("DDRAW: \n"));
|
---|
535 | }
|
---|
536 |
|
---|
537 | void _dump_pixelformat(LPDDPIXELFORMAT pf) {
|
---|
538 | _dump_DDPIXELFORMAT(pf->dwFlags);
|
---|
539 | dprintf(("DDRAW: dwFourCC : %4s", &pf->dwFourCC));
|
---|
540 | dprintf(("DDRAW: RBG bit count : %ld", pf->dwRGBBitCount));
|
---|
541 | dprintf(("DDRAW: Masks : R %08lx G %08lx B %08lx A %08lx\n",
|
---|
542 | pf->dwRBitMask, pf->dwGBitMask, pf->dwBBitMask, pf->dwRGBAlphaBitMask));
|
---|
543 | }
|
---|
544 |
|
---|
545 | // End of Internal Helpers
|
---|
546 | #endif
|
---|
547 |
|
---|
548 | //******************************************************************************
|
---|
549 | //
|
---|
550 | // Purpose function copies one part of the bitmap inside the same bitmap
|
---|
551 | //
|
---|
552 | //******************************************************************************
|
---|
553 |
|
---|
554 | void __cdecl MoveRects(char* pBuffer, LPRECT lpDestRect, LPRECT lpSrcRect, int bpp, LONG lPitch)
|
---|
555 | {
|
---|
556 |
|
---|
557 | char *pBltPos, *pSrcPos;
|
---|
558 | int BlitWidth,BlitHeight;
|
---|
559 | static char Scanline[6400]; // sufficient for 1600 at 32 bit
|
---|
560 |
|
---|
561 | if(sizeof(Scanline) < lPitch) {
|
---|
562 | DebugInt3(); //oh, oh
|
---|
563 | return;
|
---|
564 | }
|
---|
565 | // Bridge, we may got a problem ;)
|
---|
566 | // Check for Overlapping Rects
|
---|
567 |
|
---|
568 | pBltPos = pBuffer;
|
---|
569 | pSrcPos = pBuffer;
|
---|
570 |
|
---|
571 | if(lpDestRect->top > lpSrcRect->top)
|
---|
572 | {
|
---|
573 | // +-------+ +-------+ +-------+
|
---|
574 | // |S | |S | |S |
|
---|
575 | // | +---|---+ +-------+ +---|---+ |
|
---|
576 | // | | D | | | D | | D | | |
|
---|
577 | // +-------+ | +-------+ | +-------+
|
---|
578 | // | | | | | |
|
---|
579 | // +-------+ +-------+ +-------+
|
---|
580 | //
|
---|
581 | // We got one of the above cases (or no overlapping) so copy from bottom up
|
---|
582 |
|
---|
583 | pBltPos += (lpDestRect->left * bpp) + lPitch * (lpDestRect->bottom-1);
|
---|
584 | pSrcPos += (lpSrcRect->left * bpp) + lPitch * (lpSrcRect->bottom-1);
|
---|
585 | BlitHeight = lpDestRect->bottom - lpDestRect->top;
|
---|
586 | BlitWidth = (lpDestRect->right - lpDestRect->left) * bpp;
|
---|
587 |
|
---|
588 | while(1)
|
---|
589 | {
|
---|
590 | memcpy(Scanline,pSrcPos,BlitWidth);
|
---|
591 | memcpy(pBltPos,Scanline,BlitWidth);
|
---|
592 | pBltPos -= lPitch;
|
---|
593 | pSrcPos -= lPitch;
|
---|
594 | if(! (--BlitHeight))
|
---|
595 | break;
|
---|
596 | }
|
---|
597 | }
|
---|
598 | else
|
---|
599 | {
|
---|
600 | // +-------+ +-------+ +-------+
|
---|
601 | // | D | | D | | D |
|
---|
602 | // | +---|---+ +-------+ +---|---+ | +---+---+---+
|
---|
603 | // | |S | | |S | |S | | | |S |S/D| D |
|
---|
604 | // +-------+ | +-------+ | +-------+ | | | |
|
---|
605 | // | | | | | | | | | |
|
---|
606 | // +-------+ +-------+ +-------+ +---+---+---+
|
---|
607 | //
|
---|
608 | // We got one of the above cases so copy top down
|
---|
609 |
|
---|
610 | pBltPos += (lpDestRect->left * bpp) + lPitch * lpDestRect->top;
|
---|
611 | pSrcPos += (lpSrcRect->left * bpp) + lPitch * lpSrcRect->top;
|
---|
612 | BlitHeight = lpDestRect->bottom - lpDestRect->top;
|
---|
613 | BlitWidth = (lpDestRect->right - lpDestRect->left) * bpp;
|
---|
614 |
|
---|
615 | while(1)
|
---|
616 | {
|
---|
617 | memcpy(Scanline,pSrcPos,BlitWidth);
|
---|
618 | memcpy(pBltPos,Scanline,BlitWidth);
|
---|
619 | pBltPos += lPitch;
|
---|
620 | pSrcPos += lPitch;
|
---|
621 | if(! (--BlitHeight))
|
---|
622 | break;
|
---|
623 | }
|
---|
624 | }
|
---|
625 |
|
---|
626 | }
|
---|
627 |
|
---|
628 | //******************************************************************************
|
---|
629 | //
|
---|
630 | // Purpose : Do a blit using the precalced Transbuffer
|
---|
631 | // That is the only way to do fast blits if a colorrange is used
|
---|
632 | // and we can find totally transparent lines and don't blit them
|
---|
633 | // and detect if the part of the line is transparent
|
---|
634 | //
|
---|
635 | // Idea for a kind of mask buffer
|
---|
636 | // Format of Transparentbuffer (each line):
|
---|
637 | // the first DWORD contains 2 WORDS with Offset of First Non transparent
|
---|
638 | // pixel in the low word and the last non transparent pixel in a row in
|
---|
639 | // the high word. => 0 = line totally transparent!
|
---|
640 | // This limits the max supported width to 2^16 but I thing this is enougth
|
---|
641 | // The size per line is 1+((Width+31) & ~31) DWORDS => each Bit represents
|
---|
642 | // 1 pixel
|
---|
643 | //
|
---|
644 | // TransparentBufferCreate(lpDDSurfaceDesc->dwWidth, lpDDSurfaceDesc->dwHeight);
|
---|
645 | //
|
---|
646 | // Layout of a DWORD:
|
---|
647 | // UUVVWWXX dword is processed LS Byte FIRST ...
|
---|
648 | // Each bit in a byte stands for one pixel. MS Bit First
|
---|
649 | //
|
---|
650 | // example: Bitmap (16x5) (X= opaque, . = Transparent)
|
---|
651 | // ...XX...XX....XX
|
---|
652 | // ..XXXX....XXXX..
|
---|
653 | // ................
|
---|
654 | // .........XXXXXX.
|
---|
655 | // ...XX...X......X
|
---|
656 | //
|
---|
657 | // Transparent buffer (2DWORDS) per line
|
---|
658 | //
|
---|
659 | // 0x00100003, 0x0000C318
|
---|
660 | // 0x000E0002, 0x00003C3C
|
---|
661 | // 0x00000000, 0x00000000
|
---|
662 | // 0x000F000A, 0x00007E00
|
---|
663 | // 0x00100003, 0x00008118
|
---|
664 | //******************************************************************************
|
---|
665 |
|
---|
666 | void __cdecl TransSRCBlit8(LPDDSURFACEDESC2 pDestDesc, LPDDSURFACEDESC2 pSrcDesc, char *pAlpha, LPRECT lpSrcRect)
|
---|
667 | {
|
---|
668 | DWORD *pdwTLine; // pointer to the transparent buffer
|
---|
669 | DWORD dwTLineLen; // # of DWORDS in each tBuffer line
|
---|
670 | DWORD dwTLineStart; // # DWORD in which the first transinfo is
|
---|
671 | DWORD dwTDWStart; // byte in which the firs transinfo is
|
---|
672 |
|
---|
673 | dwTLineLen = 1 + ((pSrcDesc->dwWidth + 31) & ~31);
|
---|
674 | pdwTLine = (DWORD*)pAlpha + (dwTLineLen* lpSrcRect->top);
|
---|
675 | dwTLineStart = 1+(lpSrcRect->left/32);
|
---|
676 | dwTDWStart = (lpSrcRect->left+8)/8;
|
---|
677 | }
|
---|
678 |
|
---|
679 |
|
---|