3 * COPYRIGHT: See COPYING in the top level directory
5 * FILE: lib/ddraw/main/ddraw.c
6 * PURPOSE: DirectDraw Implementation
7 * PROGRAMMER: Magnus Olsen, Maarten Bosma
14 HRESULT WINAPI
Main_DirectDraw_Initialize (LPDIRECTDRAW7 iface
, LPGUID lpGUID
)
16 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
19 // this if it is not called by DirectDrawCreate
21 return DDERR_ALREADYINITIALIZED
;
24 This
->lpGUID
= lpGUID
;
27 This
->hdc
= GetWindowDC(GetDesktopWindow());
28 This
->Height
= GetDeviceCaps(This
->hdc
, HORZRES
);
29 This
->Width
= GetDeviceCaps(This
->hdc
, VERTRES
);
30 This
->Bpp
= GetDeviceCaps(This
->hdc
, BITSPIXEL
);
32 // call software first
33 if((ret
= Hal_DirectDraw_Initialize (iface
)) != DD_OK
)
36 // ... then overwrite with hal
37 if((ret
= Hel_DirectDraw_Initialize (iface
)) != DD_OK
)
43 HRESULT WINAPI
Main_DirectDraw_SetCooperativeLevel (LPDIRECTDRAW7 iface
, HWND hwnd
, DWORD cooplevel
)
46 // - create a scaner that check which driver we should get the HDC from
47 // for now we always asume it is the active dirver that should be use.
50 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
53 // check the parameters
54 if (This
->cooperative_level
== cooplevel
&& This
->window
== hwnd
)
58 return DDERR_HWNDALREADYSET
;
60 if (This
->cooperative_level
)
61 return DDERR_EXCLUSIVEMODEALREADYSET
;
63 if ((cooplevel
&DDSCL_EXCLUSIVE
) && !(cooplevel
&DDSCL_FULLSCREEN
))
64 return DDERR_INVALIDPARAMS
;
66 if (cooplevel
&DDSCL_NORMAL
&& cooplevel
&DDSCL_FULLSCREEN
)
67 return DDERR_INVALIDPARAMS
;
71 This
->hdc
= GetDC(hwnd
);
72 This
->cooperative_level
= cooplevel
;
74 if((ret
= Hel_DirectDraw_SetCooperativeLevel (iface
)) != DD_OK
)
77 if((ret
= Hal_DirectDraw_SetCooperativeLevel (iface
)) != DD_OK
)
83 HRESULT WINAPI
Main_DirectDraw_SetDisplayMode (LPDIRECTDRAW7 iface
, DWORD dwWidth
, DWORD dwHeight
,
84 DWORD dwBPP
, DWORD dwRefreshRate
, DWORD dwFlags
)
86 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
88 // this only for exclusive mode
89 if(!(This
->cooperative_level
& DDSCL_EXCLUSIVE
))
90 return DDERR_NOEXCLUSIVEMODE
;
92 // change the resolution using normal WinAPI function
94 mode
.dmSize
= sizeof(mode
);
95 mode
.dmPelsWidth
= dwWidth
;
96 mode
.dmPelsHeight
= dwHeight
;
97 mode
.dmBitsPerPel
= dwBPP
;
98 mode
.dmDisplayFrequency
= dwRefreshRate
;
102 mode
.dmFields
|= DM_PELSWIDTH
;
104 mode
.dmFields
|= DM_PELSHEIGHT
;
106 mode
.dmFields
|= DM_BITSPERPEL
;
108 mode
.dmFields
|= DM_DISPLAYFREQUENCY
;
110 if (ChangeDisplaySettings(&mode
, CDS_FULLSCREEN
) != DISP_CHANGE_SUCCESSFUL
)
111 return DDERR_UNSUPPORTEDMODE
;
113 // TODO: reactivate ddraw object, maximize window, set it in foreground
114 // and set excluive mode (if implemented by the driver)
117 This
->Height
= dwWidth
;
119 This
->Width
= dwHeight
;
126 HRESULT WINAPI
Main_DirectDraw_CreateSurface (LPDIRECTDRAW7 iface
, LPDDSURFACEDESC2 pDDSD
,
127 LPDIRECTDRAWSURFACE7
*ppSurf
, IUnknown
*pUnkOuter
)
130 return DDERR_INVALIDPARAMS
;
132 if(sizeof(DDSURFACEDESC2
)!=pDDSD
->dwSize
)
133 return DDERR_UNSUPPORTED
;
135 // the nasty com stuff
136 IDirectDrawSurfaceImpl
* That
;
138 That
= (IDirectDrawSurfaceImpl
*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY
, sizeof(IDirectDrawSurfaceImpl
));
141 return E_OUTOFMEMORY
;
143 That
->lpVtbl
= &DDrawSurface_VTable
;
145 *ppSurf
= (LPDIRECTDRAWSURFACE7
)That
;
147 // the real surface object creation
148 return That
->lpVtbl
->Initialize (*ppSurf
, (LPDIRECTDRAW
)iface
, pDDSD
);
151 ULONG WINAPI
Main_DirectDraw_AddRef (LPDIRECTDRAW7 iface
)
153 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
154 ULONG ref
= InterlockedIncrement(&This
->ref
);
159 ULONG WINAPI
Main_DirectDraw_Release (LPDIRECTDRAW7 iface
)
161 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
162 ULONG ref
= InterlockedDecrement(&This
->ref
);
166 // set resoltion back to the one in registry
167 if(This
->cooperative_level
& DDSCL_EXCLUSIVE
)
168 ChangeDisplaySettings(NULL
, 0);
170 HeapFree(GetProcessHeap(), 0, This
);
178 HRESULT WINAPI
Main_DirectDraw_QueryInterface (LPDIRECTDRAW7 iface
,REFIID refiid
,LPVOID
*obj
)
180 return DDERR_UNSUPPORTED
;
183 HRESULT WINAPI
Main_DirectDraw_Compact(LPDIRECTDRAW7 iface
)
185 return DDERR_UNSUPPORTED
;
188 HRESULT WINAPI
Main_DirectDraw_CreateClipper(LPDIRECTDRAW7 iface
, DWORD dwFlags
,
189 LPDIRECTDRAWCLIPPER
*ppClipper
, IUnknown
*pUnkOuter
)
191 return DDERR_UNSUPPORTED
;
193 HRESULT WINAPI
Main_DirectDraw_CreatePalette(LPDIRECTDRAW7 iface
, DWORD dwFlags
,
194 LPPALETTEENTRY palent
,LPDIRECTDRAWPALETTE
* ppPalette
,LPUNKNOWN pUnknown
)
196 return DDERR_UNSUPPORTED
;
199 HRESULT WINAPI
Main_DirectDraw_DuplicateSurface(LPDIRECTDRAW7 iface
, LPDIRECTDRAWSURFACE7 src
,
200 LPDIRECTDRAWSURFACE7
* dst
)
202 return DDERR_UNSUPPORTED
;
205 HRESULT WINAPI
Main_DirectDraw_EnumDisplayModes(LPDIRECTDRAW7 iface
, DWORD dwFlags
,
206 LPDDSURFACEDESC2 pDDSD
, LPVOID context
, LPDDENUMMODESCALLBACK2 callback
)
208 return DDERR_UNSUPPORTED
;
211 HRESULT WINAPI
Main_DirectDraw_EnumSurfaces(LPDIRECTDRAW7 iface
, DWORD dwFlags
,
212 LPDDSURFACEDESC2 lpDDSD2
, LPVOID context
,
213 LPDDENUMSURFACESCALLBACK7 callback
)
215 return DDERR_UNSUPPORTED
;
218 HRESULT WINAPI
Main_DirectDraw_FlipToGDISurface(LPDIRECTDRAW7 iface
)
220 return DDERR_UNSUPPORTED
;
223 HRESULT WINAPI
Main_DirectDraw_GetCaps(LPDIRECTDRAW7 iface
, LPDDCAPS pDriverCaps
,
226 return DDERR_UNSUPPORTED
;
229 HRESULT WINAPI
Main_DirectDraw_GetDisplayMode(LPDIRECTDRAW7 iface
, LPDDSURFACEDESC2 pDDSD
)
231 return DDERR_UNSUPPORTED
;
235 HRESULT WINAPI
Main_DirectDraw_GetFourCCCodes(LPDIRECTDRAW7 iface
, LPDWORD pNumCodes
, LPDWORD pCodes
)
237 return DDERR_UNSUPPORTED
;
240 HRESULT WINAPI
Main_DirectDraw_GetGDISurface(LPDIRECTDRAW7 iface
,
241 LPDIRECTDRAWSURFACE7
*lplpGDIDDSSurface
)
243 return DDERR_UNSUPPORTED
;
246 HRESULT WINAPI
Main_DirectDraw_GetMonitorFrequency(LPDIRECTDRAW7 iface
,LPDWORD freq
)
248 return DDERR_UNSUPPORTED
;
251 HRESULT WINAPI
Main_DirectDraw_GetScanLine(LPDIRECTDRAW7 iface
, LPDWORD lpdwScanLine
)
253 return DDERR_UNSUPPORTED
;
256 HRESULT WINAPI
Main_DirectDraw_GetVerticalBlankStatus(LPDIRECTDRAW7 iface
, LPBOOL status
)
258 return DDERR_UNSUPPORTED
;
261 HRESULT WINAPI
Main_DirectDraw_RestoreDisplayMode(LPDIRECTDRAW7 iface
)
263 return DDERR_UNSUPPORTED
;
266 HRESULT WINAPI
Main_DirectDraw_WaitForVerticalBlank(LPDIRECTDRAW7 iface
, DWORD dwFlags
,
270 return DDERR_UNSUPPORTED
;
273 HRESULT WINAPI
Main_DirectDraw_GetAvailableVidMem(LPDIRECTDRAW7 iface
, LPDDSCAPS2 ddscaps
,
274 LPDWORD total
, LPDWORD free
)
277 return DDERR_UNSUPPORTED
;
280 HRESULT WINAPI
Main_DirectDraw_GetSurfaceFromDC(LPDIRECTDRAW7 iface
, HDC hdc
,
281 LPDIRECTDRAWSURFACE7
*lpDDS
)
283 return DDERR_UNSUPPORTED
;
286 HRESULT WINAPI
Main_DirectDraw_RestoreAllSurfaces(LPDIRECTDRAW7 iface
)
288 return DDERR_UNSUPPORTED
;
291 HRESULT WINAPI
Main_DirectDraw_TestCooperativeLevel(LPDIRECTDRAW7 iface
)
293 return DDERR_UNSUPPORTED
;
296 HRESULT WINAPI
Main_DirectDraw_GetDeviceIdentifier(LPDIRECTDRAW7 iface
,
297 LPDDDEVICEIDENTIFIER2 pDDDI
, DWORD dwFlags
)
299 return DDERR_UNSUPPORTED
;
302 HRESULT WINAPI
Main_DirectDraw_StartModeTest(LPDIRECTDRAW7 iface
, LPSIZE pModes
,
303 DWORD dwNumModes
, DWORD dwFlags
)
305 return DDERR_UNSUPPORTED
;
308 HRESULT WINAPI
Main_DirectDraw_EvaluateMode(LPDIRECTDRAW7 iface
,DWORD a
,DWORD
* b
)
310 return DDERR_UNSUPPORTED
;
313 IDirectDraw7Vtbl DirectDraw_VTable
=
315 Main_DirectDraw_QueryInterface
,
316 Main_DirectDraw_AddRef
,
317 Main_DirectDraw_Release
,
318 Main_DirectDraw_Compact
,
319 Main_DirectDraw_CreateClipper
,
320 Main_DirectDraw_CreatePalette
,
321 Main_DirectDraw_CreateSurface
,
322 Main_DirectDraw_DuplicateSurface
,
323 Main_DirectDraw_EnumDisplayModes
,
324 Main_DirectDraw_EnumSurfaces
,
325 Main_DirectDraw_FlipToGDISurface
,
326 Main_DirectDraw_GetCaps
,
327 Main_DirectDraw_GetDisplayMode
,
328 Main_DirectDraw_GetFourCCCodes
,
329 Main_DirectDraw_GetGDISurface
,
330 Main_DirectDraw_GetMonitorFrequency
,
331 Main_DirectDraw_GetScanLine
,
332 Main_DirectDraw_GetVerticalBlankStatus
,
333 Main_DirectDraw_Initialize
,
334 Main_DirectDraw_RestoreDisplayMode
,
335 Main_DirectDraw_SetCooperativeLevel
,
336 Main_DirectDraw_SetDisplayMode
,
337 Main_DirectDraw_WaitForVerticalBlank
,
338 Main_DirectDraw_GetAvailableVidMem
,
339 Main_DirectDraw_GetSurfaceFromDC
,
340 Main_DirectDraw_RestoreAllSurfaces
,
341 Main_DirectDraw_TestCooperativeLevel
,
342 Main_DirectDraw_GetDeviceIdentifier
,
343 Main_DirectDraw_StartModeTest
,
344 Main_DirectDraw_EvaluateMode