mirror of
git://source.winehq.org/git/wine.git
synced 2024-09-06 03:08:19 +00:00
![Henri Verbeet](/assets/img/avatar_default.png)
Perhaps interesting to note is that this returns an IDirectDrawSurface instead of an IDirectDrawSurface4.
1203 lines
36 KiB
C
1203 lines
36 KiB
C
/* Direct Draw Thunks and old vtables
|
|
* Copyright 2000 TransGaming Technologies Inc.
|
|
*
|
|
* This library is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU Lesser General Public
|
|
* License as published by the Free Software Foundation; either
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
*
|
|
* This library is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
* Lesser General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU Lesser General Public
|
|
* License along with this library; if not, write to the Free Software
|
|
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
|
*/
|
|
|
|
#include "config.h"
|
|
#include "wine/port.h"
|
|
|
|
#include <assert.h>
|
|
#include <stdarg.h>
|
|
#include <string.h>
|
|
#include <stdlib.h>
|
|
|
|
#define COBJMACROS
|
|
#define NONAMELESSUNION
|
|
|
|
#include "windef.h"
|
|
#include "winbase.h"
|
|
#include "winerror.h"
|
|
#include "wingdi.h"
|
|
#include "wine/exception.h"
|
|
|
|
#include "ddraw.h"
|
|
#include "d3d.h"
|
|
|
|
#include "ddraw_private.h"
|
|
#include "wine/debug.h"
|
|
|
|
WINE_DEFAULT_DEBUG_CHANNEL(ddraw_thunk);
|
|
WINE_DECLARE_DEBUG_CHANNEL(ddraw);
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_QueryInterface(LPDIRECTDRAW This, REFIID iid, LPVOID *ppObj)
|
|
{
|
|
return IDirectDraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw1(This), iid, ppObj);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_QueryInterface(LPDIRECTDRAW2 This, REFIID iid, LPVOID *ppObj)
|
|
{
|
|
return IDirectDraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw2(This), iid, ppObj);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_QueryInterface(LPDIRECTDRAW3 This, REFIID iid, LPVOID *ppObj)
|
|
{
|
|
return IDirectDraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw3(This), iid, ppObj);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_QueryInterface(LPDIRECTDRAW4 This, REFIID iid, LPVOID *ppObj)
|
|
{
|
|
return IDirectDraw7_QueryInterface((IDirectDraw7 *)ddraw_from_ddraw4(This), iid, ppObj);
|
|
}
|
|
|
|
static ULONG WINAPI
|
|
IDirectDrawImpl_AddRef(LPDIRECTDRAW iface)
|
|
{
|
|
IDirectDrawImpl *This = ddraw_from_ddraw1(iface);
|
|
ULONG ref = InterlockedIncrement(&This->ref1);
|
|
|
|
TRACE("(%p) : incrementing IDirectDraw refcount from %u.\n", This, ref -1);
|
|
|
|
if(ref == 1) InterlockedIncrement(&This->numIfaces);
|
|
|
|
return ref;
|
|
}
|
|
|
|
static ULONG WINAPI
|
|
IDirectDraw2Impl_AddRef(LPDIRECTDRAW2 iface)
|
|
{
|
|
IDirectDrawImpl *This = ddraw_from_ddraw2(iface);
|
|
ULONG ref = InterlockedIncrement(&This->ref2);
|
|
|
|
TRACE("(%p) : incrementing IDirectDraw2 refcount from %u.\n", This, ref -1);
|
|
|
|
if(ref == 1) InterlockedIncrement(&This->numIfaces);
|
|
|
|
return ref;
|
|
}
|
|
|
|
static ULONG WINAPI
|
|
IDirectDraw3Impl_AddRef(LPDIRECTDRAW3 iface)
|
|
{
|
|
IDirectDrawImpl *This = ddraw_from_ddraw3(iface);
|
|
ULONG ref = InterlockedIncrement(&This->ref3);
|
|
|
|
TRACE("(%p) : incrementing IDirectDraw3 refcount from %u.\n", This, ref -1);
|
|
|
|
if(ref == 1) InterlockedIncrement(&This->numIfaces);
|
|
|
|
return ref;
|
|
}
|
|
|
|
static ULONG WINAPI
|
|
IDirectDraw4Impl_AddRef(LPDIRECTDRAW4 iface)
|
|
{
|
|
IDirectDrawImpl *This = ddraw_from_ddraw4(iface);
|
|
ULONG ref = InterlockedIncrement(&This->ref4);
|
|
|
|
TRACE("(%p) : incrementing IDirectDraw4 refcount from %u.\n", This, ref -1);
|
|
|
|
if(ref == 1) InterlockedIncrement(&This->numIfaces);
|
|
|
|
return ref;
|
|
}
|
|
|
|
static ULONG WINAPI
|
|
IDirectDrawImpl_Release(LPDIRECTDRAW iface)
|
|
{
|
|
IDirectDrawImpl *This = ddraw_from_ddraw1(iface);
|
|
ULONG ref = InterlockedDecrement(&This->ref1);
|
|
|
|
TRACE_(ddraw)("(%p)->() decrementing IDirectDraw refcount from %u.\n", This, ref +1);
|
|
|
|
if(ref == 0)
|
|
{
|
|
ULONG ifacecount = InterlockedDecrement(&This->numIfaces);
|
|
if(ifacecount == 0) IDirectDrawImpl_Destroy(This);
|
|
}
|
|
|
|
return ref;
|
|
}
|
|
|
|
static ULONG WINAPI
|
|
IDirectDraw2Impl_Release(LPDIRECTDRAW2 iface)
|
|
{
|
|
IDirectDrawImpl *This = ddraw_from_ddraw2(iface);
|
|
ULONG ref = InterlockedDecrement(&This->ref2);
|
|
|
|
TRACE_(ddraw)("(%p)->() decrementing IDirectDraw2 refcount from %u.\n", This, ref +1);
|
|
|
|
if(ref == 0)
|
|
{
|
|
ULONG ifacecount = InterlockedDecrement(&This->numIfaces);
|
|
if(ifacecount == 0) IDirectDrawImpl_Destroy(This);
|
|
}
|
|
|
|
return ref;
|
|
}
|
|
|
|
static ULONG WINAPI
|
|
IDirectDraw3Impl_Release(LPDIRECTDRAW3 iface)
|
|
{
|
|
IDirectDrawImpl *This = ddraw_from_ddraw3(iface);
|
|
ULONG ref = InterlockedDecrement(&This->ref3);
|
|
|
|
TRACE_(ddraw)("(%p)->() decrementing IDirectDraw3 refcount from %u.\n", This, ref +1);
|
|
|
|
if(ref == 0)
|
|
{
|
|
ULONG ifacecount = InterlockedDecrement(&This->numIfaces);
|
|
if(ifacecount == 0) IDirectDrawImpl_Destroy(This);
|
|
}
|
|
|
|
return ref;
|
|
}
|
|
|
|
static ULONG WINAPI
|
|
IDirectDraw4Impl_Release(LPDIRECTDRAW4 iface)
|
|
{
|
|
IDirectDrawImpl *This = ddraw_from_ddraw4(iface);
|
|
ULONG ref = InterlockedDecrement(&This->ref4);
|
|
|
|
TRACE_(ddraw)("(%p)->() decrementing IDirectDraw4 refcount from %u.\n", This, ref +1);
|
|
|
|
if(ref == 0)
|
|
{
|
|
ULONG ifacecount = InterlockedDecrement(&This->numIfaces);
|
|
if(ifacecount == 0) IDirectDrawImpl_Destroy(This);
|
|
}
|
|
|
|
return ref;
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_Compact(LPDIRECTDRAW This)
|
|
{
|
|
return IDirectDraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw1(This));
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_Compact(LPDIRECTDRAW2 This)
|
|
{
|
|
return IDirectDraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw2(This));
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_Compact(LPDIRECTDRAW3 This)
|
|
{
|
|
return IDirectDraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw3(This));
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_Compact(LPDIRECTDRAW4 This)
|
|
{
|
|
return IDirectDraw7_Compact((IDirectDraw7 *)ddraw_from_ddraw4(This));
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_CreateClipper(LPDIRECTDRAW This, DWORD dwFlags,
|
|
LPDIRECTDRAWCLIPPER *ppClipper,
|
|
IUnknown *pUnkOuter)
|
|
{
|
|
return IDirectDraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw1(This), dwFlags, ppClipper, pUnkOuter);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_CreateClipper(LPDIRECTDRAW2 This, DWORD dwFlags,
|
|
LPDIRECTDRAWCLIPPER *ppClipper,
|
|
IUnknown *pUnkOuter)
|
|
{
|
|
return IDirectDraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw2(This), dwFlags, ppClipper, pUnkOuter);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_CreateClipper(LPDIRECTDRAW3 This, DWORD dwFlags,
|
|
LPDIRECTDRAWCLIPPER *ppClipper,
|
|
IUnknown *pUnkOuter)
|
|
{
|
|
return IDirectDraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw3(This), dwFlags, ppClipper, pUnkOuter);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_CreateClipper(LPDIRECTDRAW4 This, DWORD dwFlags,
|
|
LPDIRECTDRAWCLIPPER *ppClipper,
|
|
IUnknown *pUnkOuter)
|
|
{
|
|
return IDirectDraw7_CreateClipper((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, ppClipper, pUnkOuter);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_CreatePalette(LPDIRECTDRAW This, DWORD dwFlags,
|
|
LPPALETTEENTRY pEntries,
|
|
LPDIRECTDRAWPALETTE *ppPalette,
|
|
IUnknown *pUnkOuter)
|
|
{
|
|
HRESULT hr;
|
|
hr = IDirectDraw7_CreatePalette((IDirectDraw7 *)ddraw_from_ddraw1(This), dwFlags, pEntries, ppPalette, pUnkOuter);
|
|
if(SUCCEEDED(hr) && *ppPalette)
|
|
{
|
|
IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*ppPalette;
|
|
IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw1(This));
|
|
impl->ifaceToRelease = NULL;
|
|
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_CreatePalette(LPDIRECTDRAW2 This, DWORD dwFlags,
|
|
LPPALETTEENTRY pEntries,
|
|
LPDIRECTDRAWPALETTE *ppPalette,
|
|
IUnknown *pUnkOuter)
|
|
{
|
|
HRESULT hr;
|
|
hr = IDirectDraw7_CreatePalette((IDirectDraw7 *)ddraw_from_ddraw2(This), dwFlags, pEntries, ppPalette, pUnkOuter);
|
|
if(SUCCEEDED(hr) && *ppPalette)
|
|
{
|
|
IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*ppPalette;
|
|
IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw2(This));
|
|
impl->ifaceToRelease = NULL;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_CreatePalette(LPDIRECTDRAW3 This, DWORD dwFlags,
|
|
LPPALETTEENTRY pEntries,
|
|
LPDIRECTDRAWPALETTE *ppPalette,
|
|
IUnknown *pUnkOuter)
|
|
{
|
|
HRESULT hr;
|
|
hr = IDirectDraw7_CreatePalette((IDirectDraw7 *)ddraw_from_ddraw3(This), dwFlags, pEntries, ppPalette, pUnkOuter);
|
|
if(SUCCEEDED(hr) && *ppPalette)
|
|
{
|
|
IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*ppPalette;
|
|
IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw3(This));
|
|
IDirectDraw4_AddRef(This);
|
|
impl->ifaceToRelease = (IUnknown *) This;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_CreatePalette(LPDIRECTDRAW4 This, DWORD dwFlags,
|
|
LPPALETTEENTRY pEntries,
|
|
LPDIRECTDRAWPALETTE *ppPalette,
|
|
IUnknown *pUnkOuter)
|
|
{
|
|
HRESULT hr;
|
|
hr = IDirectDraw7_CreatePalette((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, pEntries, ppPalette, pUnkOuter);
|
|
if(SUCCEEDED(hr) && *ppPalette)
|
|
{
|
|
IDirectDrawPaletteImpl *impl = (IDirectDrawPaletteImpl *)*ppPalette;
|
|
IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw4(This));
|
|
IDirectDraw4_AddRef(This);
|
|
impl->ifaceToRelease = (IUnknown *) This;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
/* Must set all attached surfaces (e.g. mipmaps) versions as well */
|
|
static void set_surf_version(IDirectDrawSurfaceImpl *surf, int version)
|
|
{
|
|
int i;
|
|
TRACE("%p->version(%d) = %d\n", surf, surf->version, version);
|
|
surf->version = version;
|
|
for(i = 0; i < MAX_COMPLEX_ATTACHED; i++)
|
|
{
|
|
if(!surf->complex_array[i]) break;
|
|
set_surf_version(surf->complex_array[i], version);
|
|
}
|
|
while( (surf = surf->next_attached) )
|
|
{
|
|
set_surf_version(surf, version);
|
|
}
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_CreateSurface(LPDIRECTDRAW This, LPDDSURFACEDESC pSDesc,
|
|
LPDIRECTDRAWSURFACE *ppSurface,
|
|
IUnknown *pUnkOuter)
|
|
{
|
|
LPDIRECTDRAWSURFACE7 pSurface7;
|
|
IDirectDrawSurfaceImpl *impl;
|
|
HRESULT hr;
|
|
|
|
/* Remove front buffer flag, this causes failure in v7, and its added to normal
|
|
* primaries anyway
|
|
*/
|
|
pSDesc->ddsCaps.dwCaps &= ~DDSCAPS_FRONTBUFFER;
|
|
/* the LPDDSURFACEDESC -> LPDDSURFACEDESC2 conversion should be ok,
|
|
* since the data layout is the same */
|
|
hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw1(This),
|
|
(LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
|
|
if (FAILED(hr))
|
|
{
|
|
*ppSurface = NULL;
|
|
return hr;
|
|
}
|
|
|
|
impl = (IDirectDrawSurfaceImpl *)pSurface7;
|
|
*ppSurface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_vtbl;
|
|
set_surf_version(impl, 1);
|
|
IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw1(This));
|
|
impl->ifaceToRelease = NULL;
|
|
|
|
return hr;
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_CreateSurface(LPDIRECTDRAW2 This, LPDDSURFACEDESC pSDesc,
|
|
LPDIRECTDRAWSURFACE *ppSurface,
|
|
IUnknown *pUnkOuter)
|
|
{
|
|
LPDIRECTDRAWSURFACE7 pSurface7;
|
|
IDirectDrawSurfaceImpl *impl;
|
|
HRESULT hr;
|
|
|
|
hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw2(This),
|
|
(LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
|
|
if (FAILED(hr))
|
|
{
|
|
*ppSurface = NULL;
|
|
return hr;
|
|
}
|
|
|
|
impl = (IDirectDrawSurfaceImpl *)pSurface7;
|
|
*ppSurface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_vtbl;
|
|
set_surf_version(impl, 2);
|
|
IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw2(This));
|
|
impl->ifaceToRelease = NULL;
|
|
|
|
return hr;
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_CreateSurface(LPDIRECTDRAW3 This, LPDDSURFACEDESC pSDesc,
|
|
LPDIRECTDRAWSURFACE *ppSurface,
|
|
IUnknown *pUnkOuter)
|
|
{
|
|
LPDIRECTDRAWSURFACE7 pSurface7;
|
|
IDirectDrawSurfaceImpl *impl;
|
|
HRESULT hr;
|
|
|
|
hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw3(This),
|
|
(LPDDSURFACEDESC2)pSDesc, &pSurface7, pUnkOuter);
|
|
if (FAILED(hr))
|
|
{
|
|
*ppSurface = NULL;
|
|
return hr;
|
|
}
|
|
|
|
impl = (IDirectDrawSurfaceImpl *)pSurface7;
|
|
*ppSurface = (IDirectDrawSurface *)&impl->IDirectDrawSurface3_vtbl;
|
|
set_surf_version(impl, 3);
|
|
IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw3(This));
|
|
IDirectDraw3_AddRef(This);
|
|
impl->ifaceToRelease = (IUnknown *) This;
|
|
|
|
return hr;
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_CreateSurface(LPDIRECTDRAW4 This, LPDDSURFACEDESC2 pSDesc,
|
|
LPDIRECTDRAWSURFACE4 *ppSurface,
|
|
IUnknown *pUnkOuter)
|
|
{
|
|
HRESULT hr;
|
|
IDirectDrawSurfaceImpl *impl;
|
|
|
|
hr = IDirectDraw7_CreateSurface((IDirectDraw7 *)ddraw_from_ddraw4(This),
|
|
pSDesc, (LPDIRECTDRAWSURFACE7 *)ppSurface, pUnkOuter);
|
|
impl = (IDirectDrawSurfaceImpl *)*ppSurface;
|
|
if(SUCCEEDED(hr) && impl)
|
|
{
|
|
set_surf_version(impl, 4);
|
|
IDirectDraw7_Release((IDirectDraw7 *)ddraw_from_ddraw4(This));
|
|
IDirectDraw4_AddRef(This);
|
|
impl->ifaceToRelease = (IUnknown *) This;
|
|
}
|
|
return hr;
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_DuplicateSurface(LPDIRECTDRAW This, LPDIRECTDRAWSURFACE pSrc,
|
|
LPDIRECTDRAWSURFACE *ppDst)
|
|
{
|
|
LPDIRECTDRAWSURFACE7 pDst7;
|
|
HRESULT hr;
|
|
|
|
hr = IDirectDraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw1(This),
|
|
pSrc ? (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)pSrc) : NULL, &pDst7);
|
|
|
|
/* This coercion is safe, since the IDirectDrawSurface3 vtable has the
|
|
* IDirectDrawSurface vtable layout at the beginning */
|
|
*ppDst = pDst7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pDst7)->IDirectDrawSurface3_vtbl : NULL;
|
|
|
|
return hr;
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_DuplicateSurface(LPDIRECTDRAW2 This, LPDIRECTDRAWSURFACE pSrc,
|
|
LPDIRECTDRAWSURFACE *ppDst)
|
|
{
|
|
LPDIRECTDRAWSURFACE7 pDst7;
|
|
HRESULT hr;
|
|
|
|
hr = IDirectDraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw2(This),
|
|
pSrc ? (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)pSrc) : NULL, &pDst7);
|
|
|
|
/* This coercion is safe, since the IDirectDrawSurface3 vtable has the
|
|
* IDirectDrawSurface vtable layout at the beginning */
|
|
*ppDst = pDst7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pDst7)->IDirectDrawSurface3_vtbl : NULL;
|
|
|
|
return hr;
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_DuplicateSurface(LPDIRECTDRAW3 This, LPDIRECTDRAWSURFACE pSrc,
|
|
LPDIRECTDRAWSURFACE *ppDst)
|
|
{
|
|
LPDIRECTDRAWSURFACE7 pDst7;
|
|
HRESULT hr;
|
|
|
|
hr = IDirectDraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw3(This),
|
|
pSrc ? (IDirectDrawSurface7 *)surface_from_surface3((IDirectDrawSurface3 *)pSrc) : NULL, &pDst7);
|
|
|
|
/* This coercion is safe, since the IDirectDrawSurface3 vtable has the
|
|
* IDirectDrawSurface vtable layout at the beginning */
|
|
*ppDst = pDst7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pDst7)->IDirectDrawSurface3_vtbl : NULL;
|
|
|
|
return hr;
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_DuplicateSurface(LPDIRECTDRAW4 This,
|
|
LPDIRECTDRAWSURFACE4 pSrc,
|
|
LPDIRECTDRAWSURFACE4 *ppDst)
|
|
{
|
|
return IDirectDraw7_DuplicateSurface((IDirectDraw7 *)ddraw_from_ddraw4(This),
|
|
(LPDIRECTDRAWSURFACE7)pSrc, (LPDIRECTDRAWSURFACE7 *)ppDst);
|
|
}
|
|
|
|
struct displaymodescallback_context
|
|
{
|
|
LPDDENUMMODESCALLBACK func;
|
|
LPVOID context;
|
|
};
|
|
|
|
static HRESULT CALLBACK
|
|
EnumDisplayModesCallbackThunk(LPDDSURFACEDESC2 pDDSD2, LPVOID context)
|
|
{
|
|
DDSURFACEDESC DDSD;
|
|
struct displaymodescallback_context *cbcontext = context;
|
|
|
|
memcpy(&DDSD,pDDSD2,sizeof(DDSD));
|
|
DDSD.dwSize = sizeof(DDSD);
|
|
|
|
return cbcontext->func(&DDSD, cbcontext->context);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_EnumDisplayModes(LPDIRECTDRAW This, DWORD dwFlags,
|
|
LPDDSURFACEDESC pDDSD, LPVOID context,
|
|
LPDDENUMMODESCALLBACK cb)
|
|
{
|
|
struct displaymodescallback_context cbcontext;
|
|
|
|
cbcontext.func = cb;
|
|
cbcontext.context = context;
|
|
|
|
return IDirectDraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw1(This),
|
|
dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumDisplayModesCallbackThunk);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_EnumDisplayModes(LPDIRECTDRAW2 This, DWORD dwFlags,
|
|
LPDDSURFACEDESC pDDSD, LPVOID context,
|
|
LPDDENUMMODESCALLBACK cb)
|
|
{
|
|
struct displaymodescallback_context cbcontext;
|
|
|
|
cbcontext.func = cb;
|
|
cbcontext.context = context;
|
|
|
|
return IDirectDraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw2(This),
|
|
dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumDisplayModesCallbackThunk);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_EnumDisplayModes(LPDIRECTDRAW3 This, DWORD dwFlags,
|
|
LPDDSURFACEDESC pDDSD, LPVOID context,
|
|
LPDDENUMMODESCALLBACK cb)
|
|
{
|
|
struct displaymodescallback_context cbcontext;
|
|
|
|
cbcontext.func = cb;
|
|
cbcontext.context = context;
|
|
|
|
return IDirectDraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw3(This),
|
|
dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumDisplayModesCallbackThunk);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_EnumDisplayModes(LPDIRECTDRAW4 This, DWORD dwFlags,
|
|
LPDDSURFACEDESC2 pDDSD, LPVOID context,
|
|
LPDDENUMMODESCALLBACK2 cb)
|
|
{
|
|
return IDirectDraw7_EnumDisplayModes((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, pDDSD, context, cb);
|
|
}
|
|
|
|
struct surfacescallback_context
|
|
{
|
|
LPDDENUMSURFACESCALLBACK func;
|
|
LPVOID context;
|
|
};
|
|
|
|
static HRESULT CALLBACK
|
|
EnumSurfacesCallbackThunk(LPDIRECTDRAWSURFACE7 pSurf, LPDDSURFACEDESC2 pDDSD,
|
|
LPVOID context)
|
|
{
|
|
struct surfacescallback_context *cbcontext = context;
|
|
|
|
/* This coercion is safe, since the IDirectDrawSurface3 vtable has the
|
|
* IDirectDrawSurface vtable layout at the beginning */
|
|
return cbcontext->func(
|
|
pSurf ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurf)->IDirectDrawSurface3_vtbl : NULL,
|
|
(LPDDSURFACEDESC)pDDSD, cbcontext->context);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_EnumSurfaces(LPDIRECTDRAW This, DWORD dwFlags,
|
|
LPDDSURFACEDESC pDDSD, LPVOID context,
|
|
LPDDENUMSURFACESCALLBACK cb)
|
|
{
|
|
struct surfacescallback_context cbcontext;
|
|
|
|
cbcontext.func = cb;
|
|
cbcontext.context = context;
|
|
|
|
return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw1(This),
|
|
dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumSurfacesCallbackThunk);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_EnumSurfaces(LPDIRECTDRAW2 This, DWORD dwFlags,
|
|
LPDDSURFACEDESC pDDSD, LPVOID context,
|
|
LPDDENUMSURFACESCALLBACK cb)
|
|
{
|
|
struct surfacescallback_context cbcontext;
|
|
|
|
cbcontext.func = cb;
|
|
cbcontext.context = context;
|
|
|
|
return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw2(This),
|
|
dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumSurfacesCallbackThunk);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_EnumSurfaces(LPDIRECTDRAW3 This, DWORD dwFlags,
|
|
LPDDSURFACEDESC pDDSD, LPVOID context,
|
|
LPDDENUMSURFACESCALLBACK cb)
|
|
{
|
|
struct surfacescallback_context cbcontext;
|
|
|
|
cbcontext.func = cb;
|
|
cbcontext.context = context;
|
|
|
|
return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw3(This),
|
|
dwFlags, (LPDDSURFACEDESC2)pDDSD, &cbcontext, EnumSurfacesCallbackThunk);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_EnumSurfaces(LPDIRECTDRAW4 This, DWORD dwFlags,
|
|
LPDDSURFACEDESC2 pDDSD, LPVOID context,
|
|
LPDDENUMSURFACESCALLBACK2 cb)
|
|
{
|
|
return IDirectDraw7_EnumSurfaces((IDirectDraw7 *)ddraw_from_ddraw4(This),
|
|
dwFlags, pDDSD, context, (LPDDENUMSURFACESCALLBACK7)cb);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_FlipToGDISurface(LPDIRECTDRAW This)
|
|
{
|
|
return IDirectDraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw1(This));
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_FlipToGDISurface(LPDIRECTDRAW2 This)
|
|
{
|
|
return IDirectDraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw2(This));
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_FlipToGDISurface(LPDIRECTDRAW3 This)
|
|
{
|
|
return IDirectDraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw3(This));
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_FlipToGDISurface(LPDIRECTDRAW4 This)
|
|
{
|
|
return IDirectDraw7_FlipToGDISurface((IDirectDraw7 *)ddraw_from_ddraw4(This));
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_GetCaps(LPDIRECTDRAW This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
|
|
{
|
|
return IDirectDraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw1(This), pDDC1, pDDC2);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_GetCaps(LPDIRECTDRAW2 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
|
|
{
|
|
return IDirectDraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw2(This), pDDC1, pDDC2);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_GetCaps(LPDIRECTDRAW3 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
|
|
{
|
|
return IDirectDraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw3(This), pDDC1, pDDC2);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_GetCaps(LPDIRECTDRAW4 This, LPDDCAPS pDDC1, LPDDCAPS pDDC2)
|
|
{
|
|
return IDirectDraw7_GetCaps((IDirectDraw7 *)ddraw_from_ddraw4(This), pDDC1, pDDC2);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_GetDisplayMode(LPDIRECTDRAW This, LPDDSURFACEDESC pDDSD)
|
|
{
|
|
return IDirectDraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw1(This), (LPDDSURFACEDESC2)pDDSD);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_GetDisplayMode(LPDIRECTDRAW2 This, LPDDSURFACEDESC pDDSD)
|
|
{
|
|
return IDirectDraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw2(This), (LPDDSURFACEDESC2)pDDSD);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_GetDisplayMode(LPDIRECTDRAW3 This, LPDDSURFACEDESC pDDSD)
|
|
{
|
|
return IDirectDraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw3(This), (LPDDSURFACEDESC2)pDDSD);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_GetDisplayMode(LPDIRECTDRAW4 This, LPDDSURFACEDESC2 pDDSD)
|
|
{
|
|
return IDirectDraw7_GetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(This), (LPDDSURFACEDESC2)pDDSD);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_GetFourCCCodes(LPDIRECTDRAW This, LPDWORD lpNumCodes,
|
|
LPDWORD lpCodes)
|
|
{
|
|
return IDirectDraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw1(This), lpNumCodes, lpCodes);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_GetFourCCCodes(LPDIRECTDRAW2 This, LPDWORD lpNumCodes,
|
|
LPDWORD lpCodes)
|
|
{
|
|
return IDirectDraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw2(This), lpNumCodes, lpCodes);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_GetFourCCCodes(LPDIRECTDRAW3 This, LPDWORD lpNumCodes,
|
|
LPDWORD lpCodes)
|
|
{
|
|
return IDirectDraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw3(This), lpNumCodes, lpCodes);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_GetFourCCCodes(LPDIRECTDRAW4 This, LPDWORD lpNumCodes,
|
|
LPDWORD lpCodes)
|
|
{
|
|
return IDirectDraw7_GetFourCCCodes((IDirectDraw7 *)ddraw_from_ddraw4(This), lpNumCodes, lpCodes);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_GetGDISurface(LPDIRECTDRAW This, LPDIRECTDRAWSURFACE *ppSurf)
|
|
{
|
|
LPDIRECTDRAWSURFACE7 pSurf7;
|
|
HRESULT hr;
|
|
|
|
hr = IDirectDraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw1(This), &pSurf7);
|
|
|
|
/* This coercion is safe, since the IDirectDrawSurface3 vtable has the
|
|
* IDirectDrawSurface vtable layout at the beginning */
|
|
*ppSurf = pSurf7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurf7)->IDirectDrawSurface3_vtbl : NULL;
|
|
|
|
return hr;
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_GetGDISurface(LPDIRECTDRAW2 This, LPDIRECTDRAWSURFACE *ppSurf)
|
|
{
|
|
LPDIRECTDRAWSURFACE7 pSurf7;
|
|
HRESULT hr;
|
|
|
|
hr = IDirectDraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw2(This), &pSurf7);
|
|
|
|
/* This coercion is safe, since the IDirectDrawSurface3 vtable has the
|
|
* IDirectDrawSurface vtable layout at the beginning */
|
|
*ppSurf = pSurf7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurf7)->IDirectDrawSurface3_vtbl : NULL;
|
|
|
|
return hr;
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_GetGDISurface(LPDIRECTDRAW3 This, LPDIRECTDRAWSURFACE *ppSurf)
|
|
{
|
|
LPDIRECTDRAWSURFACE7 pSurf7;
|
|
HRESULT hr;
|
|
|
|
hr = IDirectDraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw3(This), &pSurf7);
|
|
|
|
/* This coercion is safe, since the IDirectDrawSurface3 vtable has the
|
|
* IDirectDrawSurface vtable layout at the beginning */
|
|
*ppSurf = pSurf7 ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)pSurf7)->IDirectDrawSurface3_vtbl : NULL;
|
|
|
|
return hr;
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_GetGDISurface(LPDIRECTDRAW4 This,
|
|
LPDIRECTDRAWSURFACE4 *ppSurf)
|
|
{
|
|
return IDirectDraw7_GetGDISurface((IDirectDraw7 *)ddraw_from_ddraw4(This), (LPDIRECTDRAWSURFACE7 *)ppSurf);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_GetMonitorFrequency(LPDIRECTDRAW This, LPDWORD pdwFreq)
|
|
{
|
|
return IDirectDraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw1(This), pdwFreq);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_GetMonitorFrequency(LPDIRECTDRAW2 This, LPDWORD pdwFreq)
|
|
{
|
|
return IDirectDraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw2(This), pdwFreq);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_GetMonitorFrequency(LPDIRECTDRAW3 This, LPDWORD pdwFreq)
|
|
{
|
|
return IDirectDraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw3(This), pdwFreq);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_GetMonitorFrequency(LPDIRECTDRAW4 This, LPDWORD pdwFreq)
|
|
{
|
|
return IDirectDraw7_GetMonitorFrequency((IDirectDraw7 *)ddraw_from_ddraw4(This), pdwFreq);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_GetScanLine(LPDIRECTDRAW This, LPDWORD pdwLine)
|
|
{
|
|
return IDirectDraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw1(This), pdwLine);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_GetScanLine(LPDIRECTDRAW2 This, LPDWORD pdwLine)
|
|
{
|
|
return IDirectDraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw2(This), pdwLine);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_GetScanLine(LPDIRECTDRAW3 This, LPDWORD pdwLine)
|
|
{
|
|
return IDirectDraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw3(This), pdwLine);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_GetScanLine(LPDIRECTDRAW4 This, LPDWORD pdwLine)
|
|
{
|
|
return IDirectDraw7_GetScanLine((IDirectDraw7 *)ddraw_from_ddraw4(This), pdwLine);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_GetVerticalBlankStatus(LPDIRECTDRAW This, LPBOOL lpbIsInVB)
|
|
{
|
|
return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw1(This), lpbIsInVB);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_GetVerticalBlankStatus(LPDIRECTDRAW2 This, LPBOOL lpbIsInVB)
|
|
{
|
|
return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw2(This), lpbIsInVB);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_GetVerticalBlankStatus(LPDIRECTDRAW3 This, LPBOOL lpbIsInVB)
|
|
{
|
|
return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw3(This), lpbIsInVB);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_GetVerticalBlankStatus(LPDIRECTDRAW4 This, LPBOOL lpbIsInVB)
|
|
{
|
|
return IDirectDraw7_GetVerticalBlankStatus((IDirectDraw7 *)ddraw_from_ddraw4(This), lpbIsInVB);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_Initialize(LPDIRECTDRAW iface, LPGUID pGUID)
|
|
{
|
|
IDirectDrawImpl *This = ddraw_from_ddraw1(iface);
|
|
HRESULT ret_value;
|
|
|
|
ret_value = IDirectDraw7_Initialize((IDirectDraw7 *)This, pGUID);
|
|
|
|
return ret_value;
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_Initialize(LPDIRECTDRAW2 iface, LPGUID pGUID)
|
|
{
|
|
IDirectDrawImpl *This = ddraw_from_ddraw2(iface);
|
|
HRESULT ret_value;
|
|
|
|
ret_value = IDirectDraw7_Initialize((IDirectDraw7 *)This, pGUID);
|
|
|
|
return ret_value;
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_Initialize(LPDIRECTDRAW3 iface, LPGUID pGUID)
|
|
{
|
|
IDirectDrawImpl *This = ddraw_from_ddraw3(iface);
|
|
HRESULT ret_value;
|
|
|
|
ret_value = IDirectDraw7_Initialize((IDirectDraw7 *)This, pGUID);
|
|
|
|
return ret_value;
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_Initialize(LPDIRECTDRAW4 iface, LPGUID pGUID)
|
|
{
|
|
IDirectDrawImpl *This = ddraw_from_ddraw4(iface);
|
|
HRESULT ret_value;
|
|
|
|
ret_value = IDirectDraw7_Initialize((IDirectDraw7 *)This, pGUID);
|
|
|
|
return ret_value;
|
|
}
|
|
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_RestoreDisplayMode(LPDIRECTDRAW This)
|
|
{
|
|
return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw1(This));
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_RestoreDisplayMode(LPDIRECTDRAW2 This)
|
|
{
|
|
return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw2(This));
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_RestoreDisplayMode(LPDIRECTDRAW3 This)
|
|
{
|
|
return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw3(This));
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_RestoreDisplayMode(LPDIRECTDRAW4 This)
|
|
{
|
|
return IDirectDraw7_RestoreDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(This));
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_SetCooperativeLevel(LPDIRECTDRAW This, HWND hWnd,
|
|
DWORD dwFlags)
|
|
{
|
|
return IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw1(This), hWnd, dwFlags);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_SetCooperativeLevel(LPDIRECTDRAW2 This, HWND hWnd,
|
|
DWORD dwFlags)
|
|
{
|
|
return IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw2(This), hWnd, dwFlags);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_SetCooperativeLevel(LPDIRECTDRAW3 This, HWND hWnd,
|
|
DWORD dwFlags)
|
|
{
|
|
return IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw3(This), hWnd, dwFlags);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_SetCooperativeLevel(LPDIRECTDRAW4 This, HWND hWnd,
|
|
DWORD dwFlags)
|
|
{
|
|
return IDirectDraw7_SetCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw4(This), hWnd, dwFlags);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_SetDisplayMode(LPDIRECTDRAW This, DWORD a, DWORD b, DWORD c)
|
|
{
|
|
return IDirectDraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw1(This), a, b, c, 0, 0);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_SetDisplayMode(LPDIRECTDRAW2 This, DWORD a, DWORD b, DWORD c,
|
|
DWORD d, DWORD e)
|
|
{
|
|
return IDirectDraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw2(This), a, b, c, d, e);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_SetDisplayMode(LPDIRECTDRAW3 This, DWORD a, DWORD b, DWORD c,
|
|
DWORD d, DWORD e)
|
|
{
|
|
return IDirectDraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw3(This), a, b, c, d, e);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_SetDisplayMode(LPDIRECTDRAW4 This, DWORD a, DWORD b, DWORD c,
|
|
DWORD d, DWORD e)
|
|
{
|
|
return IDirectDraw7_SetDisplayMode((IDirectDraw7 *)ddraw_from_ddraw4(This), a, b, c, d, e);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDrawImpl_WaitForVerticalBlank(LPDIRECTDRAW This, DWORD dwFlags,
|
|
HANDLE hEvent)
|
|
{
|
|
return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw1(This), dwFlags, hEvent);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_WaitForVerticalBlank(LPDIRECTDRAW2 This, DWORD dwFlags,
|
|
HANDLE hEvent)
|
|
{
|
|
return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw2(This), dwFlags, hEvent);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_WaitForVerticalBlank(LPDIRECTDRAW3 This, DWORD dwFlags,
|
|
HANDLE hEvent)
|
|
{
|
|
return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw3(This), dwFlags, hEvent);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_WaitForVerticalBlank(LPDIRECTDRAW4 This, DWORD dwFlags,
|
|
HANDLE hEvent)
|
|
{
|
|
return IDirectDraw7_WaitForVerticalBlank((IDirectDraw7 *)ddraw_from_ddraw4(This), dwFlags, hEvent);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw2Impl_GetAvailableVidMem(LPDIRECTDRAW2 This, LPDDSCAPS pCaps,
|
|
LPDWORD pdwTotal, LPDWORD pdwFree)
|
|
{
|
|
DDSCAPS2 Caps2;
|
|
DDRAW_Convert_DDSCAPS_1_To_2(pCaps, &Caps2);
|
|
|
|
return IDirectDraw7_GetAvailableVidMem((IDirectDraw7 *)ddraw_from_ddraw2(This), &Caps2, pdwTotal, pdwFree);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_GetAvailableVidMem(LPDIRECTDRAW3 This, LPDDSCAPS pCaps,
|
|
LPDWORD pdwTotal, LPDWORD pdwFree)
|
|
{
|
|
DDSCAPS2 Caps2;
|
|
DDRAW_Convert_DDSCAPS_1_To_2(pCaps, &Caps2);
|
|
|
|
return IDirectDraw7_GetAvailableVidMem((IDirectDraw7 *)ddraw_from_ddraw3(This), &Caps2, pdwTotal, pdwFree);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_GetAvailableVidMem(LPDIRECTDRAW4 This, LPDDSCAPS2 pCaps,
|
|
LPDWORD pdwTotal, LPDWORD pdwFree)
|
|
{
|
|
return IDirectDraw7_GetAvailableVidMem((IDirectDraw7 *)ddraw_from_ddraw4(This), pCaps, pdwTotal, pdwFree);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw3Impl_GetSurfaceFromDC(LPDIRECTDRAW3 This, HDC hDC,
|
|
LPDIRECTDRAWSURFACE *pSurf)
|
|
{
|
|
return IDirectDraw7_GetSurfaceFromDC((IDirectDraw7 *)ddraw_from_ddraw3(This), hDC, (LPDIRECTDRAWSURFACE7 *)pSurf);
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_GetSurfaceFromDC(LPDIRECTDRAW4 This, HDC hDC,
|
|
LPDIRECTDRAWSURFACE4 *pSurf)
|
|
{
|
|
IDirectDrawSurface7 *surf7;
|
|
HRESULT hr;
|
|
|
|
if (!pSurf) return E_INVALIDARG;
|
|
|
|
hr = IDirectDraw7_GetSurfaceFromDC((IDirectDraw7 *)ddraw_from_ddraw4(This), hDC, &surf7);
|
|
*pSurf = surf7 ? (IDirectDrawSurface4 *)&((IDirectDrawSurfaceImpl *)surf7)->IDirectDrawSurface3_vtbl : NULL;
|
|
|
|
return hr;
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_RestoreAllSurfaces(LPDIRECTDRAW4 This)
|
|
{
|
|
return IDirectDraw7_RestoreAllSurfaces((IDirectDraw7 *)ddraw_from_ddraw4(This));
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_TestCooperativeLevel(LPDIRECTDRAW4 This)
|
|
{
|
|
return IDirectDraw7_TestCooperativeLevel((IDirectDraw7 *)ddraw_from_ddraw4(This));
|
|
}
|
|
|
|
static HRESULT WINAPI
|
|
IDirectDraw4Impl_GetDeviceIdentifier(LPDIRECTDRAW4 This,
|
|
LPDDDEVICEIDENTIFIER pDDDI, DWORD dwFlags)
|
|
{
|
|
DDDEVICEIDENTIFIER2 DDDI2;
|
|
HRESULT hr;
|
|
|
|
hr = IDirectDraw7_GetDeviceIdentifier((IDirectDraw7 *)ddraw_from_ddraw4(This), &DDDI2, dwFlags);
|
|
|
|
DDRAW_Convert_DDDEVICEIDENTIFIER_2_To_1(&DDDI2, pDDDI);
|
|
|
|
return hr;
|
|
}
|
|
|
|
const IDirectDrawVtbl IDirectDraw1_Vtbl =
|
|
{
|
|
IDirectDrawImpl_QueryInterface,
|
|
IDirectDrawImpl_AddRef,
|
|
IDirectDrawImpl_Release,
|
|
IDirectDrawImpl_Compact,
|
|
IDirectDrawImpl_CreateClipper,
|
|
IDirectDrawImpl_CreatePalette,
|
|
IDirectDrawImpl_CreateSurface,
|
|
IDirectDrawImpl_DuplicateSurface,
|
|
IDirectDrawImpl_EnumDisplayModes,
|
|
IDirectDrawImpl_EnumSurfaces,
|
|
IDirectDrawImpl_FlipToGDISurface,
|
|
IDirectDrawImpl_GetCaps,
|
|
IDirectDrawImpl_GetDisplayMode,
|
|
IDirectDrawImpl_GetFourCCCodes,
|
|
IDirectDrawImpl_GetGDISurface,
|
|
IDirectDrawImpl_GetMonitorFrequency,
|
|
IDirectDrawImpl_GetScanLine,
|
|
IDirectDrawImpl_GetVerticalBlankStatus,
|
|
IDirectDrawImpl_Initialize,
|
|
IDirectDrawImpl_RestoreDisplayMode,
|
|
IDirectDrawImpl_SetCooperativeLevel,
|
|
IDirectDrawImpl_SetDisplayMode,
|
|
IDirectDrawImpl_WaitForVerticalBlank,
|
|
};
|
|
|
|
const IDirectDraw2Vtbl IDirectDraw2_Vtbl =
|
|
{
|
|
IDirectDraw2Impl_QueryInterface,
|
|
IDirectDraw2Impl_AddRef,
|
|
IDirectDraw2Impl_Release,
|
|
IDirectDraw2Impl_Compact,
|
|
IDirectDraw2Impl_CreateClipper,
|
|
IDirectDraw2Impl_CreatePalette,
|
|
IDirectDraw2Impl_CreateSurface,
|
|
IDirectDraw2Impl_DuplicateSurface,
|
|
IDirectDraw2Impl_EnumDisplayModes,
|
|
IDirectDraw2Impl_EnumSurfaces,
|
|
IDirectDraw2Impl_FlipToGDISurface,
|
|
IDirectDraw2Impl_GetCaps,
|
|
IDirectDraw2Impl_GetDisplayMode,
|
|
IDirectDraw2Impl_GetFourCCCodes,
|
|
IDirectDraw2Impl_GetGDISurface,
|
|
IDirectDraw2Impl_GetMonitorFrequency,
|
|
IDirectDraw2Impl_GetScanLine,
|
|
IDirectDraw2Impl_GetVerticalBlankStatus,
|
|
IDirectDraw2Impl_Initialize,
|
|
IDirectDraw2Impl_RestoreDisplayMode,
|
|
IDirectDraw2Impl_SetCooperativeLevel,
|
|
IDirectDraw2Impl_SetDisplayMode,
|
|
IDirectDraw2Impl_WaitForVerticalBlank,
|
|
IDirectDraw2Impl_GetAvailableVidMem
|
|
};
|
|
|
|
const IDirectDraw3Vtbl IDirectDraw3_Vtbl =
|
|
{
|
|
IDirectDraw3Impl_QueryInterface,
|
|
IDirectDraw3Impl_AddRef,
|
|
IDirectDraw3Impl_Release,
|
|
IDirectDraw3Impl_Compact,
|
|
IDirectDraw3Impl_CreateClipper,
|
|
IDirectDraw3Impl_CreatePalette,
|
|
IDirectDraw3Impl_CreateSurface,
|
|
IDirectDraw3Impl_DuplicateSurface,
|
|
IDirectDraw3Impl_EnumDisplayModes,
|
|
IDirectDraw3Impl_EnumSurfaces,
|
|
IDirectDraw3Impl_FlipToGDISurface,
|
|
IDirectDraw3Impl_GetCaps,
|
|
IDirectDraw3Impl_GetDisplayMode,
|
|
IDirectDraw3Impl_GetFourCCCodes,
|
|
IDirectDraw3Impl_GetGDISurface,
|
|
IDirectDraw3Impl_GetMonitorFrequency,
|
|
IDirectDraw3Impl_GetScanLine,
|
|
IDirectDraw3Impl_GetVerticalBlankStatus,
|
|
IDirectDraw3Impl_Initialize,
|
|
IDirectDraw3Impl_RestoreDisplayMode,
|
|
IDirectDraw3Impl_SetCooperativeLevel,
|
|
IDirectDraw3Impl_SetDisplayMode,
|
|
IDirectDraw3Impl_WaitForVerticalBlank,
|
|
IDirectDraw3Impl_GetAvailableVidMem,
|
|
IDirectDraw3Impl_GetSurfaceFromDC,
|
|
};
|
|
|
|
const IDirectDraw4Vtbl IDirectDraw4_Vtbl =
|
|
{
|
|
IDirectDraw4Impl_QueryInterface,
|
|
IDirectDraw4Impl_AddRef,
|
|
IDirectDraw4Impl_Release,
|
|
IDirectDraw4Impl_Compact,
|
|
IDirectDraw4Impl_CreateClipper,
|
|
IDirectDraw4Impl_CreatePalette,
|
|
IDirectDraw4Impl_CreateSurface,
|
|
IDirectDraw4Impl_DuplicateSurface,
|
|
IDirectDraw4Impl_EnumDisplayModes,
|
|
IDirectDraw4Impl_EnumSurfaces,
|
|
IDirectDraw4Impl_FlipToGDISurface,
|
|
IDirectDraw4Impl_GetCaps,
|
|
IDirectDraw4Impl_GetDisplayMode,
|
|
IDirectDraw4Impl_GetFourCCCodes,
|
|
IDirectDraw4Impl_GetGDISurface,
|
|
IDirectDraw4Impl_GetMonitorFrequency,
|
|
IDirectDraw4Impl_GetScanLine,
|
|
IDirectDraw4Impl_GetVerticalBlankStatus,
|
|
IDirectDraw4Impl_Initialize,
|
|
IDirectDraw4Impl_RestoreDisplayMode,
|
|
IDirectDraw4Impl_SetCooperativeLevel,
|
|
IDirectDraw4Impl_SetDisplayMode,
|
|
IDirectDraw4Impl_WaitForVerticalBlank,
|
|
IDirectDraw4Impl_GetAvailableVidMem,
|
|
IDirectDraw4Impl_GetSurfaceFromDC,
|
|
IDirectDraw4Impl_RestoreAllSurfaces,
|
|
IDirectDraw4Impl_TestCooperativeLevel,
|
|
IDirectDraw4Impl_GetDeviceIdentifier
|
|
};
|