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