3 * COPYRIGHT: See COPYING in the top level directory
5 * FILE: lib/ddraw/main/ddraw.c
6 * PURPOSE: IDirectDraw7 Implementation
7 * PROGRAMMER: Magnus Olsen, Maarten Bosma
14 HRESULT WINAPI
Main_DirectDraw_Initialize (LPDIRECTDRAW7 iface
, LPGUID lpGUID
)
16 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
19 if (This
->InitializeDraw
== TRUE
)
20 return DDERR_ALREADYINITIALIZED
;
22 This
->InitializeDraw
= TRUE
;
24 /* Setup the lpExclusiveOwner struct in msdn this struct member is undoc
25 I am using there name to figout which info it should be fild with
26 My hardware drv does not support call to SetExusive so I can not
27 debug it see how it should be fild
30 This
->DirectDrawGlobal
.lpExclusiveOwner
= &This
->ExclusiveOwner
;
31 memset(&This
->ExclusiveOwner
, 0, sizeof(DDRAWI_DIRECTDRAW_LCL
));
33 This
->DirectDrawGlobal
.lpExclusiveOwner
->dwProcessId
= GetCurrentProcessId();
34 This
->DirectDrawGlobal
.lpExclusiveOwner
->hDC
= ((ULONG_PTR
)GetWindowDC(GetDesktopWindow()));
35 This
->DirectDrawGlobal
.lpExclusiveOwner
->hWnd
= ((ULONG_PTR
)GetDesktopWindow());
36 This
->DirectDrawGlobal
.lpExclusiveOwner
->lpGbl
= &This
->DirectDrawGlobal
;
38 This
->Height
= GetDeviceCaps((HDC
)This
->DirectDrawGlobal
.lpExclusiveOwner
->hDC
, VERTRES
);
39 This
->Width
= GetDeviceCaps((HDC
)This
->DirectDrawGlobal
.lpExclusiveOwner
->hDC
, HORZRES
);
40 This
->Bpp
= GetDeviceCaps((HDC
)This
->DirectDrawGlobal
.lpExclusiveOwner
->hDC
, BITSPIXEL
);
42 // call software first
43 if((ret
= Hal_DirectDraw_Initialize (iface
)) != DD_OK
)
46 // ... then overwrite with hal
47 if((ret
= Hel_DirectDraw_Initialize (iface
)) != DD_OK
)
50 /* Hack to set right freq */
52 This
->DirectDrawGlobal
.dwMonitorFrequency
= GetDeviceCaps((HDC
)This
->DirectDrawGlobal
.lpExclusiveOwner
->hDC
, VREFRESH
);
57 HRESULT WINAPI
Main_DirectDraw_SetCooperativeLevel (LPDIRECTDRAW7 iface
, HWND hwnd
, DWORD cooplevel
)
60 // - create a scaner that check which driver we should get the HDC from
61 // for now we always asume it is the active dirver that should be use.
64 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
66 // check the parameters
67 if ((This
->cooperative_level
== cooplevel
) && ((HWND
)This
->DirectDrawGlobal
.lpExclusiveOwner
->hWnd
== hwnd
))
70 if (This
->cooperative_level
)
71 return DDERR_EXCLUSIVEMODEALREADYSET
;
73 if ((cooplevel
&DDSCL_EXCLUSIVE
) && !(cooplevel
&DDSCL_FULLSCREEN
))
74 return DDERR_INVALIDPARAMS
;
76 if (cooplevel
&DDSCL_NORMAL
&& cooplevel
&DDSCL_FULLSCREEN
)
77 return DDERR_INVALIDPARAMS
;
80 This
->DirectDrawGlobal
.lpExclusiveOwner
->hWnd
= (ULONG_PTR
) hwnd
;
81 This
->DirectDrawGlobal
.lpExclusiveOwner
->hDC
= (ULONG_PTR
)GetDC(hwnd
);
82 This
->cooperative_level
= cooplevel
;
84 if (This
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.dwFlags
& DDHAL_CB32_SETEXCLUSIVEMODE
)
86 return Hal_DirectDraw_SetCooperativeLevel (iface
);
89 return Hel_DirectDraw_SetCooperativeLevel(iface
);
93 HRESULT WINAPI
Main_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface
, DWORD dwWidth
, DWORD dwHeight
,
94 DWORD dwBPP
, DWORD dwRefreshRate
, DWORD dwFlags
)
96 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
100 /* FIXME check the refresrate if it same if it not same do the mode switch */
101 if ((This
->DirectDrawGlobal
.vmiData
.dwDisplayHeight
== dwHeight
) &&
102 (This
->DirectDrawGlobal
.vmiData
.dwDisplayWidth
== dwWidth
) &&
103 (This
->DirectDrawGlobal
.vmiData
.ddpfDisplay
.dwRGBBitCount
== dwBPP
))
109 /* Check use the Hal or Hel for SetMode */
110 if (This
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.dwFlags
& DDHAL_CB32_SETMODE
)
112 ret
= Hal_DirectDraw_SetDisplayMode(iface
, dwWidth
, dwHeight
, dwBPP
, dwRefreshRate
, dwFlags
);
116 ret
= Hel_DirectDraw_SetDisplayMode(iface
, dwWidth
, dwHeight
, dwBPP
, dwRefreshRate
, dwFlags
);
121 DdReenableDirectDrawObject(&This
->DirectDrawGlobal
, &dummy
);
122 /* FIXME fill the This->DirectDrawGlobal.vmiData right */
128 ULONG WINAPI
Main_DirectDraw_AddRef (LPDIRECTDRAW7 iface
)
130 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
131 ULONG ref
= InterlockedIncrement((PLONG
)&This
->DirectDrawGlobal
.dwRefCnt
);
136 ULONG WINAPI
Main_DirectDraw_Release (LPDIRECTDRAW7 iface
)
138 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
139 ULONG ref
= InterlockedDecrement((PLONG
)&This
->DirectDrawGlobal
.dwRefCnt
);
143 // set resoltion back to the one in registry
144 if(This
->cooperative_level
& DDSCL_EXCLUSIVE
)
145 ChangeDisplaySettings(NULL
, 0);
147 HeapFree(GetProcessHeap(), 0, This
);
153 HRESULT WINAPI
Main_DirectDraw_QueryInterface (
154 LPDIRECTDRAW7 iface
, REFIID id
, LPVOID
*obj
)
156 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
158 if (IsEqualGUID(&IID_IDirectDraw7
, id
))
160 *obj
= &This
->lpVtbl
;
162 else if (IsEqualGUID(&IID_IDirectDraw
, id
))
164 *obj
= &This
->lpVtbl_v1
;
166 else if (IsEqualGUID(&IID_IDirectDraw2
, id
))
168 *obj
= &This
->lpVtbl_v2
;
170 else if (IsEqualGUID(&IID_IDirectDraw4
, id
))
172 *obj
= &This
->lpVtbl_v4
;
177 return E_NOINTERFACE
;
180 Main_DirectDraw_AddRef(iface
);
184 HRESULT WINAPI
Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface
, LPDDSURFACEDESC2 pDDSD
,
185 LPDIRECTDRAWSURFACE7
*ppSurf
, IUnknown
*pUnkOuter
)
188 return DDERR_INVALIDPARAMS
;
190 if(sizeof(DDSURFACEDESC2
)!=pDDSD
->dwSize
&& sizeof(DDSURFACEDESC
)!=pDDSD
->dwSize
)
191 return DDERR_UNSUPPORTED
;
193 // the nasty com stuff
194 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
196 IDirectDrawSurfaceImpl
* That
;
198 That
= (IDirectDrawSurfaceImpl
*)HeapAlloc(GetProcessHeap(), 0, sizeof(IDirectDrawSurfaceImpl
));
201 return E_OUTOFMEMORY
;
203 ZeroMemory(That
, sizeof(IDirectDrawSurfaceImpl
));
205 That
->lpVtbl
= &DirectDrawSurface7_Vtable
;
206 That
->lpVtbl_v3
= &DDRAW_IDDS3_Thunk_VTable
;
208 This
->DirectDrawGlobal
.dsList
= (LPDDRAWI_DDRAWSURFACE_INT
)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
,
209 sizeof(DDRAWI_DDRAWSURFACE_INT
));
210 That
->owner
= (IDirectDrawImpl
*)This
;
211 That
->owner
->DirectDrawGlobal
.dsList
->dwIntRefCnt
=1;
213 /* we alwasy set to use the DirectDrawSurface7_Vtable as internel */
214 That
->owner
->DirectDrawGlobal
.dsList
->lpVtbl
= (PVOID
) &DirectDrawSurface7_Vtable
;
216 *ppSurf
= (LPDIRECTDRAWSURFACE7
)That
;
218 // the real surface object creation
219 return That
->lpVtbl
->Initialize (*ppSurf
, (LPDIRECTDRAW
)iface
, pDDSD
);
222 HRESULT WINAPI
Main_DirectDraw_CreateClipper(LPDIRECTDRAW7 iface
, DWORD dwFlags
,
223 LPDIRECTDRAWCLIPPER
*ppClipper
, IUnknown
*pUnkOuter
)
226 return DDERR_INVALIDPARAMS
;
228 IDirectDrawClipperImpl
* That
;
229 That
= (IDirectDrawClipperImpl
*)HeapAlloc(GetProcessHeap(), 0, sizeof(IDirectDrawClipperImpl
));
232 return E_OUTOFMEMORY
;
234 ZeroMemory(That
, sizeof(IDirectDrawClipperImpl
));
236 That
->lpVtbl
= &DirectDrawClipper_Vtable
;
238 *ppClipper
= (LPDIRECTDRAWCLIPPER
)That
;
240 return That
->lpVtbl
->Initialize (*ppClipper
, (LPDIRECTDRAW
)iface
, dwFlags
);
243 // This function is exported by the dll
244 HRESULT WINAPI
DirectDrawCreateClipper (DWORD dwFlags
,
245 LPDIRECTDRAWCLIPPER
* lplpDDClipper
, LPUNKNOWN pUnkOuter
)
247 return Main_DirectDraw_CreateClipper(NULL
, dwFlags
, lplpDDClipper
, pUnkOuter
);
250 HRESULT WINAPI
Main_DirectDraw_CreatePalette(LPDIRECTDRAW7 iface
, DWORD dwFlags
,
251 LPPALETTEENTRY palent
, LPDIRECTDRAWPALETTE
* ppPalette
, LPUNKNOWN pUnkOuter
)
254 return DDERR_INVALIDPARAMS
;
256 IDirectDrawPaletteImpl
* That
;
257 That
= (IDirectDrawPaletteImpl
*)HeapAlloc(GetProcessHeap(), 0, sizeof(IDirectDrawPaletteImpl
));
260 return E_OUTOFMEMORY
;
262 ZeroMemory(That
, sizeof(IDirectDrawPaletteImpl
));
264 That
->lpVtbl
= &DirectDrawPalette_Vtable
;
266 *ppPalette
= (LPDIRECTDRAWPALETTE
)That
;
268 return That
->lpVtbl
->Initialize (*ppPalette
, (LPDIRECTDRAW
)iface
, dwFlags
, palent
);
271 HRESULT WINAPI
Main_DirectDraw_FlipToGDISurface(LPDIRECTDRAW7 iface
)
273 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
275 if (This
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.dwFlags
& DDHAL_CB32_FLIPTOGDISURFACE
)
277 return Hal_DirectDraw_FlipToGDISurface( iface
);
280 return Hel_DirectDraw_FlipToGDISurface( iface
);
283 HRESULT WINAPI
Main_DirectDraw_GetCaps(LPDIRECTDRAW7 iface
, LPDDCAPS pDriverCaps
,
286 DWORD status
= DD_FALSE
;
287 IDirectDrawImpl
*This
= (IDirectDrawImpl
*)iface
;
289 if (pDriverCaps
!= NULL
)
291 RtlCopyMemory(pDriverCaps
,&This
->DirectDrawGlobal
.ddCaps
,sizeof(DDCORECAPS
));
295 if (pHELCaps
!= NULL
)
297 RtlCopyMemory(pDriverCaps
,&This
->DirectDrawGlobal
.ddHELCaps
,sizeof(DDCORECAPS
));
301 /* Both caps mixed ?? */
302 /* DDCORECAPS ddBothCaps; */
307 HRESULT WINAPI
Main_DirectDraw_GetDisplayMode(LPDIRECTDRAW7 iface
, LPDDSURFACEDESC2 pDDSD
)
309 IDirectDrawImpl
*This
= (IDirectDrawImpl
*)iface
;
316 pDDSD
->dwFlags
= DDSD_CAPS
| DDSD_HEIGHT
| DDSD_PITCH
| DDSD_PIXELFORMAT
| DDSD_REFRESHRATE
| DDSD_WIDTH
;
317 pDDSD
->dwHeight
= This
->DirectDrawGlobal
.vmiData
.dwDisplayHeight
;
318 pDDSD
->dwWidth
= This
->DirectDrawGlobal
.vmiData
.dwDisplayWidth
;
319 pDDSD
->lPitch
= This
->DirectDrawGlobal
.vmiData
.lDisplayPitch
;
320 pDDSD
->dwRefreshRate
= This
->DirectDrawGlobal
.dwMonitorFrequency
;
322 RtlCopyMemory(&pDDSD
->ddpfPixelFormat
,&This
->DirectDrawGlobal
.vmiData
.ddpfDisplay
,sizeof(DDPIXELFORMAT
));
323 RtlCopyMemory(&pDDSD
->ddsCaps
,&This
->DirectDrawGlobal
.ddCaps
,sizeof(DDCORECAPS
));
325 /* have not check where I should get hold of this info yet
326 DWORD dwBackBufferCount;
327 DWORD dwAlphaBitDepth;
332 DDCOLORKEY ddckCKDestOverlay;
333 DWORD dwEmptyFaceColor;
335 DDCOLORKEY ddckCKDestBlt;
336 DDCOLORKEY ddckCKSrcOverlay;
337 DDCOLORKEY ddckCKSrcBlt;
338 DWORD dwTextureStage;
344 HRESULT WINAPI
Main_DirectDraw_WaitForVerticalBlank(LPDIRECTDRAW7 iface
, DWORD dwFlags
,
347 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
349 if (This
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.dwFlags
& DDHAL_CB32_WAITFORVERTICALBLANK
)
351 return Hal_DirectDraw_WaitForVerticalBlank( iface
, dwFlags
, h
);
354 return Hel_DirectDraw_WaitForVerticalBlank( iface
, dwFlags
, h
);
357 HRESULT WINAPI
Main_DirectDraw_GetAvailableVidMem(LPDIRECTDRAW7 iface
, LPDDSCAPS2 ddscaps
,
358 LPDWORD total
, LPDWORD free
)
360 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
362 if (This
->DirectDrawGlobal
.lpDDCBtmp
->HALDDMiscellaneous
.dwFlags
& DDHAL_MISCCB32_GETAVAILDRIVERMEMORY
)
364 return Hal_DirectDraw_GetAvailableVidMem (iface
,ddscaps
,total
,free
);
367 return Hel_DirectDraw_GetAvailableVidMem (iface
,ddscaps
,total
,free
);
370 HRESULT WINAPI
Main_DirectDraw_GetMonitorFrequency(LPDIRECTDRAW7 iface
,LPDWORD freq
)
372 IDirectDrawImpl
*This
= (IDirectDrawImpl
*)iface
;
379 *freq
= This
->DirectDrawGlobal
.dwMonitorFrequency
;
383 HRESULT WINAPI
Main_DirectDraw_GetScanLine(LPDIRECTDRAW7 iface
, LPDWORD lpdwScanLine
)
385 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
387 if (This
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.dwFlags
& DDHAL_CB32_GETSCANLINE
)
389 return Hal_DirectDraw_GetScanLine( iface
, lpdwScanLine
);
392 return Hel_DirectDraw_GetScanLine( iface
, lpdwScanLine
);
395 /********************************** Stubs **********************************/
397 HRESULT WINAPI
Main_DirectDraw_Compact(LPDIRECTDRAW7 iface
)
402 HRESULT WINAPI
Main_DirectDraw_DuplicateSurface(LPDIRECTDRAW7 iface
, LPDIRECTDRAWSURFACE7 src
,
403 LPDIRECTDRAWSURFACE7
* dst
)
408 HRESULT WINAPI
Main_DirectDraw_EnumDisplayModes(LPDIRECTDRAW7 iface
, DWORD dwFlags
,
409 LPDDSURFACEDESC2 pDDSD
, LPVOID context
, LPDDENUMMODESCALLBACK2 callback
)
414 HRESULT WINAPI
Main_DirectDraw_EnumSurfaces(LPDIRECTDRAW7 iface
, DWORD dwFlags
,
415 LPDDSURFACEDESC2 lpDDSD2
, LPVOID context
,
416 LPDDENUMSURFACESCALLBACK7 callback
)
422 HRESULT WINAPI
Main_DirectDraw_GetFourCCCodes(LPDIRECTDRAW7 iface
, LPDWORD pNumCodes
, LPDWORD pCodes
)
427 HRESULT WINAPI
Main_DirectDraw_GetGDISurface(LPDIRECTDRAW7 iface
,
428 LPDIRECTDRAWSURFACE7
*lplpGDIDDSSurface
)
433 HRESULT WINAPI
Main_DirectDraw_GetVerticalBlankStatus(LPDIRECTDRAW7 iface
, LPBOOL status
)
438 HRESULT WINAPI
Main_DirectDraw_RestoreDisplayMode(LPDIRECTDRAW7 iface
)
443 HRESULT WINAPI
Main_DirectDraw_GetSurfaceFromDC(LPDIRECTDRAW7 iface
, HDC hdc
,
444 LPDIRECTDRAWSURFACE7
*lpDDS
)
449 HRESULT WINAPI
Main_DirectDraw_RestoreAllSurfaces(LPDIRECTDRAW7 iface
)
454 HRESULT WINAPI
Main_DirectDraw_TestCooperativeLevel(LPDIRECTDRAW7 iface
)
459 HRESULT WINAPI
Main_DirectDraw_GetDeviceIdentifier(LPDIRECTDRAW7 iface
,
460 LPDDDEVICEIDENTIFIER2 pDDDI
, DWORD dwFlags
)
465 HRESULT WINAPI
Main_DirectDraw_StartModeTest(LPDIRECTDRAW7 iface
, LPSIZE pModes
,
466 DWORD dwNumModes
, DWORD dwFlags
)
471 HRESULT WINAPI
Main_DirectDraw_EvaluateMode(LPDIRECTDRAW7 iface
,DWORD a
,DWORD
* b
)
476 IDirectDraw7Vtbl DirectDraw7_Vtable
=
478 Main_DirectDraw_QueryInterface
,
479 Main_DirectDraw_AddRef
,
480 Main_DirectDraw_Release
,
481 Main_DirectDraw_Compact
,
482 Main_DirectDraw_CreateClipper
,
483 Main_DirectDraw_CreatePalette
,
484 Main_DirectDraw_CreateSurface
,
485 Main_DirectDraw_DuplicateSurface
,
486 Main_DirectDraw_EnumDisplayModes
,
487 Main_DirectDraw_EnumSurfaces
,
488 Main_DirectDraw_FlipToGDISurface
,
489 Main_DirectDraw_GetCaps
,
490 Main_DirectDraw_GetDisplayMode
,
491 Main_DirectDraw_GetFourCCCodes
,
492 Main_DirectDraw_GetGDISurface
,
493 Main_DirectDraw_GetMonitorFrequency
,
494 Main_DirectDraw_GetScanLine
,
495 Main_DirectDraw_GetVerticalBlankStatus
,
496 Main_DirectDraw_Initialize
,
497 Main_DirectDraw_RestoreDisplayMode
,
498 Main_DirectDraw_SetCooperativeLevel
,
499 Main_DirectDraw_SetDisplayMode
,
500 Main_DirectDraw_WaitForVerticalBlank
,
501 Main_DirectDraw_GetAvailableVidMem
,
502 Main_DirectDraw_GetSurfaceFromDC
,
503 Main_DirectDraw_RestoreAllSurfaces
,
504 Main_DirectDraw_TestCooperativeLevel
,
505 Main_DirectDraw_GetDeviceIdentifier
,
506 Main_DirectDraw_StartModeTest
,
507 Main_DirectDraw_EvaluateMode