[PATCH 1/3] ddraw: Handle DDBLT_ROP in ddraw.
Stefan Dösinger
stefan at codeweavers.com
Tue Mar 17 17:54:14 CDT 2015
---
dlls/ddraw/surface.c | 30 ++++++++++++++++++++++++++++++
dlls/ddraw/tests/ddraw7.c | 32 ++++++++++++++++++++++++++++++++
dlls/wined3d/surface.c | 21 ---------------------
3 files changed, 62 insertions(+), 21 deletions(-)
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index dd9a018..b8c9872 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -1518,6 +1518,7 @@ static HRESULT WINAPI ddraw_surface7_Blt(IDirectDrawSurface7 *iface, RECT *DestR
struct ddraw_surface *dst_surface = impl_from_IDirectDrawSurface7(iface);
struct ddraw_surface *src_surface = unsafe_impl_from_IDirectDrawSurface7(SrcSurface);
HRESULT hr = DD_OK;
+ DDBLTFX rop_fx;
TRACE("iface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#x, fx %p.\n",
iface, wine_dbgstr_rect(DestRect), SrcSurface, wine_dbgstr_rect(SrcRect), Flags, DDBltFx);
@@ -1583,6 +1584,35 @@ static HRESULT WINAPI ddraw_surface7_Blt(IDirectDrawSurface7 *iface, RECT *DestR
WARN("DDBLT_ROP used with DDBltFx = NULL, returning DDERR_INVALIDPARAMS.\n");
return DDERR_INVALIDPARAMS;
}
+
+ Flags &= ~DDBLT_ROP;
+ switch (DDBltFx->dwROP)
+ {
+ case SRCCOPY:
+ break;
+
+ case WHITENESS:
+ case BLACKNESS:
+ rop_fx = *DDBltFx;
+
+ if (DDBltFx->dwROP == WHITENESS)
+ rop_fx.u5.dwFillColor = 0xffffffff;
+ else
+ rop_fx.u5.dwFillColor = 0;
+
+ if (dst_surface->surface_desc.ddsCaps.dwCaps & DDSCAPS_ZBUFFER)
+ Flags |= DDBLT_DEPTHFILL;
+ else
+ Flags |= DDBLT_COLORFILL;
+
+ DDBltFx = &rop_fx;
+ break;
+
+ default:
+ wined3d_mutex_unlock();
+ WARN("Unsupported ROP %#x used, returning DDERR_NORASTEROPHW.\n", DDBltFx->dwROP);
+ return DDERR_NORASTEROPHW;
+ }
}
if (Flags & DDBLT_KEYSRC && (!src_surface || !(src_surface->surface_desc.dwFlags & DDSD_CKSRCBLT)))
diff --git a/dlls/ddraw/tests/ddraw7.c b/dlls/ddraw/tests/ddraw7.c
index 6b9216b..66f8cff 100644
--- a/dlls/ddraw/tests/ddraw7.c
+++ b/dlls/ddraw/tests/ddraw7.c
@@ -8672,6 +8672,31 @@ static void test_color_fill(void)
}
},
};
+ static const struct
+ {
+ DWORD rop;
+ const char *name;
+ HRESULT hr;
+ }
+ rops[] =
+ {
+ {SRCCOPY, "SRCCOPY", DD_OK},
+ {SRCPAINT, "SRCPAINT", DDERR_NORASTEROPHW},
+ {SRCAND, "SRCAND", DDERR_NORASTEROPHW},
+ {SRCINVERT, "SRCINVERT", DDERR_NORASTEROPHW},
+ {SRCERASE, "SRCERASE", DDERR_NORASTEROPHW},
+ {NOTSRCCOPY, "NOTSRCCOPY", DDERR_NORASTEROPHW},
+ {NOTSRCERASE, "NOTSRCERASE", DDERR_NORASTEROPHW},
+ {MERGECOPY, "MERGECOPY", DDERR_NORASTEROPHW},
+ {MERGEPAINT, "MERGEPAINT", DDERR_NORASTEROPHW},
+ {PATCOPY, "PATCOPY", DDERR_NORASTEROPHW},
+ {PATPAINT, "PATPAINT", DDERR_NORASTEROPHW},
+ {PATINVERT, "PATINVERT", DDERR_NORASTEROPHW},
+ {DSTINVERT, "DSTINVERT", DDERR_NORASTEROPHW},
+ {BLACKNESS, "BLACKNESS", DD_OK},
+ {WHITENESS, "WHITENESS", DD_OK},
+ {0xaa0029, "0xaa0029", DDERR_NORASTEROPHW} /* noop */
+ };
window = CreateWindowA("static", "ddraw_test", WS_OVERLAPPEDWINDOW,
0, 0, 640, 480, 0, 0, 0, 0);
@@ -8926,6 +8951,13 @@ static void test_color_fill(void)
hr = IDirectDrawSurface7_Blt(surface, &rect, NULL, NULL, DDBLT_COLORFILL | DDBLT_ROP | DDBLT_WAIT, &fx);
ok(hr == DDERR_INVALIDPARAMS, "Got unexpected hr %#x.\n", hr);
+ for (i = 0; i < sizeof(rops) / sizeof(*rops); i++)
+ {
+ fx.dwROP = rops[i].rop;
+ hr = IDirectDrawSurface7_Blt(surface, NULL, surface2, NULL, DDBLT_ROP | DDBLT_WAIT, &fx);
+ ok(hr == rops[i].hr, "Got unexpected hr %#x for rop %s.\n", hr, rops[i].name);
+ }
+
IDirectDrawSurface7_Release(surface2);
IDirectDrawSurface7_Release(surface);
diff --git a/dlls/wined3d/surface.c b/dlls/wined3d/surface.c
index c045591..78e7030 100644
--- a/dlls/wined3d/surface.c
+++ b/dlls/wined3d/surface.c
@@ -4733,27 +4733,6 @@ static HRESULT surface_cpu_blt(struct wined3d_surface *dst_surface, const RECT *
{
FIXME("DDBLT_DEPTHFILL needs to be implemented!\n");
}
- if (flags & WINEDDBLT_ROP)
- {
- /* Catch some degenerate cases here. */
- switch (fx->dwROP)
- {
- case BLACKNESS:
- hr = _Blt_ColorFill(dbuf, dstwidth, dstheight, bpp, dst_map.row_pitch, 0);
- break;
- case 0xaa0029: /* No-op */
- break;
- case WHITENESS:
- hr = _Blt_ColorFill(dbuf, dstwidth, dstheight, bpp, dst_map.row_pitch, ~0U);
- break;
- case SRCCOPY: /* Well, we do that below? */
- break;
- default:
- FIXME("Unsupported raster op: %08x Pattern: %p\n", fx->dwROP, fx->u5.lpDDSPattern);
- goto error;
- }
- flags &= ~WINEDDBLT_ROP;
- }
if (flags & WINEDDBLT_DDROPS)
{
FIXME("\tDdraw Raster Ops: %08x Pattern: %p\n", fx->dwDDROP, fx->u5.lpDDSPattern);
--
2.3.2
More information about the wine-patches
mailing list