d3drm: Implement D3DRMCreateColorRGB.
[wine] / dlls / ddraw / surface_thunks.c
1 /* IDirectDrawSurface3 -> IDirectDrawSurface7 thunks
2  * Copyright 2000 TransGaming Technologies Inc.
3  *
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.
8  *
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.
13  *
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
17  */
18
19 #include "config.h"
20 #include "wine/port.h"
21 #include "wine/debug.h"
22 #include <stdarg.h>
23
24 #include "windef.h"
25 #include "winbase.h"
26 #include "wingdi.h"
27 #include "ddraw.h"
28 #include "winerror.h"
29
30 #include "ddraw_private.h"
31 #include "ddcomimpl.h"
32
33 #define CONVERT(pdds) COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,        \
34                                          IDirectDrawSurface3,           \
35                                          IDirectDrawSurface7,           \
36                                          (pdds))
37
38 #define CONVERT_REV(pdds) COM_INTERFACE_CAST(IDirectDrawSurfaceImpl,    \
39                                              IDirectDrawSurface7,       \
40                                              IDirectDrawSurface3,       \
41                                              (pdds))
42
43 WINE_DEFAULT_DEBUG_CHANNEL(ddraw_thunk);
44
45 static HRESULT WINAPI
46 IDirectDrawSurface3Impl_QueryInterface(LPDIRECTDRAWSURFACE3 This, REFIID iid,
47                                        LPVOID *ppObj)
48 {
49     return IDirectDrawSurface7_QueryInterface(CONVERT(This), iid, ppObj);
50 }
51
52 static ULONG WINAPI
53 IDirectDrawSurface3Impl_AddRef(LPDIRECTDRAWSURFACE3 This)
54 {
55     return IDirectDrawSurface7_AddRef(CONVERT(This));
56 }
57
58 static ULONG WINAPI
59 IDirectDrawSurface3Impl_Release(LPDIRECTDRAWSURFACE3 iface)
60 {
61     ICOM_THIS_FROM( IDirectDrawSurfaceImpl, IDirectDrawSurface3, iface);
62     TRACE("(%p)\n", This);
63     return IDirectDrawSurface7_Release(CONVERT(iface));
64 }
65
66 static HRESULT WINAPI
67 IDirectDrawSurface3Impl_AddAttachedSurface(LPDIRECTDRAWSURFACE3 iface,
68                                            LPDIRECTDRAWSURFACE3 pAttach)
69 {
70     ICOM_THIS_FROM(IDirectDrawSurfaceImpl, IDirectDrawSurface3, iface);
71     IDirectDrawSurfaceImpl *Surf = ICOM_OBJECT(IDirectDrawSurfaceImpl, IDirectDrawSurface3, pAttach);
72     TRACE("(%p)->(%p)\n", This, Surf);
73
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
79      *
80      */
81     if(This->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_OFFSCREENPLAIN) &&
82        Surf->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE | DDSCAPS_OFFSCREENPLAIN))
83     {
84         /* Sizes have to match */
85         if(Surf->surface_desc.dwWidth != This->surface_desc.dwWidth ||
86         Surf->surface_desc.dwHeight != This->surface_desc.dwHeight)
87         {
88             WARN("Surface sizes do not match\n");
89             return DDERR_CANNOTATTACHSURFACE;
90         }
91         /* OK */
92     }
93     else if(This->surface_desc.ddsCaps.dwCaps & (DDSCAPS_PRIMARYSURFACE) &&
94             Surf->surface_desc.ddsCaps.dwCaps & (DDSCAPS_ZBUFFER))
95     {
96         /* OK */
97     }
98     else
99     {
100         WARN("Invalid attachment combination\n");
101         return DDERR_CANNOTATTACHSURFACE;
102     }
103
104     return IDirectDrawSurfaceImpl_AddAttachedSurface(This,
105                                                      Surf);
106 }
107
108 static HRESULT WINAPI
109 IDirectDrawSurface3Impl_AddOverlayDirtyRect(LPDIRECTDRAWSURFACE3 This,
110                                             LPRECT pRect)
111 {
112     return IDirectDrawSurface7_AddOverlayDirtyRect(CONVERT(This), pRect);
113 }
114
115 static HRESULT WINAPI
116 IDirectDrawSurface3Impl_Blt(LPDIRECTDRAWSURFACE3 This, LPRECT prcDst,
117                             LPDIRECTDRAWSURFACE3 pSrcSurf, LPRECT prcSrc,
118                             DWORD dwFlags, LPDDBLTFX pFX)
119 {
120     return IDirectDrawSurface7_Blt(CONVERT(This), prcDst, CONVERT(pSrcSurf),
121                                    prcSrc, dwFlags, pFX);
122 }
123
124 static HRESULT WINAPI
125 IDirectDrawSurface3Impl_BltBatch(LPDIRECTDRAWSURFACE3 This,
126                                  LPDDBLTBATCH pBatch, DWORD dwCount,
127                                  DWORD dwFlags)
128 {
129     return IDirectDrawSurface7_BltBatch(CONVERT(This), pBatch, dwCount,
130                                         dwFlags);
131 }
132
133 static HRESULT WINAPI
134 IDirectDrawSurface3Impl_BltFast(LPDIRECTDRAWSURFACE3 This, DWORD x, DWORD y,
135                                 LPDIRECTDRAWSURFACE3 pSrcSurf, LPRECT prcSrc,
136                                 DWORD dwTrans)
137 {
138     return IDirectDrawSurface7_BltFast(CONVERT(This), x, y, CONVERT(pSrcSurf),
139                                        prcSrc, dwTrans);
140 }
141
142 static HRESULT WINAPI
143 IDirectDrawSurface3Impl_DeleteAttachedSurface(LPDIRECTDRAWSURFACE3 This,
144                                               DWORD dwFlags,
145                                               LPDIRECTDRAWSURFACE3 pAttached)
146 {
147     return IDirectDrawSurface7_DeleteAttachedSurface(CONVERT(This), dwFlags,
148                                                      CONVERT(pAttached));
149 }
150
151 struct callback_info
152 {
153     LPDDENUMSURFACESCALLBACK callback;
154     LPVOID context;
155 };
156
157 static HRESULT CALLBACK
158 EnumCallback(LPDIRECTDRAWSURFACE7 iface, LPDDSURFACEDESC2 pDDSD,
159              LPVOID context)
160 {
161     const struct callback_info* info = context;
162
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
170
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);
175 }
176
177 static HRESULT WINAPI
178 IDirectDrawSurface3Impl_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE3 This,
179                                              LPVOID context,
180                                              LPDDENUMSURFACESCALLBACK callback)
181 {
182     struct callback_info info;
183
184     info.callback = callback;
185     info.context  = context;
186
187     return IDirectDrawSurface7_EnumAttachedSurfaces(CONVERT(This), &info,
188                                                     EnumCallback);
189 }
190
191 static HRESULT WINAPI
192 IDirectDrawSurface3Impl_EnumOverlayZOrders(LPDIRECTDRAWSURFACE3 This,
193                                            DWORD dwFlags, LPVOID context,
194                                            LPDDENUMSURFACESCALLBACK callback)
195 {
196     struct callback_info info;
197
198     info.callback = callback;
199     info.context  = context;
200
201     return IDirectDrawSurface7_EnumOverlayZOrders(CONVERT(This), dwFlags,
202                                                   &info, EnumCallback);
203 }
204
205 static HRESULT WINAPI
206 IDirectDrawSurface3Impl_Flip(LPDIRECTDRAWSURFACE3 This,
207                              LPDIRECTDRAWSURFACE3 pOverride, DWORD dwFlags)
208 {
209     return IDirectDrawSurface7_Flip(CONVERT(This), CONVERT(pOverride),
210                                     dwFlags);
211 }
212
213 static HRESULT WINAPI
214 IDirectDrawSurface3Impl_GetAttachedSurface(LPDIRECTDRAWSURFACE3 This,
215                                            LPDDSCAPS pCaps,
216                                            LPDIRECTDRAWSURFACE3* ppAttached)
217 {
218     DDSCAPS2 caps;
219     LPDIRECTDRAWSURFACE7 pAttached7;
220     HRESULT hr;
221
222     caps.dwCaps  = pCaps->dwCaps;
223     caps.dwCaps2 = 0;
224     caps.dwCaps3 = 0;
225     caps.dwCaps4 = 0;
226
227     hr = IDirectDrawSurface7_GetAttachedSurface(CONVERT(This), &caps,
228                                                 &pAttached7);
229     if (FAILED(hr)) return hr;
230
231     *ppAttached = CONVERT_REV(pAttached7);
232     return hr;
233 }
234
235 static HRESULT WINAPI
236 IDirectDrawSurface3Impl_GetBltStatus(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags)
237 {
238     return IDirectDrawSurface7_GetBltStatus(CONVERT(This), dwFlags);
239 }
240
241 static HRESULT WINAPI
242 IDirectDrawSurface3Impl_GetCaps(LPDIRECTDRAWSURFACE3 This, LPDDSCAPS pCaps)
243 {
244     DDSCAPS2 caps;
245     HRESULT hr;
246
247     hr = IDirectDrawSurface7_GetCaps(CONVERT(This), &caps);
248     if (FAILED(hr)) return hr;
249
250     pCaps->dwCaps = caps.dwCaps;
251     return hr;
252 }
253
254 static HRESULT WINAPI
255 IDirectDrawSurface3Impl_GetClipper(LPDIRECTDRAWSURFACE3 This,
256                                    LPDIRECTDRAWCLIPPER* ppClipper)
257 {
258     return IDirectDrawSurface7_GetClipper(CONVERT(This), ppClipper);
259 }
260
261 static HRESULT WINAPI
262 IDirectDrawSurface3Impl_GetColorKey(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags,
263                                     LPDDCOLORKEY pCKey)
264 {
265     return IDirectDrawSurface7_GetColorKey(CONVERT(This), dwFlags, pCKey);
266 }
267
268 static HRESULT WINAPI
269 IDirectDrawSurface3Impl_GetDC(LPDIRECTDRAWSURFACE3 This, HDC* phDC)
270 {
271     return IDirectDrawSurface7_GetDC(CONVERT(This), phDC);
272 }
273
274 static HRESULT WINAPI
275 IDirectDrawSurface3Impl_GetFlipStatus(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags)
276 {
277     return IDirectDrawSurface7_GetFlipStatus(CONVERT(This), dwFlags);
278 }
279
280 static HRESULT WINAPI
281 IDirectDrawSurface3Impl_GetOverlayPosition(LPDIRECTDRAWSURFACE3 This, LPLONG pX,
282                                        LPLONG pY)
283 {
284     return IDirectDrawSurface7_GetOverlayPosition(CONVERT(This), pX, pY);
285 }
286
287 static HRESULT WINAPI
288 IDirectDrawSurface3Impl_GetPalette(LPDIRECTDRAWSURFACE3 This,
289                                    LPDIRECTDRAWPALETTE* ppPalette)
290 {
291     return IDirectDrawSurface7_GetPalette(CONVERT(This), ppPalette);
292 }
293
294 static HRESULT WINAPI
295 IDirectDrawSurface3Impl_GetPixelFormat(LPDIRECTDRAWSURFACE3 This,
296                                        LPDDPIXELFORMAT pPixelFormat)
297 {
298     return IDirectDrawSurface7_GetPixelFormat(CONVERT(This), pPixelFormat);
299 }
300
301 static HRESULT WINAPI
302 IDirectDrawSurface3Impl_GetSurfaceDesc(LPDIRECTDRAWSURFACE3 This,
303                                        LPDDSURFACEDESC pDDSD)
304 {
305     return IDirectDrawSurface7_GetSurfaceDesc(CONVERT(This),
306                                               (LPDDSURFACEDESC2)pDDSD);
307 }
308
309 static HRESULT WINAPI
310 IDirectDrawSurface3Impl_Initialize(LPDIRECTDRAWSURFACE3 This, LPDIRECTDRAW pDD,
311                                    LPDDSURFACEDESC pDDSD)
312 {
313     return IDirectDrawSurface7_Initialize(CONVERT(This), pDD,
314                                           (LPDDSURFACEDESC2)pDDSD);
315 }
316
317 static HRESULT WINAPI
318 IDirectDrawSurface3Impl_IsLost(LPDIRECTDRAWSURFACE3 This)
319 {
320     return IDirectDrawSurface7_IsLost(CONVERT(This));
321 }
322
323 static HRESULT WINAPI
324 IDirectDrawSurface3Impl_Lock(LPDIRECTDRAWSURFACE3 This, LPRECT pRect,
325                              LPDDSURFACEDESC pDDSD, DWORD dwFlags, HANDLE h)
326 {
327     return IDirectDrawSurface7_Lock(CONVERT(This), pRect,
328                                     (LPDDSURFACEDESC2)pDDSD, dwFlags, h);
329 }
330
331 static HRESULT WINAPI
332 IDirectDrawSurface3Impl_ReleaseDC(LPDIRECTDRAWSURFACE3 This, HDC hDC)
333 {
334     return IDirectDrawSurface7_ReleaseDC(CONVERT(This), hDC);
335 }
336
337 static HRESULT WINAPI
338 IDirectDrawSurface3Impl_Restore(LPDIRECTDRAWSURFACE3 This)
339 {
340     return IDirectDrawSurface7_Restore(CONVERT(This));
341 }
342
343 static HRESULT WINAPI
344 IDirectDrawSurface3Impl_SetClipper(LPDIRECTDRAWSURFACE3 This,
345                                    LPDIRECTDRAWCLIPPER pClipper)
346 {
347     return IDirectDrawSurface7_SetClipper(CONVERT(This), pClipper);
348 }
349
350 static HRESULT WINAPI
351 IDirectDrawSurface3Impl_SetColorKey(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags,
352                                     LPDDCOLORKEY pCKey)
353 {
354     return IDirectDrawSurface7_SetColorKey(CONVERT(This), dwFlags, pCKey);
355 }
356
357 static HRESULT WINAPI
358 IDirectDrawSurface3Impl_SetOverlayPosition(LPDIRECTDRAWSURFACE3 This, LONG x,
359                                        LONG y)
360 {
361     return IDirectDrawSurface7_SetOverlayPosition(CONVERT(This), x, y);
362 }
363
364 static HRESULT WINAPI
365 IDirectDrawSurface3Impl_SetPalette(LPDIRECTDRAWSURFACE3 This,
366                                    LPDIRECTDRAWPALETTE pPalette)
367 {
368     return IDirectDrawSurface7_SetPalette(CONVERT(This), pPalette);
369 }
370
371 static HRESULT WINAPI
372 IDirectDrawSurface3Impl_Unlock(LPDIRECTDRAWSURFACE3 This, LPVOID data)
373 {
374     /* data might not be the LPRECT of later versions, so drop it. */
375     return IDirectDrawSurface7_Unlock(CONVERT(This), NULL);
376 }
377
378 static HRESULT WINAPI
379 IDirectDrawSurface3Impl_UpdateOverlay(LPDIRECTDRAWSURFACE3 This, LPRECT prcSrc,
380                                       LPDIRECTDRAWSURFACE3 pDstSurf,
381                                       LPRECT prcDst, DWORD dwFlags,
382                                       LPDDOVERLAYFX pFX)
383 {
384     return IDirectDrawSurface7_UpdateOverlay(CONVERT(This), prcSrc,
385                                              CONVERT(pDstSurf), prcDst,
386                                              dwFlags, pFX);
387 }
388
389 static HRESULT WINAPI
390 IDirectDrawSurface3Impl_UpdateOverlayDisplay(LPDIRECTDRAWSURFACE3 This,
391                                              DWORD dwFlags)
392 {
393     return IDirectDrawSurface7_UpdateOverlayDisplay(CONVERT(This), dwFlags);
394 }
395
396 static HRESULT WINAPI
397 IDirectDrawSurface3Impl_UpdateOverlayZOrder(LPDIRECTDRAWSURFACE3 This,
398                                             DWORD dwFlags,
399                                             LPDIRECTDRAWSURFACE3 pSurfReference)
400 {
401     return IDirectDrawSurface7_UpdateOverlayZOrder(CONVERT(This), dwFlags,
402                                                    CONVERT(pSurfReference));
403 }
404
405 static HRESULT WINAPI
406 IDirectDrawSurface3Impl_GetDDInterface(LPDIRECTDRAWSURFACE3 This, LPVOID* ppDD)
407 {
408     return IDirectDrawSurface7_GetDDInterface(CONVERT(This), ppDD);
409 }
410
411 static HRESULT WINAPI
412 IDirectDrawSurface3Impl_PageLock(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags)
413 {
414     return IDirectDrawSurface7_PageLock(CONVERT(This), dwFlags);
415 }
416
417 static HRESULT WINAPI
418 IDirectDrawSurface3Impl_PageUnlock(LPDIRECTDRAWSURFACE3 This, DWORD dwFlags)
419 {
420     return IDirectDrawSurface7_PageUnlock(CONVERT(This), dwFlags);
421 }
422
423 static HRESULT WINAPI
424 IDirectDrawSurface3Impl_SetSurfaceDesc(LPDIRECTDRAWSURFACE3 This,
425                                        LPDDSURFACEDESC pDDSD, DWORD dwFlags)
426 {
427     return IDirectDrawSurface7_SetSurfaceDesc(CONVERT(This),
428                                               (LPDDSURFACEDESC2)pDDSD,
429                                               dwFlags);
430 }
431
432 const IDirectDrawSurface3Vtbl IDirectDrawSurface3_Vtbl =
433 {
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
474 };