ddraw: Correctly convert from DDSD1 to DDSD2 in the SetSurfaceDesc thunk

Luke Benstead kazade at gmail.com
Mon Jun 28 13:03:51 CDT 2010


Luke.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.winehq.org/pipermail/wine-patches/attachments/20100628/ed767407/attachment-0001.htm>
-------------- next part --------------
From d1c889f46adc3bd9e74e7aadbf497d8bcc55767a Mon Sep 17 00:00:00 2001
From: Luke Benstead <kazade at gmail.com>
Date: Mon, 28 Jun 2010 18:57:01 +0100
Subject: ddraw: Correctly convert from DDSD1 to DDSD2 in the SetSurfaceDesc thunk

---
 dlls/ddraw/ddraw.c          |   27 +++++++++++++++++++++++++++
 dlls/ddraw/ddraw_private.h  |    3 +++
 dlls/ddraw/surface_thunks.c |    6 +++++-
 3 files changed, 35 insertions(+), 1 deletions(-)

diff --git a/dlls/ddraw/ddraw.c b/dlls/ddraw/ddraw.c
index d5511ad..9d6ed83 100644
--- a/dlls/ddraw/ddraw.c
+++ b/dlls/ddraw/ddraw.c
@@ -69,6 +69,33 @@ const struct wined3d_parent_ops ddraw_null_wined3d_parent_ops =
     ddraw_null_wined3d_object_destroyed,
 };
 
+void DDSD_to_DDSD2(const DDSURFACEDESC *in, DDSURFACEDESC2 *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->u4.ddpfPixelFormat = in->ddpfPixelFormat;
+    if(in->dwFlags & DDSD_CAPS) 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.dwMipMapCount = in->u2.dwZBufferBitDepth; /* 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->u3.ddckCKDestOverlay = in->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,
+     */
+}
+
 /*****************************************************************************
  * IUnknown Methods
  *****************************************************************************/
diff --git a/dlls/ddraw/ddraw_private.h b/dlls/ddraw/ddraw_private.h
index 1cb3070..954e697 100644
--- a/dlls/ddraw/ddraw_private.h
+++ b/dlls/ddraw/ddraw_private.h
@@ -307,6 +307,9 @@ HRESULT WINAPI IDirectDrawSurfaceImpl_AddAttachedSurface(IDirectDrawSurfaceImpl
         IDirectDrawSurfaceImpl *Surf) DECLSPEC_HIDDEN;
 void IDirectDrawSurfaceImpl_Destroy(IDirectDrawSurfaceImpl *This) DECLSPEC_HIDDEN;
 
+void DDSD_to_DDSD2(const DDSURFACEDESC *in, DDSURFACEDESC2 *out);
+void DDSD2_to_DDSD(const DDSURFACEDESC2 *in, DDSURFACEDESC *out);
+
 static inline IDirectDrawSurfaceImpl *surface_from_texture1(IDirect3DTexture *iface)
 {
     return (IDirectDrawSurfaceImpl *)((char*)iface - FIELD_OFFSET(IDirectDrawSurfaceImpl, IDirect3DTexture_vtbl));
diff --git a/dlls/ddraw/surface_thunks.c b/dlls/ddraw/surface_thunks.c
index d235ff9..20bc232 100644
--- a/dlls/ddraw/surface_thunks.c
+++ b/dlls/ddraw/surface_thunks.c
@@ -435,8 +435,12 @@ static HRESULT WINAPI
 IDirectDrawSurface3Impl_SetSurfaceDesc(LPDIRECTDRAWSURFACE3 This,
 				       LPDDSURFACEDESC pDDSD, DWORD dwFlags)
 {
+    DDSURFACEDESC2 ddsd2;
+    
+    DDSD_to_DDSD2(pDDSD, &ddsd2);
+    
     return IDirectDrawSurface7_SetSurfaceDesc((IDirectDrawSurface7 *)surface_from_surface3(This),
-            (LPDDSURFACEDESC2)pDDSD, dwFlags);
+            &ddsd2, dwFlags);
 }
 
 const IDirectDrawSurface3Vtbl IDirectDrawSurface3_Vtbl =
-- 
1.7.0.4


More information about the wine-patches mailing list