Release 0.9.39.
[wine/gsoc-2012-control.git] / dlls / ddraw / surface_thunks.c
blob299e4f682dd0fffbc44d78b44137c01d1acfa66e
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
19 #include "config.h"
20 #include "wine/port.h"
21 #include "wine/debug.h"
22 #include <stdarg.h>
24 #include "windef.h"
25 #include "winbase.h"
26 #include "wingdi.h"
27 #include "ddraw.h"
28 #include "winerror.h"
30 #include "ddraw_private.h"
31 #include "ddcomimpl.h"
33 #define CONVERT(pdds) COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, \
34 IDirectDrawSurface3, \
35 IDirectDrawSurface7, \
36 (pdds))
38 #define CONVERT_REV(pdds) COM_INTERFACE_CAST(IDirectDrawSurfaceImpl, \
39 IDirectDrawSurface7, \
40 IDirectDrawSurface3, \
41 (pdds))
43 WINE_DEFAULT_DEBUG_CHANNEL(ddraw_thunk);
45 static HRESULT WINAPI
46 IDirectDrawSurface3Impl_QueryInterface(LPDIRECTDRAWSURFACE3 This, REFIID iid,
47 LPVOID *ppObj)
49 return IDirectDrawSurface7_QueryInterface(CONVERT(This), iid, ppObj);
52 static ULONG WINAPI
53 IDirectDrawSurface3Impl_AddRef(LPDIRECTDRAWSURFACE3 This)
55 return IDirectDrawSurface7_AddRef(CONVERT(This));
58 static ULONG WINAPI
59 IDirectDrawSurface3Impl_Release(LPDIRECTDRAWSURFACE3 iface)
61 ICOM_THIS_FROM( IDirectDrawSurfaceImpl, IDirectDrawSurface3, iface);
62 TRACE("(%p)\n", This);
63 return IDirectDrawSurface7_Release(CONVERT(iface));
66 static HRESULT WINAPI
67 IDirectDrawSurface3Impl_AddAttachedSurface(LPDIRECTDRAWSURFACE3 iface,
68 LPDIRECTDRAWSURFACE3 pAttach)
70 ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface3, iface);
71 IDirectDrawSurfaceImpl *Surf = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface3, pAttach);
72 TRACE("(%p)->(%p)\n", This, Surf);
74 /* Tests suggest that
75 * -> offscreen plain surfaces can be attached to other offscreen plain surfaces
76 * -> offscreen plain surfaces can be attached to primaries
77 * -> primaries can be attached to offscreen plain surfaces
78 * -> z buffers can be attached to primaries
81 if(This->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_OFFSCREENPLAIN) &&
82 Surf->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_OFFSCREENPLAIN))
84 /* Sizes have to match */
85 if(Surf->surface_desc.dwWidth != This->surface_desc.dwWidth ||
86 Surf->surface_desc.dwHeight != This->surface_desc.dwHeight)
88 WARN("Surface sizes do not match\n");
89 return DDERR_CANNOTATTACHSURFACE;
91 /* OK */
93 else if(This->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE) &&
94 Surf->surface_desc.ddsCaps.dwCaps & (DDSCAPS_ZBUFFER))
96 /* OK */
98 else
100 WARN("Invalid attachment combination\n");
101 return DDERR_CANNOTATTACHSURFACE;
104 return IDirectDrawSurfaceImpl_AddAttachedSurface(This,
105 Surf);
108 static HRESULT WINAPI
109 IDirectDrawSurface3Impl_AddOverlayDirtyRect(LPDIRECTDRAWSURFACE3 This,
110 LPRECT pRect)
112 return IDirectDrawSurface7_AddOverlayDirtyRect(CONVERT(This), pRect);
115 static HRESULT WINAPI
116 IDirectDrawSurface3Impl_Blt(LPDIRECTDRAWSURFACE3 This, LPRECT prcDst,
117 LPDIRECTDRAWSURFACE3 pSrcSurf, LPRECT prcSrc,
118 DWORD dwFlags, LPDDBLTFX pFX)
120 return IDirectDrawSurface7_Blt(CONVERT(This), prcDst, CONVERT(pSrcSurf),
121 prcSrc, dwFlags, pFX);
124 static HRESULT WINAPI
125 IDirectDrawSurface3Impl_BltBatch(LPDIRECTDRAWSURFACE3 This,
126 LPDDBLTBATCH pBatch, DWORD dwCount,
127 DWORD dwFlags)
129 return IDirectDrawSurface7_BltBatch(CONVERT(This), pBatch, dwCount,
130 dwFlags);
133 static HRESULT WINAPI
134 IDirectDrawSurface3Impl_BltFast(LPDIRECTDRAWSURFACE3 This, DWORD x, DWORD y,
135 LPDIRECTDRAWSURFACE3 pSrcSurf, LPRECT prcSrc,
136 DWORD dwTrans)
138 return IDirectDrawSurface7_BltFast(CONVERT(This), x, y, CONVERT(pSrcSurf),
139 prcSrc, dwTrans);
142 static HRESULT WINAPI
143 IDirectDrawSurface3Impl_DeleteAttachedSurface(LPDIRECTDRAWSURFACE3 This,
144 DWORD dwFlags,
145 LPDIRECTDRAWSURFACE3 pAttached)
147 return IDirectDrawSurface7_DeleteAttachedSurface(CONVERT(This), dwFlags,
148 CONVERT(pAttached));
151 struct callback_info
153 LPDDENUMSURFACESCALLBACK callback;
154 LPVOID context;
157 static HRESULT CALLBACK
158 EnumCallback(LPDIRECTDRAWSURFACE7 iface, LPDDSURFACEDESC2 pDDSD,
159 LPVOID context)
161 const struct callback_info* info = context;
163 #if 0
164 /* This is an outgoing conversion so we have to do it. */
165 DDSURFACEDESC ddsd;
166 memset(&ddsd, 0, sizeof(ddsd));
167 ddsd.dwSize = sizeof(ddsd);
168 DDRAW_Convert_DDSURFACEDESC_2_To_1(pDDSD, &ddsd);
169 #endif
171 /* the LPDDSURFACEDESC2 -> LPDDSURFACEDESC coercion is safe, since
172 * the data format is compatible with older enum procs */
173 return info->callback((LPDIRECTDRAWSURFACE)CONVERT_REV(iface), (LPDDSURFACEDESC)pDDSD,
174 info->context);
177 static HRESULT WINAPI
178 IDirectDrawSurface3Impl_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE3 This,
179 LPVOID context,
180 LPDDENUMSURFACESCALLBACK callback)
182 struct callback_info info;
184 info.callback = callback;
185 info.context = context;
187 return IDirectDrawSurface7_EnumAttachedSurfaces(CONVERT(This), &info,
188 EnumCallback);
191 static HRESULT WINAPI
192 IDirectDrawSurface3Impl_EnumOverlayZOrders(LPDIRECTDRAWSURFACE3 This,
193 DWORD dwFlags, LPVOID context,
194 LPDDENUMSURFACESCALLBACK callback)
196 struct callback_info info;
198 info.callback = callback;
199 info.context = context;
201 return IDirectDrawSurface7_EnumOverlayZOrders(CONVERT(This), dwFlags,
202 &info, EnumCallback);
205 static HRESULT WINAPI
206 IDirectDrawSurface3Impl_Flip(LPDIRECTDRAWSURFACE3 This,
207 LPDIRECTDRAWSURFACE3 pOverride, DWORD dwFlags)
209 return IDirectDrawSurface7_Flip(CONVERT(This), CONVERT(pOverride),
210 dwFlags);
213 static HRESULT WINAPI
214 IDirectDrawSurface3Impl_GetAttachedSurface(LPDIRECTDRAWSURFACE3 This,
215 LPDDSCAPS pCaps,
216 LPDIRECTDRAWSURFACE3* ppAttached)
218 DDSCAPS2 caps;
219 LPDIRECTDRAWSURFACE7 pAttached7;
220 HRESULT hr;
222 caps.dwCaps = pCaps->dwCaps;
223 caps.dwCaps2 = 0;
224 caps.dwCaps3 = 0;
225 caps.dwCaps4 = 0;
227 hr = IDirectDrawSurface7_GetAttachedSurface(CONVERT(This), &caps,
228 &pAttached7);
229 if (FAILED(hr)) return hr;
231 *ppAttached = CONVERT_REV(pAttached7);
232 return hr;
235 static HRESULT WINAPI
236 IDirectDrawSurface3Impl_GetBltStatus(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags)
238 return IDirectDrawSurface7_GetBltStatus(CONVERT(This), dwFlags);
241 static HRESULT WINAPI
242 IDirectDrawSurface3Impl_GetCaps(LPDIRECTDRAWSURFACE3 This, LPDDSCAPS pCaps)
244 DDSCAPS2 caps;
245 HRESULT hr;
247 hr = IDirectDrawSurface7_GetCaps(CONVERT(This), &caps);
248 if (FAILED(hr)) return hr;
250 pCaps->dwCaps = caps.dwCaps;
251 return hr;
254 static HRESULT WINAPI
255 IDirectDrawSurface3Impl_GetClipper(LPDIRECTDRAWSURFACE3 This,
256 LPDIRECTDRAWCLIPPER* ppClipper)
258 return IDirectDrawSurface7_GetClipper(CONVERT(This), ppClipper);
261 static HRESULT WINAPI
262 IDirectDrawSurface3Impl_GetColorKey(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags,
263 LPDDCOLORKEY pCKey)
265 return IDirectDrawSurface7_GetColorKey(CONVERT(This), dwFlags, pCKey);
268 static HRESULT WINAPI
269 IDirectDrawSurface3Impl_GetDC(LPDIRECTDRAWSURFACE3 This, HDC* phDC)
271 return IDirectDrawSurface7_GetDC(CONVERT(This), phDC);
274 static HRESULT WINAPI
275 IDirectDrawSurface3Impl_GetFlipStatus(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags)
277 return IDirectDrawSurface7_GetFlipStatus(CONVERT(This), dwFlags);
280 static HRESULT WINAPI
281 IDirectDrawSurface3Impl_GetOverlayPosition(LPDIRECTDRAWSURFACE3 This, LPLONG pX,
282 LPLONG pY)
284 return IDirectDrawSurface7_GetOverlayPosition(CONVERT(This), pX, pY);
287 static HRESULT WINAPI
288 IDirectDrawSurface3Impl_GetPalette(LPDIRECTDRAWSURFACE3 This,
289 LPDIRECTDRAWPALETTE* ppPalette)
291 return IDirectDrawSurface7_GetPalette(CONVERT(This), ppPalette);
294 static HRESULT WINAPI
295 IDirectDrawSurface3Impl_GetPixelFormat(LPDIRECTDRAWSURFACE3 This,
296 LPDDPIXELFORMAT pPixelFormat)
298 return IDirectDrawSurface7_GetPixelFormat(CONVERT(This), pPixelFormat);
301 static HRESULT WINAPI
302 IDirectDrawSurface3Impl_GetSurfaceDesc(LPDIRECTDRAWSURFACE3 This,
303 LPDDSURFACEDESC pDDSD)
305 return IDirectDrawSurface7_GetSurfaceDesc(CONVERT(This),
306 (LPDDSURFACEDESC2)pDDSD);
309 static HRESULT WINAPI
310 IDirectDrawSurface3Impl_Initialize(LPDIRECTDRAWSURFACE3 This, LPDIRECTDRAW pDD,
311 LPDDSURFACEDESC pDDSD)
313 return IDirectDrawSurface7_Initialize(CONVERT(This), pDD,
314 (LPDDSURFACEDESC2)pDDSD);
317 static HRESULT WINAPI
318 IDirectDrawSurface3Impl_IsLost(LPDIRECTDRAWSURFACE3 This)
320 return IDirectDrawSurface7_IsLost(CONVERT(This));
323 static HRESULT WINAPI
324 IDirectDrawSurface3Impl_Lock(LPDIRECTDRAWSURFACE3 This, LPRECT pRect,
325 LPDDSURFACEDESC pDDSD, DWORD dwFlags, HANDLE h)
327 return IDirectDrawSurface7_Lock(CONVERT(This), pRect,
328 (LPDDSURFACEDESC2)pDDSD, dwFlags, h);
331 static HRESULT WINAPI
332 IDirectDrawSurface3Impl_ReleaseDC(LPDIRECTDRAWSURFACE3 This, HDC hDC)
334 return IDirectDrawSurface7_ReleaseDC(CONVERT(This), hDC);
337 static HRESULT WINAPI
338 IDirectDrawSurface3Impl_Restore(LPDIRECTDRAWSURFACE3 This)
340 return IDirectDrawSurface7_Restore(CONVERT(This));
343 static HRESULT WINAPI
344 IDirectDrawSurface3Impl_SetClipper(LPDIRECTDRAWSURFACE3 This,
345 LPDIRECTDRAWCLIPPER pClipper)
347 return IDirectDrawSurface7_SetClipper(CONVERT(This), pClipper);
350 static HRESULT WINAPI
351 IDirectDrawSurface3Impl_SetColorKey(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags,
352 LPDDCOLORKEY pCKey)
354 return IDirectDrawSurface7_SetColorKey(CONVERT(This), dwFlags, pCKey);
357 static HRESULT WINAPI
358 IDirectDrawSurface3Impl_SetOverlayPosition(LPDIRECTDRAWSURFACE3 This, LONG x,
359 LONG y)
361 return IDirectDrawSurface7_SetOverlayPosition(CONVERT(This), x, y);
364 static HRESULT WINAPI
365 IDirectDrawSurface3Impl_SetPalette(LPDIRECTDRAWSURFACE3 This,
366 LPDIRECTDRAWPALETTE pPalette)
368 return IDirectDrawSurface7_SetPalette(CONVERT(This), pPalette);
371 static HRESULT WINAPI
372 IDirectDrawSurface3Impl_Unlock(LPDIRECTDRAWSURFACE3 This, LPVOID data)
374 /* data might not be the LPRECT of later versions, so drop it. */
375 return IDirectDrawSurface7_Unlock(CONVERT(This), NULL);
378 static HRESULT WINAPI
379 IDirectDrawSurface3Impl_UpdateOverlay(LPDIRECTDRAWSURFACE3 This, LPRECT prcSrc,
380 LPDIRECTDRAWSURFACE3 pDstSurf,
381 LPRECT prcDst, DWORD dwFlags,
382 LPDDOVERLAYFX pFX)
384 return IDirectDrawSurface7_UpdateOverlay(CONVERT(This), prcSrc,
385 CONVERT(pDstSurf), prcDst,
386 dwFlags, pFX);
389 static HRESULT WINAPI
390 IDirectDrawSurface3Impl_UpdateOverlayDisplay(LPDIRECTDRAWSURFACE3 This,
391 DWORD dwFlags)
393 return IDirectDrawSurface7_UpdateOverlayDisplay(CONVERT(This), dwFlags);
396 static HRESULT WINAPI
397 IDirectDrawSurface3Impl_UpdateOverlayZOrder(LPDIRECTDRAWSURFACE3 This,
398 DWORD dwFlags,
399 LPDIRECTDRAWSURFACE3 pSurfReference)
401 return IDirectDrawSurface7_UpdateOverlayZOrder(CONVERT(This), dwFlags,
402 CONVERT(pSurfReference));
405 static HRESULT WINAPI
406 IDirectDrawSurface3Impl_GetDDInterface(LPDIRECTDRAWSURFACE3 This, LPVOID* ppDD)
408 return IDirectDrawSurface7_GetDDInterface(CONVERT(This), ppDD);
411 static HRESULT WINAPI
412 IDirectDrawSurface3Impl_PageLock(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags)
414 return IDirectDrawSurface7_PageLock(CONVERT(This), dwFlags);
417 static HRESULT WINAPI
418 IDirectDrawSurface3Impl_PageUnlock(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags)
420 return IDirectDrawSurface7_PageUnlock(CONVERT(This), dwFlags);
423 static HRESULT WINAPI
424 IDirectDrawSurface3Impl_SetSurfaceDesc(LPDIRECTDRAWSURFACE3 This,
425 LPDDSURFACEDESC pDDSD, DWORD dwFlags)
427 return IDirectDrawSurface7_SetSurfaceDesc(CONVERT(This),
428 (LPDDSURFACEDESC2)pDDSD,
429 dwFlags);
432 const IDirectDrawSurface3Vtbl IDirectDrawSurface3_Vtbl =
434 IDirectDrawSurface3Impl_QueryInterface,
435 IDirectDrawSurface3Impl_AddRef,
436 IDirectDrawSurface3Impl_Release,
437 IDirectDrawSurface3Impl_AddAttachedSurface,
438 IDirectDrawSurface3Impl_AddOverlayDirtyRect,
439 IDirectDrawSurface3Impl_Blt,
440 IDirectDrawSurface3Impl_BltBatch,
441 IDirectDrawSurface3Impl_BltFast,
442 IDirectDrawSurface3Impl_DeleteAttachedSurface,
443 IDirectDrawSurface3Impl_EnumAttachedSurfaces,
444 IDirectDrawSurface3Impl_EnumOverlayZOrders,
445 IDirectDrawSurface3Impl_Flip,
446 IDirectDrawSurface3Impl_GetAttachedSurface,
447 IDirectDrawSurface3Impl_GetBltStatus,
448 IDirectDrawSurface3Impl_GetCaps,
449 IDirectDrawSurface3Impl_GetClipper,
450 IDirectDrawSurface3Impl_GetColorKey,
451 IDirectDrawSurface3Impl_GetDC,
452 IDirectDrawSurface3Impl_GetFlipStatus,
453 IDirectDrawSurface3Impl_GetOverlayPosition,
454 IDirectDrawSurface3Impl_GetPalette,
455 IDirectDrawSurface3Impl_GetPixelFormat,
456 IDirectDrawSurface3Impl_GetSurfaceDesc,
457 IDirectDrawSurface3Impl_Initialize,
458 IDirectDrawSurface3Impl_IsLost,
459 IDirectDrawSurface3Impl_Lock,
460 IDirectDrawSurface3Impl_ReleaseDC,
461 IDirectDrawSurface3Impl_Restore,
462 IDirectDrawSurface3Impl_SetClipper,
463 IDirectDrawSurface3Impl_SetColorKey,
464 IDirectDrawSurface3Impl_SetOverlayPosition,
465 IDirectDrawSurface3Impl_SetPalette,
466 IDirectDrawSurface3Impl_Unlock,
467 IDirectDrawSurface3Impl_UpdateOverlay,
468 IDirectDrawSurface3Impl_UpdateOverlayDisplay,
469 IDirectDrawSurface3Impl_UpdateOverlayZOrder,
470 IDirectDrawSurface3Impl_GetDDInterface,
471 IDirectDrawSurface3Impl_PageLock,
472 IDirectDrawSurface3Impl_PageUnlock,
473 IDirectDrawSurface3Impl_SetSurfaceDesc