2 * Copyright 2008 Stefan Dösinger for CodeWeavers
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 "wine/debug.h"
29 #include "ddrawex_private.h"
31 WINE_DEFAULT_DEBUG_CHANNEL(ddrawex
);
33 static struct ddrawex_surface
*impl_from_IDirectDrawSurface3(IDirectDrawSurface3
*iface
)
35 return CONTAINING_RECORD(iface
, struct ddrawex_surface
, IDirectDrawSurface3_iface
);
38 static struct ddrawex_surface
*unsafe_impl_from_IDirectDrawSurface3(IDirectDrawSurface3
*iface
);
40 static struct ddrawex_surface
*impl_from_IDirectDrawSurface4(IDirectDrawSurface4
*iface
)
42 return CONTAINING_RECORD(iface
, struct ddrawex_surface
, IDirectDrawSurface4_iface
);
45 static HRESULT WINAPI
ddrawex_surface4_QueryInterface(IDirectDrawSurface4
*iface
, REFIID riid
, void **out
)
47 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
49 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
54 return DDERR_INVALIDPARAMS
;
57 if (IsEqualGUID(riid
, &IID_IDirectDrawSurface4
)
58 || IsEqualGUID(riid
, &IID_IUnknown
))
60 *out
= &surface
->IDirectDrawSurface4_iface
;
62 else if (IsEqualGUID(riid
, &IID_IDirectDrawSurface3
)
63 || IsEqualGUID(riid
, &IID_IDirectDrawSurface2
)
64 || IsEqualGUID(riid
, &IID_IDirectDrawSurface
))
66 *out
= &surface
->IDirectDrawSurface3_iface
;
70 if (IsEqualGUID(riid
, &IID_IDirectDrawGammaControl
))
71 FIXME("Implement IDirectDrawGammaControl in ddrawex.\n");
72 else if (IsEqualGUID(riid
, &IID_IDirect3DHALDevice
)
73 || IsEqualGUID(riid
, &IID_IDirect3DRGBDevice
))
74 FIXME("Test IDirect3DDevice in ddrawex.\n");
75 else if (IsEqualGUID(&IID_IDirect3DTexture2
, riid
)
76 || IsEqualGUID( &IID_IDirect3DTexture
, riid
))
77 FIXME("Implement IDirect3DTexture in ddrawex.\n");
80 WARN("%s not implemented, returning E_NOINTERFACE.\n", debugstr_guid(riid
));
84 IUnknown_AddRef((IUnknown
*)*out
);
88 static HRESULT WINAPI
ddrawex_surface3_QueryInterface(IDirectDrawSurface3
*iface
, REFIID riid
, void **out
)
90 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
92 TRACE("iface %p, riid %s, out %p.\n", iface
, debugstr_guid(riid
), out
);
94 return ddrawex_surface4_QueryInterface(&surface
->IDirectDrawSurface4_iface
, riid
, out
);
97 static ULONG WINAPI
ddrawex_surface4_AddRef(IDirectDrawSurface4
*iface
)
99 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
100 ULONG refcount
= InterlockedIncrement(&surface
->ref
);
102 TRACE("%p increasing refcount to %u.\n", iface
, refcount
);
107 static ULONG WINAPI
ddrawex_surface3_AddRef(IDirectDrawSurface3
*iface
)
109 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
111 TRACE("iface %p.\n", iface
);
113 return ddrawex_surface4_AddRef(&surface
->IDirectDrawSurface4_iface
);
116 static ULONG WINAPI
ddrawex_surface4_Release(IDirectDrawSurface4
*iface
)
118 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
119 ULONG refcount
= InterlockedDecrement(&surface
->ref
);
121 TRACE("%p decreasing refcount to %u.\n", iface
, refcount
);
125 IDirectDrawSurface4_FreePrivateData(surface
->parent
, &IID_DDrawexPriv
);
126 IDirectDrawSurface4_Release(surface
->parent
);
133 static ULONG WINAPI
ddrawex_surface3_Release(IDirectDrawSurface3
*iface
)
135 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
137 TRACE("iface %p.\n", iface
);
139 return ddrawex_surface4_Release(&surface
->IDirectDrawSurface4_iface
);
142 static HRESULT WINAPI
ddrawex_surface4_AddAttachedSurface(IDirectDrawSurface4
*iface
,
143 IDirectDrawSurface4
*attachment
)
145 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
146 struct ddrawex_surface
*attachment_impl
= unsafe_impl_from_IDirectDrawSurface4(attachment
);
148 TRACE("iface %p, attachment %p.\n", iface
, attachment
);
150 return IDirectDrawSurface4_AddAttachedSurface(surface
->parent
, attachment_impl
->parent
);
153 static HRESULT WINAPI
ddrawex_surface3_AddAttachedSurface(IDirectDrawSurface3
*iface
,
154 IDirectDrawSurface3
*attachment
)
156 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
157 struct ddrawex_surface
*attachment_impl
= unsafe_impl_from_IDirectDrawSurface3(attachment
);
159 TRACE("iface %p, attachment %p.\n", iface
, attachment
);
161 return ddrawex_surface4_AddAttachedSurface(&surface
->IDirectDrawSurface4_iface
,
162 attachment_impl
? &attachment_impl
->IDirectDrawSurface4_iface
: NULL
);
165 static HRESULT WINAPI
ddrawex_surface4_AddOverlayDirtyRect(IDirectDrawSurface4
*iface
, RECT
*rect
)
167 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
169 TRACE("iface %p, rect %s.\n", iface
, wine_dbgstr_rect(rect
));
171 return IDirectDrawSurface4_AddOverlayDirtyRect(surface
->parent
, rect
);
174 static HRESULT WINAPI
ddrawex_surface3_AddOverlayDirtyRect(IDirectDrawSurface3
*iface
, RECT
*rect
)
176 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
178 TRACE("iface %p, rect %s.\n", iface
, wine_dbgstr_rect(rect
));
180 return ddrawex_surface4_AddOverlayDirtyRect(&surface
->IDirectDrawSurface4_iface
, rect
);
183 static HRESULT WINAPI
ddrawex_surface4_Blt(IDirectDrawSurface4
*iface
, RECT
*dst_rect
,
184 IDirectDrawSurface4
*src_surface
, RECT
*src_rect
, DWORD flags
, DDBLTFX
*fx
)
186 struct ddrawex_surface
*dst
= impl_from_IDirectDrawSurface4(iface
);
187 struct ddrawex_surface
*src
= unsafe_impl_from_IDirectDrawSurface4(src_surface
);
189 TRACE("iface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#x, fx %p.\n",
190 iface
, wine_dbgstr_rect(dst_rect
), src_surface
, wine_dbgstr_rect(src_rect
), flags
, fx
);
192 return IDirectDrawSurface4_Blt(dst
->parent
, dst_rect
, src
? src
->parent
: NULL
, src_rect
, flags
, fx
);
195 static HRESULT WINAPI
ddrawex_surface3_Blt(IDirectDrawSurface3
*iface
, RECT
*dst_rect
,
196 IDirectDrawSurface3
*src_surface
, RECT
*src_rect
, DWORD flags
, DDBLTFX
*fx
)
198 struct ddrawex_surface
*dst
= impl_from_IDirectDrawSurface3(iface
);
199 struct ddrawex_surface
*src
= unsafe_impl_from_IDirectDrawSurface3(src_surface
);
201 TRACE("iface %p, dst_rect %s, src_surface %p, src_rect %s, flags %#x, fx %p.\n",
202 iface
, wine_dbgstr_rect(dst_rect
), src_surface
, wine_dbgstr_rect(src_rect
), flags
, fx
);
204 return ddrawex_surface4_Blt(&dst
->IDirectDrawSurface4_iface
, dst_rect
,
205 src
? &src
->IDirectDrawSurface4_iface
: NULL
, src_rect
, flags
, fx
);
208 static HRESULT WINAPI
ddrawex_surface4_BltBatch(IDirectDrawSurface4
*iface
,
209 DDBLTBATCH
*batch
, DWORD count
, DWORD flags
)
211 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
213 TRACE("iface %p, batch %p, count %u, flags %#x.\n", iface
, batch
, count
, flags
);
215 return IDirectDrawSurface4_BltBatch(surface
->parent
, batch
, count
, flags
);
218 static HRESULT WINAPI
ddrawex_surface3_BltBatch(IDirectDrawSurface3
*iface
,
219 DDBLTBATCH
*batch
, DWORD count
, DWORD flags
)
221 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
223 TRACE("iface %p, batch %p, count %u, flags %#x.\n", iface
, batch
, count
, flags
);
225 return ddrawex_surface4_BltBatch(&surface
->IDirectDrawSurface4_iface
, batch
, count
, flags
);
228 static HRESULT WINAPI
ddrawex_surface4_BltFast(IDirectDrawSurface4
*iface
, DWORD dst_x
,
229 DWORD dst_y
, IDirectDrawSurface4
*src_surface
, RECT
*src_rect
, DWORD flags
)
231 struct ddrawex_surface
*dst
= impl_from_IDirectDrawSurface4(iface
);
232 struct ddrawex_surface
*src
= unsafe_impl_from_IDirectDrawSurface4(src_surface
);
234 TRACE("iface %p, dst_x %u, dst_y %u, src_surface %p, src_rect %s, flags %#x.\n",
235 iface
, dst_x
, dst_y
, src_surface
, wine_dbgstr_rect(src_rect
), flags
);
237 return IDirectDrawSurface4_BltFast(dst
->parent
, dst_x
, dst_y
,
238 src
? src
->parent
: NULL
, src_rect
, flags
);
241 static HRESULT WINAPI
ddrawex_surface3_BltFast(IDirectDrawSurface3
*iface
, DWORD dst_x
,
242 DWORD dst_y
, IDirectDrawSurface3
*src_surface
, RECT
*src_rect
, DWORD flags
)
244 struct ddrawex_surface
*dst
= impl_from_IDirectDrawSurface3(iface
);
245 struct ddrawex_surface
*src
= unsafe_impl_from_IDirectDrawSurface3(src_surface
);
247 TRACE("iface %p, dst_x %u, dst_y %u, src_surface %p, src_rect %s, flags %#x.\n",
248 iface
, dst_x
, dst_y
, src_surface
, wine_dbgstr_rect(src_rect
), flags
);
250 return ddrawex_surface4_BltFast(&dst
->IDirectDrawSurface4_iface
, dst_x
, dst_y
,
251 src
? &src
->IDirectDrawSurface4_iface
: NULL
, src_rect
, flags
);
254 static HRESULT WINAPI
ddrawex_surface4_DeleteAttachedSurface(IDirectDrawSurface4
*iface
,
255 DWORD flags
, IDirectDrawSurface4
*attachment
)
257 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
258 struct ddrawex_surface
*attachment_impl
= unsafe_impl_from_IDirectDrawSurface4(attachment
);
260 TRACE("iface %p, flags %#x, attachment %p.\n", iface
, flags
, attachment
);
262 return IDirectDrawSurface4_DeleteAttachedSurface(surface
->parent
,
263 flags
, attachment_impl
? attachment_impl
->parent
: NULL
);
266 static HRESULT WINAPI
ddrawex_surface3_DeleteAttachedSurface(IDirectDrawSurface3
*iface
,
267 DWORD flags
, IDirectDrawSurface3
*attachment
)
269 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
270 struct ddrawex_surface
*attachment_impl
= unsafe_impl_from_IDirectDrawSurface3(attachment
);
272 TRACE("iface %p, flags %#x, attachment %p.\n", iface
, flags
, attachment
);
274 return ddrawex_surface4_DeleteAttachedSurface(&surface
->IDirectDrawSurface4_iface
,
275 flags
, attachment_impl
? &attachment_impl
->IDirectDrawSurface4_iface
: NULL
);
278 struct enumsurfaces_wrap
280 LPDDENUMSURFACESCALLBACK2 orig_cb
;
284 static HRESULT WINAPI
285 enumsurfaces_wrap_cb(IDirectDrawSurface4
*surf
, DDSURFACEDESC2
*desc
, void *vctx
)
287 struct enumsurfaces_wrap
*ctx
= vctx
;
288 IDirectDrawSurface4
*outer
= dds_get_outer(surf
);
290 TRACE("Returning outer surface %p for inner surface %p\n", outer
, surf
);
291 IDirectDrawSurface4_AddRef(outer
);
292 IDirectDrawSurface4_Release(surf
);
293 return ctx
->orig_cb(outer
, desc
, vctx
);
296 static HRESULT WINAPI
ddrawex_surface4_EnumAttachedSurfaces(IDirectDrawSurface4
*iface
,
297 void *ctx
, LPDDENUMSURFACESCALLBACK2 cb
)
299 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
300 struct enumsurfaces_wrap cb_ctx
;
302 TRACE("iface %p, ctx %p, cb %p.\n", iface
, ctx
, cb
);
305 cb_ctx
.orig_ctx
= ctx
;
306 return IDirectDrawSurface4_EnumAttachedSurfaces(surface
->parent
, &cb_ctx
, enumsurfaces_wrap_cb
);
309 struct enumsurfaces_thunk
311 LPDDENUMSURFACESCALLBACK orig_cb
;
315 static HRESULT WINAPI
enumsurfaces_thunk_cb(IDirectDrawSurface4
*surf
, DDSURFACEDESC2
*desc2
,
318 struct ddrawex_surface
*surface
= unsafe_impl_from_IDirectDrawSurface4(surf
);
319 struct enumsurfaces_thunk
*ctx
= vctx
;
322 TRACE("Thunking back to IDirectDrawSurface3\n");
323 IDirectDrawSurface3_AddRef(&surface
->IDirectDrawSurface3_iface
);
324 IDirectDrawSurface3_Release(surf
);
325 DDSD2_to_DDSD(desc2
, &desc
);
326 return ctx
->orig_cb((IDirectDrawSurface
*)&surface
->IDirectDrawSurface3_iface
, &desc
, ctx
->orig_ctx
);
329 static HRESULT WINAPI
ddrawex_surface3_EnumAttachedSurfaces(IDirectDrawSurface3
*iface
,
330 void *ctx
, LPDDENUMSURFACESCALLBACK cb
)
332 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
333 struct enumsurfaces_thunk cb_ctx
;
335 TRACE("iface %p, ctx %p, cb %p.\n", iface
, ctx
, cb
);
338 cb_ctx
.orig_ctx
= ctx
;
339 return ddrawex_surface4_EnumAttachedSurfaces(&surface
->IDirectDrawSurface4_iface
, &cb_ctx
, enumsurfaces_thunk_cb
);
342 static HRESULT WINAPI
ddrawex_surface4_EnumOverlayZOrders(IDirectDrawSurface4
*iface
,
343 DWORD flags
, void *ctx
, LPDDENUMSURFACESCALLBACK2 cb
)
345 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
346 struct enumsurfaces_wrap cb_ctx
;
348 TRACE("iface %p, flags %#x, ctx %p, cb %p.\n", iface
, flags
, ctx
, cb
);
351 cb_ctx
.orig_ctx
= ctx
;
352 return IDirectDrawSurface4_EnumOverlayZOrders(surface
->parent
, flags
, &cb_ctx
, enumsurfaces_wrap_cb
);
355 static HRESULT WINAPI
ddrawex_surface3_EnumOverlayZOrders(IDirectDrawSurface3
*iface
,
356 DWORD flags
, void *ctx
, LPDDENUMSURFACESCALLBACK cb
)
358 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
359 struct enumsurfaces_thunk cb_ctx
;
361 TRACE("iface %p, flags %#x, ctx %p, cb %p.\n", iface
, flags
, ctx
, cb
);
364 cb_ctx
.orig_ctx
= ctx
;
365 return ddrawex_surface4_EnumOverlayZOrders(&surface
->IDirectDrawSurface4_iface
,
366 flags
, &cb_ctx
, enumsurfaces_thunk_cb
);
369 static HRESULT WINAPI
ddrawex_surface4_Flip(IDirectDrawSurface4
*iface
, IDirectDrawSurface4
*dst
, DWORD flags
)
371 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
372 struct ddrawex_surface
*dst_impl
= unsafe_impl_from_IDirectDrawSurface4(dst
);
374 TRACE("iface %p, dst %p, flags %#x.\n", iface
, dst
, flags
);
376 return IDirectDrawSurface4_Flip(surface
->parent
, dst_impl
? dst_impl
->parent
: NULL
, flags
);
379 static HRESULT WINAPI
ddrawex_surface3_Flip(IDirectDrawSurface3
*iface
, IDirectDrawSurface3
*dst
, DWORD flags
)
381 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
382 struct ddrawex_surface
*dst_impl
= unsafe_impl_from_IDirectDrawSurface3(dst
);
384 TRACE("iface %p, dst %p, flags %#x.\n", iface
, dst
, flags
);
386 return ddrawex_surface4_Flip(&surface
->IDirectDrawSurface4_iface
,
387 dst_impl
? &dst_impl
->IDirectDrawSurface4_iface
: NULL
, flags
);
390 static HRESULT WINAPI
ddrawex_surface4_GetAttachedSurface(IDirectDrawSurface4
*iface
,
391 DDSCAPS2
*caps
, IDirectDrawSurface4
**attachment
)
393 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
394 IDirectDrawSurface4
*inner
= NULL
;
397 TRACE("iface %p, caps %p, attachment %p.\n", iface
, caps
, attachment
);
399 if (SUCCEEDED(hr
= IDirectDrawSurface4_GetAttachedSurface(surface
->parent
, caps
, &inner
)))
401 *attachment
= dds_get_outer(inner
);
402 IDirectDrawSurface4_AddRef(*attachment
);
403 IDirectDrawSurface4_Release(inner
);
412 static HRESULT WINAPI
ddrawex_surface3_GetAttachedSurface(IDirectDrawSurface3
*iface
,
413 DDSCAPS
*caps
, IDirectDrawSurface3
**attachment
)
415 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
416 IDirectDrawSurface4
*surf4
;
420 TRACE("iface %p, caps %p, attachment %p.\n", iface
, caps
, attachment
);
422 memset(&caps2
, 0, sizeof(caps2
));
423 caps2
.dwCaps
= caps
->dwCaps
;
424 if (SUCCEEDED(hr
= ddrawex_surface4_GetAttachedSurface(&surface
->IDirectDrawSurface4_iface
, &caps2
, &surf4
)))
426 IDirectDrawSurface4_QueryInterface(surf4
, &IID_IDirectDrawSurface3
, (void **)attachment
);
427 IDirectDrawSurface4_Release(surf4
);
436 static HRESULT WINAPI
ddrawex_surface4_GetBltStatus(IDirectDrawSurface4
*iface
, DWORD flags
)
438 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
440 TRACE("iface %p, flags %#x.\n", iface
, flags
);
442 return IDirectDrawSurface4_GetBltStatus(surface
->parent
, flags
);
445 static HRESULT WINAPI
ddrawex_surface3_GetBltStatus(IDirectDrawSurface3
*iface
, DWORD flags
)
447 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
449 TRACE("iface %p, flags %#x.\n", iface
, flags
);
451 return ddrawex_surface4_GetBltStatus(&surface
->IDirectDrawSurface4_iface
, flags
);
454 static HRESULT WINAPI
ddrawex_surface4_GetCaps(IDirectDrawSurface4
*iface
, DDSCAPS2
*caps
)
456 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
458 TRACE("iface %p, caps %p.\n", iface
, caps
);
460 return IDirectDrawSurface4_GetCaps(surface
->parent
, caps
);
463 static HRESULT WINAPI
ddrawex_surface3_GetCaps(IDirectDrawSurface3
*iface
, DDSCAPS
*caps
)
465 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
469 TRACE("iface %p, caps %p.\n", iface
, caps
);
471 memset(&caps2
, 0, sizeof(caps2
));
472 memset(caps
, 0, sizeof(*caps
));
473 hr
= IDirectDrawSurface4_GetCaps(&surface
->IDirectDrawSurface4_iface
, &caps2
);
474 caps
->dwCaps
= caps2
.dwCaps
;
478 static HRESULT WINAPI
ddrawex_surface4_GetClipper(IDirectDrawSurface4
*iface
, IDirectDrawClipper
**clipper
)
480 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
482 TRACE("iface %p, clipper %p.\n", iface
, clipper
);
484 return IDirectDrawSurface4_GetClipper(surface
->parent
, clipper
);
487 static HRESULT WINAPI
ddrawex_surface3_GetClipper(IDirectDrawSurface3
*iface
, IDirectDrawClipper
**clipper
)
489 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
491 TRACE("iface %p, clipper %p.\n", iface
, clipper
);
493 return ddrawex_surface4_GetClipper(&surface
->IDirectDrawSurface4_iface
, clipper
);
496 static HRESULT WINAPI
ddrawex_surface4_GetColorKey(IDirectDrawSurface4
*iface
, DWORD flags
, DDCOLORKEY
*color_key
)
498 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
500 TRACE("iface %p, flags %#x, color_key %p.\n", iface
, flags
, color_key
);
502 return IDirectDrawSurface4_GetColorKey(surface
->parent
, flags
, color_key
);
505 static HRESULT WINAPI
ddrawex_surface3_GetColorKey(IDirectDrawSurface3
*iface
, DWORD flags
, DDCOLORKEY
*color_key
)
507 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
509 TRACE("iface %p, flags %#x, color_key %p.\n", iface
, flags
, color_key
);
511 return ddrawex_surface4_GetColorKey(&surface
->IDirectDrawSurface4_iface
, flags
, color_key
);
514 static HRESULT WINAPI
ddrawex_surface4_GetDC(IDirectDrawSurface4
*iface
, HDC
*dc
)
516 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
518 TRACE("iface %p, dc %p.\n", iface
, dc
);
520 if (surface
->permanent_dc
)
522 TRACE("Returning stored dc %p.\n", surface
->hdc
);
527 return IDirectDrawSurface4_GetDC(surface
->parent
, dc
);
530 static HRESULT WINAPI
ddrawex_surface3_GetDC(IDirectDrawSurface3
*iface
, HDC
*dc
)
532 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
534 TRACE("iface %p, dc %p.\n", iface
, dc
);
536 return ddrawex_surface4_GetDC(&surface
->IDirectDrawSurface4_iface
, dc
);
539 static HRESULT WINAPI
ddrawex_surface4_GetFlipStatus(IDirectDrawSurface4
*iface
, DWORD flags
)
541 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
543 TRACE("iface %p, flags %#x.\n", iface
, flags
);
545 return IDirectDrawSurface4_GetFlipStatus(surface
->parent
, flags
);
548 static HRESULT WINAPI
ddrawex_surface3_GetFlipStatus(IDirectDrawSurface3
*iface
, DWORD flags
)
550 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
552 TRACE("iface %p, flags %#x.\n", iface
, flags
);
554 return ddrawex_surface4_GetFlipStatus(&surface
->IDirectDrawSurface4_iface
, flags
);
557 static HRESULT WINAPI
ddrawex_surface4_GetOverlayPosition(IDirectDrawSurface4
*iface
, LONG
*x
, LONG
*y
)
559 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
561 TRACE("iface %p, x %p, y %p.\n", iface
, x
, y
);
563 return IDirectDrawSurface4_GetOverlayPosition(surface
->parent
, x
, y
);
566 static HRESULT WINAPI
ddrawex_surface3_GetOverlayPosition(IDirectDrawSurface3
*iface
, LONG
*x
, LONG
*y
)
568 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
570 TRACE("iface %p, x %p, y %p.\n", iface
, x
, y
);
572 return ddrawex_surface4_GetOverlayPosition(&surface
->IDirectDrawSurface4_iface
, x
, y
);
575 static HRESULT WINAPI
ddrawex_surface4_GetPalette(IDirectDrawSurface4
*iface
, IDirectDrawPalette
**palette
)
577 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
579 TRACE("iface %p, palette %p.\n", iface
, palette
);
581 return IDirectDrawSurface4_GetPalette(surface
->parent
, palette
);
584 static HRESULT WINAPI
ddrawex_surface3_GetPalette(IDirectDrawSurface3
*iface
, IDirectDrawPalette
**palette
)
586 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
588 TRACE("iface %p, palette %p.\n", iface
, palette
);
590 return ddrawex_surface4_GetPalette(&surface
->IDirectDrawSurface4_iface
, palette
);
593 static HRESULT WINAPI
ddrawex_surface4_GetPixelFormat(IDirectDrawSurface4
*iface
, DDPIXELFORMAT
*pixel_format
)
595 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
597 TRACE("iface %p, pixel_format %p.\n", iface
, pixel_format
);
599 return IDirectDrawSurface4_GetPixelFormat(surface
->parent
, pixel_format
);
602 static HRESULT WINAPI
ddrawex_surface3_GetPixelFormat(IDirectDrawSurface3
*iface
, DDPIXELFORMAT
*pixel_format
)
604 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
606 TRACE("iface %p, pixel_format %p.\n", iface
, pixel_format
);
608 return ddrawex_surface4_GetPixelFormat(&surface
->IDirectDrawSurface4_iface
, pixel_format
);
611 static HRESULT WINAPI
ddrawex_surface4_GetSurfaceDesc(IDirectDrawSurface4
*iface
, DDSURFACEDESC2
*desc
)
613 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
616 TRACE("iface %p, desc %p.\n", iface
, desc
);
618 if (SUCCEEDED(hr
= IDirectDrawSurface4_GetSurfaceDesc(surface
->parent
, desc
))
619 && surface
->permanent_dc
)
621 desc
->ddsCaps
.dwCaps
|= DDSCAPS_VIDEOMEMORY
;
622 desc
->ddsCaps
.dwCaps
&= ~DDSCAPS_OWNDC
;
628 static HRESULT WINAPI
ddrawex_surface3_GetSurfaceDesc(IDirectDrawSurface3
*iface
, DDSURFACEDESC
*desc
)
630 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
631 DDSURFACEDESC2 ddsd2
;
634 TRACE("iface %p, desc %p.\n", iface
, desc
);
636 memset(&ddsd2
, 0, sizeof(ddsd2
));
637 ddsd2
.dwSize
= sizeof(ddsd2
);
638 hr
= ddrawex_surface4_GetSurfaceDesc(&surface
->IDirectDrawSurface4_iface
, &ddsd2
);
639 DDSD2_to_DDSD(&ddsd2
, desc
);
644 static HRESULT WINAPI
ddrawex_surface4_Initialize(IDirectDrawSurface4
*iface
,
645 IDirectDraw
*ddraw
, DDSURFACEDESC2
*desc
)
647 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
648 IDirectDraw4
*outer_DD4
;
649 IDirectDraw4
*inner_DD4
;
650 IDirectDraw
*inner_DD
;
653 TRACE("iface %p, ddraw %p, desc %p.\n", iface
, ddraw
, desc
);
655 IDirectDraw_QueryInterface(ddraw
, &IID_IDirectDraw4
, (void **)&outer_DD4
);
656 inner_DD4
= dd_get_inner(outer_DD4
);
657 IDirectDraw4_Release(outer_DD4
);
658 IDirectDraw4_QueryInterface(inner_DD4
, &IID_IDirectDraw4
, (void **)&inner_DD
);
659 hr
= IDirectDrawSurface4_Initialize(surface
->parent
, inner_DD
, desc
);
660 IDirectDraw_Release(inner_DD
);
664 static HRESULT WINAPI
ddrawex_surface3_Initialize(IDirectDrawSurface3
*iface
,
665 IDirectDraw
*ddraw
, DDSURFACEDESC
*desc
)
667 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
668 DDSURFACEDESC2 ddsd2
;
670 TRACE("iface %p, ddraw %p, desc %p.\n", iface
, ddraw
, desc
);
672 DDSD_to_DDSD2(desc
, &ddsd2
);
673 return ddrawex_surface4_Initialize(&surface
->IDirectDrawSurface4_iface
, ddraw
, &ddsd2
);
676 static HRESULT WINAPI
ddrawex_surface4_IsLost(IDirectDrawSurface4
*iface
)
678 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
680 TRACE("iface %p.\n", iface
);
682 return IDirectDrawSurface4_IsLost(surface
->parent
);
685 static HRESULT WINAPI
ddrawex_surface3_IsLost(IDirectDrawSurface3
*iface
)
687 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
689 TRACE("iface %p.\n", iface
);
691 return ddrawex_surface4_IsLost(&surface
->IDirectDrawSurface4_iface
);
694 static HRESULT WINAPI
ddrawex_surface4_Lock(IDirectDrawSurface4
*iface
, RECT
*rect
,
695 DDSURFACEDESC2
*desc
, DWORD flags
, HANDLE h
)
697 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
700 TRACE("iface %p, rect %s, desc %p, flags %#x, h %p.\n",
701 iface
, wine_dbgstr_rect(rect
), desc
, flags
, h
);
703 if (SUCCEEDED(hr
= IDirectDrawSurface4_Lock(surface
->parent
, rect
, desc
, flags
, h
))
704 && surface
->permanent_dc
)
706 desc
->ddsCaps
.dwCaps
|= DDSCAPS_VIDEOMEMORY
;
707 desc
->ddsCaps
.dwCaps
&= ~DDSCAPS_OWNDC
;
713 static HRESULT WINAPI
ddrawex_surface3_Lock(IDirectDrawSurface3
*iface
, RECT
*rect
,
714 DDSURFACEDESC
*desc
, DWORD flags
, HANDLE h
)
716 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
717 DDSURFACEDESC2 ddsd2
;
720 TRACE("iface %p, rect %s, desc %p, flags %#x, h %p.\n",
721 iface
, wine_dbgstr_rect(rect
), desc
, flags
, h
);
723 memset(&ddsd2
, 0, sizeof(ddsd2
));
724 ddsd2
.dwSize
= sizeof(ddsd2
);
725 hr
= ddrawex_surface4_Lock(&surface
->IDirectDrawSurface4_iface
, rect
, &ddsd2
, flags
, h
);
726 DDSD2_to_DDSD(&ddsd2
, desc
);
731 static HRESULT WINAPI
ddrawex_surface4_ReleaseDC(IDirectDrawSurface4
*iface
, HDC dc
)
733 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
735 TRACE("iface %p, dc %p.\n", iface
, dc
);
737 if (surface
->permanent_dc
)
739 TRACE("Surface has a permanent DC, not doing anything.\n");
743 return IDirectDrawSurface4_ReleaseDC(surface
->parent
, dc
);
746 static HRESULT WINAPI
ddrawex_surface3_ReleaseDC(IDirectDrawSurface3
*iface
, HDC dc
)
748 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
750 TRACE("iface %p, dc %p.\n", iface
, dc
);
752 return ddrawex_surface4_ReleaseDC(&surface
->IDirectDrawSurface4_iface
, dc
);
755 static HRESULT WINAPI
ddrawex_surface4_Restore(IDirectDrawSurface4
*iface
)
757 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
759 TRACE("iface %p.\n", iface
);
761 return IDirectDrawSurface4_Restore(surface
->parent
);
764 static HRESULT WINAPI
ddrawex_surface3_Restore(IDirectDrawSurface3
*iface
)
766 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
768 TRACE("iface %p.\n", iface
);
770 return ddrawex_surface4_Restore(&surface
->IDirectDrawSurface4_iface
);
773 static HRESULT WINAPI
ddrawex_surface4_SetClipper(IDirectDrawSurface4
*iface
, IDirectDrawClipper
*clipper
)
775 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
777 TRACE("iface %p, clipper %p.\n", iface
, clipper
);
779 return IDirectDrawSurface4_SetClipper(surface
->parent
, clipper
);
782 static HRESULT WINAPI
ddrawex_surface3_SetClipper(IDirectDrawSurface3
*iface
, IDirectDrawClipper
*clipper
)
784 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
786 TRACE("iface %p, clipper %p.\n", iface
, clipper
);
788 return ddrawex_surface4_SetClipper(&surface
->IDirectDrawSurface4_iface
, clipper
);
791 static HRESULT WINAPI
ddrawex_surface4_SetColorKey(IDirectDrawSurface4
*iface
,
792 DWORD flags
, DDCOLORKEY
*color_key
)
794 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
796 TRACE("iface %p, flags %#x, color_key %p.\n", iface
, flags
, color_key
);
798 return IDirectDrawSurface4_SetColorKey(surface
->parent
, flags
, color_key
);
801 static HRESULT WINAPI
ddrawex_surface3_SetColorKey(IDirectDrawSurface3
*iface
,
802 DWORD flags
, DDCOLORKEY
*color_key
)
804 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
806 TRACE("iface %p, flags %#x, color_key %p.\n", iface
, flags
, color_key
);
808 return ddrawex_surface4_SetColorKey(&surface
->IDirectDrawSurface4_iface
, flags
, color_key
);
811 static HRESULT WINAPI
ddrawex_surface4_SetOverlayPosition(IDirectDrawSurface4
*iface
, LONG x
, LONG y
)
813 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
815 TRACE("iface %p, x %d, y %d.\n", iface
, x
, y
);
817 return IDirectDrawSurface4_SetOverlayPosition(surface
->parent
, x
, y
);
820 static HRESULT WINAPI
ddrawex_surface3_SetOverlayPosition(IDirectDrawSurface3
*iface
, LONG x
, LONG y
)
822 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
824 TRACE("iface %p, x %d, y %d.\n", iface
, x
, y
);
826 return ddrawex_surface4_SetOverlayPosition(&surface
->IDirectDrawSurface4_iface
, x
, y
);
829 static HRESULT WINAPI
ddrawex_surface4_SetPalette(IDirectDrawSurface4
*iface
, IDirectDrawPalette
*palette
)
831 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
833 TRACE("iface %p, palette %p.\n", iface
, palette
);
835 return IDirectDrawSurface4_SetPalette(surface
->parent
, palette
);
838 static HRESULT WINAPI
ddrawex_surface3_SetPalette(IDirectDrawSurface3
*iface
, IDirectDrawPalette
*palette
)
840 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
842 TRACE("iface %p, palette %p.\n", iface
, palette
);
844 return ddrawex_surface4_SetPalette(&surface
->IDirectDrawSurface4_iface
, palette
);
847 static HRESULT WINAPI
ddrawex_surface4_Unlock(IDirectDrawSurface4
*iface
, RECT
*rect
)
849 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
851 TRACE("iface %p, rect %s.\n", iface
, wine_dbgstr_rect(rect
));
853 return IDirectDrawSurface4_Unlock(surface
->parent
, rect
);
856 static HRESULT WINAPI
ddrawex_surface3_Unlock(IDirectDrawSurface3
*iface
, void *data
)
858 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
860 TRACE("iface %p, data %p.\n", iface
, data
);
862 return ddrawex_surface4_Unlock(&surface
->IDirectDrawSurface4_iface
, NULL
);
865 static HRESULT WINAPI
ddrawex_surface4_UpdateOverlay(IDirectDrawSurface4
*iface
, RECT
*src_rect
,
866 IDirectDrawSurface4
*dst_surface
, RECT
*dst_rect
, DWORD flags
, DDOVERLAYFX
*fx
)
868 struct ddrawex_surface
*src_impl
= impl_from_IDirectDrawSurface4(iface
);
869 struct ddrawex_surface
*dst_impl
= unsafe_impl_from_IDirectDrawSurface4(dst_surface
);
871 TRACE("iface %p, src_rect %s, dst_surface %p, dst_rect %s, flags %#x, fx %p.\n",
872 iface
, wine_dbgstr_rect(src_rect
), dst_surface
, wine_dbgstr_rect(dst_rect
), flags
, fx
);
874 return IDirectDrawSurface4_UpdateOverlay(src_impl
->parent
, src_rect
,
875 dst_impl
? dst_impl
->parent
: NULL
, dst_rect
, flags
, fx
);
878 static HRESULT WINAPI
ddrawex_surface3_UpdateOverlay(IDirectDrawSurface3
*iface
, RECT
*src_rect
,
879 IDirectDrawSurface3
*dst_surface
, RECT
*dst_rect
, DWORD flags
, DDOVERLAYFX
*fx
)
881 struct ddrawex_surface
*src_impl
= impl_from_IDirectDrawSurface3(iface
);
882 struct ddrawex_surface
*dst_impl
= unsafe_impl_from_IDirectDrawSurface3(dst_surface
);
884 TRACE("iface %p, src_rect %s, dst_surface %p, dst_rect %s, flags %#x, fx %p.\n",
885 iface
, wine_dbgstr_rect(src_rect
), dst_surface
, wine_dbgstr_rect(dst_rect
), flags
, fx
);
887 return ddrawex_surface4_UpdateOverlay(&src_impl
->IDirectDrawSurface4_iface
, src_rect
,
888 dst_impl
? &dst_impl
->IDirectDrawSurface4_iface
: NULL
, dst_rect
, flags
, fx
);
891 static HRESULT WINAPI
ddrawex_surface4_UpdateOverlayDisplay(IDirectDrawSurface4
*iface
, DWORD flags
)
893 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
895 TRACE("iface %p, flags %#x.\n", iface
, flags
);
897 return IDirectDrawSurface4_UpdateOverlayDisplay(surface
->parent
, flags
);
900 static HRESULT WINAPI
ddrawex_surface3_UpdateOverlayDisplay(IDirectDrawSurface3
*iface
, DWORD flags
)
902 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
904 TRACE("iface %p, flags %#x.\n", iface
, flags
);
906 return ddrawex_surface4_UpdateOverlayDisplay(&surface
->IDirectDrawSurface4_iface
, flags
);
909 static HRESULT WINAPI
ddrawex_surface4_UpdateOverlayZOrder(IDirectDrawSurface4
*iface
,
910 DWORD flags
, IDirectDrawSurface4
*reference
)
912 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
913 struct ddrawex_surface
*reference_impl
= unsafe_impl_from_IDirectDrawSurface4(reference
);
915 TRACE("iface %p, flags %#x, reference %p.\n", iface
, flags
, reference
);
917 return IDirectDrawSurface4_UpdateOverlayZOrder(surface
->parent
,
918 flags
, reference_impl
? reference_impl
->parent
: NULL
);
921 static HRESULT WINAPI
ddrawex_surface3_UpdateOverlayZOrder(IDirectDrawSurface3
*iface
,
922 DWORD flags
, IDirectDrawSurface3
*reference
)
924 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
925 struct ddrawex_surface
*reference_impl
= unsafe_impl_from_IDirectDrawSurface3(reference
);
927 TRACE("iface %p, flags %#x, reference %p.\n", iface
, flags
, reference
);
929 return ddrawex_surface4_UpdateOverlayZOrder(&surface
->IDirectDrawSurface4_iface
,
930 flags
, reference_impl
? &reference_impl
->IDirectDrawSurface4_iface
: NULL
);
933 static HRESULT WINAPI
ddrawex_surface4_GetDDInterface(IDirectDrawSurface4
*iface
, void **ddraw
)
935 FIXME("iface %p, ddraw %p stub!\n", iface
, ddraw
);
937 /* This has to be implemented in ddrawex, ddraw's interface can't be used
938 * because it is pretty hard to tell which version of the ddraw interface
945 static HRESULT WINAPI
ddrawex_surface3_GetDDInterface(IDirectDrawSurface3
*iface
, void **ddraw
)
947 FIXME("iface %p, ddraw %p stub!\n", iface
, ddraw
);
949 /* A thunk it pretty pointless for the same reason that relaying to
950 * ddraw.dll works badly. */
956 static HRESULT WINAPI
ddrawex_surface4_PageLock(IDirectDrawSurface4
*iface
, DWORD flags
)
958 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
960 TRACE("iface %p, flags %#x.\n", iface
, flags
);
962 return IDirectDrawSurface4_PageLock(surface
->parent
, flags
);
965 static HRESULT WINAPI
ddrawex_surface3_PageLock(IDirectDrawSurface3
*iface
, DWORD flags
)
967 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
969 TRACE("iface %p, flags %#x.\n", iface
, flags
);
971 return ddrawex_surface4_PageLock(&surface
->IDirectDrawSurface4_iface
, flags
);
974 static HRESULT WINAPI
ddrawex_surface4_PageUnlock(IDirectDrawSurface4
*iface
, DWORD flags
)
976 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
978 TRACE("iface %p, flags %#x.\n", iface
, flags
);
980 return IDirectDrawSurface4_PageUnlock(surface
->parent
, flags
);
983 static HRESULT WINAPI
ddrawex_surface3_PageUnlock(IDirectDrawSurface3
*iface
, DWORD flags
)
985 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
987 TRACE("iface %p, flags %#x.\n", iface
, flags
);
989 return ddrawex_surface4_PageUnlock(&surface
->IDirectDrawSurface4_iface
, flags
);
992 static HRESULT WINAPI
ddrawex_surface4_SetSurfaceDesc(IDirectDrawSurface4
*iface
,
993 DDSURFACEDESC2
*desc
, DWORD flags
)
995 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
997 TRACE("iface %p, desc %p, flags %#x.\n", iface
, desc
, flags
);
999 return IDirectDrawSurface4_SetSurfaceDesc(surface
->parent
, desc
, flags
);
1002 static HRESULT WINAPI
ddrawex_surface3_SetSurfaceDesc(IDirectDrawSurface3
*iface
,
1003 DDSURFACEDESC
*desc
, DWORD flags
)
1005 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface3(iface
);
1006 DDSURFACEDESC2 ddsd
;
1008 TRACE("iface %p, desc %p, flags %#x.\n", iface
, desc
, flags
);
1010 DDSD_to_DDSD2(desc
, &ddsd
);
1011 return ddrawex_surface4_SetSurfaceDesc(&surface
->IDirectDrawSurface4_iface
, &ddsd
, flags
);
1014 static HRESULT WINAPI
ddrawex_surface4_SetPrivateData(IDirectDrawSurface4
*iface
,
1015 REFGUID tag
, void *data
, DWORD data_size
, DWORD flags
)
1017 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
1019 TRACE("iface %p, tag %s, data %p, data_size %u, flags %#x.\n",
1020 iface
, debugstr_guid(tag
), data
, data_size
, flags
);
1022 /* To completely avoid this we'd have to clone the private data API in
1024 if (IsEqualGUID(&IID_DDrawexPriv
, tag
))
1025 FIXME("Application uses ddrawex's private GUID.\n");
1027 return IDirectDrawSurface4_SetPrivateData(surface
->parent
, tag
, data
, data_size
, flags
);
1030 static HRESULT WINAPI
ddrawex_surface4_GetPrivateData(IDirectDrawSurface4
*iface
,
1031 REFGUID tag
, void *data
, DWORD
*data_size
)
1033 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
1035 TRACE("iface %p, tag %s, data %p, data_size %p.\n",
1036 iface
, debugstr_guid(tag
), data
, data_size
);
1038 /* To completely avoid this we'd have to clone the private data API in
1040 if (IsEqualGUID(&IID_DDrawexPriv
, tag
))
1041 FIXME("Application uses ddrawex's private GUID.\n");
1043 return IDirectDrawSurface4_GetPrivateData(surface
->parent
, tag
, data
, data_size
);
1046 static HRESULT WINAPI
ddrawex_surface4_FreePrivateData(IDirectDrawSurface4
*iface
, REFGUID tag
)
1048 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
1050 TRACE("iface %p, tag %s.\n", iface
, debugstr_guid(tag
));
1052 /* To completely avoid this we'd have to clone the private data API in
1054 if (IsEqualGUID(&IID_DDrawexPriv
, tag
))
1055 FIXME("Application uses ddrawex's private GUID.\n");
1057 return IDirectDrawSurface4_FreePrivateData(surface
->parent
, tag
);
1060 static HRESULT WINAPI
ddrawex_surface4_GetUniquenessValue(IDirectDrawSurface4
*iface
, DWORD
*value
)
1062 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
1064 TRACE("iface %p, value %p.\n", iface
, value
);
1066 return IDirectDrawSurface4_GetUniquenessValue(surface
->parent
, value
);
1069 static HRESULT WINAPI
ddrawex_surface4_ChangeUniquenessValue(IDirectDrawSurface4
*iface
)
1071 struct ddrawex_surface
*surface
= impl_from_IDirectDrawSurface4(iface
);
1073 TRACE("iface %p.\n", iface
);
1075 return IDirectDrawSurface4_ChangeUniquenessValue(surface
->parent
);
1078 static const IDirectDrawSurface3Vtbl ddrawex_surface3_vtbl
=
1080 ddrawex_surface3_QueryInterface
,
1081 ddrawex_surface3_AddRef
,
1082 ddrawex_surface3_Release
,
1083 ddrawex_surface3_AddAttachedSurface
,
1084 ddrawex_surface3_AddOverlayDirtyRect
,
1085 ddrawex_surface3_Blt
,
1086 ddrawex_surface3_BltBatch
,
1087 ddrawex_surface3_BltFast
,
1088 ddrawex_surface3_DeleteAttachedSurface
,
1089 ddrawex_surface3_EnumAttachedSurfaces
,
1090 ddrawex_surface3_EnumOverlayZOrders
,
1091 ddrawex_surface3_Flip
,
1092 ddrawex_surface3_GetAttachedSurface
,
1093 ddrawex_surface3_GetBltStatus
,
1094 ddrawex_surface3_GetCaps
,
1095 ddrawex_surface3_GetClipper
,
1096 ddrawex_surface3_GetColorKey
,
1097 ddrawex_surface3_GetDC
,
1098 ddrawex_surface3_GetFlipStatus
,
1099 ddrawex_surface3_GetOverlayPosition
,
1100 ddrawex_surface3_GetPalette
,
1101 ddrawex_surface3_GetPixelFormat
,
1102 ddrawex_surface3_GetSurfaceDesc
,
1103 ddrawex_surface3_Initialize
,
1104 ddrawex_surface3_IsLost
,
1105 ddrawex_surface3_Lock
,
1106 ddrawex_surface3_ReleaseDC
,
1107 ddrawex_surface3_Restore
,
1108 ddrawex_surface3_SetClipper
,
1109 ddrawex_surface3_SetColorKey
,
1110 ddrawex_surface3_SetOverlayPosition
,
1111 ddrawex_surface3_SetPalette
,
1112 ddrawex_surface3_Unlock
,
1113 ddrawex_surface3_UpdateOverlay
,
1114 ddrawex_surface3_UpdateOverlayDisplay
,
1115 ddrawex_surface3_UpdateOverlayZOrder
,
1116 ddrawex_surface3_GetDDInterface
,
1117 ddrawex_surface3_PageLock
,
1118 ddrawex_surface3_PageUnlock
,
1119 ddrawex_surface3_SetSurfaceDesc
,
1122 static const IDirectDrawSurface4Vtbl ddrawex_surface4_vtbl
=
1124 ddrawex_surface4_QueryInterface
,
1125 ddrawex_surface4_AddRef
,
1126 ddrawex_surface4_Release
,
1127 ddrawex_surface4_AddAttachedSurface
,
1128 ddrawex_surface4_AddOverlayDirtyRect
,
1129 ddrawex_surface4_Blt
,
1130 ddrawex_surface4_BltBatch
,
1131 ddrawex_surface4_BltFast
,
1132 ddrawex_surface4_DeleteAttachedSurface
,
1133 ddrawex_surface4_EnumAttachedSurfaces
,
1134 ddrawex_surface4_EnumOverlayZOrders
,
1135 ddrawex_surface4_Flip
,
1136 ddrawex_surface4_GetAttachedSurface
,
1137 ddrawex_surface4_GetBltStatus
,
1138 ddrawex_surface4_GetCaps
,
1139 ddrawex_surface4_GetClipper
,
1140 ddrawex_surface4_GetColorKey
,
1141 ddrawex_surface4_GetDC
,
1142 ddrawex_surface4_GetFlipStatus
,
1143 ddrawex_surface4_GetOverlayPosition
,
1144 ddrawex_surface4_GetPalette
,
1145 ddrawex_surface4_GetPixelFormat
,
1146 ddrawex_surface4_GetSurfaceDesc
,
1147 ddrawex_surface4_Initialize
,
1148 ddrawex_surface4_IsLost
,
1149 ddrawex_surface4_Lock
,
1150 ddrawex_surface4_ReleaseDC
,
1151 ddrawex_surface4_Restore
,
1152 ddrawex_surface4_SetClipper
,
1153 ddrawex_surface4_SetColorKey
,
1154 ddrawex_surface4_SetOverlayPosition
,
1155 ddrawex_surface4_SetPalette
,
1156 ddrawex_surface4_Unlock
,
1157 ddrawex_surface4_UpdateOverlay
,
1158 ddrawex_surface4_UpdateOverlayDisplay
,
1159 ddrawex_surface4_UpdateOverlayZOrder
,
1160 ddrawex_surface4_GetDDInterface
,
1161 ddrawex_surface4_PageLock
,
1162 ddrawex_surface4_PageUnlock
,
1163 ddrawex_surface4_SetSurfaceDesc
,
1164 ddrawex_surface4_SetPrivateData
,
1165 ddrawex_surface4_GetPrivateData
,
1166 ddrawex_surface4_FreePrivateData
,
1167 ddrawex_surface4_GetUniquenessValue
,
1168 ddrawex_surface4_ChangeUniquenessValue
,
1171 static struct ddrawex_surface
*unsafe_impl_from_IDirectDrawSurface3(IDirectDrawSurface3
*iface
)
1173 if (!iface
|| iface
->lpVtbl
!= &ddrawex_surface3_vtbl
)
1175 return impl_from_IDirectDrawSurface3(iface
);
1178 struct ddrawex_surface
*unsafe_impl_from_IDirectDrawSurface4(IDirectDrawSurface4
*iface
)
1180 if (!iface
|| iface
->lpVtbl
!= &ddrawex_surface4_vtbl
)
1182 return impl_from_IDirectDrawSurface4(iface
);
1187 * Given a surface from ddraw.dll it retrieves the pointer to the ddrawex.dll wrapper around it
1190 * inner: ddraw.dll surface to retrieve the outer surface from
1193 * The surface wrapper. If there is none yet, a new one is created
1195 IDirectDrawSurface4
*dds_get_outer(IDirectDrawSurface4
*inner
)
1197 IDirectDrawSurface4
*outer
= NULL
;
1198 DWORD size
= sizeof(outer
);
1200 if(!inner
) return NULL
;
1202 hr
= IDirectDrawSurface4_GetPrivateData(inner
,
1206 if(FAILED(hr
) || outer
== NULL
)
1208 struct ddrawex_surface
*impl
;
1210 TRACE("Creating new ddrawex surface wrapper for surface %p\n", inner
);
1211 impl
= heap_alloc_zero(sizeof(*impl
));
1213 impl
->IDirectDrawSurface3_iface
.lpVtbl
= &ddrawex_surface3_vtbl
;
1214 impl
->IDirectDrawSurface4_iface
.lpVtbl
= &ddrawex_surface4_vtbl
;
1215 IDirectDrawSurface4_AddRef(inner
);
1216 impl
->parent
= inner
;
1218 outer
= &impl
->IDirectDrawSurface4_iface
;
1220 hr
= IDirectDrawSurface4_SetPrivateData(inner
,
1227 ERR("IDirectDrawSurface4_SetPrivateData failed\n");
1234 HRESULT
prepare_permanent_dc(IDirectDrawSurface4
*iface
)
1236 struct ddrawex_surface
*surface
= unsafe_impl_from_IDirectDrawSurface4(iface
);
1239 surface
->permanent_dc
= TRUE
;
1240 if (FAILED(hr
= IDirectDrawSurface4_GetDC(surface
->parent
, &surface
->hdc
)))
1242 return IDirectDrawSurface4_ReleaseDC(surface
->parent
, surface
->hdc
);