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

Last change on this file since 9459 was 9459, checked in by sandervl, 23 years ago

cleanup + don't change the window size/status in SetCooperativeLevel

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