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

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

Get rid of dd_obj_base.h which duplicates obj_base.h creating unnecessary mess (symbol/define duplication) and conflicts when both the DDarw and other COM-related headers are included.

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#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.
35BYTE 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
293WORD wDefaultPalete16[256];
294DWORD dwDefaultPalete24[256];
295BOOL fPalInit=FALSE;
296
297#define CBM_CREATEDIB 0x02L /* create DIB bitmap */
298
299//#define PERFTEST
300#ifdef PERFTEST
301LARGE_INTEGER liStart;
302LARGE_INTEGER liEnd;
303ULONG average = 0;
304#endif
305
306#ifdef DEBUG
307
308// ******************************************************************************
309// * internal helper functions from WINE
310// *
311
312void _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
337void _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
355void _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
395void _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
439void _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
460void _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
490void _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
509void _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
537void _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
554void __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
666void __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
Note: See TracBrowser for help on using the repository browser.