diff --git a/DDrawCompat/DDraw/DirectDrawSurface.cpp b/DDrawCompat/DDraw/DirectDrawSurface.cpp index fbdec2a..360ba0d 100644 --- a/DDrawCompat/DDraw/DirectDrawSurface.cpp +++ b/DDrawCompat/DDraw/DirectDrawSurface.cpp @@ -60,6 +60,7 @@ namespace SET_COMPAT_METHOD(Blt); SET_COMPAT_METHOD(BltFast); SET_COMPAT_METHOD(Flip); + SET_COMPAT_METHOD(GetAttachedSurface); SET_COMPAT_METHOD(GetCaps); SET_COMPAT_METHOD(GetDC); SET_COMPAT_METHOD(GetPalette); diff --git a/DDrawCompat/DDraw/Surfaces/SurfaceImpl.cpp b/DDrawCompat/DDraw/Surfaces/SurfaceImpl.cpp index 19335f2..df002be 100644 --- a/DDrawCompat/DDraw/Surfaces/SurfaceImpl.cpp +++ b/DDrawCompat/DDraw/Surfaces/SurfaceImpl.cpp @@ -150,6 +150,21 @@ namespace DDraw return getOrigVtable(This).Flip(This, lpDDSurfaceTargetOverride, dwFlags); } + template + HRESULT SurfaceImpl::GetAttachedSurface(TSurface* This, TDdsCaps* lpDDSCaps, TSurface** lplpDDAttachedSurface) + { + TDdsCaps caps = {}; + if (lpDDSCaps && (lpDDSCaps->dwCaps & DDSCAPS_3DDEVICE) && + SUCCEEDED(getOrigVtable(This).GetCaps(This, &caps)) && + !(caps.dwCaps & DDSCAPS_3DDEVICE) && (m_data->m_origCaps & DDSCAPS_3DDEVICE)) + { + caps = *lpDDSCaps; + caps.dwCaps &= ~DDSCAPS_3DDEVICE; + return getOrigVtable(This).GetAttachedSurface(This, &caps, lplpDDAttachedSurface); + } + return getOrigVtable(This).GetAttachedSurface(This, lpDDSCaps, lplpDDAttachedSurface); + } + template TSurface* SurfaceImpl::getBltSrc(TSurface* src) { diff --git a/DDrawCompat/DDraw/Surfaces/SurfaceImpl.h b/DDrawCompat/DDraw/Surfaces/SurfaceImpl.h index db8d689..e921896 100644 --- a/DDrawCompat/DDraw/Surfaces/SurfaceImpl.h +++ b/DDrawCompat/DDraw/Surfaces/SurfaceImpl.h @@ -29,6 +29,7 @@ namespace DDraw virtual HRESULT BltFast(TSurface* This, DWORD dwX, DWORD dwY, TSurface* lpDDSrcSurface, LPRECT lpSrcRect, DWORD dwTrans); virtual HRESULT Flip(TSurface* This, TSurface* lpDDSurfaceTargetOverride, DWORD dwFlags); + virtual HRESULT GetAttachedSurface(TSurface* This, TDdsCaps* lpDDSCaps, TSurface** lplpDDAttachedSurface); virtual HRESULT GetCaps(TSurface* This, TDdsCaps* lpDDSCaps); virtual HRESULT GetDC(TSurface* This, HDC* lphDC); virtual HRESULT GetPalette(TSurface* This, LPDIRECTDRAWPALETTE* lplpDDPalette);