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
)
23 LPDDRAWI_DIRECTDRAW_INT This
= (LPDDRAWI_DIRECTDRAW_INT
)iface
;
28 const UINT bmiSize
= sizeof(BITMAPINFOHEADER
) + 0x10;
36 RtlZeroMemory(&ddgbl
, sizeof(DDRAWI_DIRECTDRAW_GBL
));
38 ddgbl
.lpDDCBtmp
= (LPDDHAL_CALLBACKS
) DxHeapMemAlloc(sizeof(DDHAL_CALLBACKS
));
39 if (ddgbl
.lpDDCBtmp
== NULL
)
41 DX_STUB_str("Out of memmory");
45 This
->lpLcl
->lpDDCB
= ddgbl
.lpDDCBtmp
;
48 /* Same for HEL and HAL */
49 This
->lpLcl
->lpGbl
->lpModeInfo
= (DDHALMODEINFO
*) DxHeapMemAlloc(1 * sizeof(DDHALMODEINFO
));
51 if (This
->lpLcl
->lpGbl
->lpModeInfo
== NULL
)
53 DX_STUB_str("DD_FALSE");
57 EnumDisplaySettings(NULL
, ENUM_CURRENT_SETTINGS
, &devmode
);
59 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwWidth
= devmode
.dmPelsWidth
;
60 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwHeight
= devmode
.dmPelsHeight
;
61 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwBPP
= devmode
.dmBitsPerPel
;
62 This
->lpLcl
->lpGbl
->lpModeInfo
[0].lPitch
= (devmode
.dmPelsWidth
*devmode
.dmBitsPerPel
)/8;
63 This
->lpLcl
->lpGbl
->lpModeInfo
[0].wRefreshRate
= (WORD
)devmode
.dmDisplayFrequency
;
70 /* Create HDC for default, hal and hel driver */
71 This
->lpLcl
->hDC
= (ULONG_PTR
) CreateDCW(L
"DISPLAY",L
"DISPLAY",NULL
,NULL
);
73 /* cObsolete is undoc in msdn it being use in CreateDCA */
74 RtlCopyMemory(&ddgbl
.cObsolete
,&"DISPLAY",7);
75 RtlCopyMemory(&ddgbl
.cDriverName
,&"DISPLAY",7);
78 else if (lpGuid
== (LPGUID
) DDCREATE_HARDWAREONLY
)
82 /* Create HDC for default, hal and hel driver */
83 This
->lpLcl
->hDC
= (ULONG_PTR
)CreateDCW(L
"DISPLAY",L
"DISPLAY",NULL
,NULL
);
85 /* cObsolete is undoc in msdn it being use in CreateDCA */
86 RtlCopyMemory(&ddgbl
.cObsolete
,&"DISPLAY",7);
87 RtlCopyMemory(&ddgbl
.cDriverName
,&"DISPLAY",7);
90 else if (lpGuid
== (LPGUID
) DDCREATE_EMULATIONONLY
)
94 /* Create HDC for default, hal and hel driver */
95 This
->lpLcl
->hDC
= (ULONG_PTR
) CreateDCW(L
"DISPLAY",L
"DISPLAY",NULL
,NULL
);
97 /* cObsolete is undoc in msdn it being use in CreateDCA */
98 RtlCopyMemory(&ddgbl
.cObsolete
,&"DISPLAY",7);
99 RtlCopyMemory(&ddgbl
.cDriverName
,&"DISPLAY",7);
103 /* FIXME : need getting driver from the GUID that have been pass in from
104 the register. we do not support that yet
107 This
->lpLcl
->hDC
= (ULONG_PTR
) NULL
;
110 if ( (HDC
)This
->lpLcl
->hDC
== NULL
)
112 DX_STUB_str("DDERR_OUTOFMEMORY");
113 return DDERR_OUTOFMEMORY
;
116 hbmp
= CreateCompatibleBitmap((HDC
) This
->lpLcl
->hDC
, 1, 1);
119 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
120 DeleteDC((HDC
) This
->lpLcl
->hDC
);
121 DX_STUB_str("DDERR_OUTOFMEMORY");
122 return DDERR_OUTOFMEMORY
;
125 pbmiData
= (UCHAR
*) DxHeapMemAlloc(bmiSize
);
126 pbmi
= (BITMAPINFO
*)pbmiData
;
130 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
131 DeleteDC((HDC
) This
->lpLcl
->hDC
);
133 DX_STUB_str("DDERR_OUTOFMEMORY");
134 return DDERR_OUTOFMEMORY
;
137 pbmi
->bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
138 pbmi
->bmiHeader
.biBitCount
= (WORD
)devmode
.dmBitsPerPel
;
139 pbmi
->bmiHeader
.biCompression
= BI_BITFIELDS
;
140 pbmi
->bmiHeader
.biWidth
= 1;
141 pbmi
->bmiHeader
.biHeight
= 1;
143 GetDIBits((HDC
) This
->lpLcl
->hDC
, hbmp
, 0, 0, NULL
, pbmi
, 0);
146 pMasks
= (DWORD
*)(pbmiData
+ sizeof(BITMAPINFOHEADER
));
147 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwRBitMask
= pMasks
[0];
148 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwGBitMask
= pMasks
[1];
149 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwBBitMask
= pMasks
[2];
150 This
->lpLcl
->lpGbl
->lpModeInfo
[0].dwAlphaBitMask
= pMasks
[3];
152 DxHeapMemFree(pbmiData
);
154 /* Startup HEL and HAL */
155 // RtlZeroMemory(&ddgbl, sizeof(DDRAWI_DIRECTDRAW_GBL));
157 This
->lpLcl
->lpDDCB
= This
->lpLcl
->lpGbl
->lpDDCBtmp
;
158 This
->lpLcl
->dwProcessId
= GetCurrentProcessId();
162 hal_ret
= StartDirectDrawHal(iface
);
163 hel_ret
= StartDirectDrawHel(iface
);
164 if ((hal_ret
!=DD_OK
) && (hel_ret
!=DD_OK
))
166 DX_STUB_str("DDERR_NODIRECTDRAWSUPPORT");
167 return DDERR_NODIRECTDRAWSUPPORT
;
170 This
->lpLcl
->hDD
= This
->lpLcl
->lpGbl
->hDD
;
173 /* Mix the DDCALLBACKS */
174 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->cbDDCallbacks
);
176 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
) && (devicetypes
!=3))
178 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CANCREATESURFACE
;
179 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CanCreateSurface
= This
->lpLcl
->lpDDCB
->HALDD
.CanCreateSurface
;
181 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
) && (devicetypes
!=2))
183 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CANCREATESURFACE
;
184 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CanCreateSurface
= This
->lpLcl
->lpDDCB
->HELDD
.CanCreateSurface
;
186 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_CREATESURFACE
) && (devicetypes
!=3))
188 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CREATESURFACE
;
189 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CreateSurface
= This
->lpLcl
->lpDDCB
->HALDD
.CreateSurface
;
191 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_CREATESURFACE
) && (devicetypes
!=2))
193 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CREATESURFACE
;
194 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CreateSurface
= This
->lpLcl
->lpDDCB
->HELDD
.CreateSurface
;
196 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_CREATEPALETTE
) && (devicetypes
!=3))
198 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CREATEPALETTE
;
199 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CreatePalette
= This
->lpLcl
->lpDDCB
->HALDD
.CreatePalette
;
201 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_CREATEPALETTE
) && (devicetypes
!=2))
203 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CREATEPALETTE
;
204 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CreatePalette
= This
->lpLcl
->lpDDCB
->HELDD
.CreatePalette
;
206 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_DESTROYDRIVER
) && (devicetypes
!=3))
208 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_DESTROYDRIVER
;
209 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.DestroyDriver
= This
->lpLcl
->lpDDCB
->HALDD
.DestroyDriver
;
211 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_DESTROYDRIVER
) && (devicetypes
!=2))
213 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_DESTROYDRIVER
;
214 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.DestroyDriver
= This
->lpLcl
->lpDDCB
->HELDD
.DestroyDriver
;
216 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_FLIPTOGDISURFACE
) && (devicetypes
!=3))
218 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_FLIPTOGDISURFACE
;
219 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.FlipToGDISurface
= This
->lpLcl
->lpDDCB
->HALDD
.FlipToGDISurface
;
221 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_FLIPTOGDISURFACE
) && (devicetypes
!=2))
223 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_FLIPTOGDISURFACE
;
224 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.FlipToGDISurface
= This
->lpLcl
->lpDDCB
->HELDD
.FlipToGDISurface
;
226 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_GETSCANLINE
) && (devicetypes
!=3))
228 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_GETSCANLINE
;
229 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.GetScanLine
= This
->lpLcl
->lpDDCB
->HALDD
.GetScanLine
;
231 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_GETSCANLINE
) && (devicetypes
!=2))
233 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_GETSCANLINE
;
234 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.GetScanLine
= This
->lpLcl
->lpDDCB
->HELDD
.GetScanLine
;
236 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_SETCOLORKEY
) && (devicetypes
!=3))
238 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETCOLORKEY
;
239 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetColorKey
= This
->lpLcl
->lpDDCB
->HALDD
.SetColorKey
;
241 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_SETCOLORKEY
) && (devicetypes
!=2))
243 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETCOLORKEY
;
244 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetColorKey
= This
->lpLcl
->lpDDCB
->HELDD
.SetColorKey
;
246 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_SETEXCLUSIVEMODE
) && (devicetypes
!=3))
248 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETEXCLUSIVEMODE
;
249 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetExclusiveMode
= This
->lpLcl
->lpDDCB
->HALDD
.SetExclusiveMode
;
251 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_SETEXCLUSIVEMODE
) && (devicetypes
!=2))
253 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETEXCLUSIVEMODE
;
254 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetExclusiveMode
= This
->lpLcl
->lpDDCB
->HELDD
.SetExclusiveMode
;
256 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_SETMODE
) && (devicetypes
!=3))
258 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETMODE
;
259 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetMode
= This
->lpLcl
->lpDDCB
->HALDD
.SetMode
;
261 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_SETMODE
) && (devicetypes
!=2))
263 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETMODE
;
264 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetMode
= This
->lpLcl
->lpDDCB
->HELDD
.SetMode
;
266 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_WAITFORVERTICALBLANK
) && (devicetypes
!=3))
268 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_WAITFORVERTICALBLANK
;
269 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.WaitForVerticalBlank
=
270 This
->lpLcl
->lpDDCB
->HALDD
.WaitForVerticalBlank
;
272 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_WAITFORVERTICALBLANK
) && (devicetypes
!=2))
274 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_WAITFORVERTICALBLANK
;
275 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.WaitForVerticalBlank
=
276 This
->lpLcl
->lpDDCB
->HELDD
.WaitForVerticalBlank
;
279 /* Mix the DDSURFACE CALLBACKS */
280 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
);
282 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
) && (devicetypes
!=3))
284 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_ADDATTACHEDSURFACE
;
286 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.AddAttachedSurface
=
287 This
->lpLcl
->lpDDCB
->HALDDSurface
.AddAttachedSurface
;
289 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
) && (devicetypes
!=2))
291 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_ADDATTACHEDSURFACE
;
293 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.AddAttachedSurface
=
294 This
->lpLcl
->lpDDCB
->HELDDSurface
.AddAttachedSurface
;
297 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_BLT
) && (devicetypes
!=3))
299 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_BLT
;
301 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Blt
=
302 This
->lpLcl
->lpDDCB
->HALDDSurface
.Blt
;
304 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_BLT
) && (devicetypes
!=2))
306 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_BLT
;
308 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Blt
=
309 This
->lpLcl
->lpDDCB
->HELDDSurface
.Blt
;
312 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_DESTROYSURFACE
) && (devicetypes
!=3))
314 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_DESTROYSURFACE
;
316 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.DestroySurface
=
317 This
->lpLcl
->lpDDCB
->HALDDSurface
.DestroySurface
;
319 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_DESTROYSURFACE
) && (devicetypes
!=2))
321 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_DESTROYSURFACE
;
323 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.DestroySurface
=
324 This
->lpLcl
->lpDDCB
->HELDDSurface
.DestroySurface
;
327 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_FLIP
) && (devicetypes
!=3))
329 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_FLIP
;
331 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Flip
=
332 This
->lpLcl
->lpDDCB
->HALDDSurface
.Flip
;
334 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_FLIP
) && (devicetypes
!=2))
336 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_FLIP
;
338 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Flip
=
339 This
->lpLcl
->lpDDCB
->HELDDSurface
.Flip
;
342 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_GETBLTSTATUS
) && (devicetypes
!=3))
344 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_GETBLTSTATUS
;
346 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.GetBltStatus
=
347 This
->lpLcl
->lpDDCB
->HALDDSurface
.GetBltStatus
;
349 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_GETBLTSTATUS
) && (devicetypes
!=2))
351 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_GETBLTSTATUS
;
353 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.GetBltStatus
=
354 This
->lpLcl
->lpDDCB
->HELDDSurface
.GetBltStatus
;
357 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_GETFLIPSTATUS
) && (devicetypes
!=3))
359 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_GETFLIPSTATUS
;
361 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.GetFlipStatus
=
362 This
->lpLcl
->lpDDCB
->HALDDSurface
.GetFlipStatus
;
364 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_GETFLIPSTATUS
) && (devicetypes
!=2))
366 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_GETFLIPSTATUS
;
368 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.GetFlipStatus
=
369 This
->lpLcl
->lpDDCB
->HELDDSurface
.GetFlipStatus
;
372 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_LOCK
) && (devicetypes
!=3))
374 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_LOCK
;
376 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Lock
=
377 This
->lpLcl
->lpDDCB
->HALDDSurface
.Lock
;
379 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_LOCK
) && (devicetypes
!=2))
381 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_LOCK
;
383 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Lock
=
384 This
->lpLcl
->lpDDCB
->HELDDSurface
.Lock
;
387 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_RESERVED4
) && (devicetypes
!=3))
389 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_RESERVED4
;
391 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.reserved4
=
392 This
->lpLcl
->lpDDCB
->HALDDSurface
.reserved4
;
394 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_RESERVED4
) && (devicetypes
!=2))
396 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_RESERVED4
;
398 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.reserved4
=
399 This
->lpLcl
->lpDDCB
->HELDDSurface
.reserved4
;
402 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_SETCLIPLIST
) && (devicetypes
!=3))
404 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETCLIPLIST
;
406 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetClipList
=
407 This
->lpLcl
->lpDDCB
->HALDDSurface
.SetClipList
;
409 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_SETCLIPLIST
) && (devicetypes
!=2))
411 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETCLIPLIST
;
413 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetClipList
=
414 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetClipList
;
417 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_SETCOLORKEY
) && (devicetypes
!=3))
419 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETCOLORKEY
;
421 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetColorKey
=
422 This
->lpLcl
->lpDDCB
->HALDDSurface
.SetColorKey
;
424 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_SETCOLORKEY
) && (devicetypes
!=2))
426 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETCOLORKEY
;
428 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetColorKey
=
429 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetColorKey
;
432 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
) && (devicetypes
!=3))
434 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETOVERLAYPOSITION
;
436 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetOverlayPosition
=
437 This
->lpLcl
->lpDDCB
->HALDDSurface
.SetOverlayPosition
;
439 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
) && (devicetypes
!=2))
441 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETOVERLAYPOSITION
;
443 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetOverlayPosition
=
444 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetOverlayPosition
;
447 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_SETPALETTE
) && (devicetypes
!=3))
449 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETPALETTE
;
451 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetPalette
=
452 This
->lpLcl
->lpDDCB
->HALDDSurface
.SetPalette
;
454 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_SETPALETTE
) && (devicetypes
!=2))
456 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETPALETTE
;
458 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetPalette
=
459 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetPalette
;
462 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_UNLOCK
) && (devicetypes
!=3))
464 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_UNLOCK
;
466 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Unlock
=
467 This
->lpLcl
->lpDDCB
->HALDDSurface
.Unlock
;
469 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_UNLOCK
) && (devicetypes
!=2))
471 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_UNLOCK
;
473 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Unlock
=
474 This
->lpLcl
->lpDDCB
->HELDDSurface
.Unlock
;
477 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_UPDATEOVERLAY
) && (devicetypes
!=3))
479 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_UPDATEOVERLAY
;
481 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.UpdateOverlay
=
482 This
->lpLcl
->lpDDCB
->HALDDSurface
.UpdateOverlay
;
484 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_UPDATEOVERLAY
) && (devicetypes
!=2))
486 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_UPDATEOVERLAY
;
488 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.UpdateOverlay
=
489 This
->lpLcl
->lpDDCB
->HELDDSurface
.UpdateOverlay
;
492 /* Mix the DDPALETTE CALLBACKS */
493 This
->lpLcl
->lpDDCB
->HALDDPalette
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->HALDDPalette
);
495 if ((This
->lpLcl
->lpDDCB
->HALDDPalette
.dwFlags
& DDHAL_PALCB32_DESTROYPALETTE
) && (devicetypes
!=3))
497 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.dwFlags
|= DDHAL_PALCB32_SETENTRIES
;
499 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.DestroyPalette
=
500 This
->lpLcl
->lpDDCB
->HALDDPalette
.DestroyPalette
;
502 else if ((This
->lpLcl
->lpDDCB
->HELDDPalette
.dwFlags
& DDHAL_PALCB32_DESTROYPALETTE
) && (devicetypes
!=2))
504 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.dwFlags
|= DDHAL_PALCB32_DESTROYPALETTE
;
506 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.DestroyPalette
=
507 This
->lpLcl
->lpDDCB
->HELDDPalette
.DestroyPalette
;
510 if ((This
->lpLcl
->lpDDCB
->HALDDPalette
.dwFlags
& DDHAL_PALCB32_SETENTRIES
) && (devicetypes
!=3))
512 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.dwFlags
|= DDHAL_PALCB32_SETENTRIES
;
514 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.SetEntries
=
515 This
->lpLcl
->lpDDCB
->HALDDPalette
.SetEntries
;
517 else if ((This
->lpLcl
->lpDDCB
->HELDDPalette
.dwFlags
& DDHAL_PALCB32_SETENTRIES
) && (devicetypes
!=2))
519 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.dwFlags
|= DDHAL_PALCB32_SETENTRIES
;
521 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.SetEntries
=
522 This
->lpLcl
->lpDDCB
->HELDDPalette
.SetEntries
;
525 /* Mix the DDExeBuf CALLBACKS */
526 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
);
528 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_CANCREATEEXEBUF
) && (devicetypes
!=3))
530 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.CanCreateExecuteBuffer
=
531 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.CanCreateExecuteBuffer
;
532 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_CANCREATEEXEBUF
;
534 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_CANCREATEEXEBUF
) && (devicetypes
!=2))
536 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.CanCreateExecuteBuffer
=
537 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.CanCreateExecuteBuffer
;
538 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_CANCREATEEXEBUF
;
541 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_CREATEEXEBUF
) && (devicetypes
!=3))
543 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.CreateExecuteBuffer
=
544 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.CreateExecuteBuffer
;
545 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_CREATEEXEBUF
;
547 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_CREATEEXEBUF
) && (devicetypes
!=2))
549 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.CreateExecuteBuffer
=
550 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.CreateExecuteBuffer
;
551 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_CREATEEXEBUF
;
554 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_DESTROYEXEBUF
) && (devicetypes
!=3))
556 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.DestroyExecuteBuffer
=
557 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.DestroyExecuteBuffer
;
558 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_DESTROYEXEBUF
;
560 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_DESTROYEXEBUF
) && (devicetypes
!=2))
562 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.DestroyExecuteBuffer
=
563 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.DestroyExecuteBuffer
;
564 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_DESTROYEXEBUF
;
567 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_LOCKEXEBUF
) && (devicetypes
!=3))
569 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.LockExecuteBuffer
=
570 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.LockExecuteBuffer
;
571 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_LOCKEXEBUF
;
573 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_LOCKEXEBUF
) && (devicetypes
!=2))
575 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.LockExecuteBuffer
=
576 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.LockExecuteBuffer
;
577 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_LOCKEXEBUF
;
580 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_UNLOCKEXEBUF
) && (devicetypes
!=3))
582 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.UnlockExecuteBuffer
=
583 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.UnlockExecuteBuffer
;
584 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_UNLOCKEXEBUF
;
586 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_UNLOCKEXEBUF
) && (devicetypes
!=2))
588 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.UnlockExecuteBuffer
=
589 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.UnlockExecuteBuffer
;
590 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_UNLOCKEXEBUF
;
593 /* Fill some basic info for Surface */
594 ddSurfGbl
.lpDD
= &ddgbl
;
597 We need setup this also
598 This->lpLcl->lpDDCB->cbDDColorControlCallbacks
599 This->lpLcl->lpDDCB->cbDDKernelCallbacks
600 This->lpLcl->lpDDCB->cbDDMiscellaneousCallbacks
601 This->lpLcl->lpDDCB->cbDDMotionCompCallbacks
602 This->lpLcl->lpDDCB->cbDDVideoPortCallbacks
610 StartDirectDrawHal(LPDIRECTDRAW
* iface
)
612 LPDDRAWI_DIRECTDRAW_INT This
= (LPDDRAWI_DIRECTDRAW_INT
)iface
;
613 DDHAL_GETDRIVERINFODATA DriverInfo
;
616 DDHAL_CALLBACKS mCallbacks
;
617 DDHAL_DDEXEBUFCALLBACKS mD3dBufferCallbacks
;
618 D3DHAL_CALLBACKS mD3dCallbacks
;
619 D3DHAL_GLOBALDRIVERDATA mD3dDriverData
;
626 DDSURFACEDESC
*mpTextures
;
628 /* HAL Startup process */
629 BOOL newmode
= FALSE
;
632 RtlZeroMemory(&mHALInfo
, sizeof(DDHALINFO
));
633 RtlZeroMemory(&mCallbacks
, sizeof(DDHAL_CALLBACKS
));
636 Startup DX HAL step one of three
638 if (!DdCreateDirectDrawObject(This
->lpLcl
->lpGbl
, (HDC
)This
->lpLcl
->hDC
))
640 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
641 DeleteDC((HDC
)This
->lpLcl
->hDC
);
645 // Do not relase HDC it have been map in kernel mode
648 if (!DdReenableDirectDrawObject(This
->lpLcl
->lpGbl
, &newmode
))
650 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
651 DeleteDC((HDC
)This
->lpLcl
->hDC
);
657 Startup DX HAL step two of three
660 if (!DdQueryDirectDrawObject(This
->lpLcl
->lpGbl
,
663 &mCallbacks
.HALDDSurface
,
664 &mCallbacks
.HALDDPalette
,
667 &mD3dBufferCallbacks
,
672 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
673 DeleteDC((HDC
)This
->lpLcl
->hDC
);
674 // FIXME Close DX fristcall and second call
678 mcvmList
= mHALInfo
.vmiData
.dwNumHeaps
;
679 mpvmList
= (VIDMEM
*) DxHeapMemAlloc(sizeof(VIDMEM
) * mcvmList
);
680 if (mpvmList
== NULL
)
682 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
683 DeleteDC((HDC
)This
->lpLcl
->hDC
);
684 // FIXME Close DX fristcall and second call
688 mcFourCC
= mHALInfo
.ddCaps
.dwNumFourCCCodes
;
689 mpFourCC
= (DWORD
*) DxHeapMemAlloc(sizeof(DWORD
) * mcFourCC
);
690 if (mpFourCC
== NULL
)
692 DxHeapMemFree(mpvmList
);
693 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
694 DeleteDC((HDC
)This
->lpLcl
->hDC
);
695 // FIXME Close DX fristcall and second call
699 mcTextures
= mD3dDriverData
.dwNumTextureFormats
;
700 mpTextures
= (DDSURFACEDESC
*) DxHeapMemAlloc(sizeof(DDSURFACEDESC
) * mcTextures
);
701 if (mpTextures
== NULL
)
703 DxHeapMemFree( mpFourCC
);
704 DxHeapMemFree( mpvmList
);
705 DxHeapMemFree( This
->lpLcl
->lpGbl
->lpModeInfo
);
706 DeleteDC((HDC
)This
->lpLcl
->hDC
);
707 // FIXME Close DX fristcall and second call
711 mHALInfo
.vmiData
.pvmList
= mpvmList
;
712 mHALInfo
.lpdwFourCC
= mpFourCC
;
713 mD3dDriverData
.lpTextureFormats
= (DDSURFACEDESC
*) mpTextures
;
715 if (!DdQueryDirectDrawObject(
719 &mCallbacks
.HALDDSurface
,
720 &mCallbacks
.HALDDPalette
,
723 &mCallbacks
.HALDDExeBuf
,
724 (DDSURFACEDESC
*)mpTextures
,
729 DxHeapMemFree(mpTextures
);
730 DxHeapMemFree(mpFourCC
);
731 DxHeapMemFree(mpvmList
);
732 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
733 DeleteDC((HDC
)This
->lpLcl
->hDC
);
734 // FIXME Close DX fristcall and second call
739 Copy over from HalInfo to DirectDrawGlobal
742 // this is wrong, cDriverName need be in ASC code not UNICODE
743 //memcpy(mDDrawGlobal.cDriverName, mDisplayAdapter, sizeof(wchar)*MAX_DRIVER_NAME);
745 memcpy(&ddgbl
.vmiData
, &mHALInfo
.vmiData
,sizeof(VIDMEMINFO
));
746 memcpy(&ddgbl
.ddCaps
, &mHALInfo
.ddCaps
,sizeof(DDCORECAPS
));
748 mHALInfo
.dwNumModes
= 1;
749 mHALInfo
.lpModeInfo
= This
->lpLcl
->lpGbl
->lpModeInfo
;
750 mHALInfo
.dwMonitorFrequency
= This
->lpLcl
->lpGbl
->lpModeInfo
[0].wRefreshRate
;
752 This
->lpLcl
->lpGbl
->dwMonitorFrequency
= mHALInfo
.dwMonitorFrequency
;
753 This
->lpLcl
->lpGbl
->dwModeIndex
= mHALInfo
.dwModeIndex
;
754 This
->lpLcl
->lpGbl
->dwNumModes
= mHALInfo
.dwNumModes
;
755 This
->lpLcl
->lpGbl
->lpModeInfo
= mHALInfo
.lpModeInfo
;
756 This
->lpLcl
->lpGbl
->hInstance
= mHALInfo
.hInstance
;
758 This
->lpLcl
->lpGbl
->lp16DD
= This
->lpLcl
->lpGbl
;
761 memset(&DriverInfo
,0, sizeof(DDHAL_GETDRIVERINFODATA
));
762 DriverInfo
.dwSize
= sizeof(DDHAL_GETDRIVERINFODATA
);
763 DriverInfo
.dwContext
= This
->lpLcl
->lpGbl
->hDD
;
765 /* Get the MiscellaneousCallbacks */
766 DriverInfo
.guidInfo
= GUID_MiscellaneousCallbacks
;
767 DriverInfo
.lpvData
= &ddgbl
.lpDDCBtmp
->HALDDMiscellaneous
;
768 DriverInfo
.dwExpectedSize
= sizeof(DDHAL_DDMISCELLANEOUSCALLBACKS
);
769 mHALInfo
.GetDriverInfo(&DriverInfo
);
773 The 3d and private data are not save at moment
775 we need lest the private data being setup
776 for some driver are puting kmode memory there
777 the memory often contain the private struct +
778 surface, see MS DDK how MS example driver using
781 the 3d interface are not so improten if u do not
782 want the 3d, and we are not writing 3d code yet
783 so we be okay for now.
791 StartDirectDrawHel(LPDIRECTDRAW
* iface
)
793 LPDDRAWI_DIRECTDRAW_INT This
= (LPDDRAWI_DIRECTDRAW_INT
)iface
;
795 This
->lpLcl
->lpDDCB
->HELDD
.CanCreateSurface
= HelDdCanCreateSurface
;
796 This
->lpLcl
->lpDDCB
->HELDD
.CreateSurface
= HelDdCreateSurface
;
797 This
->lpLcl
->lpDDCB
->HELDD
.CreatePalette
= HelDdCreatePalette
;
798 This
->lpLcl
->lpDDCB
->HELDD
.DestroyDriver
= HelDdDestroyDriver
;
799 This
->lpLcl
->lpDDCB
->HELDD
.FlipToGDISurface
= HelDdFlipToGDISurface
;
800 This
->lpLcl
->lpDDCB
->HELDD
.GetScanLine
= HelDdGetScanLine
;
801 //This->lpLcl->lpDDCB->HELDD.SetColorKey = HelDdSetColorKey;
802 This
->lpLcl
->lpDDCB
->HELDD
.SetExclusiveMode
= HelDdSetExclusiveMode
;
803 This
->lpLcl
->lpDDCB
->HELDD
.SetMode
= HelDdSetMode
;
804 This
->lpLcl
->lpDDCB
->HELDD
.WaitForVerticalBlank
= HelDdWaitForVerticalBlank
;
806 This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
= DDHAL_CB32_CANCREATESURFACE
|
807 DDHAL_CB32_CREATESURFACE
|
808 DDHAL_CB32_CREATEPALETTE
|
809 DDHAL_CB32_DESTROYDRIVER
|
810 DDHAL_CB32_FLIPTOGDISURFACE
|
811 DDHAL_CB32_GETSCANLINE
|
812 //DDHAL_CB32_SETCOLORKEY |
813 DDHAL_CB32_SETEXCLUSIVEMODE
|
815 DDHAL_CB32_WAITFORVERTICALBLANK
;
817 This
->lpLcl
->lpDDCB
->HELDD
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->HELDD
);
819 This
->lpLcl
->lpDDCB
->HELDDSurface
.AddAttachedSurface
= HelDdSurfAddAttachedSurface
;
820 This
->lpLcl
->lpDDCB
->HELDDSurface
.Blt
= HelDdSurfBlt
;
821 This
->lpLcl
->lpDDCB
->HELDDSurface
.DestroySurface
= HelDdSurfDestroySurface
;
822 This
->lpLcl
->lpDDCB
->HELDDSurface
.Flip
= HelDdSurfFlip
;
823 This
->lpLcl
->lpDDCB
->HELDDSurface
.GetBltStatus
= HelDdSurfGetBltStatus
;
824 This
->lpLcl
->lpDDCB
->HELDDSurface
.GetFlipStatus
= HelDdSurfGetFlipStatus
;
825 This
->lpLcl
->lpDDCB
->HELDDSurface
.Lock
= HelDdSurfLock
;
826 This
->lpLcl
->lpDDCB
->HELDDSurface
.reserved4
= HelDdSurfreserved4
;
827 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetClipList
= HelDdSurfSetClipList
;
828 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetColorKey
= HelDdSurfSetColorKey
;
829 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetOverlayPosition
= HelDdSurfSetOverlayPosition
;
830 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetPalette
= HelDdSurfSetPalette
;
831 This
->lpLcl
->lpDDCB
->HELDDSurface
.Unlock
= HelDdSurfUnlock
;
832 This
->lpLcl
->lpDDCB
->HELDDSurface
.UpdateOverlay
= HelDdSurfUpdateOverlay
;
834 This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
= DDHAL_SURFCB32_ADDATTACHEDSURFACE
|
836 DDHAL_SURFCB32_DESTROYSURFACE
|
837 DDHAL_SURFCB32_FLIP
|
838 DDHAL_SURFCB32_GETBLTSTATUS
|
839 DDHAL_SURFCB32_GETFLIPSTATUS
|
840 DDHAL_SURFCB32_LOCK
|
841 DDHAL_SURFCB32_RESERVED4
|
842 DDHAL_SURFCB32_SETCLIPLIST
|
843 DDHAL_SURFCB32_SETCOLORKEY
|
844 DDHAL_SURFCB32_SETOVERLAYPOSITION
|
845 DDHAL_SURFCB32_SETPALETTE
|
846 DDHAL_SURFCB32_UNLOCK
|
847 DDHAL_SURFCB32_UPDATEOVERLAY
;
849 This
->lpLcl
->lpDDCB
->HELDDSurface
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->HELDDSurface
);
852 This->lpLcl->lpDDCB->HELDDPalette.DestroyPalette = HelDdPalDestroyPalette;
853 This->lpLcl->lpDDCB->HELDDPalette.SetEntries = HelDdPalSetEntries;
854 This->lpLcl->lpDDCB->HELDDPalette.dwSize = sizeof(This->lpLcl->lpDDCB->HELDDPalette);
858 This->lpLcl->lpDDCB->HELDDExeBuf.CanCreateExecuteBuffer = HelDdExeCanCreateExecuteBuffer;
859 This->lpLcl->lpDDCB->HELDDExeBuf.CreateExecuteBuffer = HelDdExeCreateExecuteBuffer;
860 This->lpLcl->lpDDCB->HELDDExeBuf.DestroyExecuteBuffer = HelDdExeDestroyExecuteBuffer;
861 This->lpLcl->lpDDCB->HELDDExeBuf.LockExecuteBuffer = HelDdExeLockExecuteBuffer;
862 This->lpLcl->lpDDCB->HELDDExeBuf.UnlockExecuteBuffer = HelDdExeUnlockExecuteBuffer;
870 Create_DirectDraw (LPGUID pGUID
,
871 LPDIRECTDRAW
* pIface
,
875 LPDDRAWI_DIRECTDRAW_INT This
;
880 This
= DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT
));
883 return E_OUTOFMEMORY
;
886 This
->lpLcl
= DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT
));
888 if (This
->lpLcl
== NULL
)
891 return DDERR_OUTOFMEMORY
;
894 This
->lpLcl
->lpGbl
= &ddgbl
;
896 *pIface
= (LPDIRECTDRAW
)This
;
898 if(Main_DirectDraw_QueryInterface((LPDIRECTDRAW7
)This
, id
, (void**)&pIface
) != S_OK
)
900 return DDERR_INVALIDPARAMS
;
903 if (StartDirectDraw((LPDIRECTDRAW
*)This
, pGUID
) == DD_OK
);
909 return DDERR_INVALIDPARAMS
;