Commit 029c5a6c authored by Stefan Dösinger's avatar Stefan Dösinger Committed by Alexandre Julliard

ddraw: Convert DDSURFACEDESC2 in lock.

parent d6f17d68
...@@ -875,18 +875,14 @@ static HRESULT WINAPI ddraw_surface1_GetAttachedSurface(IDirectDrawSurface *ifac ...@@ -875,18 +875,14 @@ static HRESULT WINAPI ddraw_surface1_GetAttachedSurface(IDirectDrawSurface *ifac
* For more details, see IWineD3DSurface::LockRect * For more details, see IWineD3DSurface::LockRect
* *
*****************************************************************************/ *****************************************************************************/
static HRESULT WINAPI ddraw_surface7_Lock(IDirectDrawSurface7 *iface, static HRESULT WINAPI surface_lock(IDirectDrawSurfaceImpl *This,
RECT *Rect, DDSURFACEDESC2 *DDSD, DWORD Flags, HANDLE h) RECT *Rect, DDSURFACEDESC2 *DDSD, DWORD Flags, HANDLE h)
{ {
IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface);
WINED3DLOCKED_RECT LockedRect; WINED3DLOCKED_RECT LockedRect;
HRESULT hr; HRESULT hr;
TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n", TRACE("This %p, rect %s, surface_desc %p, flags %#x, h %p.\n",
iface, wine_dbgstr_rect(Rect), DDSD, Flags, h); This, wine_dbgstr_rect(Rect), DDSD, Flags, h);
if(!DDSD)
return DDERR_INVALIDPARAMS;
/* This->surface_desc.dwWidth and dwHeight are changeable, thus lock */ /* This->surface_desc.dwWidth and dwHeight are changeable, thus lock */
EnterCriticalSection(&ddraw_cs); EnterCriticalSection(&ddraw_cs);
...@@ -897,14 +893,6 @@ static HRESULT WINAPI ddraw_surface7_Lock(IDirectDrawSurface7 *iface, ...@@ -897,14 +893,6 @@ static HRESULT WINAPI ddraw_surface7_Lock(IDirectDrawSurface7 *iface,
* for the supported values. The others are ignored by WineD3D * for the supported values. The others are ignored by WineD3D
*/ */
if(DDSD->dwSize != sizeof(DDSURFACEDESC) &&
DDSD->dwSize != sizeof(DDSURFACEDESC2))
{
WARN("Invalid structure size %d, returning DDERR_INVALIDPARAMS\n", DDSD->dwSize);
LeaveCriticalSection(&ddraw_cs);
return DDERR_INVALIDPARAMS;
}
/* Windows zeroes this if the rect is invalid */ /* Windows zeroes this if the rect is invalid */
DDSD->lpSurface = 0; DDSD->lpSurface = 0;
...@@ -954,6 +942,23 @@ static HRESULT WINAPI ddraw_surface7_Lock(IDirectDrawSurface7 *iface, ...@@ -954,6 +942,23 @@ static HRESULT WINAPI ddraw_surface7_Lock(IDirectDrawSurface7 *iface,
return DD_OK; return DD_OK;
} }
static HRESULT WINAPI ddraw_surface7_Lock(IDirectDrawSurface7 *iface,
RECT *rect, DDSURFACEDESC2 *surface_desc, DWORD flags, HANDLE h)
{
IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface7(iface);
TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n",
iface, wine_dbgstr_rect(rect), surface_desc, flags, h);
if (!surface_desc) return DDERR_INVALIDPARAMS;
if (surface_desc->dwSize != sizeof(DDSURFACEDESC) &&
surface_desc->dwSize != sizeof(DDSURFACEDESC2))
{
WARN("Invalid structure size %d, returning DDERR_INVALIDPARAMS\n", surface_desc->dwSize);
return DDERR_INVALIDPARAMS;
}
return surface_lock(This, rect, surface_desc, flags, h);
}
static HRESULT WINAPI ddraw_surface4_Lock(IDirectDrawSurface4 *iface, RECT *rect, static HRESULT WINAPI ddraw_surface4_Lock(IDirectDrawSurface4 *iface, RECT *rect,
DDSURFACEDESC2 *surface_desc, DWORD flags, HANDLE h) DDSURFACEDESC2 *surface_desc, DWORD flags, HANDLE h)
{ {
...@@ -961,49 +966,86 @@ static HRESULT WINAPI ddraw_surface4_Lock(IDirectDrawSurface4 *iface, RECT *rect ...@@ -961,49 +966,86 @@ static HRESULT WINAPI ddraw_surface4_Lock(IDirectDrawSurface4 *iface, RECT *rect
TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n", TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n",
iface, wine_dbgstr_rect(rect), surface_desc, flags, h); iface, wine_dbgstr_rect(rect), surface_desc, flags, h);
return ddraw_surface7_Lock(&This->IDirectDrawSurface7_iface, if (!surface_desc) return DDERR_INVALIDPARAMS;
rect, surface_desc, flags, h); if (surface_desc->dwSize != sizeof(DDSURFACEDESC) &&
surface_desc->dwSize != sizeof(DDSURFACEDESC2))
{
WARN("Invalid structure size %d, returning DDERR_INVALIDPARAMS\n", surface_desc->dwSize);
return DDERR_INVALIDPARAMS;
}
return surface_lock(This, rect, surface_desc, flags, h);
} }
static HRESULT WINAPI ddraw_surface3_Lock(IDirectDrawSurface3 *iface, RECT *rect, static HRESULT WINAPI ddraw_surface3_Lock(IDirectDrawSurface3 *iface, RECT *rect,
DDSURFACEDESC *surface_desc, DWORD flags, HANDLE h) DDSURFACEDESC *surface_desc, DWORD flags, HANDLE h)
{ {
IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface); IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface3(iface);
DDSURFACEDESC2 surface_desc2;
HRESULT hr;
TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n", TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n",
iface, wine_dbgstr_rect(rect), surface_desc, flags, h); iface, wine_dbgstr_rect(rect), surface_desc, flags, h);
/* All versions of Lock() accept both sizeof(DDSURFACEDESC) and if (!surface_desc) return DDERR_INVALIDPARAMS;
* sizeof(DDSURFACEDESC2) structures and do not touch the dwSize member */ if (surface_desc->dwSize != sizeof(DDSURFACEDESC) &&
return ddraw_surface7_Lock(&This->IDirectDrawSurface7_iface, surface_desc->dwSize != sizeof(DDSURFACEDESC2))
rect, (DDSURFACEDESC2 *)surface_desc, flags, h); {
WARN("Invalid structure size %d, returning DDERR_INVALIDPARAMS\n", surface_desc->dwSize);
return DDERR_INVALIDPARAMS;
}
surface_desc2.dwSize = surface_desc->dwSize;
hr = surface_lock(This, rect, &surface_desc2, flags, h);
DDSD2_to_DDSD(&surface_desc2, surface_desc);
surface_desc->dwSize = surface_desc2.dwSize;
return hr;
} }
static HRESULT WINAPI ddraw_surface2_Lock(IDirectDrawSurface2 *iface, RECT *rect, static HRESULT WINAPI ddraw_surface2_Lock(IDirectDrawSurface2 *iface, RECT *rect,
DDSURFACEDESC *surface_desc, DWORD flags, HANDLE h) DDSURFACEDESC *surface_desc, DWORD flags, HANDLE h)
{ {
IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface2(iface); IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface2(iface);
DDSURFACEDESC2 surface_desc2;
HRESULT hr;
TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n", TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n",
iface, wine_dbgstr_rect(rect), surface_desc, flags, h); iface, wine_dbgstr_rect(rect), surface_desc, flags, h);
/* All versions of Lock() accept both sizeof(DDSURFACEDESC) and if (!surface_desc) return DDERR_INVALIDPARAMS;
* sizeof(DDSURFACEDESC2) structures and do not touch the dwSize member if (surface_desc->dwSize != sizeof(DDSURFACEDESC) &&
* surface_desc->dwSize != sizeof(DDSURFACEDESC2))
* TODO: Test DDSD_ZBUFFERBITDEPTH behavior */ {
return ddraw_surface7_Lock(&This->IDirectDrawSurface7_iface, WARN("Invalid structure size %d, returning DDERR_INVALIDPARAMS\n", surface_desc->dwSize);
rect, (DDSURFACEDESC2 *)surface_desc, flags, h); return DDERR_INVALIDPARAMS;
}
surface_desc2.dwSize = surface_desc->dwSize;
hr = surface_lock(This, rect, &surface_desc2, flags, h);
DDSD2_to_DDSD(&surface_desc2, surface_desc);
surface_desc->dwSize = surface_desc2.dwSize;
return hr;
} }
static HRESULT WINAPI ddraw_surface1_Lock(IDirectDrawSurface *iface, RECT *rect, static HRESULT WINAPI ddraw_surface1_Lock(IDirectDrawSurface *iface, RECT *rect,
DDSURFACEDESC *surface_desc, DWORD flags, HANDLE h) DDSURFACEDESC *surface_desc, DWORD flags, HANDLE h)
{ {
IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface(iface); IDirectDrawSurfaceImpl *This = impl_from_IDirectDrawSurface(iface);
DDSURFACEDESC2 surface_desc2;
HRESULT hr;
TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n", TRACE("iface %p, rect %s, surface_desc %p, flags %#x, h %p.\n",
iface, wine_dbgstr_rect(rect), surface_desc, flags, h); iface, wine_dbgstr_rect(rect), surface_desc, flags, h);
/* All versions of Lock() accept both sizeof(DDSURFACEDESC) and if (!surface_desc) return DDERR_INVALIDPARAMS;
* sizeof(DDSURFACEDESC2) structures and do not touch the dwSize member */ if (surface_desc->dwSize != sizeof(DDSURFACEDESC) &&
return ddraw_surface7_Lock(&This->IDirectDrawSurface7_iface, surface_desc->dwSize != sizeof(DDSURFACEDESC2))
rect, (DDSURFACEDESC2 *)surface_desc, flags, h); {
WARN("Invalid structure size %d, returning DDERR_INVALIDPARAMS\n", surface_desc->dwSize);
return DDERR_INVALIDPARAMS;
}
surface_desc2.dwSize = surface_desc->dwSize;
hr = surface_lock(This, rect, &surface_desc2, flags, h);
DDSD2_to_DDSD(&surface_desc2, surface_desc);
surface_desc->dwSize = surface_desc2.dwSize;
return hr;
} }
/***************************************************************************** /*****************************************************************************
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment