1 /* IDirectDrawSurface3 -> IDirectDrawSurface7 thunks
2 * Copyright 2000 TransGaming Technologies Inc.
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
20 #include "wine/port.h"
21 #include "wine/debug.h"
31 #include "ddraw_private.h"
32 #include "ddcomimpl.h"
34 #define CONVERT(pdds) COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, \
35 IDirectDrawSurface3, \
36 IDirectDrawSurface7, \
39 #define CONVERT_REV(pdds) COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, \
40 IDirectDrawSurface7, \
41 IDirectDrawSurface3, \
44 WINE_DEFAULT_DEBUG_CHANNEL(ddraw_thunk
);
45 WINE_DECLARE_DEBUG_CHANNEL(ddraw
);
48 IDirectDrawSurface3Impl_QueryInterface(LPDIRECTDRAWSURFACE3 This
, REFIID iid
,
51 return IDirectDrawSurface7_QueryInterface(CONVERT(This
), iid
, ppObj
);
55 IDirectDrawSurface3Impl_AddRef(LPDIRECTDRAWSURFACE3 This
)
57 return IDirectDrawSurface7_AddRef(CONVERT(This
));
61 IDirectDrawSurface3Impl_Release(LPDIRECTDRAWSURFACE3 iface
)
63 ICOM_THIS_FROM( IDirectDrawSurfaceImpl
, IDirectDrawSurface3
, iface
);
64 TRACE("(%p)\n", This
);
65 return IDirectDrawSurface7_Release(CONVERT(iface
));
69 IDirectDrawSurface3Impl_AddAttachedSurface(LPDIRECTDRAWSURFACE3 iface
,
70 LPDIRECTDRAWSURFACE3 pAttach
)
72 ICOM_THIS_FROM(IDirectDrawSurfaceImpl
, IDirectDrawSurface3
, iface
);
73 IDirectDrawSurfaceImpl
*Surf
= ICOM_OBJECT(IDirectDrawSurfaceImpl
, IDirectDrawSurface3
, pAttach
);
74 TRACE("(%p)->(%p)\n", This
, Surf
);
77 * -> offscreen plain surfaces can be attached to other offscreen plain surfaces
78 * -> offscreen plain surfaces can be attached to primaries
79 * -> primaries can be attached to offscreen plain surfaces
80 * -> z buffers can be attached to primaries
83 if(This
->surface_desc
.ddsCaps
.dwCaps
& (DDSCAPS_PRIMARYSURFACE
| DDSCAPS_OFFSCREENPLAIN
) &&
84 Surf
->surface_desc
.ddsCaps
.dwCaps
& (DDSCAPS_PRIMARYSURFACE
| DDSCAPS_OFFSCREENPLAIN
))
86 /* Sizes have to match */
87 if(Surf
->surface_desc
.dwWidth
!= This
->surface_desc
.dwWidth
||
88 Surf
->surface_desc
.dwHeight
!= This
->surface_desc
.dwHeight
)
90 WARN("Surface sizes do not match\n");
91 return DDERR_CANNOTATTACHSURFACE
;
95 else if(This
->surface_desc
.ddsCaps
.dwCaps
& (DDSCAPS_PRIMARYSURFACE
| DDSCAPS_3DDEVICE
) &&
96 Surf
->surface_desc
.ddsCaps
.dwCaps
& (DDSCAPS_ZBUFFER
))
102 WARN("Invalid attachment combination\n");
103 return DDERR_CANNOTATTACHSURFACE
;
106 return IDirectDrawSurfaceImpl_AddAttachedSurface(This
,
110 static HRESULT WINAPI
111 IDirectDrawSurface3Impl_AddOverlayDirtyRect(LPDIRECTDRAWSURFACE3 This
,
114 return IDirectDrawSurface7_AddOverlayDirtyRect(CONVERT(This
), pRect
);
117 static HRESULT WINAPI
118 IDirectDrawSurface3Impl_Blt(LPDIRECTDRAWSURFACE3 This
, LPRECT prcDst
,
119 LPDIRECTDRAWSURFACE3 pSrcSurf
, LPRECT prcSrc
,
120 DWORD dwFlags
, LPDDBLTFX pFX
)
122 return IDirectDrawSurface7_Blt(CONVERT(This
), prcDst
, CONVERT(pSrcSurf
),
123 prcSrc
, dwFlags
, pFX
);
126 static HRESULT WINAPI
127 IDirectDrawSurface3Impl_BltBatch(LPDIRECTDRAWSURFACE3 This
,
128 LPDDBLTBATCH pBatch
, DWORD dwCount
,
131 return IDirectDrawSurface7_BltBatch(CONVERT(This
), pBatch
, dwCount
,
135 static HRESULT WINAPI
136 IDirectDrawSurface3Impl_BltFast(LPDIRECTDRAWSURFACE3 This
, DWORD x
, DWORD y
,
137 LPDIRECTDRAWSURFACE3 pSrcSurf
, LPRECT prcSrc
,
140 return IDirectDrawSurface7_BltFast(CONVERT(This
), x
, y
, CONVERT(pSrcSurf
),
144 static HRESULT WINAPI
145 IDirectDrawSurface3Impl_DeleteAttachedSurface(LPDIRECTDRAWSURFACE3 This
,
147 LPDIRECTDRAWSURFACE3 pAttached
)
149 return IDirectDrawSurface7_DeleteAttachedSurface(CONVERT(This
), dwFlags
,
155 LPDDENUMSURFACESCALLBACK callback
;
159 static HRESULT CALLBACK
160 EnumCallback(LPDIRECTDRAWSURFACE7 iface
, LPDDSURFACEDESC2 pDDSD
,
163 const struct callback_info
* info
= context
;
166 /* This is an outgoing conversion so we have to do it. */
168 memset(&ddsd
, 0, sizeof(ddsd
));
169 ddsd
.dwSize
= sizeof(ddsd
);
170 DDRAW_Convert_DDSURFACEDESC_2_To_1(pDDSD
, &ddsd
);
173 /* the LPDDSURFACEDESC2 -> LPDDSURFACEDESC coercion is safe, since
174 * the data format is compatible with older enum procs */
175 return info
->callback((LPDIRECTDRAWSURFACE
)CONVERT_REV(iface
), (LPDDSURFACEDESC
)pDDSD
,
179 static HRESULT WINAPI
180 IDirectDrawSurface3Impl_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE3 This
,
182 LPDDENUMSURFACESCALLBACK callback
)
184 struct callback_info info
;
186 info
.callback
= callback
;
187 info
.context
= context
;
189 return IDirectDrawSurface7_EnumAttachedSurfaces(CONVERT(This
), &info
,
193 static HRESULT WINAPI
194 IDirectDrawSurface3Impl_EnumOverlayZOrders(LPDIRECTDRAWSURFACE3 This
,
195 DWORD dwFlags
, LPVOID context
,
196 LPDDENUMSURFACESCALLBACK callback
)
198 struct callback_info info
;
200 info
.callback
= callback
;
201 info
.context
= context
;
203 return IDirectDrawSurface7_EnumOverlayZOrders(CONVERT(This
), dwFlags
,
204 &info
, EnumCallback
);
207 static HRESULT WINAPI
208 IDirectDrawSurface3Impl_Flip(LPDIRECTDRAWSURFACE3 This
,
209 LPDIRECTDRAWSURFACE3 pOverride
, DWORD dwFlags
)
211 return IDirectDrawSurface7_Flip(CONVERT(This
), CONVERT(pOverride
),
215 static HRESULT WINAPI
216 IDirectDrawSurface3Impl_GetAttachedSurface(LPDIRECTDRAWSURFACE3 This
,
218 LPDIRECTDRAWSURFACE3
* ppAttached
)
221 LPDIRECTDRAWSURFACE7 pAttached7
;
224 caps
.dwCaps
= pCaps
->dwCaps
;
229 hr
= IDirectDrawSurface7_GetAttachedSurface(CONVERT(This
), &caps
,
231 if (FAILED(hr
)) *ppAttached
= NULL
;
232 else *ppAttached
= CONVERT_REV(pAttached7
);
236 static HRESULT WINAPI
237 IDirectDrawSurface3Impl_GetBltStatus(LPDIRECTDRAWSURFACE3 This
, DWORD dwFlags
)
239 return IDirectDrawSurface7_GetBltStatus(CONVERT(This
), dwFlags
);
242 static HRESULT WINAPI
243 IDirectDrawSurface3Impl_GetCaps(LPDIRECTDRAWSURFACE3 This
, LPDDSCAPS pCaps
)
248 hr
= IDirectDrawSurface7_GetCaps(CONVERT(This
), &caps
);
249 if (FAILED(hr
)) return hr
;
251 pCaps
->dwCaps
= caps
.dwCaps
;
255 static HRESULT WINAPI
256 IDirectDrawSurface3Impl_GetClipper(LPDIRECTDRAWSURFACE3 This
,
257 LPDIRECTDRAWCLIPPER
* ppClipper
)
259 return IDirectDrawSurface7_GetClipper(CONVERT(This
), ppClipper
);
262 static HRESULT WINAPI
263 IDirectDrawSurface3Impl_GetColorKey(LPDIRECTDRAWSURFACE3 This
, DWORD dwFlags
,
266 return IDirectDrawSurface7_GetColorKey(CONVERT(This
), dwFlags
, pCKey
);
269 static HRESULT WINAPI
270 IDirectDrawSurface3Impl_GetDC(LPDIRECTDRAWSURFACE3 This
, HDC
* phDC
)
272 return IDirectDrawSurface7_GetDC(CONVERT(This
), phDC
);
275 static HRESULT WINAPI
276 IDirectDrawSurface3Impl_GetFlipStatus(LPDIRECTDRAWSURFACE3 This
, DWORD dwFlags
)
278 return IDirectDrawSurface7_GetFlipStatus(CONVERT(This
), dwFlags
);
281 static HRESULT WINAPI
282 IDirectDrawSurface3Impl_GetOverlayPosition(LPDIRECTDRAWSURFACE3 This
, LPLONG pX
,
285 return IDirectDrawSurface7_GetOverlayPosition(CONVERT(This
), pX
, pY
);
288 static HRESULT WINAPI
289 IDirectDrawSurface3Impl_GetPalette(LPDIRECTDRAWSURFACE3 This
,
290 LPDIRECTDRAWPALETTE
* ppPalette
)
292 return IDirectDrawSurface7_GetPalette(CONVERT(This
), ppPalette
);
295 static HRESULT WINAPI
296 IDirectDrawSurface3Impl_GetPixelFormat(LPDIRECTDRAWSURFACE3 This
,
297 LPDDPIXELFORMAT pPixelFormat
)
299 return IDirectDrawSurface7_GetPixelFormat(CONVERT(This
), pPixelFormat
);
302 static HRESULT WINAPI
303 IDirectDrawSurface3Impl_GetSurfaceDesc(LPDIRECTDRAWSURFACE3 iface
,
304 LPDDSURFACEDESC pDDSD
)
306 ICOM_THIS_FROM(IDirectDrawSurfaceImpl
, IDirectDrawSurface3
, iface
);
308 TRACE_(ddraw
)("(%p)->(%p)\n",This
,pDDSD
);
311 return DDERR_INVALIDPARAMS
;
313 if (pDDSD
->dwSize
!= sizeof(DDSURFACEDESC
))
315 WARN("Incorrect struct size %d, returning DDERR_INVALIDPARAMS\n",pDDSD
->dwSize
);
316 return DDERR_INVALIDPARAMS
;
319 EnterCriticalSection(&ddraw_cs
);
320 DD_STRUCT_COPY_BYSIZE(pDDSD
,(DDSURFACEDESC
*) &This
->surface_desc
);
321 TRACE("Returning surface desc:\n");
324 /* DDRAW_dump_surface_desc handles the smaller size */
325 DDRAW_dump_surface_desc((DDSURFACEDESC2
*) pDDSD
);
328 LeaveCriticalSection(&ddraw_cs
);
332 static HRESULT WINAPI
333 IDirectDrawSurface3Impl_Initialize(LPDIRECTDRAWSURFACE3 This
, LPDIRECTDRAW pDD
,
334 LPDDSURFACEDESC pDDSD
)
336 return IDirectDrawSurface7_Initialize(CONVERT(This
), pDD
,
337 (LPDDSURFACEDESC2
)pDDSD
);
340 static HRESULT WINAPI
341 IDirectDrawSurface3Impl_IsLost(LPDIRECTDRAWSURFACE3 This
)
343 return IDirectDrawSurface7_IsLost(CONVERT(This
));
346 static HRESULT WINAPI
347 IDirectDrawSurface3Impl_Lock(LPDIRECTDRAWSURFACE3 This
, LPRECT pRect
,
348 LPDDSURFACEDESC pDDSD
, DWORD dwFlags
, HANDLE h
)
350 return IDirectDrawSurface7_Lock(CONVERT(This
), pRect
,
351 (LPDDSURFACEDESC2
)pDDSD
, dwFlags
, h
);
354 static HRESULT WINAPI
355 IDirectDrawSurface3Impl_ReleaseDC(LPDIRECTDRAWSURFACE3 This
, HDC hDC
)
357 return IDirectDrawSurface7_ReleaseDC(CONVERT(This
), hDC
);
360 static HRESULT WINAPI
361 IDirectDrawSurface3Impl_Restore(LPDIRECTDRAWSURFACE3 This
)
363 return IDirectDrawSurface7_Restore(CONVERT(This
));
366 static HRESULT WINAPI
367 IDirectDrawSurface3Impl_SetClipper(LPDIRECTDRAWSURFACE3 This
,
368 LPDIRECTDRAWCLIPPER pClipper
)
370 return IDirectDrawSurface7_SetClipper(CONVERT(This
), pClipper
);
373 static HRESULT WINAPI
374 IDirectDrawSurface3Impl_SetColorKey(LPDIRECTDRAWSURFACE3 This
, DWORD dwFlags
,
377 return IDirectDrawSurface7_SetColorKey(CONVERT(This
), dwFlags
, pCKey
);
380 static HRESULT WINAPI
381 IDirectDrawSurface3Impl_SetOverlayPosition(LPDIRECTDRAWSURFACE3 This
, LONG x
,
384 return IDirectDrawSurface7_SetOverlayPosition(CONVERT(This
), x
, y
);
387 static HRESULT WINAPI
388 IDirectDrawSurface3Impl_SetPalette(LPDIRECTDRAWSURFACE3 This
,
389 LPDIRECTDRAWPALETTE pPalette
)
391 return IDirectDrawSurface7_SetPalette(CONVERT(This
), pPalette
);
394 static HRESULT WINAPI
395 IDirectDrawSurface3Impl_Unlock(LPDIRECTDRAWSURFACE3 This
, LPVOID data
)
397 /* data might not be the LPRECT of later versions, so drop it. */
398 return IDirectDrawSurface7_Unlock(CONVERT(This
), NULL
);
401 static HRESULT WINAPI
402 IDirectDrawSurface3Impl_UpdateOverlay(LPDIRECTDRAWSURFACE3 This
, LPRECT prcSrc
,
403 LPDIRECTDRAWSURFACE3 pDstSurf
,
404 LPRECT prcDst
, DWORD dwFlags
,
407 return IDirectDrawSurface7_UpdateOverlay(CONVERT(This
), prcSrc
,
408 CONVERT(pDstSurf
), prcDst
,
412 static HRESULT WINAPI
413 IDirectDrawSurface3Impl_UpdateOverlayDisplay(LPDIRECTDRAWSURFACE3 This
,
416 return IDirectDrawSurface7_UpdateOverlayDisplay(CONVERT(This
), dwFlags
);
419 static HRESULT WINAPI
420 IDirectDrawSurface3Impl_UpdateOverlayZOrder(LPDIRECTDRAWSURFACE3 This
,
422 LPDIRECTDRAWSURFACE3 pSurfReference
)
424 return IDirectDrawSurface7_UpdateOverlayZOrder(CONVERT(This
), dwFlags
,
425 CONVERT(pSurfReference
));
428 static HRESULT WINAPI
429 IDirectDrawSurface3Impl_GetDDInterface(LPDIRECTDRAWSURFACE3 This
, LPVOID
* ppDD
)
431 return IDirectDrawSurface7_GetDDInterface(CONVERT(This
), ppDD
);
434 static HRESULT WINAPI
435 IDirectDrawSurface3Impl_PageLock(LPDIRECTDRAWSURFACE3 This
, DWORD dwFlags
)
437 return IDirectDrawSurface7_PageLock(CONVERT(This
), dwFlags
);
440 static HRESULT WINAPI
441 IDirectDrawSurface3Impl_PageUnlock(LPDIRECTDRAWSURFACE3 This
, DWORD dwFlags
)
443 return IDirectDrawSurface7_PageUnlock(CONVERT(This
), dwFlags
);
446 static HRESULT WINAPI
447 IDirectDrawSurface3Impl_SetSurfaceDesc(LPDIRECTDRAWSURFACE3 This
,
448 LPDDSURFACEDESC pDDSD
, DWORD dwFlags
)
450 return IDirectDrawSurface7_SetSurfaceDesc(CONVERT(This
),
451 (LPDDSURFACEDESC2
)pDDSD
,
455 const IDirectDrawSurface3Vtbl IDirectDrawSurface3_Vtbl
=
457 IDirectDrawSurface3Impl_QueryInterface
,
458 IDirectDrawSurface3Impl_AddRef
,
459 IDirectDrawSurface3Impl_Release
,
460 IDirectDrawSurface3Impl_AddAttachedSurface
,
461 IDirectDrawSurface3Impl_AddOverlayDirtyRect
,
462 IDirectDrawSurface3Impl_Blt
,
463 IDirectDrawSurface3Impl_BltBatch
,
464 IDirectDrawSurface3Impl_BltFast
,
465 IDirectDrawSurface3Impl_DeleteAttachedSurface
,
466 IDirectDrawSurface3Impl_EnumAttachedSurfaces
,
467 IDirectDrawSurface3Impl_EnumOverlayZOrders
,
468 IDirectDrawSurface3Impl_Flip
,
469 IDirectDrawSurface3Impl_GetAttachedSurface
,
470 IDirectDrawSurface3Impl_GetBltStatus
,
471 IDirectDrawSurface3Impl_GetCaps
,
472 IDirectDrawSurface3Impl_GetClipper
,
473 IDirectDrawSurface3Impl_GetColorKey
,
474 IDirectDrawSurface3Impl_GetDC
,
475 IDirectDrawSurface3Impl_GetFlipStatus
,
476 IDirectDrawSurface3Impl_GetOverlayPosition
,
477 IDirectDrawSurface3Impl_GetPalette
,
478 IDirectDrawSurface3Impl_GetPixelFormat
,
479 IDirectDrawSurface3Impl_GetSurfaceDesc
,
480 IDirectDrawSurface3Impl_Initialize
,
481 IDirectDrawSurface3Impl_IsLost
,
482 IDirectDrawSurface3Impl_Lock
,
483 IDirectDrawSurface3Impl_ReleaseDC
,
484 IDirectDrawSurface3Impl_Restore
,
485 IDirectDrawSurface3Impl_SetClipper
,
486 IDirectDrawSurface3Impl_SetColorKey
,
487 IDirectDrawSurface3Impl_SetOverlayPosition
,
488 IDirectDrawSurface3Impl_SetPalette
,
489 IDirectDrawSurface3Impl_Unlock
,
490 IDirectDrawSurface3Impl_UpdateOverlay
,
491 IDirectDrawSurface3Impl_UpdateOverlayDisplay
,
492 IDirectDrawSurface3Impl_UpdateOverlayZOrder
,
493 IDirectDrawSurface3Impl_GetDDInterface
,
494 IDirectDrawSurface3Impl_PageLock
,
495 IDirectDrawSurface3Impl_PageUnlock
,
496 IDirectDrawSurface3Impl_SetSurfaceDesc