/* IDirectDrawSurface3 -> IDirectDrawSurface7 thunks * 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 "wine/debug.h" #include <stdarg.h> #include <assert.h> #include "windef.h" #include "winbase.h" #include "wingdi.h" #include "ddraw.h" #include "winerror.h" #include "ddraw_private.h" WINE_DEFAULT_DEBUG_CHANNEL(ddraw_thunk); WINE_DECLARE_DEBUG_CHANNEL(ddraw); static HRESULT WINAPI IDirectDrawSurface3Impl_QueryInterface(LPDIRECTDRAWSURFACE3 This, REFIID iid, LPVOID *ppObj) { return IDirectDrawSurface7_QueryInterface((IDirectDrawSurface7 *)surface_from_surface3(This), iid, ppObj); } static ULONG WINAPI IDirectDrawSurface3Impl_AddRef(LPDIRECTDRAWSURFACE3 This) { return IDirectDrawSurface7_AddRef((IDirectDrawSurface7 *)surface_from_surface3(This)); } static ULONG WINAPI IDirectDrawSurface3Impl_Release(LPDIRECTDRAWSURFACE3 iface) { IDirectDrawSurfaceImpl *This = surface_from_surface3(iface); TRACE("(%p)\n", This); return IDirectDrawSurface7_Release((IDirectDrawSurface7 *)surface_from_surface3(iface)); } static HRESULT WINAPI IDirectDrawSurface3Impl_AddAttachedSurface(LPDIRECTDRAWSURFACE3 iface, LPDIRECTDRAWSURFACE3 pAttach) { IDirectDrawSurfaceImpl *This = surface_from_surface3(iface); IDirectDrawSurfaceImpl *Surf = surface_from_surface3(pAttach); TRACE("(%p)->(%p)\n", This, Surf); /* Tests suggest that * -> offscreen plain surfaces can be attached to other offscreen plain surfaces * -> offscreen plain surfaces can be attached to primaries * -> primaries can be attached to offscreen plain surfaces * -> z buffers can be attached to primaries * */ if(This->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_OFFSCREENPLAIN) && Surf->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_OFFSCREENPLAIN)) { /* Sizes have to match */ if(Surf->surface_desc.dwWidth != This->surface_desc.dwWidth || Surf->surface_desc.dwHeight != This->surface_desc.dwHeight) { WARN("Surface sizes do not match\n"); return DDERR_CANNOTATTACHSURFACE; } /* OK */ } else if(This->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_3DDEVICE) && Surf->surface_desc.ddsCaps.dwCaps & (DDSCAPS_ZBUFFER)) { /* OK */ } else { WARN("Invalid attachment combination\n"); return DDERR_CANNOTATTACHSURFACE; } return IDirectDrawSurfaceImpl_AddAttachedSurface(This, Surf); } static HRESULT WINAPI IDirectDrawSurface3Impl_AddOverlayDirtyRect(LPDIRECTDRAWSURFACE3 This, LPRECT pRect) { return IDirectDrawSurface7_AddOverlayDirtyRect((IDirectDrawSurface7 *)surface_from_surface3(This), pRect); } static HRESULT WINAPI IDirectDrawSurface3Impl_Blt(LPDIRECTDRAWSURFACE3 This, LPRECT prcDst, LPDIRECTDRAWSURFACE3 pSrcSurf, LPRECT prcSrc, DWORD dwFlags, LPDDBLTFX pFX) { return IDirectDrawSurface7_Blt((IDirectDrawSurface7 *)surface_from_surface3(This), prcDst, pSrcSurf ? (IDirectDrawSurface7 *)surface_from_surface3(pSrcSurf) : NULL, prcSrc, dwFlags, pFX); } static HRESULT WINAPI IDirectDrawSurface3Impl_BltBatch(LPDIRECTDRAWSURFACE3 This, LPDDBLTBATCH pBatch, DWORD dwCount, DWORD dwFlags) { return IDirectDrawSurface7_BltBatch((IDirectDrawSurface7 *)surface_from_surface3(This), pBatch, dwCount, dwFlags); } static HRESULT WINAPI IDirectDrawSurface3Impl_BltFast(LPDIRECTDRAWSURFACE3 This, DWORD x, DWORD y, LPDIRECTDRAWSURFACE3 pSrcSurf, LPRECT prcSrc, DWORD dwTrans) { return IDirectDrawSurface7_BltFast((IDirectDrawSurface7 *)surface_from_surface3(This), x, y, pSrcSurf ? (IDirectDrawSurface7 *)surface_from_surface3(pSrcSurf) : NULL, prcSrc, dwTrans); } static HRESULT WINAPI IDirectDrawSurface3Impl_DeleteAttachedSurface(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags, LPDIRECTDRAWSURFACE3 pAttached) { return IDirectDrawSurface7_DeleteAttachedSurface((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags, pAttached ? (IDirectDrawSurface7 *)surface_from_surface3(pAttached) : NULL); } struct callback_info { LPDDENUMSURFACESCALLBACK callback; LPVOID context; }; static HRESULT CALLBACK EnumCallback(LPDIRECTDRAWSURFACE7 iface, LPDDSURFACEDESC2 pDDSD, LPVOID context) { const struct callback_info* info = context; #if 0 /* This is an outgoing conversion so we have to do it. */ DDSURFACEDESC ddsd; memset(&ddsd, 0, sizeof(ddsd)); ddsd.dwSize = sizeof(ddsd); DDRAW_Convert_DDSURFACEDESC_2_To_1(pDDSD, &ddsd); #endif /* the LPDDSURFACEDESC2 -> LPDDSURFACEDESC coercion is safe, since * the data format is compatible with older enum procs */ return info->callback(iface ? (IDirectDrawSurface *)&((IDirectDrawSurfaceImpl *)iface)->IDirectDrawSurface3_vtbl : NULL, (LPDDSURFACEDESC)pDDSD, info->context); } static HRESULT WINAPI IDirectDrawSurface3Impl_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE3 This, LPVOID context, LPDDENUMSURFACESCALLBACK callback) { struct callback_info info; info.callback = callback; info.context = context; return IDirectDrawSurface7_EnumAttachedSurfaces((IDirectDrawSurface7 *)surface_from_surface3(This), &info, EnumCallback); } static HRESULT WINAPI IDirectDrawSurface3Impl_EnumOverlayZOrders(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags, LPVOID context, LPDDENUMSURFACESCALLBACK callback) { struct callback_info info; info.callback = callback; info.context = context; return IDirectDrawSurface7_EnumOverlayZOrders((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags, &info, EnumCallback); } static HRESULT WINAPI IDirectDrawSurface3Impl_Flip(LPDIRECTDRAWSURFACE3 This, LPDIRECTDRAWSURFACE3 pOverride, DWORD dwFlags) { return IDirectDrawSurface7_Flip((IDirectDrawSurface7 *)surface_from_surface3(This), pOverride ? (IDirectDrawSurface7 *)surface_from_surface3(pOverride) : NULL, dwFlags); } static HRESULT WINAPI IDirectDrawSurface3Impl_GetAttachedSurface(LPDIRECTDRAWSURFACE3 This, LPDDSCAPS pCaps, LPDIRECTDRAWSURFACE3* ppAttached) { DDSCAPS2 caps; LPDIRECTDRAWSURFACE7 pAttached7; HRESULT hr; caps.dwCaps = pCaps->dwCaps; caps.dwCaps2 = 0; caps.dwCaps3 = 0; caps.dwCaps4 = 0; hr = IDirectDrawSurface7_GetAttachedSurface((IDirectDrawSurface7 *)surface_from_surface3(This), &caps, &pAttached7); if (FAILED(hr)) *ppAttached = NULL; else *ppAttached = pAttached7 ? (IDirectDrawSurface3 *)&((IDirectDrawSurfaceImpl *)pAttached7)->IDirectDrawSurface3_vtbl : NULL; return hr; } static HRESULT WINAPI IDirectDrawSurface3Impl_GetBltStatus(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags) { return IDirectDrawSurface7_GetBltStatus((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags); } static HRESULT WINAPI IDirectDrawSurface3Impl_GetCaps(LPDIRECTDRAWSURFACE3 This, LPDDSCAPS pCaps) { DDSCAPS2 caps; HRESULT hr; hr = IDirectDrawSurface7_GetCaps((IDirectDrawSurface7 *)surface_from_surface3(This), &caps); if (FAILED(hr)) return hr; pCaps->dwCaps = caps.dwCaps; return hr; } static HRESULT WINAPI IDirectDrawSurface3Impl_GetClipper(LPDIRECTDRAWSURFACE3 This, LPDIRECTDRAWCLIPPER* ppClipper) { return IDirectDrawSurface7_GetClipper((IDirectDrawSurface7 *)surface_from_surface3(This), ppClipper); } static HRESULT WINAPI IDirectDrawSurface3Impl_GetColorKey(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags, LPDDCOLORKEY pCKey) { return IDirectDrawSurface7_GetColorKey((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags, pCKey); } static HRESULT WINAPI IDirectDrawSurface3Impl_GetDC(LPDIRECTDRAWSURFACE3 This, HDC* phDC) { return IDirectDrawSurface7_GetDC((IDirectDrawSurface7 *)surface_from_surface3(This), phDC); } static HRESULT WINAPI IDirectDrawSurface3Impl_GetFlipStatus(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags) { return IDirectDrawSurface7_GetFlipStatus((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags); } static HRESULT WINAPI IDirectDrawSurface3Impl_GetOverlayPosition(LPDIRECTDRAWSURFACE3 This, LPLONG pX, LPLONG pY) { return IDirectDrawSurface7_GetOverlayPosition((IDirectDrawSurface7 *)surface_from_surface3(This), pX, pY); } static HRESULT WINAPI IDirectDrawSurface3Impl_GetPalette(LPDIRECTDRAWSURFACE3 This, LPDIRECTDRAWPALETTE* ppPalette) { return IDirectDrawSurface7_GetPalette((IDirectDrawSurface7 *)surface_from_surface3(This), ppPalette); } static HRESULT WINAPI IDirectDrawSurface3Impl_GetPixelFormat(LPDIRECTDRAWSURFACE3 This, LPDDPIXELFORMAT pPixelFormat) { return IDirectDrawSurface7_GetPixelFormat((IDirectDrawSurface7 *)surface_from_surface3(This), pPixelFormat); } static HRESULT WINAPI IDirectDrawSurface3Impl_GetSurfaceDesc(LPDIRECTDRAWSURFACE3 iface, LPDDSURFACEDESC pDDSD) { IDirectDrawSurfaceImpl *This = surface_from_surface3(iface); TRACE_(ddraw)("(%p)->(%p)\n",This,pDDSD); if(!pDDSD) return DDERR_INVALIDPARAMS; if (pDDSD->dwSize != sizeof(DDSURFACEDESC)) { WARN("Incorrect struct size %d, returning DDERR_INVALIDPARAMS\n",pDDSD->dwSize); return DDERR_INVALIDPARAMS; } EnterCriticalSection(&ddraw_cs); DD_STRUCT_COPY_BYSIZE(pDDSD,(DDSURFACEDESC *) &This->surface_desc); TRACE("Returning surface desc:\n"); if (TRACE_ON(ddraw)) { /* DDRAW_dump_surface_desc handles the smaller size */ DDRAW_dump_surface_desc((DDSURFACEDESC2 *) pDDSD); } LeaveCriticalSection(&ddraw_cs); return DD_OK; } static HRESULT WINAPI IDirectDrawSurface3Impl_Initialize(LPDIRECTDRAWSURFACE3 This, LPDIRECTDRAW pDD, LPDDSURFACEDESC pDDSD) { return IDirectDrawSurface7_Initialize((IDirectDrawSurface7 *)surface_from_surface3(This), pDD, (LPDDSURFACEDESC2)pDDSD); } static HRESULT WINAPI IDirectDrawSurface3Impl_IsLost(LPDIRECTDRAWSURFACE3 This) { return IDirectDrawSurface7_IsLost((IDirectDrawSurface7 *)surface_from_surface3(This)); } static HRESULT WINAPI IDirectDrawSurface3Impl_Lock(LPDIRECTDRAWSURFACE3 This, LPRECT pRect, LPDDSURFACEDESC pDDSD, DWORD dwFlags, HANDLE h) { return IDirectDrawSurface7_Lock((IDirectDrawSurface7 *)surface_from_surface3(This), pRect, (LPDDSURFACEDESC2)pDDSD, dwFlags, h); } static HRESULT WINAPI IDirectDrawSurface3Impl_ReleaseDC(LPDIRECTDRAWSURFACE3 This, HDC hDC) { return IDirectDrawSurface7_ReleaseDC((IDirectDrawSurface7 *)surface_from_surface3(This), hDC); } static HRESULT WINAPI IDirectDrawSurface3Impl_Restore(LPDIRECTDRAWSURFACE3 This) { return IDirectDrawSurface7_Restore((IDirectDrawSurface7 *)surface_from_surface3(This)); } static HRESULT WINAPI IDirectDrawSurface3Impl_SetClipper(LPDIRECTDRAWSURFACE3 This, LPDIRECTDRAWCLIPPER pClipper) { return IDirectDrawSurface7_SetClipper((IDirectDrawSurface7 *)surface_from_surface3(This), pClipper); } static HRESULT WINAPI IDirectDrawSurface3Impl_SetColorKey(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags, LPDDCOLORKEY pCKey) { return IDirectDrawSurface7_SetColorKey((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags, pCKey); } static HRESULT WINAPI IDirectDrawSurface3Impl_SetOverlayPosition(LPDIRECTDRAWSURFACE3 This, LONG x, LONG y) { return IDirectDrawSurface7_SetOverlayPosition((IDirectDrawSurface7 *)surface_from_surface3(This), x, y); } static HRESULT WINAPI IDirectDrawSurface3Impl_SetPalette(LPDIRECTDRAWSURFACE3 This, LPDIRECTDRAWPALETTE pPalette) { return IDirectDrawSurface7_SetPalette((IDirectDrawSurface7 *)surface_from_surface3(This), pPalette); } static HRESULT WINAPI IDirectDrawSurface3Impl_Unlock(LPDIRECTDRAWSURFACE3 This, LPVOID data) { /* data might not be the LPRECT of later versions, so drop it. */ return IDirectDrawSurface7_Unlock((IDirectDrawSurface7 *)surface_from_surface3(This), NULL); } static HRESULT WINAPI IDirectDrawSurface3Impl_UpdateOverlay(LPDIRECTDRAWSURFACE3 This, LPRECT prcSrc, LPDIRECTDRAWSURFACE3 pDstSurf, LPRECT prcDst, DWORD dwFlags, LPDDOVERLAYFX pFX) { return IDirectDrawSurface7_UpdateOverlay((IDirectDrawSurface7 *)surface_from_surface3(This), prcSrc, pDstSurf ? (IDirectDrawSurface7 *)surface_from_surface3(pDstSurf) : NULL, prcDst, dwFlags, pFX); } static HRESULT WINAPI IDirectDrawSurface3Impl_UpdateOverlayDisplay(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags) { return IDirectDrawSurface7_UpdateOverlayDisplay((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags); } static HRESULT WINAPI IDirectDrawSurface3Impl_UpdateOverlayZOrder(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags, LPDIRECTDRAWSURFACE3 pSurfReference) { return IDirectDrawSurface7_UpdateOverlayZOrder((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags, pSurfReference ? (IDirectDrawSurface7 *)surface_from_surface3(pSurfReference) : NULL); } static HRESULT WINAPI IDirectDrawSurface3Impl_GetDDInterface(LPDIRECTDRAWSURFACE3 This, LPVOID* ppDD) { return IDirectDrawSurface7_GetDDInterface((IDirectDrawSurface7 *)surface_from_surface3(This), ppDD); } static HRESULT WINAPI IDirectDrawSurface3Impl_PageLock(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags) { return IDirectDrawSurface7_PageLock((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags); } static HRESULT WINAPI IDirectDrawSurface3Impl_PageUnlock(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags) { return IDirectDrawSurface7_PageUnlock((IDirectDrawSurface7 *)surface_from_surface3(This), dwFlags); } static HRESULT WINAPI IDirectDrawSurface3Impl_SetSurfaceDesc(LPDIRECTDRAWSURFACE3 This, LPDDSURFACEDESC pDDSD, DWORD dwFlags) { return IDirectDrawSurface7_SetSurfaceDesc((IDirectDrawSurface7 *)surface_from_surface3(This), (LPDDSURFACEDESC2)pDDSD, dwFlags); } const IDirectDrawSurface3Vtbl IDirectDrawSurface3_Vtbl = { IDirectDrawSurface3Impl_QueryInterface, IDirectDrawSurface3Impl_AddRef, IDirectDrawSurface3Impl_Release, IDirectDrawSurface3Impl_AddAttachedSurface, IDirectDrawSurface3Impl_AddOverlayDirtyRect, IDirectDrawSurface3Impl_Blt, IDirectDrawSurface3Impl_BltBatch, IDirectDrawSurface3Impl_BltFast, IDirectDrawSurface3Impl_DeleteAttachedSurface, IDirectDrawSurface3Impl_EnumAttachedSurfaces, IDirectDrawSurface3Impl_EnumOverlayZOrders, IDirectDrawSurface3Impl_Flip, IDirectDrawSurface3Impl_GetAttachedSurface, IDirectDrawSurface3Impl_GetBltStatus, IDirectDrawSurface3Impl_GetCaps, IDirectDrawSurface3Impl_GetClipper, IDirectDrawSurface3Impl_GetColorKey, IDirectDrawSurface3Impl_GetDC, IDirectDrawSurface3Impl_GetFlipStatus, IDirectDrawSurface3Impl_GetOverlayPosition, IDirectDrawSurface3Impl_GetPalette, IDirectDrawSurface3Impl_GetPixelFormat, IDirectDrawSurface3Impl_GetSurfaceDesc, IDirectDrawSurface3Impl_Initialize, IDirectDrawSurface3Impl_IsLost, IDirectDrawSurface3Impl_Lock, IDirectDrawSurface3Impl_ReleaseDC, IDirectDrawSurface3Impl_Restore, IDirectDrawSurface3Impl_SetClipper, IDirectDrawSurface3Impl_SetColorKey, IDirectDrawSurface3Impl_SetOverlayPosition, IDirectDrawSurface3Impl_SetPalette, IDirectDrawSurface3Impl_Unlock, IDirectDrawSurface3Impl_UpdateOverlay, IDirectDrawSurface3Impl_UpdateOverlayDisplay, IDirectDrawSurface3Impl_UpdateOverlayZOrder, IDirectDrawSurface3Impl_GetDDInterface, IDirectDrawSurface3Impl_PageLock, IDirectDrawSurface3Impl_PageUnlock, IDirectDrawSurface3Impl_SetSurfaceDesc };