Stefan Dösinger : ddraw: Introduce a function to convert a DDSURFACEDESC2 to a DDSURFACEDESC.
Alexandre Julliard
julliard at winehq.org
Wed Aug 31 13:19:26 CDT 2011
Module: wine
Branch: master
Commit: c42277883a5764271c3bd5949c948c6efbabe0c5
URL: http://source.winehq.org/git/wine.git/?a=commit;h=c42277883a5764271c3bd5949c948c6efbabe0c5
Author: Stefan Dösinger <stefan at codeweavers.com>
Date: Sun Aug 28 15:00:59 2011 +0200
ddraw: Introduce a function to convert a DDSURFACEDESC2 to a DDSURFACEDESC.
---
dlls/ddraw/ddraw.c | 7 ++++---
dlls/ddraw/ddraw_private.h | 1 +
dlls/ddraw/surface.c | 11 ++++++++++-
dlls/ddraw/utils.c | 35 +++++++++++++++++++++++++++++++++++
4 files changed, 50 insertions(+), 4 deletions(-)
diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index e889815..c23b8bf 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -1328,6 +1328,7 @@ static HRESULT WINAPI ddraw3_GetDisplayMode(IDirectDraw3 *iface, DDSURFACEDESC *
TRACE("iface %p, surface_desc %p.\n", iface, surface_desc);
+ /* FIXME: Test sizes, properly convert surface_desc */
return ddraw7_GetDisplayMode(&This->IDirectDraw7_iface, (DDSURFACEDESC2 *)surface_desc);
}
@@ -1337,6 +1338,7 @@ static HRESULT WINAPI ddraw2_GetDisplayMode(IDirectDraw2 *iface, DDSURFACEDESC *
TRACE("iface %p, surface_desc %p.\n", iface, surface_desc);
+ /* FIXME: Test sizes, properly convert surface_desc */
return ddraw7_GetDisplayMode(&This->IDirectDraw7_iface, (DDSURFACEDESC2 *)surface_desc);
}
@@ -1346,6 +1348,7 @@ static HRESULT WINAPI ddraw1_GetDisplayMode(IDirectDraw *iface, DDSURFACEDESC *s
TRACE("iface %p, surface_desc %p.\n", iface, surface_desc);
+ /* FIXME: Test sizes, properly convert surface_desc */
return ddraw7_GetDisplayMode(&This->IDirectDraw7_iface, (DDSURFACEDESC2 *)surface_desc);
}
@@ -2118,9 +2121,7 @@ static HRESULT CALLBACK EnumDisplayModesCallbackThunk(DDSURFACEDESC2 *surface_de
struct displaymodescallback_context *cbcontext = context;
DDSURFACEDESC desc;
- memcpy(&desc, surface_desc, sizeof(desc));
- desc.dwSize = sizeof(desc);
-
+ DDSD2_to_DDSD(surface_desc, &desc);
return cbcontext->func(&desc, cbcontext->context);
}
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 0e4fe8d..2c3ab8f 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -556,6 +556,7 @@ DWORD get_flexible_vertex_size(DWORD d3dvtVertexType) DECLSPEC_HIDDEN;
void DDRAW_dump_DDSCAPS2(const DDSCAPS2 *in) DECLSPEC_HIDDEN;
void DDRAW_dump_cooperativelevel(DWORD cooplevel) DECLSPEC_HIDDEN;
void DDSD_to_DDSD2(const DDSURFACEDESC *in, DDSURFACEDESC2 *out) DECLSPEC_HIDDEN;
+void DDSD2_to_DDSD(const DDSURFACEDESC2 *in, DDSURFACEDESC *out) DECLSPEC_HIDDEN;
/* This only needs to be here as long the processvertices functionality of
* IDirect3DExecuteBuffer isn't in WineD3D */
diff --git a/dlls/ddraw/surface.c b/dlls/ddraw/surface.c
index a8142eb..c7d52d7 100644
--- a/dlls/ddraw/surface.c
+++ b/dlls/ddraw/surface.c
@@ -972,6 +972,8 @@ static HRESULT WINAPI ddraw_surface3_Lock(IDirectDrawSurface3 *iface, RECT *rect
TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n",
iface, wine_dbgstr_rect(rect), surface_desc, flags, h);
+ /* All versions of Lock() accept both sizeof(DDSURFACEDESC) and
+ * sizeof(DDSURFACEDESC2) structures and do not touch the dwSize member */
return ddraw_surface7_Lock(&This->IDirectDrawSurface7_iface,
rect, (DDSURFACEDESC2 *)surface_desc, flags, h);
}
@@ -983,6 +985,10 @@ static HRESULT WINAPI ddraw_surface2_Lock(IDirectDrawSurface2 *iface, RECT *rect
TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n",
iface, wine_dbgstr_rect(rect), surface_desc, flags, h);
+ /* All versions of Lock() accept both sizeof(DDSURFACEDESC) and
+ * sizeof(DDSURFACEDESC2) structures and do not touch the dwSize member
+ *
+ * TODO: Test DDSD_ZBUFFERBITDEPTH behavior */
return ddraw_surface7_Lock(&This->IDirectDrawSurface7_iface,
rect, (DDSURFACEDESC2 *)surface_desc, flags, h);
}
@@ -994,6 +1000,8 @@ static HRESULT WINAPI ddraw_surface1_Lock(IDirectDrawSurface *iface, RECT *rect,
TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n",
iface, wine_dbgstr_rect(rect), surface_desc, flags, h);
+ /* All versions of Lock() accept both sizeof(DDSURFACEDESC) and
+ * sizeof(DDSURFACEDESC2) structures and do not touch the dwSize member */
return ddraw_surface7_Lock(&This->IDirectDrawSurface7_iface,
rect, (DDSURFACEDESC2 *)surface_desc, flags, h);
}
@@ -2310,6 +2318,7 @@ static HRESULT CALLBACK EnumCallback(IDirectDrawSurface7 *surface, DDSURFACEDESC
ddraw_surface1_AddRef(&surface_impl->IDirectDrawSurface_iface);
ddraw_surface7_Release(surface);
+ /* FIXME: Check surface_test.dwSize */
return info->callback(&surface_impl->IDirectDrawSurface_iface,
(DDSURFACEDESC *)surface_desc, info->context);
}
@@ -2863,7 +2872,7 @@ static HRESULT WINAPI ddraw_surface3_GetSurfaceDesc(IDirectDrawSurface3 *iface,
}
EnterCriticalSection(&ddraw_cs);
- DD_STRUCT_COPY_BYSIZE(surface_desc, (DDSURFACEDESC *)&This->surface_desc);
+ DDSD2_to_DDSD(&This->surface_desc, surface_desc);
TRACE("Returning surface desc:\n");
if (TRACE_ON(ddraw))
{
diff --git a/dlls/ddraw/utils.c b/dlls/ddraw/utils.c
index ca63461..962a62f 100644
--- a/dlls/ddraw/utils.c
+++ b/dlls/ddraw/utils.c
@@ -1219,3 +1219,38 @@ void DDSD_to_DDSD2(const DDSURFACEDESC *in, DDSURFACEDESC2 *out)
* DDSD_TEXTURESTAGE, DDSD_FVF, DDSD_SRCVBHANDLE,
*/
}
+
+/* Note that this function writes the full sizeof(DDSURFACEDESC) size, don't use it
+ * for writing into application-provided DDSURFACEDESC structures if the size may
+ * be different */
+void DDSD2_to_DDSD(const DDSURFACEDESC2 *in, DDSURFACEDESC *out)
+{
+ memset(out, 0, sizeof(*out));
+ out->dwSize = sizeof(*out);
+ out->dwFlags = in->dwFlags;
+ if (in->dwFlags & DDSD_WIDTH) out->dwWidth = in->dwWidth;
+ if (in->dwFlags & DDSD_HEIGHT) out->dwHeight = in->dwHeight;
+ if (in->dwFlags & DDSD_PIXELFORMAT) out->ddpfPixelFormat = in->u4.ddpfPixelFormat;
+ /* ddsCaps is read even without DDSD_CAPS set. See dsurface:no_ddsd_caps_test */
+ out->ddsCaps.dwCaps = in->ddsCaps.dwCaps;
+ if (in->dwFlags & DDSD_PITCH) out->u1.lPitch = in->u1.lPitch;
+ if (in->dwFlags & DDSD_BACKBUFFERCOUNT) out->dwBackBufferCount = in->dwBackBufferCount;
+ if (in->dwFlags & DDSD_ZBUFFERBITDEPTH) out->u2.dwZBufferBitDepth = in->u2.dwMipMapCount; /* same union */
+ if (in->dwFlags & DDSD_ALPHABITDEPTH) out->dwAlphaBitDepth = in->dwAlphaBitDepth;
+ /* DDraw(native, and wine) does not set the DDSD_LPSURFACE, so always copy */
+ out->lpSurface = in->lpSurface;
+ if (in->dwFlags & DDSD_CKDESTOVERLAY) out->ddckCKDestOverlay = in->u3.ddckCKDestOverlay;
+ if (in->dwFlags & DDSD_CKDESTBLT) out->ddckCKDestBlt = in->ddckCKDestBlt;
+ if (in->dwFlags & DDSD_CKSRCOVERLAY) out->ddckCKSrcOverlay = in->ddckCKSrcOverlay;
+ if (in->dwFlags & DDSD_CKSRCBLT) out->ddckCKSrcBlt = in->ddckCKSrcBlt;
+ if (in->dwFlags & DDSD_MIPMAPCOUNT) out->u2.dwMipMapCount = in->u2.dwMipMapCount;
+ if (in->dwFlags & DDSD_REFRESHRATE) out->u2.dwRefreshRate = in->u2.dwRefreshRate;
+ if (in->dwFlags & DDSD_LINEARSIZE) out->u1.dwLinearSize = in->u1.dwLinearSize;
+ /* Does not exist in DDSURFACEDESC:
+ * DDSD_TEXTURESTAGE, DDSD_FVF, DDSD_SRCVBHANDLE,
+ */
+ if (in->dwFlags & DDSD_TEXTURESTAGE) WARN("Does not exist in DDSURFACEDESC: DDSD_TEXTURESTAGE\n");
+ if (in->dwFlags & DDSD_FVF) WARN("Does not exist in DDSURFACEDESC: DDSD_FVF\n");
+ if (in->dwFlags & DDSD_SRCVBHANDLE) WARN("Does not exist in DDSURFACEDESC: DDSD_SRCVBHANDLE\n");
+ out->dwFlags &= ~(DDSD_TEXTURESTAGE | DDSD_FVF | DDSD_SRCVBHANDLE);
+}
More information about the wine-cvs
mailing list