source: trunk/src/ddraw/surfacehlp.cpp@ 21483

Last change on this file since 21483 was 21483, checked in by dmik, 15 years ago

ddraw: Don't define CINTERFACE twice.

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