1 /* DirectDraw IDirectDraw interface (generic)
3 * Copyright 1997-2000 Marcus Meissner
4 * Copyright 1998-2000 Lionel Ulmer (most of Direct3D stuff)
5 * Copyright 2000-2001 TransGaming Technologies Inc.
7 * This library is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU Lesser General Public
9 * License as published by the Free Software Foundation; either
10 * version 2.1 of the License, or (at your option) any later version.
12 * This library is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15 * Lesser General Public License for more details.
17 * You should have received a copy of the GNU Lesser General Public
18 * License along with this library; if not, write to the Free Software
19 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
23 * This file contains all the interface functions that are shared between
24 * all interfaces. Or better, it is a "common stub" library for the
25 * IDirectDraw* objects
29 #include "wine/port.h"
37 #include "wine/debug.h"
39 #include "ddraw_private.h"
40 #include "ddraw/main.h"
41 #include "dclipper/main.h"
42 #include "dpalette/main.h"
43 #include "dsurface/main.h"
44 #include "dsurface/dib.h"
45 #include "dsurface/fakezbuffer.h"
47 WINE_DEFAULT_DEBUG_CHANNEL(ddraw);
49 extern ICOM_VTABLE(IDirectDraw) DDRAW_IDirectDraw_VTable;
50 extern ICOM_VTABLE(IDirectDraw2) DDRAW_IDirectDraw2_VTable;
51 extern ICOM_VTABLE(IDirectDraw4) DDRAW_IDirectDraw4_VTable;
53 static void DDRAW_UnsubclassWindow(IDirectDrawImpl* This);
55 static void Main_DirectDraw_DeleteSurfaces(IDirectDrawImpl* This);
56 static void Main_DirectDraw_DeleteClippers(IDirectDrawImpl* This);
57 static void Main_DirectDraw_DeletePalettes(IDirectDrawImpl* This);
58 static void LosePrimarySurface(IDirectDrawImpl* This);
60 static const char ddProp[] = "WINE_DDRAW_Property";
62 /* Not called from the vtable. */
63 HRESULT Main_DirectDraw_Construct(IDirectDrawImpl *This, BOOL ex)
65 /* NOTE: The creator must use HEAP_ZERO_MEMORY or equivalent. */
69 if (ex) This->local.dwLocalFlags |= DDRAWILCL_DIRECTDRAW7;
70 This->local.dwProcessId = GetCurrentProcessId();
72 This->final_release = Main_DirectDraw_final_release;
74 This->create_palette = Main_DirectDrawPalette_Create;
76 This->create_offscreen = Main_create_offscreen;
77 This->create_texture = Main_create_texture;
78 This->create_zbuffer = Main_create_zbuffer;
79 /* There are no generic versions of create_{primary,backbuffer}. */
81 ICOM_INIT_INTERFACE(This, IDirectDraw, DDRAW_IDirectDraw_VTable);
82 ICOM_INIT_INTERFACE(This, IDirectDraw2, DDRAW_IDirectDraw2_VTable);
83 ICOM_INIT_INTERFACE(This, IDirectDraw4, DDRAW_IDirectDraw4_VTable);
84 /* There is no generic implementation of IDD7 */
89 void Main_DirectDraw_final_release(IDirectDrawImpl* This)
91 if (IsWindow(This->window))
93 if (GetPropA(This->window, ddProp))
94 DDRAW_UnsubclassWindow(This);
96 FIXME("this shouldn't happen, right?\n");
99 Main_DirectDraw_DeleteSurfaces(This);
100 Main_DirectDraw_DeleteClippers(This);
101 Main_DirectDraw_DeletePalettes(This);
102 if (This->local.lpGbl && This->local.lpGbl->lpExclusiveOwner == &This->local)
104 This->local.lpGbl->lpExclusiveOwner = NULL;
105 if (This->set_exclusive_mode)
106 This->set_exclusive_mode(This, FALSE);
110 /* There is no Main_DirectDraw_Create. */
112 ULONG WINAPI Main_DirectDraw_AddRef(LPDIRECTDRAW7 iface) {
113 ICOM_THIS(IDirectDrawImpl,iface);
114 TRACE("(%p)->() incrementing from %lu.\n", This, This->ref );
119 ULONG WINAPI Main_DirectDraw_Release(LPDIRECTDRAW7 iface) {
121 ICOM_THIS(IDirectDrawImpl,iface);
122 TRACE("(%p)->() decrementing from %lu.\n", This, This->ref );
128 if (This->final_release != NULL)
129 This->final_release(This);
131 /* We free the private. This is an artifact of the fact that I don't
132 * have the destructors set up correctly. */
133 if (This->private != (This+1))
134 HeapFree(GetProcessHeap(), 0, This->private);
136 HeapFree(GetProcessHeap(), 0, This);
142 /* TODO: need to support IDirect3D. */
143 HRESULT WINAPI Main_DirectDraw_QueryInterface(
144 LPDIRECTDRAW7 iface,REFIID refiid,LPVOID *obj
146 ICOM_THIS(IDirectDrawImpl,iface);
147 TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(refiid), obj);
149 if ( IsEqualGUID( &IID_IUnknown, refiid )
150 || IsEqualGUID( &IID_IDirectDraw7, refiid ) )
152 *obj = ICOM_INTERFACE(This, IDirectDraw7);
154 else if ( IsEqualGUID( &IID_IDirectDraw, refiid ) )
156 *obj = ICOM_INTERFACE(This, IDirectDraw);
158 else if ( IsEqualGUID( &IID_IDirectDraw2, refiid ) )
160 *obj = ICOM_INTERFACE(This, IDirectDraw2);
162 else if ( IsEqualGUID( &IID_IDirectDraw4, refiid ) )
164 *obj = ICOM_INTERFACE(This, IDirectDraw4);
167 else if ( IsEqualGUID( &IID_IDirect3D3, refiid ) )
169 return create_direct3d3(obj, This);
171 else if ( IsEqualGUID( &IID_IDirect3D2, refiid ) )
173 return create_direct3d2(obj, This);
175 else if ( IsEqualGUID( &IID_IDirect3D, refiid ) )
177 return create_direct3d(obj, This);
182 FIXME("(%p)->(%s,%p): no interface\n",This,debugstr_guid(refiid),obj);
183 return E_NOINTERFACE;
186 IDirectDraw7_AddRef(iface);
190 /* MSDN: "not currently implemented". */
191 HRESULT WINAPI Main_DirectDraw_Compact(LPDIRECTDRAW7 iface)
193 TRACE("(%p)\n", iface);
198 HRESULT WINAPI Main_DirectDraw_CreateClipper(LPDIRECTDRAW7 iface,
200 LPDIRECTDRAWCLIPPER *ppClipper,
203 ICOM_THIS(IDirectDrawImpl, iface);
206 TRACE("(%p)->(0x%lx, %p, %p)\n", iface, dwFlags, ppClipper, pUnkOuter);
208 hr = DirectDrawCreateClipper(dwFlags, ppClipper, pUnkOuter);
209 if (FAILED(hr)) return hr;
211 /* dwFlags is passed twice, apparently an API wart. */
212 hr = IDirectDrawClipper_Initialize(*ppClipper,
213 ICOM_INTERFACE(This, IDirectDraw),
217 IDirectDrawClipper_Release(*ppClipper);
225 Main_DirectDraw_CreatePalette(LPDIRECTDRAW7 iface, DWORD dwFlags,
226 LPPALETTEENTRY palent,
227 LPDIRECTDRAWPALETTE* ppPalette,
230 ICOM_THIS(IDirectDrawImpl,iface);
231 LPDIRECTDRAWPALETTE pPalette;
234 TRACE("(%p)->(%08lx,%p,%p,%p)\n",This,dwFlags,palent,ppPalette,pUnknown);
236 if (ppPalette == NULL) return E_POINTER; /* unchecked */
237 if (pUnknown != NULL) return CLASS_E_NOAGGREGATION; /* unchecked */
239 hr = This->create_palette(This, dwFlags, &pPalette, pUnknown);
240 if (FAILED(hr)) return hr;
242 hr = IDirectDrawPalette_SetEntries(pPalette, 0, 0,
243 Main_DirectDrawPalette_Size(dwFlags),
247 IDirectDrawPalette_Release(pPalette);
252 *ppPalette = pPalette;
258 Main_create_offscreen(IDirectDrawImpl* This, const DDSURFACEDESC2* pDDSD,
259 LPDIRECTDRAWSURFACE7* ppSurf, LPUNKNOWN pOuter)
261 assert(pOuter == NULL);
263 return DIB_DirectDrawSurface_Create(This, pDDSD, ppSurf, pOuter);
267 Main_create_texture(IDirectDrawImpl* This, const DDSURFACEDESC2* pDDSD,
268 LPDIRECTDRAWSURFACE7* ppSurf, LPUNKNOWN pOuter,
271 assert(pOuter == NULL);
273 return DIB_DirectDrawSurface_Create(This, pDDSD, ppSurf, pOuter);
277 Main_create_zbuffer(IDirectDrawImpl* This, const DDSURFACEDESC2* pDDSD,
278 LPDIRECTDRAWSURFACE7* ppSurf, LPUNKNOWN pOuter)
280 assert(pOuter == NULL);
282 return FakeZBuffer_DirectDrawSurface_Create(This, pDDSD, ppSurf, pOuter);
285 /* Does the texture surface described in pDDSD have any smaller mipmaps? */
286 static BOOL more_mipmaps(const DDSURFACEDESC2 *pDDSD)
288 return ((pDDSD->dwFlags & DDSD_MIPMAPCOUNT) && pDDSD->u2.dwMipMapCount > 1
289 && (pDDSD->dwWidth > 1 || pDDSD->dwHeight > 1));
292 /* Create a texture surface along with any of its mipmaps. */
294 create_texture(IDirectDrawImpl* This, const DDSURFACEDESC2 *pDDSD,
295 LPDIRECTDRAWSURFACE7* ppSurf, LPUNKNOWN pUnkOuter)
298 DWORD mipmap_level = 0;
301 assert(pUnkOuter == NULL);
303 /* is this check right? (pixelformat can be copied from primary) */
304 if ((pDDSD->dwFlags&(DDSD_HEIGHT|DDSD_WIDTH)) != (DDSD_HEIGHT|DDSD_WIDTH))
305 return DDERR_INVALIDPARAMS;
307 ddsd.dwSize = sizeof(ddsd);
308 DD_STRUCT_COPY_BYSIZE((&ddsd),pDDSD);
310 if (!(ddsd.dwFlags & DDSD_PIXELFORMAT))
312 ddsd.u4.ddpfPixelFormat = This->pixelformat;
315 if (!(ddsd.dwFlags & DDSD_PITCH))
317 ddsd.u1.lPitch = DDRAW_width_bpp_to_pitch(ddsd.dwWidth,
321 ddsd.dwFlags |= DDSD_PITCH | DDSD_PIXELFORMAT;
323 hr = This->create_texture(This, &ddsd, ppSurf, pUnkOuter, mipmap_level);
324 if (FAILED(hr)) return hr;
326 /* Create attached mipmaps if required. */
327 if (more_mipmaps(&ddsd))
329 LPDIRECTDRAWSURFACE7 mipmap;
330 LPDIRECTDRAWSURFACE7 prev_mipmap;
331 DDSURFACEDESC2 mipmap_surface_desc;
333 prev_mipmap = *ppSurf;
334 IDirectDrawSurface7_AddRef(prev_mipmap);
335 mipmap_surface_desc = ddsd;
336 mipmap_surface_desc.ddsCaps.dwCaps2 |= DDSCAPS2_MIPMAPSUBLEVEL;
338 while (more_mipmaps(&mipmap_surface_desc))
342 mipmap_surface_desc.u2.dwMipMapCount--;
344 if (mipmap_surface_desc.dwWidth > 1)
345 mipmap_surface_desc.dwWidth /= 2;
347 if (mipmap_surface_desc.dwHeight > 1)
348 mipmap_surface_desc.dwHeight /= 2;
350 mipmap_surface_desc.u1.lPitch
351 = DDRAW_width_bpp_to_pitch(mipmap_surface_desc.dwWidth,
354 hr = This->create_texture(This, &mipmap_surface_desc, &mipmap,
355 pUnkOuter, mipmap_level);
358 IDirectDrawSurface7_Release(prev_mipmap);
359 IDirectDrawSurface7_Release(*ppSurf);
363 IDirectDrawSurface7_AddAttachedSurface(prev_mipmap, mipmap);
364 IDirectDrawSurface7_Release(prev_mipmap);
365 prev_mipmap = mipmap;
368 IDirectDrawSurface7_Release(prev_mipmap);
374 /* Creates a primary surface and any indicated backbuffers. */
376 create_primary(IDirectDrawImpl* This, LPDDSURFACEDESC2 pDDSD,
377 LPDIRECTDRAWSURFACE7* ppSurf, LPUNKNOWN pUnkOuter)
382 assert(pUnkOuter == NULL);
384 if (This->primary_surface != NULL)
385 return DDERR_PRIMARYSURFACEALREADYEXISTS;
387 /* as documented (what about pitch?) */
388 if (pDDSD->dwFlags & (DDSD_HEIGHT|DDSD_WIDTH|DDSD_PIXELFORMAT))
389 return DDERR_INVALIDPARAMS;
391 ddsd.dwSize = sizeof(ddsd);
392 DD_STRUCT_COPY_BYSIZE((&ddsd),pDDSD);
393 ddsd.dwFlags |= DDSD_HEIGHT | DDSD_WIDTH | DDSD_PITCH | DDSD_PIXELFORMAT;
394 ddsd.dwHeight = This->height;
395 ddsd.dwWidth = This->width;
396 ddsd.u1.lPitch = This->pitch;
397 ddsd.u4.ddpfPixelFormat = This->pixelformat;
398 ddsd.ddsCaps.dwCaps |= DDSCAPS_LOCALVIDMEM | DDSCAPS_VIDEOMEMORY
399 | DDSCAPS_VISIBLE | DDSCAPS_FRONTBUFFER;
401 if ((ddsd.dwFlags & DDSD_BACKBUFFERCOUNT) && ddsd.dwBackBufferCount > 0)
402 ddsd.ddsCaps.dwCaps |= DDSCAPS_FLIP;
404 hr = This->create_primary(This, &ddsd, ppSurf, pUnkOuter);
405 if (FAILED(hr)) return hr;
407 if (ddsd.dwFlags & DDSD_BACKBUFFERCOUNT)
409 IDirectDrawSurfaceImpl* primary;
410 LPDIRECTDRAWSURFACE7 pPrev;
413 ddsd.dwFlags &= ~DDSD_BACKBUFFERCOUNT;
414 ddsd.ddsCaps.dwCaps &= ~(DDSCAPS_VISIBLE | DDSCAPS_PRIMARYSURFACE
415 | DDSCAPS_BACKBUFFER);
417 primary = ICOM_OBJECT(IDirectDrawSurfaceImpl,IDirectDrawSurface7,
420 IDirectDrawSurface7_AddRef(pPrev);
422 for (i=0; i < ddsd.dwBackBufferCount; i++)
424 LPDIRECTDRAWSURFACE7 pBack;
427 ddsd.ddsCaps.dwCaps |= DDSCAPS_BACKBUFFER;
429 ddsd.ddsCaps.dwCaps &= ~DDSCAPS_BACKBUFFER;
431 hr = This->create_backbuffer(This, &ddsd, &pBack, pUnkOuter,
436 IDirectDraw7_Release(pPrev);
437 IDirectDraw7_Release(*ppSurf);
441 IDirectDrawSurface7_AddAttachedSurface(pPrev, pBack);
442 IDirectDrawSurface7_Release(pPrev);
446 IDirectDrawSurface7_Release(pPrev);
449 This->primary_surface = (IDirectDrawSurfaceImpl *)*ppSurf;
455 create_offscreen(IDirectDrawImpl* This, LPDDSURFACEDESC2 pDDSD,
456 LPDIRECTDRAWSURFACE7* ppSurf, LPUNKNOWN pUnkOuter)
461 /* is this check right? (pixelformat can be copied from primary) */
462 if ((pDDSD->dwFlags&(DDSD_HEIGHT|DDSD_WIDTH)) != (DDSD_HEIGHT|DDSD_WIDTH))
463 return DDERR_INVALIDPARAMS;
465 ddsd.dwSize = sizeof(ddsd);
466 DD_STRUCT_COPY_BYSIZE((&ddsd),pDDSD);
468 if (!(ddsd.dwFlags & DDSD_PIXELFORMAT))
470 ddsd.u4.ddpfPixelFormat = This->pixelformat;
473 if (!(ddsd.dwFlags & DDSD_PITCH))
475 ddsd.u1.lPitch = DDRAW_width_bpp_to_pitch(ddsd.dwWidth,
479 ddsd.dwFlags |= DDSD_PITCH | DDSD_PIXELFORMAT;
481 hr = This->create_offscreen(This, &ddsd, ppSurf, pUnkOuter);
482 if (FAILED(hr)) return hr;
488 Main_DirectDraw_CreateSurface(LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD,
489 LPDIRECTDRAWSURFACE7 *ppSurf,
493 ICOM_THIS(IDirectDrawImpl, iface);
495 TRACE("(%p)->(%p,%p,%p)\n",This,pDDSD,ppSurf,pUnkOuter);
496 TRACE("Requested Caps: 0x%lx\n", pDDSD->ddsCaps.dwCaps);
498 if (pUnkOuter != NULL) {
499 FIXME("outer != NULL?\n");
500 return CLASS_E_NOAGGREGATION; /* unchecked */
503 if (!(pDDSD->dwFlags & DDSD_CAPS)) {
504 /* DVIDEO.DLL does forget the DDSD_CAPS flag ... *sigh* */
505 pDDSD->dwFlags |= DDSD_CAPS;
508 if (ppSurf == NULL) {
509 FIXME("You want to get back a surface? Don't give NULL ptrs!\n");
510 return E_POINTER; /* unchecked */
513 if (pDDSD->ddsCaps.dwCaps & DDSCAPS_PRIMARYSURFACE)
515 /* create primary surface & backbuffers */
516 hr = create_primary(This, pDDSD, ppSurf, pUnkOuter);
518 else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_BACKBUFFER)
520 /* create backbuffer surface */
521 hr = This->create_backbuffer(This, pDDSD, ppSurf, pUnkOuter, NULL);
523 else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_OFFSCREENPLAIN)
525 /* create offscreenplain surface */
526 hr = create_offscreen(This, pDDSD, ppSurf, pUnkOuter);
528 else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_ZBUFFER)
530 /* create z-buffer */
531 hr = This->create_zbuffer(This, pDDSD, ppSurf, pUnkOuter);
533 else if (pDDSD->ddsCaps.dwCaps & DDSCAPS_TEXTURE)
536 hr = create_texture(This, pDDSD, ppSurf, pUnkOuter);
540 /* Otherwise, assume offscreenplain surface */
541 FIXME("App didn't request a valid surface type - assuming offscreenplain\n");
542 hr = create_offscreen(This, pDDSD, ppSurf, pUnkOuter);
546 FIXME("failed surface creation with code 0x%08lx\n",hr);
554 Main_DirectDraw_DuplicateSurface(LPDIRECTDRAW7 iface, LPDIRECTDRAWSURFACE7 src,
555 LPDIRECTDRAWSURFACE7* dst)
557 ICOM_THIS(IDirectDrawImpl,iface);
559 IDirectDrawSurfaceImpl *pSrc = ICOM_OBJECT(IDirectDrawSurfaceImpl,
560 IDirectDrawSurface7, src);
562 TRACE("(%p)->(%p,%p)\n",This,src,dst);
564 return pSrc->duplicate_surface(pSrc, dst);
567 /* EnumDisplayModes */
569 BOOL Main_DirectDraw_DDPIXELFORMAT_Match(const DDPIXELFORMAT *requested,
570 const DDPIXELFORMAT *provided)
572 /* Some flags must be present in both or neither for a match. */
573 static const DWORD must_match = DDPF_PALETTEINDEXED1 | DDPF_PALETTEINDEXED2
574 | DDPF_PALETTEINDEXED4 | DDPF_PALETTEINDEXED8 | DDPF_FOURCC
575 | DDPF_ZBUFFER | DDPF_STENCILBUFFER;
577 if ((requested->dwFlags & provided->dwFlags) != requested->dwFlags)
580 if ((requested->dwFlags & must_match) != (provided->dwFlags & must_match))
583 if (requested->dwFlags & DDPF_FOURCC)
584 if (requested->dwFourCC != provided->dwFourCC)
587 if (requested->dwFlags & (DDPF_RGB|DDPF_YUV|DDPF_ZBUFFER|DDPF_ALPHA
588 |DDPF_LUMINANCE|DDPF_BUMPDUDV))
589 if (requested->u1.dwRGBBitCount != provided->u1.dwRGBBitCount)
592 if (requested->dwFlags & (DDPF_RGB|DDPF_YUV|DDPF_STENCILBUFFER
593 |DDPF_LUMINANCE|DDPF_BUMPDUDV))
594 if (requested->u2.dwRBitMask != provided->u2.dwRBitMask)
597 if (requested->dwFlags & (DDPF_RGB|DDPF_YUV|DDPF_ZBUFFER|DDPF_BUMPDUDV))
598 if (requested->u3.dwGBitMask != provided->u3.dwGBitMask)
601 /* I could be wrong about the bumpmapping. MSDN docs are vague. */
602 if (requested->dwFlags & (DDPF_RGB|DDPF_YUV|DDPF_STENCILBUFFER
604 if (requested->u4.dwBBitMask != provided->u4.dwBBitMask)
607 if (requested->dwFlags & (DDPF_ALPHAPIXELS|DDPF_ZPIXELS))
608 if (requested->u5.dwRGBAlphaBitMask != provided->u5.dwRGBAlphaBitMask)
614 BOOL Main_DirectDraw_DDSD_Match(const DDSURFACEDESC2* requested,
615 const DDSURFACEDESC2* provided)
624 #define CMP(FLAG, FIELD) \
625 { DDSD_##FLAG, offsetof(DDSURFACEDESC2, FIELD), \
626 sizeof(((DDSURFACEDESC2 *)(NULL))->FIELD) }
628 static const struct compare_info compare[] = {
629 CMP(ALPHABITDEPTH, dwAlphaBitDepth),
630 CMP(BACKBUFFERCOUNT, dwBackBufferCount),
632 CMP(CKDESTBLT, ddckCKDestBlt),
633 CMP(CKDESTOVERLAY, u3.ddckCKDestOverlay),
634 CMP(CKSRCBLT, ddckCKSrcBlt),
635 CMP(CKSRCOVERLAY, ddckCKSrcOverlay),
636 CMP(HEIGHT, dwHeight),
637 CMP(LINEARSIZE, u1.dwLinearSize),
638 CMP(LPSURFACE, lpSurface),
639 CMP(MIPMAPCOUNT, u2.dwMipMapCount),
640 CMP(PITCH, u1.lPitch),
641 /* PIXELFORMAT: manual */
642 CMP(REFRESHRATE, u2.dwRefreshRate),
643 CMP(TEXTURESTAGE, dwTextureStage),
645 /* ZBUFFERBITDEPTH: "obsolete" */
652 if ((requested->dwFlags & provided->dwFlags) != requested->dwFlags)
655 for (i=0; i < sizeof(compare)/sizeof(compare[0]); i++)
657 if (requested->dwFlags & compare[i].flag
658 && memcmp((const char *)provided + compare[i].offset,
659 (const char *)requested + compare[i].offset,
660 compare[i].size) != 0)
664 if (requested->dwFlags & DDSD_PIXELFORMAT)
666 if (!Main_DirectDraw_DDPIXELFORMAT_Match(&requested->u4.ddpfPixelFormat,
667 &provided->u4.ddpfPixelFormat))
674 #define DDENUMSURFACES_SEARCHTYPE (DDENUMSURFACES_CANBECREATED|DDENUMSURFACES_DOESEXIST)
675 #define DDENUMSURFACES_MATCHTYPE (DDENUMSURFACES_ALL|DDENUMSURFACES_MATCH|DDENUMSURFACES_NOMATCH)
677 /* This should be extended so that it can be used by
678 * IDirectDrawSurface7::EnumAttachedSurfaces. */
680 Main_DirectDraw_EnumExistingSurfaces(IDirectDrawImpl *This, DWORD dwFlags,
681 LPDDSURFACEDESC2 lpDDSD2, LPVOID context,
682 LPDDENUMSURFACESCALLBACK7 callback)
684 IDirectDrawSurfaceImpl *surf;
687 /* A NULL lpDDSD2 is permitted if we are enumerating all surfaces anyway */
688 if (lpDDSD2 == NULL && !(dwFlags & DDENUMSURFACES_ALL))
689 return DDERR_INVALIDPARAMS;
691 all = dwFlags & DDENUMSURFACES_ALL;
692 nomatch = dwFlags & DDENUMSURFACES_NOMATCH;
694 for (surf = This->surfaces; surf != NULL; surf = surf->next_ddraw)
697 || (nomatch != Main_DirectDraw_DDSD_Match(lpDDSD2,
698 &surf->surface_desc)))
700 LPDIRECTDRAWSURFACE7 surface = ICOM_INTERFACE(surf,
701 IDirectDrawSurface7);
703 /* BOGUS! Violates COM rules, but MSDN says so. */
704 IDirectDrawSurface7_AddRef(surface);
706 if (callback(surface, &surf->surface_desc, context)
715 /* I really don't understand how this is supposed to work.
716 * We only consider dwHeight, dwWidth and ddpfPixelFormat.dwFlags. */
718 Main_DirectDraw_EnumCreateableSurfaces(IDirectDrawImpl *This, DWORD dwFlags,
719 LPDDSURFACEDESC2 lpDDSD2,
721 LPDDENUMSURFACESCALLBACK7 callback)
723 FIXME("This isn't going to work.\n");
725 if ((dwFlags & DDENUMSURFACES_MATCHTYPE) != DDENUMSURFACES_MATCH)
726 return DDERR_INVALIDPARAMS;
728 /* TODO: implement this.
729 * Does this work before SCL is called?
730 * Does it only consider off-screen surfaces?
736 /* For unsigned x. 0 is not a power of 2. */
737 #define IS_POW_2(x) (((x) & ((x) - 1)) == 0)
740 Main_DirectDraw_EnumSurfaces(LPDIRECTDRAW7 iface, DWORD dwFlags,
741 LPDDSURFACEDESC2 lpDDSD2, LPVOID context,
742 LPDDENUMSURFACESCALLBACK7 callback)
744 ICOM_THIS(IDirectDrawImpl, iface);
745 TRACE("(%p)->(0x%lx, %p, %p, %p)\n", iface, dwFlags, lpDDSD2, context,
748 if (callback == NULL)
749 return DDERR_INVALIDPARAMS;
751 if (dwFlags & ~(DDENUMSURFACES_SEARCHTYPE|DDENUMSURFACES_MATCHTYPE))
752 return DDERR_INVALIDPARAMS;
754 if (!IS_POW_2(dwFlags & DDENUMSURFACES_SEARCHTYPE)
755 || !IS_POW_2(dwFlags & DDENUMSURFACES_MATCHTYPE))
756 return DDERR_INVALIDPARAMS;
758 if (dwFlags & DDENUMSURFACES_DOESEXIST)
760 return Main_DirectDraw_EnumExistingSurfaces(This, dwFlags, lpDDSD2,
765 return Main_DirectDraw_EnumCreateableSurfaces(This, dwFlags, lpDDSD2,
771 Main_DirectDraw_EvaluateMode(LPDIRECTDRAW7 iface,DWORD a,DWORD* b)
773 ICOM_THIS(IDirectDrawImpl,iface);
774 FIXME("(%p)->() stub\n", This);
780 Main_DirectDraw_FlipToGDISurface(LPDIRECTDRAW7 iface)
782 ICOM_THIS(IDirectDrawImpl,iface);
783 TRACE("(%p)->()\n",This);
788 Main_DirectDraw_GetCaps(LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps,
791 ICOM_THIS(IDirectDrawImpl,iface);
792 TRACE("(%p,%p,%p), stub\n",This,pDriverCaps,pHELCaps);
793 if (pDriverCaps != NULL)
794 DD_STRUCT_COPY_BYSIZE(pDriverCaps,&This->caps);
795 if (pHELCaps != NULL)
796 DD_STRUCT_COPY_BYSIZE(pHELCaps,&This->caps);
801 /* GetDeviceIdentifier */
805 Main_DirectDraw_GetFourCCCodes(LPDIRECTDRAW7 iface, LPDWORD pNumCodes,
808 ICOM_THIS(IDirectDrawImpl,iface);
812 FIXME("(%p,%p,%p), stub\n",This,pNumCodes,pCodes);
817 Main_DirectDraw_GetGDISurface(LPDIRECTDRAW7 iface,
818 LPDIRECTDRAWSURFACE7 *lplpGDIDDSSurface)
820 ICOM_THIS(IDirectDrawImpl,iface);
821 TRACE("(%p)->(%p)\n", This, lplpGDIDDSSurface);
822 TRACE("returning primary (%p)\n", This->primary_surface);
823 *lplpGDIDDSSurface = ICOM_INTERFACE(This->primary_surface, IDirectDrawSurface7);
824 if (*lplpGDIDDSSurface)
825 IDirectDrawSurface7_AddRef(*lplpGDIDDSSurface);
830 Main_DirectDraw_GetMonitorFrequency(LPDIRECTDRAW7 iface,LPDWORD freq)
832 ICOM_THIS(IDirectDrawImpl,iface);
833 FIXME("(%p)->(%p) returns 60 Hz always\n",This,freq);
834 *freq = 60*100; /* 60 Hz */
839 Main_DirectDraw_GetScanLine(LPDIRECTDRAW7 iface, LPDWORD lpdwScanLine)
841 ICOM_THIS(IDirectDrawImpl,iface);
842 FIXME("(%p)->(%p)\n", This, lpdwScanLine);
850 Main_DirectDraw_GetSurfaceFromDC(LPDIRECTDRAW7 iface, HDC hdc,
851 LPDIRECTDRAWSURFACE7 *lpDDS)
853 ICOM_THIS(IDirectDrawImpl,iface);
854 FIXME("(%p)->(%08ld,%p)\n", This, (DWORD) hdc, lpDDS);
860 Main_DirectDraw_GetVerticalBlankStatus(LPDIRECTDRAW7 iface, LPBOOL status)
862 ICOM_THIS(IDirectDrawImpl,iface);
863 TRACE("(%p)->(%p)\n",This,status);
868 /* If we were not initialised then Uninit_Main_IDirectDraw7_Initialize would
869 * have been called instead. */
871 Main_DirectDraw_Initialize(LPDIRECTDRAW7 iface, LPGUID lpGuid)
873 TRACE("(%p)->(%s)\n", iface, debugstr_guid(lpGuid));
875 return DDERR_ALREADYINITIALIZED;
879 Main_DirectDraw_RestoreAllSurfaces(LPDIRECTDRAW7 iface)
881 ICOM_THIS(IDirectDrawImpl,iface);
882 IDirectDrawSurfaceImpl* surf;
884 TRACE("(%p)->()\n", This);
886 for (surf = This->surfaces; surf != NULL; surf = surf->next_ddraw)
887 IDirectDrawSurface7_Restore(ICOM_INTERFACE(surf, IDirectDrawSurface7));
892 static void DDRAW_SubclassWindow(IDirectDrawImpl* This)
894 /* Well we don't actually subclass the window yet. */
895 SetPropA(This->window, ddProp, (LONG)This);
898 static void DDRAW_UnsubclassWindow(IDirectDrawImpl* This)
900 RemovePropA(This->window, ddProp);
904 Main_DirectDraw_SetCooperativeLevel(LPDIRECTDRAW7 iface, HWND hwnd,
907 ICOM_THIS(IDirectDrawImpl,iface);
909 FIXME("(%p)->(%08lx,%08lx)\n",This,(DWORD)hwnd,cooplevel);
910 DDRAW_dump_cooperativelevel(cooplevel);
912 /* Makes realMYST test happy. */
913 if (This->cooperative_level == cooplevel
914 && This->window == hwnd)
917 /* XXX "It cannot be reset while the process has surfaces or palettes
918 * created." Otherwise the window can be changed???
920 * This appears to be wrong - comment it out for now.
922 return DDERR_HWNDALREADYSET;
925 if (!(cooplevel & (DDSCL_EXCLUSIVE|DDSCL_NORMAL)))
926 return DDERR_INVALIDPARAMS;
929 This->cooperative_level = cooplevel;
931 This->local.hWnd = hwnd;
932 This->local.dwLocalFlags |= DDRAWILCL_SETCOOPCALLED;
933 /* not entirely sure about these */
934 if (cooplevel & DDSCL_EXCLUSIVE) This->local.dwLocalFlags |= DDRAWILCL_HASEXCLUSIVEMODE;
935 if (cooplevel & DDSCL_FULLSCREEN) This->local.dwLocalFlags |= DDRAWILCL_ISFULLSCREEN;
936 if (cooplevel & DDSCL_ALLOWMODEX) This->local.dwLocalFlags |= DDRAWILCL_ALLOWMODEX;
937 if (cooplevel & DDSCL_MULTITHREADED) This->local.dwLocalFlags |= DDRAWILCL_MULTITHREADED;
938 if (cooplevel & DDSCL_FPUSETUP) This->local.dwLocalFlags |= DDRAWILCL_FPUSETUP;
939 if (cooplevel & DDSCL_FPUPRESERVE) This->local.dwLocalFlags |= DDRAWILCL_FPUPRESERVE;
941 if (This->local.lpGbl) {
942 /* assume that this app is the active app (in wine, there's
943 * probably only one app per global ddraw object anyway) */
944 if (cooplevel & DDSCL_EXCLUSIVE) This->local.lpGbl->lpExclusiveOwner = &This->local;
945 else if (This->local.lpGbl->lpExclusiveOwner == &This->local)
946 This->local.lpGbl->lpExclusiveOwner = NULL;
947 if (This->set_exclusive_mode)
948 This->set_exclusive_mode(This, (cooplevel & DDSCL_EXCLUSIVE) != 0);
951 ShowWindow(hwnd, SW_SHOW);
953 DDRAW_SubclassWindow(This);
955 /* TODO Does it also get resized to the current screen size? */
961 Main_DirectDraw_SetDisplayMode(LPDIRECTDRAW7 iface, DWORD dwWidth,
962 DWORD dwHeight, LONG lPitch,
963 DWORD dwRefreshRate, DWORD dwFlags,
964 const DDPIXELFORMAT* pixelformat)
969 ICOM_THIS(IDirectDrawImpl,iface);
971 TRACE("(%p)->SetDisplayMode(%ld,%ld)\n",This,dwWidth,dwHeight);
973 if (!(This->cooperative_level & DDSCL_EXCLUSIVE))
974 return DDERR_NOEXCLUSIVEMODE;
976 if (!IsWindow(This->window))
977 return DDERR_GENERIC; /* unchecked */
979 LosePrimarySurface(This);
981 screenX = GetSystemMetrics(SM_CXSCREEN);
982 screenY = GetSystemMetrics(SM_CYSCREEN);
984 This->width = dwWidth;
985 This->height = dwHeight;
986 This->pitch = lPitch;
987 This->pixelformat = *pixelformat;
989 /* Position the window in the center of the screen - don't center for now */
990 /* MoveWindow(This->window, (screenX-dwWidth)/2, (screenY-dwHeight)/2,
991 dwWidth, dwHeight, TRUE);*/
992 MoveWindow(This->window, 0, 0, dwWidth, dwHeight, TRUE);
994 SetFocus(This->window);
1000 Main_DirectDraw_RestoreDisplayMode(LPDIRECTDRAW7 iface)
1002 ICOM_THIS(IDirectDrawImpl,iface);
1004 TRACE("(%p)\n",This);
1005 if (!(This->cooperative_level & DDSCL_EXCLUSIVE))
1006 return DDERR_NOEXCLUSIVEMODE;
1008 /* Lose the primary surface if the resolution changes. */
1009 if (This->orig_width != This->width || This->orig_height != This->height
1010 || This->orig_pitch != This->pitch
1011 || This->orig_pixelformat.dwFlags != This->pixelformat.dwFlags
1012 || !Main_DirectDraw_DDPIXELFORMAT_Match(&This->pixelformat,
1013 &This->orig_pixelformat))
1015 LosePrimarySurface(This);
1018 /* TODO Move the window back where it belongs. */
1024 Main_DirectDraw_WaitForVerticalBlank(LPDIRECTDRAW7 iface, DWORD dwFlags,
1027 ICOM_THIS(IDirectDrawImpl,iface);
1028 FIXME("(%p)->(flags=0x%08lx,handle=0x%08x)\n",This,dwFlags,h);
1033 Main_DirectDraw_GetDisplayMode(LPDIRECTDRAW7 iface, LPDDSURFACEDESC2 pDDSD)
1035 ICOM_THIS(IDirectDrawImpl,iface);
1036 TRACE("(%p)->GetDisplayMode(%p)\n",This,pDDSD);
1038 pDDSD->dwFlags = DDSD_HEIGHT|DDSD_WIDTH|DDSD_PITCH|DDSD_PIXELFORMAT|DDSD_REFRESHRATE;
1039 pDDSD->dwHeight = This->height;
1040 pDDSD->dwWidth = This->width;
1041 pDDSD->u1.lPitch = This->pitch;
1042 pDDSD->u2.dwRefreshRate = 60;
1043 pDDSD->u4.ddpfPixelFormat = This->pixelformat;
1044 pDDSD->ddsCaps.dwCaps = 0;
1050 Main_DirectDraw_GetAvailableVidMem(LPDIRECTDRAW7 iface, LPDDSCAPS2 ddscaps,
1051 LPDWORD total, LPDWORD free)
1053 ICOM_THIS(IDirectDrawImpl,iface);
1054 TRACE("(%p)->(%p,%p,%p)\n", This,ddscaps,total,free);
1056 /* We have 16 MB videomemory */
1057 if (total) *total= 16*1024*1024;
1058 if (free) *free = 16*1024*1024;
1062 HRESULT WINAPI Main_DirectDraw_TestCooperativeLevel(LPDIRECTDRAW7 iface) {
1063 ICOM_THIS(IDirectDrawImpl,iface);
1064 TRACE("(%p)->(): stub\n", This);
1070 Main_DirectDraw_StartModeTest(LPDIRECTDRAW7 iface, LPSIZE pModes,
1071 DWORD dwNumModes, DWORD dwFlags)
1073 ICOM_THIS(IDirectDrawImpl,iface);
1074 FIXME("(%p)->() stub\n", This);
1079 /*** Owned object management. */
1081 void Main_DirectDraw_AddSurface(IDirectDrawImpl* This,
1082 IDirectDrawSurfaceImpl* surface)
1084 assert(surface->ddraw_owner == NULL || surface->ddraw_owner == This);
1086 surface->ddraw_owner = This;
1088 /* where should it go? */
1089 surface->next_ddraw = This->surfaces;
1090 surface->prev_ddraw = NULL;
1092 This->surfaces->prev_ddraw = surface;
1093 This->surfaces = surface;
1096 void Main_DirectDraw_RemoveSurface(IDirectDrawImpl* This,
1097 IDirectDrawSurfaceImpl* surface)
1099 assert(surface->ddraw_owner == This);
1101 if (This->surfaces == surface)
1102 This->surfaces = surface->next_ddraw;
1104 if (This->primary_surface == surface)
1105 This->primary_surface = NULL;
1107 if (surface->next_ddraw)
1108 surface->next_ddraw->prev_ddraw = surface->prev_ddraw;
1109 if (surface->prev_ddraw)
1110 surface->prev_ddraw->next_ddraw = surface->next_ddraw;
1113 static void Main_DirectDraw_DeleteSurfaces(IDirectDrawImpl* This)
1115 while (This->surfaces != NULL)
1116 Main_DirectDrawSurface_ForceDestroy(This->surfaces);
1119 void Main_DirectDraw_AddClipper(IDirectDrawImpl* This,
1120 IDirectDrawClipperImpl* clipper)
1122 assert(clipper->ddraw_owner == NULL || clipper->ddraw_owner == This);
1124 clipper->ddraw_owner = This;
1126 clipper->next_ddraw = This->clippers;
1127 clipper->prev_ddraw = NULL;
1129 This->clippers->prev_ddraw = clipper;
1130 This->clippers = clipper;
1133 void Main_DirectDraw_RemoveClipper(IDirectDrawImpl* This,
1134 IDirectDrawClipperImpl* clipper)
1136 assert(clipper->ddraw_owner == This);
1138 if (This->clippers == clipper)
1139 This->clippers = clipper->next_ddraw;
1141 if (clipper->next_ddraw)
1142 clipper->next_ddraw->prev_ddraw = clipper->prev_ddraw;
1143 if (clipper->prev_ddraw)
1144 clipper->prev_ddraw->next_ddraw = clipper->next_ddraw;
1147 static void Main_DirectDraw_DeleteClippers(IDirectDrawImpl* This)
1149 while (This->clippers != NULL)
1150 Main_DirectDrawClipper_ForceDestroy(This->clippers);
1153 void Main_DirectDraw_AddPalette(IDirectDrawImpl* This,
1154 IDirectDrawPaletteImpl* palette)
1156 assert(palette->ddraw_owner == NULL || palette->ddraw_owner == This);
1158 palette->ddraw_owner = This;
1160 /* where should it go? */
1161 palette->next_ddraw = This->palettes;
1162 palette->prev_ddraw = NULL;
1164 This->palettes->prev_ddraw = palette;
1165 This->palettes = palette;
1168 void Main_DirectDraw_RemovePalette(IDirectDrawImpl* This,
1169 IDirectDrawPaletteImpl* palette)
1171 assert(palette->ddraw_owner == This);
1173 if (This->palettes == palette)
1174 This->palettes = palette->next_ddraw;
1176 if (palette->next_ddraw)
1177 palette->next_ddraw->prev_ddraw = palette->prev_ddraw;
1178 if (palette->prev_ddraw)
1179 palette->prev_ddraw->next_ddraw = palette->next_ddraw;
1182 static void Main_DirectDraw_DeletePalettes(IDirectDrawImpl* This)
1184 while (This->palettes != NULL)
1185 Main_DirectDrawPalette_ForceDestroy(This->palettes);
1191 LoseSurface(IDirectDrawSurfaceImpl *surface)
1193 if (surface != NULL) surface->lose_surface(surface);
1197 LosePrimarySurface(IDirectDrawImpl *This)
1199 /* MSDN: "If another application changes the display mode, the primary
1200 * surface is lost, and the method returns DDERR_SURFACELOST until the
1201 * primary surface is recreated to match the new display mode."
1203 * We mark all the primary surfaces as lost as soon as the display
1204 * mode is changed (by any application). */
1206 LoseSurface(This->primary_surface);
1209 /******************************************************************************
1210 * Uninitialised DirectDraw functions
1212 * This vtable is used when a DirectDraw object is created with
1213 * CoCreateInstance. The only usable method is Initialize.
1216 void Uninit_DirectDraw_final_release(IDirectDrawImpl *This)
1218 Main_DirectDraw_final_release(This);
1221 static ICOM_VTABLE(IDirectDraw7) Uninit_DirectDraw_VTable;
1223 /* Not called from the vtable. */
1224 HRESULT Uninit_DirectDraw_Construct(IDirectDrawImpl *This, BOOL ex)
1228 hr = Main_DirectDraw_Construct(This, ex);
1229 if (FAILED(hr)) return hr;
1231 This->final_release = Uninit_DirectDraw_final_release;
1232 ICOM_INIT_INTERFACE(This, IDirectDraw7, Uninit_DirectDraw_VTable);
1237 HRESULT Uninit_DirectDraw_Create(const GUID* pGUID,
1238 LPDIRECTDRAW7* pIface,
1239 IUnknown* pUnkOuter, BOOL ex)
1242 IDirectDrawImpl* This;
1244 assert(pUnkOuter == NULL); /* XXX no: we must check this */
1246 This = HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY,
1247 sizeof(IDirectDrawImpl));
1248 if (This == NULL) return E_OUTOFMEMORY;
1250 hr = Uninit_DirectDraw_Construct(This, ex);
1252 HeapFree(GetProcessHeap(), HEAP_ZERO_MEMORY, This);
1254 *pIface = ICOM_INTERFACE(This, IDirectDraw7);
1259 static HRESULT WINAPI
1260 Uninit_DirectDraw_Initialize(LPDIRECTDRAW7 iface, LPGUID pDeviceGuid)
1262 const ddraw_driver* driver;
1263 ICOM_THIS(IDirectDrawImpl, iface);
1265 TRACE("(%p)->(%p)\n", iface, pDeviceGuid);
1267 driver = DDRAW_FindDriver(pDeviceGuid);
1268 /* XXX This return value is not documented. (Not checked.) */
1269 if (driver == NULL) return DDERR_INVALIDDIRECTDRAWGUID;
1271 return driver->init(This, pDeviceGuid);
1274 static HRESULT WINAPI
1275 Uninit_DirectDraw_Compact(LPDIRECTDRAW7 iface)
1277 return DDERR_NOTINITIALIZED;
1280 static HRESULT WINAPI
1281 Uninit_DirectDraw_CreateClipper(LPDIRECTDRAW7 iface, DWORD dwFlags,
1282 LPDIRECTDRAWCLIPPER *lplpDDClipper,
1283 IUnknown *pUnkOuter)
1286 return DDERR_NOTINITIALIZED;
1289 static HRESULT WINAPI
1290 Uninit_DirectDraw_CreatePalette(LPDIRECTDRAW7 iface, DWORD dwFlags,
1291 LPPALETTEENTRY lpColorTable,
1292 LPDIRECTDRAWPALETTE *lplpDDPalette,
1293 IUnknown *pUnkOuter)
1295 return DDERR_NOTINITIALIZED;
1298 static HRESULT WINAPI
1299 Uninit_DirectDraw_CreateSurface(LPDIRECTDRAW7 iface,
1300 LPDDSURFACEDESC2 lpDDSurfaceDesc,
1301 LPDIRECTDRAWSURFACE7 *lplpDDSurface,
1302 IUnknown *pUnkOuter)
1304 return DDERR_NOTINITIALIZED;
1307 static HRESULT WINAPI
1308 Uninit_DirectDraw_DuplicateSurface(LPDIRECTDRAW7 iface,
1309 LPDIRECTDRAWSURFACE7 pSurf,
1310 LPDIRECTDRAWSURFACE7 *pDupSurf)
1313 return DDERR_NOTINITIALIZED;
1316 static HRESULT WINAPI
1317 Uninit_DirectDraw_EnumDisplayModes(LPDIRECTDRAW7 iface, DWORD dwFlags,
1318 LPDDSURFACEDESC2 lpDDSD,
1320 LPDDENUMMODESCALLBACK2 cb)
1322 return DDERR_NOTINITIALIZED;
1325 static HRESULT WINAPI
1326 Uninit_DirectDraw_EnumSurfaces(LPDIRECTDRAW7 iface, DWORD dwFlags,
1327 LPDDSURFACEDESC2 pDDSD, LPVOID context,
1328 LPDDENUMSURFACESCALLBACK7 cb)
1330 return DDERR_NOTINITIALIZED;
1333 static HRESULT WINAPI
1334 Uninit_DirectDraw_FlipToGDISurface(LPDIRECTDRAW7 iface)
1336 return DDERR_NOTINITIALIZED;
1339 static HRESULT WINAPI
1340 Uninit_DirectDraw_GetCaps(LPDIRECTDRAW7 iface, LPDDCAPS pDriverCaps,
1343 return DDERR_NOTINITIALIZED;
1346 static HRESULT WINAPI
1347 Uninit_DirectDraw_GetDisplayMode(LPDIRECTDRAW7 iface,
1348 LPDDSURFACEDESC2 pDDSD)
1350 return DDERR_NOTINITIALIZED;
1353 static HRESULT WINAPI
1354 Uninit_DirectDraw_GetFourCCCodes(LPDIRECTDRAW7 iface, LPDWORD pNumCodes,
1357 return DDERR_NOTINITIALIZED;
1360 static HRESULT WINAPI
1361 Uninit_DirectDraw_GetGDISurface(LPDIRECTDRAW7 iface,
1362 LPDIRECTDRAWSURFACE7 *pGDISurf)
1364 return DDERR_NOTINITIALIZED;
1367 static HRESULT WINAPI
1368 Uninit_DirectDraw_GetMonitorFrequency(LPDIRECTDRAW7 iface, LPDWORD pdwFreq)
1370 return DDERR_NOTINITIALIZED;
1373 static HRESULT WINAPI
1374 Uninit_DirectDraw_GetScanLine(LPDIRECTDRAW7 iface, LPDWORD pdwScanLine)
1376 return DDERR_NOTINITIALIZED;
1379 static HRESULT WINAPI
1380 Uninit_DirectDraw_GetVerticalBlankStatus(LPDIRECTDRAW7 iface, PBOOL pbIsInVB)
1382 return DDERR_NOTINITIALIZED;
1385 static HRESULT WINAPI
1386 Uninit_DirectDraw_RestoreDisplayMode(LPDIRECTDRAW7 iface)
1388 return DDERR_NOTINITIALIZED;
1391 static HRESULT WINAPI
1392 Uninit_DirectDraw_SetCooperativeLevel(LPDIRECTDRAW7 iface, HWND hWnd,
1395 return DDERR_NOTINITIALIZED;
1398 static HRESULT WINAPI
1399 Uninit_DirectDraw_SetDisplayMode(LPDIRECTDRAW7 iface, DWORD dwWidth,
1400 DWORD dwHeight, DWORD dwBPP,
1401 DWORD dwRefreshRate, DWORD dwFlags)
1403 return DDERR_NOTINITIALIZED;
1406 static HRESULT WINAPI
1407 Uninit_DirectDraw_WaitForVerticalBlank(LPDIRECTDRAW7 iface, DWORD dwFlags,
1410 return DDERR_NOTINITIALIZED;
1413 static HRESULT WINAPI
1414 Uninit_DirectDraw_GetAvailableVidMem(LPDIRECTDRAW7 iface, LPDDSCAPS2 pDDCaps,
1415 LPDWORD pdwTotal, LPDWORD pdwFree)
1417 return DDERR_NOTINITIALIZED;
1420 static HRESULT WINAPI
1421 Uninit_DirectDraw_GetSurfaceFromDC(LPDIRECTDRAW7 iface, HDC hDC,
1422 LPDIRECTDRAWSURFACE7 *pSurf)
1424 return DDERR_NOTINITIALIZED;
1427 static HRESULT WINAPI
1428 Uninit_DirectDraw_RestoreAllSurfaces(LPDIRECTDRAW7 iface)
1430 return DDERR_NOTINITIALIZED;
1433 static HRESULT WINAPI
1434 Uninit_DirectDraw_TestCooperativeLevel(LPDIRECTDRAW7 iface)
1436 return DDERR_NOTINITIALIZED;
1439 static HRESULT WINAPI
1440 Uninit_DirectDraw_GetDeviceIdentifier(LPDIRECTDRAW7 iface,
1441 LPDDDEVICEIDENTIFIER2 pDDDI,
1444 return DDERR_NOTINITIALIZED;
1447 static HRESULT WINAPI
1448 Uninit_DirectDraw_StartModeTest(LPDIRECTDRAW7 iface, LPSIZE pszModes,
1449 DWORD cModes, DWORD dwFlags)
1451 return DDERR_NOTINITIALIZED;
1454 static HRESULT WINAPI
1455 Uninit_DirectDraw_EvaluateMode(LPDIRECTDRAW7 iface, DWORD dwFlags,
1458 return DDERR_NOTINITIALIZED;
1461 static ICOM_VTABLE(IDirectDraw7) Uninit_DirectDraw_VTable =
1463 ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
1464 Main_DirectDraw_QueryInterface,
1465 Main_DirectDraw_AddRef,
1466 Main_DirectDraw_Release,
1467 Uninit_DirectDraw_Compact,
1468 Uninit_DirectDraw_CreateClipper,
1469 Uninit_DirectDraw_CreatePalette,
1470 Uninit_DirectDraw_CreateSurface,
1471 Uninit_DirectDraw_DuplicateSurface,
1472 Uninit_DirectDraw_EnumDisplayModes,
1473 Uninit_DirectDraw_EnumSurfaces,
1474 Uninit_DirectDraw_FlipToGDISurface,
1475 Uninit_DirectDraw_GetCaps,
1476 Uninit_DirectDraw_GetDisplayMode,
1477 Uninit_DirectDraw_GetFourCCCodes,
1478 Uninit_DirectDraw_GetGDISurface,
1479 Uninit_DirectDraw_GetMonitorFrequency,
1480 Uninit_DirectDraw_GetScanLine,
1481 Uninit_DirectDraw_GetVerticalBlankStatus,
1482 Uninit_DirectDraw_Initialize,
1483 Uninit_DirectDraw_RestoreDisplayMode,
1484 Uninit_DirectDraw_SetCooperativeLevel,
1485 Uninit_DirectDraw_SetDisplayMode,
1486 Uninit_DirectDraw_WaitForVerticalBlank,
1487 Uninit_DirectDraw_GetAvailableVidMem,
1488 Uninit_DirectDraw_GetSurfaceFromDC,
1489 Uninit_DirectDraw_RestoreAllSurfaces,
1490 Uninit_DirectDraw_TestCooperativeLevel,
1491 Uninit_DirectDraw_GetDeviceIdentifier,
1492 Uninit_DirectDraw_StartModeTest,
1493 Uninit_DirectDraw_EvaluateMode