Fix for [bug 841] DirectDrawSurface_Blt support for DDBLT_DDFX
Tony Lambregts
tony_lambregts at telusplanet.net
Sat Jul 13 22:17:18 CDT 2002
Change log: Added support DDBLT_DDFX flag in DirectDrawSurface_Blt
Tony Lambregts tony_lambregts at telusplanet.net
-------------- next part --------------
Index: dib.c
===================================================================
RCS file: /home/wine/wine/dlls/ddraw/dsurface/dib.c,v
retrieving revision 1.12
diff -u -r1.12 dib.c
--- dib.c 10 Jul 2002 23:10:54 -0000 1.12
+++ dib.c 13 Jul 2002 05:25:36 -0000
@@ -570,50 +570,144 @@
last_sy = sy;
}
}
- } else if (dwFlags & (DDBLT_KEYSRC | DDBLT_KEYDEST | DDBLT_KEYSRCOVERRIDE | DDBLT_KEYDESTOVERRIDE)) {
- DWORD keylow, keyhigh;
+ } else {
+ LONG dstyinc = ddesc.u1.lPitch, dstxinc = bpp;
+ DWORD keylow = 0, keyhigh = 0;
+ if (dwFlags & (DDBLT_KEYSRC | DDBLT_KEYDEST | DDBLT_KEYSRCOVERRIDE | DDBLT_KEYDESTOVERRIDE)) {
+
+ if (dwFlags & DDBLT_KEYSRC) {
+ keylow = sdesc.ddckCKSrcBlt.dwColorSpaceLowValue;
+ keyhigh = sdesc.ddckCKSrcBlt.dwColorSpaceHighValue;
+ } else if (dwFlags & DDBLT_KEYDEST){
+ keylow = ddesc.ddckCKDestBlt.dwColorSpaceLowValue;
+ keyhigh = ddesc.ddckCKDestBlt.dwColorSpaceHighValue;
+ } else if (dwFlags & DDBLT_KEYSRCOVERRIDE) {
+ keylow = lpbltfx->ddckSrcColorkey.dwColorSpaceLowValue;
+ keyhigh = lpbltfx->ddckSrcColorkey.dwColorSpaceHighValue;
+ } else {
+ keylow = lpbltfx->ddckDestColorkey.dwColorSpaceLowValue;
+ keyhigh = lpbltfx->ddckDestColorkey.dwColorSpaceHighValue;
+ }
+ dwFlags &= ~(DDBLT_KEYSRC | DDBLT_KEYDEST | DDBLT_KEYSRCOVERRIDE | DDBLT_KEYDESTOVERRIDE);
+ }
- if (dwFlags & DDBLT_KEYSRC) {
- keylow = sdesc.ddckCKSrcBlt.dwColorSpaceLowValue;
- keyhigh = sdesc.ddckCKSrcBlt.dwColorSpaceHighValue;
- } else if (dwFlags & DDBLT_KEYDEST){
- /* I'm not sure if this is correct */
- FIXME("DDBLT_KEYDEST not fully supported yet.\n");
- keylow = ddesc.ddckCKDestBlt.dwColorSpaceLowValue;
- keyhigh = ddesc.ddckCKDestBlt.dwColorSpaceHighValue;
- } else if (dwFlags & DDBLT_KEYSRCOVERRIDE) {
- keylow = lpbltfx->ddckSrcColorkey.dwColorSpaceLowValue;
- keyhigh = lpbltfx->ddckSrcColorkey.dwColorSpaceHighValue;
- } else {
- keylow = lpbltfx->ddckDestColorkey.dwColorSpaceLowValue;
- keyhigh = lpbltfx->ddckDestColorkey.dwColorSpaceHighValue;
- }
+ if (dwFlags & DDBLT_DDFX) {
+ LPBYTE dTopLeft, dTopRight, dBottomLeft, dBottomRight, tmp;
+ LONG tmpxy;
+ dTopLeft = dbuf;
+ dTopRight = dbuf+((dstwidth-1)*bpp);
+ dBottomLeft = dTopLeft+((dstheight-1)*ddesc.u1.lPitch);
+ dBottomRight = dBottomLeft+((dstwidth-1)*bpp);
- for (y = sy = 0; y < dstheight; y++, sy += yinc) {
- sbuf = sbase + (sy >> 16) * sdesc.u1.lPitch;
+ if (lpbltfx->dwDDFX & DDBLTFX_ARITHSTRETCHY){
+ /* I don't think we need to do anything about this flag */
+ WARN("dwflags=DDBLT_DDFX nothing done for DDBLTFX_ARITHSTRETCHY\n");
+ }
+ if (lpbltfx->dwDDFX & DDBLTFX_MIRRORLEFTRIGHT) {
+ tmp = dTopRight;
+ dTopRight = dTopLeft;
+ dTopLeft = tmp;
+ tmp = dBottomRight;
+ dBottomRight = dBottomLeft;
+ dBottomLeft = tmp;
+ dstxinc = dstxinc *-1;
+ }
+ if (lpbltfx->dwDDFX & DDBLTFX_MIRRORUPDOWN) {
+ tmp = dTopLeft;
+ dTopLeft = dBottomLeft;
+ dBottomLeft = tmp;
+ tmp = dTopRight;
+ dTopRight = dBottomRight;
+ dBottomRight = tmp;
+ dstyinc = dstyinc *-1;
+ }
+ if (lpbltfx->dwDDFX & DDBLTFX_NOTEARING) {
+ /* I don't think we need to do anything about this flag */
+ WARN("dwflags=DDBLT_DDFX nothing done for DDBLTFX_NOTEARING\n");
+ }
+ if (lpbltfx->dwDDFX & DDBLTFX_ROTATE180) {
+ tmp = dBottomRight;
+ dBottomRight = dTopLeft;
+ dTopLeft = tmp;
+ tmp = dBottomLeft;
+ dBottomLeft = dTopRight;
+ dTopRight = tmp;
+ dstxinc = dstxinc * -1;
+ dstyinc = dstyinc * -1;
+ }
+ if (lpbltfx->dwDDFX & DDBLTFX_ROTATE270) {
+ tmp = dTopLeft;
+ dTopLeft = dBottomLeft;
+ dBottomLeft = dBottomRight;
+ dBottomRight = dTopRight;
+ dTopRight = tmp;
+ tmpxy = dstxinc;
+ dstxinc = dstyinc;
+ dstyinc = tmpxy;
+ dstxinc = dstxinc * -1;
+ }
+ if (lpbltfx->dwDDFX & DDBLTFX_ROTATE90) {
+ tmp = dTopLeft;
+ dTopLeft = dTopRight;
+ dTopRight = dBottomRight;
+ dBottomRight = dBottomLeft;
+ dBottomLeft = tmp;
+ tmpxy = dstxinc;
+ dstxinc = dstyinc;
+ dstyinc = tmpxy;
+ dstyinc = dstyinc * -1;
+ }
+ if (lpbltfx->dwDDFX & DDBLTFX_ZBUFFERBASEDEST) {
+ /* I don't think we need to do anything about this flag */
+ WARN("dwflags=DDBLT_DDFX nothing done for DDBLTFX_ZBUFFERBASEDEST\n");
+ }
+ dbuf = dTopLeft;
+ dwFlags &= ~(DDBLT_DDFX);
+ }
-#define COPYROW_COLORKEY(type) { \
- type *s = (type *) sbuf, *d = (type *) dbuf, tmp; \
- for (x = sx = 0; x < dstwidth; x++, sx += xinc) { \
- tmp = s[sx >> 16]; \
- if (tmp < keylow || tmp > keyhigh) d[x] = tmp; \
- } \
- break; }
+#define COPY_COLORKEY_FX(type) { \
+ type *s = (type *) sbuf, *d = (type *) dbuf, *dx, tmp; \
+ for (y = sy = 0; y < dstheight; y++, sy += yinc) { \
+ (LPBYTE)s = sbase + (sy >> 16) * sdesc.u1.lPitch; \
+ (LPBYTE)dx = d; \
+ for (x = sx = 0; x < dstwidth; x++, sx += xinc) { \
+ tmp = s[sx >> 16]; \
+ if (tmp < keylow || tmp > keyhigh) dx[0] = tmp; \
+ (LPBYTE)dx += dstxinc; \
+ } \
+ (LPBYTE)d += dstyinc; \
+ } \
+ break; }
- switch (bpp) {
- case 1: COPYROW_COLORKEY(BYTE)
- case 2: COPYROW_COLORKEY(WORD)
- case 4: COPYROW_COLORKEY(DWORD)
- default:
- FIXME("%s color-keyed blit not implemented for bpp %d!\n",
- (dwFlags & DDBLT_KEYSRC) ? "Source" : "Destination", bpp*8);
- ret = DDERR_UNSUPPORTED;
- goto error;
- }
- dbuf += ddesc.u1.lPitch;
- }
-#undef COPYROW_COLORKEY
- dwFlags &= ~(DDBLT_KEYSRC | DDBLT_KEYDEST | DDBLT_KEYSRCOVERRIDE | DDBLT_KEYDESTOVERRIDE);
+ switch (bpp) {
+ case 1: COPY_COLORKEY_FX(BYTE)
+ case 2: COPY_COLORKEY_FX(WORD)
+ case 4: COPY_COLORKEY_FX(DWORD)
+ case 3: {LPBYTE s,d = dbuf, dx;
+ for (y = sy = 0; y < dstheight; y++, sy += yinc) {
+ sbuf = sbase + (sy >> 16) * sdesc.u1.lPitch;
+ dx = d;
+ for (x = sx = 0; x < dstwidth; x++, sx+= xinc) {
+ DWORD pixel;
+ s = sbuf+3*(sx>>16);
+ pixel = (s[0]<<16)|(s[1]<<8)|s[2];
+ if (pixel < keylow || pixel > keyhigh){
+ dx[0] = (pixel>>16)&0xff;
+ dx[1] = (pixel>> 8)&0xff;
+ dx[2] = (pixel )&0xff;
+ }
+ dx+= dstxinc;
+ }
+ d += dstyinc;
+ }
+ break;}
+ default:
+ FIXME("%s color-keyed blit not implemented for bpp %d!\n",
+ (dwFlags & DDBLT_KEYSRC) ? "Source" : "Destination", bpp*8);
+ ret = DDERR_UNSUPPORTED;
+ goto error;
+#undef COPY_COLORKEY_FX
+ }
}
}
More information about the wine-patches
mailing list