mirror of
https://github.com/reactos/wine.git
synced 2025-02-19 20:31:35 +00:00
Added support DDBLT_DDFX flag in DirectDrawSurface_Blt.
This commit is contained in:
parent
65b845b053
commit
2c5a41b027
@ -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
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user