1 /* $Id: main.c 21434 2006-04-01 19:12:56Z greatlrd $
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * FILE: lib/ddraw/ddraw.c
6 * PURPOSE: DirectDraw Library
7 * PROGRAMMER: Magnus Olsen (greatlrd)
16 DDRAWI_DIRECTDRAW_GBL ddgbl
;
17 DDRAWI_DDRAWSURFACE_GBL ddSurfGbl
;
21 StartDirectDraw(LPDIRECTDRAW
* iface
, LPGUID lpGuid
, BOOL reenable
)
23 LPDDRAWI_DIRECTDRAW_INT This
= (LPDDRAWI_DIRECTDRAW_INT
)iface
;
24 DWORD hal_ret
= DD_FALSE
;
25 DWORD hel_ret
= DD_FALSE
;
28 const UINT bmiSize
= sizeof(BITMAPINFOHEADER
) + 0x10;
37 if (reenable
== FALSE
)
39 if (This
->lpLink
== NULL
)
41 RtlZeroMemory(&ddgbl
, sizeof(DDRAWI_DIRECTDRAW_GBL
));
42 This
->lpLcl
->lpGbl
->dwRefCnt
++;
43 if (ddgbl
.lpDDCBtmp
== NULL
)
45 ddgbl
.lpDDCBtmp
= (LPDDHAL_CALLBACKS
) DxHeapMemAlloc(sizeof(DDHAL_CALLBACKS
));
46 if (ddgbl
.lpDDCBtmp
== NULL
)
48 DX_STUB_str("Out of memmory");
56 Visual studio think this code is a break point if we call
57 second time to this function, press on continue in visual
58 studio the program will work. No real bug. gcc 3.4.5 genreate
59 code that look like MS visual studio break point.
62 This
->lpLcl
->lpDDCB
= ddgbl
.lpDDCBtmp
;
64 /* Same for HEL and HAL */
66 if (ddgbl
.lpModeInfo
== NULL
)
68 ddgbl
.lpModeInfo
= (DDHALMODEINFO
*) DxHeapMemAlloc(1 * sizeof(DDHALMODEINFO
));
69 if (ddgbl
.lpModeInfo
== NULL
)
71 DX_STUB_str("DD_FALSE");
76 EnumDisplaySettings(NULL
, ENUM_CURRENT_SETTINGS
, &devmode
);
78 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwWidth
= devmode
.dmPelsWidth
;
79 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwHeight
= devmode
.dmPelsHeight
;
80 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwBPP
= devmode
.dmBitsPerPel
;
81 This
->lpLcl
->lpGbl
->lpModeInfo
[0].lPitch
= (devmode
.dmPelsWidth
*devmode
.dmBitsPerPel
)/8;
82 This
->lpLcl
->lpGbl
->lpModeInfo
[0].wRefreshRate
= (WORD
)devmode
.dmDisplayFrequency
;
85 if (reenable
== FALSE
)
91 /* Create HDC for default, hal and hel driver */
92 This
->lpLcl
->hDC
= (ULONG_PTR
) CreateDCW(L
"DISPLAY",L
"DISPLAY",NULL
,NULL
);
94 /* cObsolete is undoc in msdn it being use in CreateDCA */
95 RtlCopyMemory(&ddgbl
.cObsolete
,&"DISPLAY",7);
96 RtlCopyMemory(&ddgbl
.cDriverName
,&"DISPLAY",7);
98 dwFlags
|= DDRAWI_DISPLAYDRV
| DDRAWI_GDIDRV
;
100 else if (lpGuid
== (LPGUID
) DDCREATE_HARDWAREONLY
)
103 /* Create HDC for default, hal and hel driver */
104 This
->lpLcl
->hDC
= (ULONG_PTR
)CreateDCW(L
"DISPLAY",L
"DISPLAY",NULL
,NULL
);
106 /* cObsolete is undoc in msdn it being use in CreateDCA */
107 RtlCopyMemory(&ddgbl
.cObsolete
,&"DISPLAY",7);
108 RtlCopyMemory(&ddgbl
.cDriverName
,&"DISPLAY",7);
109 dwFlags
|= DDRAWI_DISPLAYDRV
| DDRAWI_GDIDRV
;
111 else if (lpGuid
== (LPGUID
) DDCREATE_EMULATIONONLY
)
115 /* Create HDC for default, hal and hel driver */
116 This
->lpLcl
->hDC
= (ULONG_PTR
) CreateDCW(L
"DISPLAY",L
"DISPLAY",NULL
,NULL
);
118 /* cObsolete is undoc in msdn it being use in CreateDCA */
119 RtlCopyMemory(&ddgbl
.cObsolete
,&"DISPLAY",7);
120 RtlCopyMemory(&ddgbl
.cDriverName
,&"DISPLAY",7);
122 dwFlags
|= DDRAWI_DISPLAYDRV
| DDRAWI_GDIDRV
;
126 /* FIXME : need getting driver from the GUID that have been pass in from
127 * the register. we do not support that yet
130 This
->lpLcl
->hDC
= (ULONG_PTR
) NULL
;
133 if ( (HDC
)This
->lpLcl
->hDC
== NULL
)
135 DX_STUB_str("DDERR_OUTOFMEMORY");
136 return DDERR_OUTOFMEMORY
;
140 hbmp
= CreateCompatibleBitmap((HDC
) This
->lpLcl
->hDC
, 1, 1);
143 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
144 DeleteDC((HDC
) This
->lpLcl
->hDC
);
145 DX_STUB_str("DDERR_OUTOFMEMORY");
146 return DDERR_OUTOFMEMORY
;
149 pbmiData
= (UCHAR
*) DxHeapMemAlloc(bmiSize
);
150 pbmi
= (BITMAPINFO
*)pbmiData
;
154 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
155 DeleteDC((HDC
) This
->lpLcl
->hDC
);
157 DX_STUB_str("DDERR_OUTOFMEMORY");
158 return DDERR_OUTOFMEMORY
;
161 pbmi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
162 pbmi
->bmiHeader
.biBitCount
= (WORD
)devmode
.dmBitsPerPel
;
163 pbmi
->bmiHeader
.biCompression
= BI_BITFIELDS
;
164 pbmi
->bmiHeader
.biWidth
= 1;
165 pbmi
->bmiHeader
.biHeight
= 1;
167 GetDIBits((HDC
) This
->lpLcl
->hDC
, hbmp
, 0, 0, NULL
, pbmi
, 0);
170 pMasks
= (DWORD
*)(pbmiData
+ sizeof(BITMAPINFOHEADER
));
171 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwRBitMask
= pMasks
[0];
172 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwGBitMask
= pMasks
[1];
173 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwBBitMask
= pMasks
[2];
174 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwAlphaBitMask
= pMasks
[3];
176 DxHeapMemFree(pbmiData
);
178 /* Startup HEL and HAL */
179 // RtlZeroMemory(&ddgbl, sizeof(DDRAWI_DIRECTDRAW_GBL));
181 This
->lpLcl
->lpDDCB
= This
->lpLcl
->lpGbl
->lpDDCBtmp
;
182 This
->lpLcl
->dwProcessId
= GetCurrentProcessId();
187 hal_ret
= StartDirectDrawHal(iface
, reenable
);
188 This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
= 0;
192 hel_ret
= StartDirectDrawHel(iface
, reenable
);
193 This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
= 0;
197 hal_ret
= StartDirectDrawHal(iface
, reenable
);
198 hel_ret
= StartDirectDrawHel(iface
, reenable
);
205 DX_STUB_str("DDERR_NODIRECTDRAWSUPPORT");
206 return DDERR_NODIRECTDRAWSUPPORT
;
208 dwFlags
|= DDRAWI_NOHARDWARE
;
213 dwFlags
|= DDRAWI_NOEMULATION
;
218 dwFlags
|= DDRAWI_EMULATIONINITIALIZED
;
221 This
->lpLcl
->lpGbl
->dwFlags
= dwFlags
| DDRAWI_ATTACHEDTODESKTOP
;
223 This
->lpLcl
->hDD
= This
->lpLcl
->lpGbl
->hDD
;
225 /* Mix the DDCALLBACKS */
226 This
->lpLcl
->lpDDCB
= This
->lpLcl
->lpGbl
->lpDDCBtmp
;
228 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->cbDDCallbacks
);
230 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
) && (devicetypes
!=3))
232 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CANCREATESURFACE
;
233 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CanCreateSurface
= This
->lpLcl
->lpDDCB
->HALDD
.CanCreateSurface
;
235 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
) && (devicetypes
!=2))
237 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CANCREATESURFACE
;
238 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CanCreateSurface
= This
->lpLcl
->lpDDCB
->HELDD
.CanCreateSurface
;
241 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_CREATESURFACE
) && (devicetypes
!=3))
243 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CREATESURFACE
;
244 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CreateSurface
= This
->lpLcl
->lpDDCB
->HALDD
.CreateSurface
;
246 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_CREATESURFACE
) && (devicetypes
!=2))
248 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CREATESURFACE
;
249 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CreateSurface
= This
->lpLcl
->lpDDCB
->HELDD
.CreateSurface
;
252 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_CREATEPALETTE
) && (devicetypes
!=3))
254 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CREATEPALETTE
;
255 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CreatePalette
= This
->lpLcl
->lpDDCB
->HALDD
.CreatePalette
;
257 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_CREATEPALETTE
) && (devicetypes
!=2))
259 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CREATEPALETTE
;
260 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CreatePalette
= This
->lpLcl
->lpDDCB
->HELDD
.CreatePalette
;
262 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_DESTROYDRIVER
) && (devicetypes
!=3))
264 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_DESTROYDRIVER
;
265 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.DestroyDriver
= This
->lpLcl
->lpDDCB
->HALDD
.DestroyDriver
;
267 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_DESTROYDRIVER
) && (devicetypes
!=2))
269 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_DESTROYDRIVER
;
270 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.DestroyDriver
= This
->lpLcl
->lpDDCB
->HELDD
.DestroyDriver
;
272 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_FLIPTOGDISURFACE
) && (devicetypes
!=3))
274 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_FLIPTOGDISURFACE
;
275 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.FlipToGDISurface
= This
->lpLcl
->lpDDCB
->HALDD
.FlipToGDISurface
;
277 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_FLIPTOGDISURFACE
) && (devicetypes
!=2))
279 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_FLIPTOGDISURFACE
;
280 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.FlipToGDISurface
= This
->lpLcl
->lpDDCB
->HELDD
.FlipToGDISurface
;
282 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_GETSCANLINE
) && (devicetypes
!=3))
284 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_GETSCANLINE
;
285 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.GetScanLine
= This
->lpLcl
->lpDDCB
->HALDD
.GetScanLine
;
287 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_GETSCANLINE
) && (devicetypes
!=2))
289 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_GETSCANLINE
;
290 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.GetScanLine
= This
->lpLcl
->lpDDCB
->HELDD
.GetScanLine
;
292 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_SETCOLORKEY
) && (devicetypes
!=3))
294 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETCOLORKEY
;
295 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetColorKey
= This
->lpLcl
->lpDDCB
->HALDD
.SetColorKey
;
297 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_SETCOLORKEY
) && (devicetypes
!=2))
299 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETCOLORKEY
;
300 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetColorKey
= This
->lpLcl
->lpDDCB
->HELDD
.SetColorKey
;
302 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_SETEXCLUSIVEMODE
) && (devicetypes
!=3))
304 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETEXCLUSIVEMODE
;
305 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetExclusiveMode
= This
->lpLcl
->lpDDCB
->HALDD
.SetExclusiveMode
;
307 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_SETEXCLUSIVEMODE
) && (devicetypes
!=2))
309 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETEXCLUSIVEMODE
;
310 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetExclusiveMode
= This
->lpLcl
->lpDDCB
->HELDD
.SetExclusiveMode
;
312 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_SETMODE
) && (devicetypes
!=3))
314 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETMODE
;
315 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetMode
= This
->lpLcl
->lpDDCB
->HALDD
.SetMode
;
317 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_SETMODE
) && (devicetypes
!=2))
319 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETMODE
;
320 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetMode
= This
->lpLcl
->lpDDCB
->HELDD
.SetMode
;
322 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_WAITFORVERTICALBLANK
) && (devicetypes
!=3))
324 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_WAITFORVERTICALBLANK
;
325 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.WaitForVerticalBlank
=
326 This
->lpLcl
->lpDDCB
->HALDD
.WaitForVerticalBlank
;
328 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_WAITFORVERTICALBLANK
) && (devicetypes
!=2))
330 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_WAITFORVERTICALBLANK
;
331 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.WaitForVerticalBlank
=
332 This
->lpLcl
->lpDDCB
->HELDD
.WaitForVerticalBlank
;
335 /* Mix the DDSURFACE CALLBACKS */
336 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
);
338 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
) && (devicetypes
!=3))
340 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_ADDATTACHEDSURFACE
;
341 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.AddAttachedSurface
=
342 This
->lpLcl
->lpDDCB
->HALDDSurface
.AddAttachedSurface
;
344 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
) && (devicetypes
!=2))
346 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_ADDATTACHEDSURFACE
;
348 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.AddAttachedSurface
=
349 This
->lpLcl
->lpDDCB
->HELDDSurface
.AddAttachedSurface
;
352 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_BLT
) && (devicetypes
!=3))
354 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_BLT
;
355 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Blt
= This
->lpLcl
->lpDDCB
->HALDDSurface
.Blt
;
357 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_BLT
) && (devicetypes
!=2))
359 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_BLT
;
360 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Blt
= This
->lpLcl
->lpDDCB
->HELDDSurface
.Blt
;
363 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_DESTROYSURFACE
) && (devicetypes
!=3))
365 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_DESTROYSURFACE
;
366 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.DestroySurface
= This
->lpLcl
->lpDDCB
->HALDDSurface
.DestroySurface
;
368 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_DESTROYSURFACE
) && (devicetypes
!=2))
370 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_DESTROYSURFACE
;
371 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.DestroySurface
= This
->lpLcl
->lpDDCB
->HELDDSurface
.DestroySurface
;
374 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_FLIP
) && (devicetypes
!=3))
376 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_FLIP
;
377 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Flip
= This
->lpLcl
->lpDDCB
->HALDDSurface
.Flip
;
379 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_FLIP
) && (devicetypes
!=2))
381 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_FLIP
;
382 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Flip
= This
->lpLcl
->lpDDCB
->HELDDSurface
.Flip
;
385 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_GETBLTSTATUS
) && (devicetypes
!=3))
387 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_GETBLTSTATUS
;
388 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.GetBltStatus
=
389 This
->lpLcl
->lpDDCB
->HALDDSurface
.GetBltStatus
;
391 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_GETBLTSTATUS
) && (devicetypes
!=2))
393 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_GETBLTSTATUS
;
394 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.GetBltStatus
= This
->lpLcl
->lpDDCB
->HELDDSurface
.GetBltStatus
;
397 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_GETFLIPSTATUS
) && (devicetypes
!=3))
399 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_GETFLIPSTATUS
;
400 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.GetFlipStatus
= This
->lpLcl
->lpDDCB
->HALDDSurface
.GetFlipStatus
;
402 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_GETFLIPSTATUS
) && (devicetypes
!=2))
404 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_GETFLIPSTATUS
;
405 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.GetFlipStatus
= This
->lpLcl
->lpDDCB
->HELDDSurface
.GetFlipStatus
;
408 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_LOCK
) && (devicetypes
!=3))
410 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_LOCK
;
411 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Lock
= This
->lpLcl
->lpDDCB
->HALDDSurface
.Lock
;
413 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_LOCK
) && (devicetypes
!=2))
415 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_LOCK
;
416 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Lock
= This
->lpLcl
->lpDDCB
->HELDDSurface
.Lock
;
419 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_RESERVED4
) && (devicetypes
!=3))
421 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_RESERVED4
;
422 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.reserved4
= This
->lpLcl
->lpDDCB
->HALDDSurface
.reserved4
;
424 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_RESERVED4
) && (devicetypes
!=2))
426 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_RESERVED4
;
427 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.reserved4
= This
->lpLcl
->lpDDCB
->HELDDSurface
.reserved4
;
430 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_SETCLIPLIST
) && (devicetypes
!=3))
432 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETCLIPLIST
;
433 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetClipList
= This
->lpLcl
->lpDDCB
->HALDDSurface
.SetClipList
;
435 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_SETCLIPLIST
) && (devicetypes
!=2))
437 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETCLIPLIST
;
438 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetClipList
= This
->lpLcl
->lpDDCB
->HELDDSurface
.SetClipList
;
441 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_SETCOLORKEY
) && (devicetypes
!=3))
443 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETCOLORKEY
;
444 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetColorKey
= This
->lpLcl
->lpDDCB
->HALDDSurface
.SetColorKey
;
446 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_SETCOLORKEY
) && (devicetypes
!=2))
448 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETCOLORKEY
;
449 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetColorKey
= This
->lpLcl
->lpDDCB
->HELDDSurface
.SetColorKey
;
452 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
) && (devicetypes
!=3))
454 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETOVERLAYPOSITION
;
455 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetOverlayPosition
=
456 This
->lpLcl
->lpDDCB
->HALDDSurface
.SetOverlayPosition
;
458 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
) && (devicetypes
!=2))
460 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETOVERLAYPOSITION
;
461 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetOverlayPosition
=
462 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetOverlayPosition
;
465 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_SETPALETTE
) && (devicetypes
!=3))
467 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETPALETTE
;
468 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetPalette
= This
->lpLcl
->lpDDCB
->HALDDSurface
.SetPalette
;
470 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_SETPALETTE
) && (devicetypes
!=2))
472 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETPALETTE
;
473 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetPalette
= This
->lpLcl
->lpDDCB
->HELDDSurface
.SetPalette
;
476 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_UNLOCK
) && (devicetypes
!=3))
478 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_UNLOCK
;
479 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Unlock
= This
->lpLcl
->lpDDCB
->HALDDSurface
.Unlock
;
481 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_UNLOCK
) && (devicetypes
!=2))
483 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_UNLOCK
;
484 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Unlock
= This
->lpLcl
->lpDDCB
->HELDDSurface
.Unlock
;
487 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_UPDATEOVERLAY
) && (devicetypes
!=3))
489 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_UPDATEOVERLAY
;
490 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.UpdateOverlay
= This
->lpLcl
->lpDDCB
->HALDDSurface
.UpdateOverlay
;
492 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_UPDATEOVERLAY
) && (devicetypes
!=2))
494 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_UPDATEOVERLAY
;
495 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.UpdateOverlay
= This
->lpLcl
->lpDDCB
->HELDDSurface
.UpdateOverlay
;
498 /* Mix the DDPALETTE CALLBACKS */
499 This
->lpLcl
->lpDDCB
->HALDDPalette
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->HALDDPalette
);
501 if ((This
->lpLcl
->lpDDCB
->HALDDPalette
.dwFlags
& DDHAL_PALCB32_DESTROYPALETTE
) && (devicetypes
!=3))
503 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.dwFlags
|= DDHAL_PALCB32_SETENTRIES
;
504 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.DestroyPalette
=
505 This
->lpLcl
->lpDDCB
->HALDDPalette
.DestroyPalette
;
507 else if ((This
->lpLcl
->lpDDCB
->HELDDPalette
.dwFlags
& DDHAL_PALCB32_DESTROYPALETTE
) && (devicetypes
!=2))
509 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.dwFlags
|= DDHAL_PALCB32_DESTROYPALETTE
;
510 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.DestroyPalette
=
511 This
->lpLcl
->lpDDCB
->HELDDPalette
.DestroyPalette
;
514 if ((This
->lpLcl
->lpDDCB
->HALDDPalette
.dwFlags
& DDHAL_PALCB32_SETENTRIES
) && (devicetypes
!=3))
516 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.dwFlags
|= DDHAL_PALCB32_SETENTRIES
;
517 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.SetEntries
=
518 This
->lpLcl
->lpDDCB
->HALDDPalette
.SetEntries
;
520 else if ((This
->lpLcl
->lpDDCB
->HELDDPalette
.dwFlags
& DDHAL_PALCB32_SETENTRIES
) && (devicetypes
!=2))
522 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.dwFlags
|= DDHAL_PALCB32_SETENTRIES
;
523 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.SetEntries
=
524 This
->lpLcl
->lpDDCB
->HELDDPalette
.SetEntries
;
527 /* Mix the DDExeBuf CALLBACKS */
528 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
);
530 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_CANCREATEEXEBUF
) && (devicetypes
!=3))
532 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.CanCreateExecuteBuffer
=
533 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.CanCreateExecuteBuffer
;
534 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_CANCREATEEXEBUF
;
536 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_CANCREATEEXEBUF
) && (devicetypes
!=2))
538 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.CanCreateExecuteBuffer
=
539 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.CanCreateExecuteBuffer
;
540 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_CANCREATEEXEBUF
;
543 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_CREATEEXEBUF
) && (devicetypes
!=3))
545 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.CreateExecuteBuffer
=
546 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.CreateExecuteBuffer
;
547 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_CREATEEXEBUF
;
549 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_CREATEEXEBUF
) && (devicetypes
!=2))
551 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.CreateExecuteBuffer
=
552 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.CreateExecuteBuffer
;
553 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_CREATEEXEBUF
;
556 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_DESTROYEXEBUF
) && (devicetypes
!=3))
558 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.DestroyExecuteBuffer
=
559 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.DestroyExecuteBuffer
;
560 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_DESTROYEXEBUF
;
562 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_DESTROYEXEBUF
) && (devicetypes
!=2))
564 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.DestroyExecuteBuffer
=
565 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.DestroyExecuteBuffer
;
566 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_DESTROYEXEBUF
;
569 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_LOCKEXEBUF
) && (devicetypes
!=3))
571 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.LockExecuteBuffer
=
572 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.LockExecuteBuffer
;
573 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_LOCKEXEBUF
;
575 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_LOCKEXEBUF
) && (devicetypes
!=2))
577 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.LockExecuteBuffer
=
578 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.LockExecuteBuffer
;
579 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_LOCKEXEBUF
;
582 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_UNLOCKEXEBUF
) && (devicetypes
!=3))
584 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.UnlockExecuteBuffer
=
585 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.UnlockExecuteBuffer
;
586 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_UNLOCKEXEBUF
;
588 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_UNLOCKEXEBUF
) && (devicetypes
!=2))
590 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.UnlockExecuteBuffer
=
591 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.UnlockExecuteBuffer
;
592 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_UNLOCKEXEBUF
;
595 /* Fill some basic info for Surface */
598 We need setup this also
599 This->lpLcl->lpDDCB->cbDDColorControlCallbacks
600 This->lpLcl->lpDDCB->cbDDKernelCallbacks
601 This->lpLcl->lpDDCB->cbDDMiscellaneousCallbacks
602 This->lpLcl->lpDDCB->cbDDMotionCompCallbacks
603 This->lpLcl->lpDDCB->cbDDVideoPortCallbacks
606 This
->lpLcl
->hDD
= ddgbl
.hDD
;
613 StartDirectDrawHal(LPDIRECTDRAW
* iface
, BOOL reenable
)
615 LPDDRAWI_DIRECTDRAW_INT This
= (LPDDRAWI_DIRECTDRAW_INT
)iface
;
616 DDHAL_GETDRIVERINFODATA DriverInfo
;
619 DDHAL_DDEXEBUFCALLBACKS mD3dBufferCallbacks
;
620 D3DHAL_CALLBACKS mD3dCallbacks
;
621 D3DHAL_GLOBALDRIVERDATA mD3dDriverData
;
628 DDSURFACEDESC
*mpTextures
;
630 /* HAL Startup process */
631 BOOL newmode
= FALSE
;
632 RtlZeroMemory(&mHALInfo
, sizeof(DDHALINFO
));
634 if (reenable
== FALSE
)
636 ddgbl
.lpDDCBtmp
= DxHeapMemAlloc(sizeof(DDHAL_CALLBACKS
));
637 if ( ddgbl
.lpDDCBtmp
== NULL
)
644 RtlZeroMemory(ddgbl
.lpDDCBtmp
,sizeof(DDHAL_CALLBACKS
));
648 Startup DX HAL step one of three
650 if (!DdCreateDirectDrawObject(This
->lpLcl
->lpGbl
, (HDC
)This
->lpLcl
->hDC
))
652 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
653 DeleteDC((HDC
)This
->lpLcl
->hDC
);
657 // Do not relase HDC it have been map in kernel mode
660 if (!DdReenableDirectDrawObject(This
->lpLcl
->lpGbl
, &newmode
))
662 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
663 DeleteDC((HDC
)This
->lpLcl
->hDC
);
669 Startup DX HAL step two of three
672 if (!DdQueryDirectDrawObject(This
->lpLcl
->lpGbl
,
674 &ddgbl
.lpDDCBtmp
->HALDD
,
675 &ddgbl
.lpDDCBtmp
->HALDDSurface
,
676 &ddgbl
.lpDDCBtmp
->HALDDPalette
,
679 &mD3dBufferCallbacks
,
684 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
685 DeleteDC((HDC
)This
->lpLcl
->hDC
);
686 // FIXME Close DX fristcall and second call
690 mcvmList
= mHALInfo
.vmiData
.dwNumHeaps
;
691 mpvmList
= (VIDMEM
*) DxHeapMemAlloc(sizeof(VIDMEM
) * mcvmList
);
692 if (mpvmList
== NULL
)
694 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
695 DeleteDC((HDC
)This
->lpLcl
->hDC
);
696 // FIXME Close DX fristcall and second call
700 mcFourCC
= mHALInfo
.ddCaps
.dwNumFourCCCodes
;
701 mpFourCC
= (DWORD
*) DxHeapMemAlloc(sizeof(DWORD
) * mcFourCC
);
702 if (mpFourCC
== NULL
)
704 DxHeapMemFree(mpvmList
);
705 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
706 DeleteDC((HDC
)This
->lpLcl
->hDC
);
707 // FIXME Close DX fristcall and second call
711 mcTextures
= mD3dDriverData
.dwNumTextureFormats
;
712 mpTextures
= (DDSURFACEDESC
*) DxHeapMemAlloc(sizeof(DDSURFACEDESC
) * mcTextures
);
713 if (mpTextures
== NULL
)
715 DxHeapMemFree( mpFourCC
);
716 DxHeapMemFree( mpvmList
);
717 DxHeapMemFree( This
->lpLcl
->lpGbl
->lpModeInfo
);
718 DeleteDC((HDC
)This
->lpLcl
->hDC
);
719 // FIXME Close DX fristcall and second call
723 mHALInfo
.vmiData
.pvmList
= mpvmList
;
724 mHALInfo
.lpdwFourCC
= mpFourCC
;
725 mD3dDriverData
.lpTextureFormats
= (DDSURFACEDESC
*) mpTextures
;
727 if (!DdQueryDirectDrawObject(
730 &ddgbl
.lpDDCBtmp
->HALDD
,
731 &ddgbl
.lpDDCBtmp
->HALDDSurface
,
732 &ddgbl
.lpDDCBtmp
->HALDDPalette
,
735 &ddgbl
.lpDDCBtmp
->HALDDExeBuf
,
736 (DDSURFACEDESC
*)mpTextures
,
741 DxHeapMemFree(mpTextures
);
742 DxHeapMemFree(mpFourCC
);
743 DxHeapMemFree(mpvmList
);
744 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
745 DeleteDC((HDC
)This
->lpLcl
->hDC
);
746 // FIXME Close DX fristcall and second call
752 Copy over from HalInfo to DirectDrawGlobal
755 // this is wrong, cDriverName need be in ASC code not UNICODE
756 //memcpy(mDDrawGlobal.cDriverName, mDisplayAdapter, sizeof(wchar)*MAX_DRIVER_NAME);
758 memcpy(&ddgbl
.vmiData
, &mHALInfo
.vmiData
,sizeof(VIDMEMINFO
));
759 memcpy(&ddgbl
.ddCaps
, &mHALInfo
.ddCaps
,sizeof(DDCORECAPS
));
761 mHALInfo
.dwNumModes
= 1;
762 mHALInfo
.lpModeInfo
= This
->lpLcl
->lpGbl
->lpModeInfo
;
763 mHALInfo
.dwMonitorFrequency
= This
->lpLcl
->lpGbl
->lpModeInfo
[0].wRefreshRate
;
765 This
->lpLcl
->lpGbl
->dwMonitorFrequency
= mHALInfo
.dwMonitorFrequency
;
766 This
->lpLcl
->lpGbl
->dwModeIndex
= mHALInfo
.dwModeIndex
;
767 This
->lpLcl
->lpGbl
->dwNumModes
= mHALInfo
.dwNumModes
;
768 This
->lpLcl
->lpGbl
->lpModeInfo
= mHALInfo
.lpModeInfo
;
769 This
->lpLcl
->lpGbl
->hInstance
= mHALInfo
.hInstance
;
771 This
->lpLcl
->lpGbl
->lp16DD
= This
->lpLcl
->lpGbl
;
774 memset(&DriverInfo
,0, sizeof(DDHAL_GETDRIVERINFODATA
));
775 DriverInfo
.dwSize
= sizeof(DDHAL_GETDRIVERINFODATA
);
776 DriverInfo
.dwContext
= This
->lpLcl
->lpGbl
->hDD
;
778 /* Get the MiscellaneousCallbacks */
779 DriverInfo
.guidInfo
= GUID_MiscellaneousCallbacks
;
780 DriverInfo
.lpvData
= &ddgbl
.lpDDCBtmp
->HALDDMiscellaneous
;
781 DriverInfo
.dwExpectedSize
= sizeof(DDHAL_DDMISCELLANEOUSCALLBACKS
);
782 mHALInfo
.GetDriverInfo(&DriverInfo
);
786 The 3d and private data are not save at moment
788 we need lest the private data being setup
789 for some driver are puting kmode memory there
790 the memory often contain the private struct +
791 surface, see MS DDK how MS example driver using
794 the 3d interface are not so improten if u do not
795 want the 3d, and we are not writing 3d code yet
796 so we be okay for now.
804 StartDirectDrawHel(LPDIRECTDRAW
* iface
, BOOL reenable
)
806 LPDDRAWI_DIRECTDRAW_INT This
= (LPDDRAWI_DIRECTDRAW_INT
)iface
;
808 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDD
.CanCreateSurface
= HelDdCanCreateSurface
;
809 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDD
.CreateSurface
= HelDdCreateSurface
;
810 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDD
.CreatePalette
= HelDdCreatePalette
;
811 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDD
.DestroyDriver
= HelDdDestroyDriver
;
812 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDD
.FlipToGDISurface
= HelDdFlipToGDISurface
;
813 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDD
.GetScanLine
= HelDdGetScanLine
;
814 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDD
.SetColorKey
= HelDdSetColorKey
;
815 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDD
.SetExclusiveMode
= HelDdSetExclusiveMode
;
816 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDD
.SetMode
= HelDdSetMode
;
817 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDD
.WaitForVerticalBlank
= HelDdWaitForVerticalBlank
;
819 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDD
.dwFlags
= DDHAL_CB32_CANCREATESURFACE
|
820 DDHAL_CB32_CREATESURFACE
|
821 DDHAL_CB32_CREATEPALETTE
|
822 DDHAL_CB32_DESTROYDRIVER
|
823 DDHAL_CB32_FLIPTOGDISURFACE
|
824 DDHAL_CB32_GETSCANLINE
|
825 DDHAL_CB32_SETCOLORKEY
|
826 DDHAL_CB32_SETEXCLUSIVEMODE
|
828 DDHAL_CB32_WAITFORVERTICALBLANK
;
830 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDD
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->HELDD
);
832 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDDSurface
.AddAttachedSurface
= HelDdSurfAddAttachedSurface
;
833 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDDSurface
.Blt
= HelDdSurfBlt
;
834 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDDSurface
.DestroySurface
= HelDdSurfDestroySurface
;
835 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDDSurface
.Flip
= HelDdSurfFlip
;
836 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDDSurface
.GetBltStatus
= HelDdSurfGetBltStatus
;
837 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDDSurface
.GetFlipStatus
= HelDdSurfGetFlipStatus
;
838 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDDSurface
.Lock
= HelDdSurfLock
;
839 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDDSurface
.reserved4
= HelDdSurfreserved4
;
840 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDDSurface
.SetClipList
= HelDdSurfSetClipList
;
841 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDDSurface
.SetColorKey
= HelDdSurfSetColorKey
;
842 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDDSurface
.SetOverlayPosition
= HelDdSurfSetOverlayPosition
;
843 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDDSurface
.SetPalette
= HelDdSurfSetPalette
;
844 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDDSurface
.Unlock
= HelDdSurfUnlock
;
845 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDDSurface
.UpdateOverlay
= HelDdSurfUpdateOverlay
;
846 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDDSurface
.dwFlags
= DDHAL_SURFCB32_ADDATTACHEDSURFACE
|
848 DDHAL_SURFCB32_DESTROYSURFACE
|
849 DDHAL_SURFCB32_FLIP
|
850 DDHAL_SURFCB32_GETBLTSTATUS
|
851 DDHAL_SURFCB32_GETFLIPSTATUS
|
852 DDHAL_SURFCB32_LOCK
|
853 DDHAL_SURFCB32_RESERVED4
|
854 DDHAL_SURFCB32_SETCLIPLIST
|
855 DDHAL_SURFCB32_SETCOLORKEY
|
856 DDHAL_SURFCB32_SETOVERLAYPOSITION
|
857 DDHAL_SURFCB32_SETPALETTE
|
858 DDHAL_SURFCB32_UNLOCK
|
859 DDHAL_SURFCB32_UPDATEOVERLAY
;
861 This
->lpLcl
->lpGbl
->lpDDCBtmp
->HELDDSurface
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->HELDDSurface
);
864 This->lpLcl->lpDDCB->HELDDPalette.DestroyPalette = HelDdPalDestroyPalette;
865 This->lpLcl->lpDDCB->HELDDPalette.SetEntries = HelDdPalSetEntries;
866 This->lpLcl->lpDDCB->HELDDPalette.dwSize = sizeof(This->lpLcl->lpDDCB->HELDDPalette);
870 This->lpLcl->lpDDCB->HELDDExeBuf.CanCreateExecuteBuffer = HelDdExeCanCreateExecuteBuffer;
871 This->lpLcl->lpDDCB->HELDDExeBuf.CreateExecuteBuffer = HelDdExeCreateExecuteBuffer;
872 This->lpLcl->lpDDCB->HELDDExeBuf.DestroyExecuteBuffer = HelDdExeDestroyExecuteBuffer;
873 This->lpLcl->lpDDCB->HELDDExeBuf.LockExecuteBuffer = HelDdExeLockExecuteBuffer;
874 This->lpLcl->lpDDCB->HELDDExeBuf.UnlockExecuteBuffer = HelDdExeUnlockExecuteBuffer;
882 Create_DirectDraw (LPGUID pGUID
,
883 LPDIRECTDRAW
* pIface
,
887 LPDDRAWI_DIRECTDRAW_INT This
= (LPDDRAWI_DIRECTDRAW_INT
)*pIface
;
891 if (!IsEqualGUID(&IID_IDirectDraw7
, id
))
893 return DDERR_INVALIDDIRECTDRAWGUID
;
898 LPDDRAWI_DIRECTDRAW_INT memThis
;
900 /* We do not have any DirectDraw interface alloc
901 * or a idot send in pIface as NULL
903 memThis
= DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT
));
909 /* do not create memmory leak if some
910 * idot send in pIface as NULL
912 DxHeapMemFree(memThis
);
914 return DDERR_OUTOFMEMORY
;
919 /* We got the DirectDraw interface alloc and we need create the link */
921 LPDDRAWI_DIRECTDRAW_INT newThis
;
922 newThis
= DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT
));
925 return DDERR_OUTOFMEMORY
;
928 /* we need check the GUID lpGUID what type it is */
929 if (pGUID
!= (LPGUID
)DDCREATE_HARDWAREONLY
)
934 return DDERR_INVALIDDIRECTDRAWGUID
;
938 newThis
->lpLink
= This
;
942 This
->lpLcl
= DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT
));
944 if (This
->lpLcl
== NULL
)
947 return DDERR_OUTOFMEMORY
;
952 read dwAppHackFlags flag from the system register instead for hard code it
954 This
->lpLcl
->dwAppHackFlags
= 0;
955 This
->lpLcl
->dwHotTracking
= 0;
956 This
->lpLcl
->dwIMEState
= 0;
957 This
->lpLcl
->dwLocalFlags
= DDRAWILCL_DIRECTDRAW7
;
958 This
->lpLcl
->dwLocalRefCnt
= 0;
960 do not rest this flag to NULL it need be unistae for some reason other wise
961 somet thing will crash dwObsolete1 seam being use for something this was a
964 //This->lpLcl->dwObsolete1 = 0;
965 This
->lpLcl
->dwProcessId
= 0;
966 This
->lpLcl
->dwUnused0
= 0;
967 This
->lpLcl
->hD3DInstance
= NULL
;
968 This
->lpLcl
->hDC
= 0;
969 This
->lpLcl
->hDDVxd
= 0;
970 This
->lpLcl
->hFocusWnd
= 0;
971 This
->lpLcl
->hGammaCalibrator
= 0;
972 /* Do mot inistate this value if we do we can not open the HAL interface */
973 //This->lpLcl->hWnd = 0;
974 This
->lpLcl
->hWndPopup
= 0;
975 This
->lpLcl
->lpCB
= NULL
;
976 This
->lpLcl
->lpDDCB
= NULL
;
977 This
->lpLcl
->lpDDMore
= 0;
978 This
->lpLcl
->lpGammaCalibrator
= 0;
979 This
->lpLcl
->lpGbl
= &ddgbl
;
981 /* Do mot inistate this value if we do we can not open the HAL interface */
982 //This->lpLcl->lpPrimary = NULL;
983 This
->lpLcl
->pD3DIUnknown
= NULL
;
984 This
->lpLcl
->pUnkOuter
= NULL
;
986 *pIface
= (LPDIRECTDRAW
)This
;
988 if(Main_DirectDraw_QueryInterface((LPDIRECTDRAW7
)This
, id
, (void**)&pIface
) != S_OK
)
990 return DDERR_INVALIDPARAMS
;
993 if (StartDirectDraw((LPDIRECTDRAW
*)This
, pGUID
, FALSE
) == DD_OK
);
997 return DDERR_INVALIDPARAMS
;
1003 ReCreateDirectDraw(LPDIRECTDRAW
* iface
)
1005 LPDDRAWI_DIRECTDRAW_INT This
= (LPDDRAWI_DIRECTDRAW_INT
)iface
;
1007 DdDeleteDirectDrawObject(This
->lpLcl
->lpGbl
);
1009 if ((This
->lpLcl
->lpGbl
->dwFlags
& DDRAWI_NOHARDWARE
) != DDRAWI_NOHARDWARE
)
1011 if (This
->lpLcl
->lpGbl
->dwFlags
& DDRAWI_EMULATIONINITIALIZED
)
1013 return StartDirectDraw(iface
,NULL
, TRUE
);
1017 return StartDirectDraw(iface
,(LPGUID
)DDCREATE_HARDWAREONLY
, TRUE
);
1022 return StartDirectDraw(iface
,(LPGUID
)DDCREATE_EMULATIONONLY
, TRUE
);