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