Added support DDBLT_DDFX flag in DirectDrawSurface_Blt.

This commit is contained in:
Tony Lambregts 2002-07-16 01:42:47 +00:00 committed by Alexandre Julliard
parent 65b845b053
commit 2c5a41b027

View File

@ -570,50 +570,144 @@ DIB_DirectDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rdst,
last_sy = sy; last_sy = sy;
} }
} }
} else if (dwFlags & (DDBLT_KEYSRC | DDBLT_KEYDEST | DDBLT_KEYSRCOVERRIDE | DDBLT_KEYDESTOVERRIDE)) { } else {
DWORD keylow, keyhigh; 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) { if (dwFlags & DDBLT_KEYSRC) {
keylow = sdesc.ddckCKSrcBlt.dwColorSpaceLowValue; keylow = sdesc.ddckCKSrcBlt.dwColorSpaceLowValue;
keyhigh = sdesc.ddckCKSrcBlt.dwColorSpaceHighValue; keyhigh = sdesc.ddckCKSrcBlt.dwColorSpaceHighValue;
} else if (dwFlags & DDBLT_KEYDEST){ } else if (dwFlags & DDBLT_KEYDEST){
/* I'm not sure if this is correct */ keylow = ddesc.ddckCKDestBlt.dwColorSpaceLowValue;
FIXME("DDBLT_KEYDEST not fully supported yet.\n"); keyhigh = ddesc.ddckCKDestBlt.dwColorSpaceHighValue;
keylow = ddesc.ddckCKDestBlt.dwColorSpaceLowValue; } else if (dwFlags & DDBLT_KEYSRCOVERRIDE) {
keyhigh = ddesc.ddckCKDestBlt.dwColorSpaceHighValue; keylow = lpbltfx->ddckSrcColorkey.dwColorSpaceLowValue;
} else if (dwFlags & DDBLT_KEYSRCOVERRIDE) { keyhigh = lpbltfx->ddckSrcColorkey.dwColorSpaceHighValue;
keylow = lpbltfx->ddckSrcColorkey.dwColorSpaceLowValue; } else {
keyhigh = lpbltfx->ddckSrcColorkey.dwColorSpaceHighValue; keylow = lpbltfx->ddckDestColorkey.dwColorSpaceLowValue;
} else { keyhigh = lpbltfx->ddckDestColorkey.dwColorSpaceHighValue;
keylow = lpbltfx->ddckDestColorkey.dwColorSpaceLowValue; }
keyhigh = lpbltfx->ddckDestColorkey.dwColorSpaceHighValue; dwFlags &= ~(DDBLT_KEYSRC | DDBLT_KEYDEST | DDBLT_KEYSRCOVERRIDE | DDBLT_KEYDESTOVERRIDE);
} }
for (y = sy = 0; y < dstheight; y++, sy += yinc) { if (dwFlags & DDBLT_DDFX) {
sbuf = sbase + (sy >> 16) * sdesc.u1.lPitch; 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);
#define COPYROW_COLORKEY(type) { \ if (lpbltfx->dwDDFX & DDBLTFX_ARITHSTRETCHY){
type *s = (type *) sbuf, *d = (type *) dbuf, tmp; \ /* I don't think we need to do anything about this flag */
for (x = sx = 0; x < dstwidth; x++, sx += xinc) { \ WARN("dwflags=DDBLT_DDFX nothing done for DDBLTFX_ARITHSTRETCHY\n");
tmp = s[sx >> 16]; \ }
if (tmp < keylow || tmp > keyhigh) d[x] = tmp; \ if (lpbltfx->dwDDFX & DDBLTFX_MIRRORLEFTRIGHT) {
} \ tmp = dTopRight;
break; } 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);
}
switch (bpp) { #define COPY_COLORKEY_FX(type) { \
case 1: COPYROW_COLORKEY(BYTE) type *s = (type *) sbuf, *d = (type *) dbuf, *dx, tmp; \
case 2: COPYROW_COLORKEY(WORD) for (y = sy = 0; y < dstheight; y++, sy += yinc) { \
case 4: COPYROW_COLORKEY(DWORD) (LPBYTE)s = sbase + (sy >> 16) * sdesc.u1.lPitch; \
default: (LPBYTE)dx = d; \
FIXME("%s color-keyed blit not implemented for bpp %d!\n", for (x = sx = 0; x < dstwidth; x++, sx += xinc) { \
(dwFlags & DDBLT_KEYSRC) ? "Source" : "Destination", bpp*8); tmp = s[sx >> 16]; \
ret = DDERR_UNSUPPORTED; if (tmp < keylow || tmp > keyhigh) dx[0] = tmp; \
goto error; (LPBYTE)dx += dstxinc; \
} } \
dbuf += ddesc.u1.lPitch; (LPBYTE)d += dstyinc; \
} } \
#undef COPYROW_COLORKEY break; }
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
}
} }
} }