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();
163 hel_ret
= StartDirectDrawHel(iface
);
164 hal_ret
= StartDirectDrawHal(iface
);
168 if ((hal_ret
!=DD_OK
) && (hel_ret
!=DD_OK
))
170 DX_STUB_str("DDERR_NODIRECTDRAWSUPPORT");
171 return DDERR_NODIRECTDRAWSUPPORT
;
174 This
->lpLcl
->hDD
= This
->lpLcl
->lpGbl
->hDD
;
177 /* Mix the DDCALLBACKS */
178 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->cbDDCallbacks
);
180 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
) && (devicetypes
!=3))
182 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CANCREATESURFACE
;
183 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CanCreateSurface
= This
->lpLcl
->lpDDCB
->HALDD
.CanCreateSurface
;
185 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
) && (devicetypes
!=2))
187 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CANCREATESURFACE
;
188 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CanCreateSurface
= This
->lpLcl
->lpDDCB
->HELDD
.CanCreateSurface
;
190 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_CREATESURFACE
) && (devicetypes
!=3))
192 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CREATESURFACE
;
193 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CreateSurface
= This
->lpLcl
->lpDDCB
->HALDD
.CreateSurface
;
195 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_CREATESURFACE
) && (devicetypes
!=2))
197 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CREATESURFACE
;
198 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CreateSurface
= This
->lpLcl
->lpDDCB
->HELDD
.CreateSurface
;
200 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_CREATEPALETTE
) && (devicetypes
!=3))
202 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CREATEPALETTE
;
203 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CreatePalette
= This
->lpLcl
->lpDDCB
->HALDD
.CreatePalette
;
205 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_CREATEPALETTE
) && (devicetypes
!=2))
207 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_CREATEPALETTE
;
208 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.CreatePalette
= This
->lpLcl
->lpDDCB
->HELDD
.CreatePalette
;
210 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_DESTROYDRIVER
) && (devicetypes
!=3))
212 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_DESTROYDRIVER
;
213 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.DestroyDriver
= This
->lpLcl
->lpDDCB
->HALDD
.DestroyDriver
;
215 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_DESTROYDRIVER
) && (devicetypes
!=2))
217 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_DESTROYDRIVER
;
218 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.DestroyDriver
= This
->lpLcl
->lpDDCB
->HELDD
.DestroyDriver
;
220 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_FLIPTOGDISURFACE
) && (devicetypes
!=3))
222 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_FLIPTOGDISURFACE
;
223 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.FlipToGDISurface
= This
->lpLcl
->lpDDCB
->HALDD
.FlipToGDISurface
;
225 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_FLIPTOGDISURFACE
) && (devicetypes
!=2))
227 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_FLIPTOGDISURFACE
;
228 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.FlipToGDISurface
= This
->lpLcl
->lpDDCB
->HELDD
.FlipToGDISurface
;
230 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_GETSCANLINE
) && (devicetypes
!=3))
232 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_GETSCANLINE
;
233 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.GetScanLine
= This
->lpLcl
->lpDDCB
->HALDD
.GetScanLine
;
235 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_GETSCANLINE
) && (devicetypes
!=2))
237 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_GETSCANLINE
;
238 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.GetScanLine
= This
->lpLcl
->lpDDCB
->HELDD
.GetScanLine
;
240 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_SETCOLORKEY
) && (devicetypes
!=3))
242 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETCOLORKEY
;
243 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetColorKey
= This
->lpLcl
->lpDDCB
->HALDD
.SetColorKey
;
245 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_SETCOLORKEY
) && (devicetypes
!=2))
247 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETCOLORKEY
;
248 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetColorKey
= This
->lpLcl
->lpDDCB
->HELDD
.SetColorKey
;
250 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_SETEXCLUSIVEMODE
) && (devicetypes
!=3))
252 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETEXCLUSIVEMODE
;
253 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetExclusiveMode
= This
->lpLcl
->lpDDCB
->HALDD
.SetExclusiveMode
;
255 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_SETEXCLUSIVEMODE
) && (devicetypes
!=2))
257 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETEXCLUSIVEMODE
;
258 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetExclusiveMode
= This
->lpLcl
->lpDDCB
->HELDD
.SetExclusiveMode
;
260 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_SETMODE
) && (devicetypes
!=3))
262 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETMODE
;
263 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetMode
= This
->lpLcl
->lpDDCB
->HALDD
.SetMode
;
265 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_SETMODE
) && (devicetypes
!=2))
267 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_SETMODE
;
268 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.SetMode
= This
->lpLcl
->lpDDCB
->HELDD
.SetMode
;
270 if ((This
->lpLcl
->lpDDCB
->HALDD
.dwFlags
& DDHAL_CB32_WAITFORVERTICALBLANK
) && (devicetypes
!=3))
272 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_WAITFORVERTICALBLANK
;
273 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.WaitForVerticalBlank
=
274 This
->lpLcl
->lpDDCB
->HALDD
.WaitForVerticalBlank
;
276 else if ((This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
& DDHAL_CB32_WAITFORVERTICALBLANK
) && (devicetypes
!=2))
278 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.dwFlags
|= DDHAL_CB32_WAITFORVERTICALBLANK
;
279 This
->lpLcl
->lpDDCB
->cbDDCallbacks
.WaitForVerticalBlank
=
280 This
->lpLcl
->lpDDCB
->HELDD
.WaitForVerticalBlank
;
283 /* Mix the DDSURFACE CALLBACKS */
284 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
);
286 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
) && (devicetypes
!=3))
288 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_ADDATTACHEDSURFACE
;
290 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.AddAttachedSurface
=
291 This
->lpLcl
->lpDDCB
->HALDDSurface
.AddAttachedSurface
;
293 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
) && (devicetypes
!=2))
295 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_ADDATTACHEDSURFACE
;
297 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.AddAttachedSurface
=
298 This
->lpLcl
->lpDDCB
->HELDDSurface
.AddAttachedSurface
;
301 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_BLT
) && (devicetypes
!=3))
303 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_BLT
;
305 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Blt
=
306 This
->lpLcl
->lpDDCB
->HALDDSurface
.Blt
;
308 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_BLT
) && (devicetypes
!=2))
310 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_BLT
;
312 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Blt
=
313 This
->lpLcl
->lpDDCB
->HELDDSurface
.Blt
;
316 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_DESTROYSURFACE
) && (devicetypes
!=3))
318 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_DESTROYSURFACE
;
320 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.DestroySurface
=
321 This
->lpLcl
->lpDDCB
->HALDDSurface
.DestroySurface
;
323 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_DESTROYSURFACE
) && (devicetypes
!=2))
325 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_DESTROYSURFACE
;
327 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.DestroySurface
=
328 This
->lpLcl
->lpDDCB
->HELDDSurface
.DestroySurface
;
331 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_FLIP
) && (devicetypes
!=3))
333 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_FLIP
;
335 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Flip
=
336 This
->lpLcl
->lpDDCB
->HALDDSurface
.Flip
;
338 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_FLIP
) && (devicetypes
!=2))
340 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_FLIP
;
342 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Flip
=
343 This
->lpLcl
->lpDDCB
->HELDDSurface
.Flip
;
346 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_GETBLTSTATUS
) && (devicetypes
!=3))
348 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_GETBLTSTATUS
;
350 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.GetBltStatus
=
351 This
->lpLcl
->lpDDCB
->HALDDSurface
.GetBltStatus
;
353 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_GETBLTSTATUS
) && (devicetypes
!=2))
355 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_GETBLTSTATUS
;
357 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.GetBltStatus
=
358 This
->lpLcl
->lpDDCB
->HELDDSurface
.GetBltStatus
;
361 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_GETFLIPSTATUS
) && (devicetypes
!=3))
363 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_GETFLIPSTATUS
;
365 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.GetFlipStatus
=
366 This
->lpLcl
->lpDDCB
->HALDDSurface
.GetFlipStatus
;
368 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_GETFLIPSTATUS
) && (devicetypes
!=2))
370 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_GETFLIPSTATUS
;
372 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.GetFlipStatus
=
373 This
->lpLcl
->lpDDCB
->HELDDSurface
.GetFlipStatus
;
376 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_LOCK
) && (devicetypes
!=3))
378 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_LOCK
;
380 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Lock
=
381 This
->lpLcl
->lpDDCB
->HALDDSurface
.Lock
;
383 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_LOCK
) && (devicetypes
!=2))
385 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_LOCK
;
387 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Lock
=
388 This
->lpLcl
->lpDDCB
->HELDDSurface
.Lock
;
391 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_RESERVED4
) && (devicetypes
!=3))
393 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_RESERVED4
;
395 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.reserved4
=
396 This
->lpLcl
->lpDDCB
->HALDDSurface
.reserved4
;
398 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_RESERVED4
) && (devicetypes
!=2))
400 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_RESERVED4
;
402 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.reserved4
=
403 This
->lpLcl
->lpDDCB
->HELDDSurface
.reserved4
;
406 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_SETCLIPLIST
) && (devicetypes
!=3))
408 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETCLIPLIST
;
410 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetClipList
=
411 This
->lpLcl
->lpDDCB
->HALDDSurface
.SetClipList
;
413 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_SETCLIPLIST
) && (devicetypes
!=2))
415 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETCLIPLIST
;
417 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetClipList
=
418 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetClipList
;
421 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_SETCOLORKEY
) && (devicetypes
!=3))
423 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETCOLORKEY
;
425 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetColorKey
=
426 This
->lpLcl
->lpDDCB
->HALDDSurface
.SetColorKey
;
428 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_SETCOLORKEY
) && (devicetypes
!=2))
430 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETCOLORKEY
;
432 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetColorKey
=
433 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetColorKey
;
436 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
) && (devicetypes
!=3))
438 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETOVERLAYPOSITION
;
440 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetOverlayPosition
=
441 This
->lpLcl
->lpDDCB
->HALDDSurface
.SetOverlayPosition
;
443 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
) && (devicetypes
!=2))
445 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETOVERLAYPOSITION
;
447 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetOverlayPosition
=
448 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetOverlayPosition
;
451 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_SETPALETTE
) && (devicetypes
!=3))
453 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETPALETTE
;
455 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetPalette
=
456 This
->lpLcl
->lpDDCB
->HALDDSurface
.SetPalette
;
458 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_SETPALETTE
) && (devicetypes
!=2))
460 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_SETPALETTE
;
462 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.SetPalette
=
463 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetPalette
;
466 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_UNLOCK
) && (devicetypes
!=3))
468 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_UNLOCK
;
470 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Unlock
=
471 This
->lpLcl
->lpDDCB
->HALDDSurface
.Unlock
;
473 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_UNLOCK
) && (devicetypes
!=2))
475 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_UNLOCK
;
477 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.Unlock
=
478 This
->lpLcl
->lpDDCB
->HELDDSurface
.Unlock
;
481 if ((This
->lpLcl
->lpDDCB
->HALDDSurface
.dwFlags
& DDHAL_SURFCB32_UPDATEOVERLAY
) && (devicetypes
!=3))
483 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_UPDATEOVERLAY
;
485 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.UpdateOverlay
=
486 This
->lpLcl
->lpDDCB
->HALDDSurface
.UpdateOverlay
;
488 else if ((This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
& DDHAL_SURFCB32_UPDATEOVERLAY
) && (devicetypes
!=2))
490 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.dwFlags
|= DDHAL_SURFCB32_UPDATEOVERLAY
;
492 This
->lpLcl
->lpDDCB
->cbDDSurfaceCallbacks
.UpdateOverlay
=
493 This
->lpLcl
->lpDDCB
->HELDDSurface
.UpdateOverlay
;
496 /* Mix the DDPALETTE CALLBACKS */
497 This
->lpLcl
->lpDDCB
->HALDDPalette
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->HALDDPalette
);
499 if ((This
->lpLcl
->lpDDCB
->HALDDPalette
.dwFlags
& DDHAL_PALCB32_DESTROYPALETTE
) && (devicetypes
!=3))
501 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.dwFlags
|= DDHAL_PALCB32_SETENTRIES
;
503 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.DestroyPalette
=
504 This
->lpLcl
->lpDDCB
->HALDDPalette
.DestroyPalette
;
506 else if ((This
->lpLcl
->lpDDCB
->HELDDPalette
.dwFlags
& DDHAL_PALCB32_DESTROYPALETTE
) && (devicetypes
!=2))
508 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
;
518 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.SetEntries
=
519 This
->lpLcl
->lpDDCB
->HALDDPalette
.SetEntries
;
521 else if ((This
->lpLcl
->lpDDCB
->HELDDPalette
.dwFlags
& DDHAL_PALCB32_SETENTRIES
) && (devicetypes
!=2))
523 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.dwFlags
|= DDHAL_PALCB32_SETENTRIES
;
525 This
->lpLcl
->lpDDCB
->cbDDPaletteCallbacks
.SetEntries
=
526 This
->lpLcl
->lpDDCB
->HELDDPalette
.SetEntries
;
529 /* Mix the DDExeBuf CALLBACKS */
530 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
);
532 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_CANCREATEEXEBUF
) && (devicetypes
!=3))
534 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.CanCreateExecuteBuffer
=
535 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.CanCreateExecuteBuffer
;
536 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_CANCREATEEXEBUF
;
538 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_CANCREATEEXEBUF
) && (devicetypes
!=2))
540 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.CanCreateExecuteBuffer
=
541 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.CanCreateExecuteBuffer
;
542 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_CANCREATEEXEBUF
;
545 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_CREATEEXEBUF
) && (devicetypes
!=3))
547 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.CreateExecuteBuffer
=
548 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.CreateExecuteBuffer
;
549 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_CREATEEXEBUF
;
551 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_CREATEEXEBUF
) && (devicetypes
!=2))
553 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.CreateExecuteBuffer
=
554 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.CreateExecuteBuffer
;
555 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_CREATEEXEBUF
;
558 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_DESTROYEXEBUF
) && (devicetypes
!=3))
560 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.DestroyExecuteBuffer
=
561 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.DestroyExecuteBuffer
;
562 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_DESTROYEXEBUF
;
564 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_DESTROYEXEBUF
) && (devicetypes
!=2))
566 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.DestroyExecuteBuffer
=
567 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.DestroyExecuteBuffer
;
568 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_DESTROYEXEBUF
;
571 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_LOCKEXEBUF
) && (devicetypes
!=3))
573 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.LockExecuteBuffer
=
574 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.LockExecuteBuffer
;
575 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_LOCKEXEBUF
;
577 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_LOCKEXEBUF
) && (devicetypes
!=2))
579 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.LockExecuteBuffer
=
580 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.LockExecuteBuffer
;
581 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_LOCKEXEBUF
;
584 if ((This
->lpLcl
->lpDDCB
->HALDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_UNLOCKEXEBUF
) && (devicetypes
!=3))
586 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.UnlockExecuteBuffer
=
587 This
->lpLcl
->lpDDCB
->HALDDExeBuf
.UnlockExecuteBuffer
;
588 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_UNLOCKEXEBUF
;
590 else if ((This
->lpLcl
->lpDDCB
->HELDDExeBuf
.dwFlags
& DDHAL_EXEBUFCB32_UNLOCKEXEBUF
) && (devicetypes
!=2))
592 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.UnlockExecuteBuffer
=
593 This
->lpLcl
->lpDDCB
->HELDDExeBuf
.UnlockExecuteBuffer
;
594 This
->lpLcl
->lpDDCB
->cbDDExeBufCallbacks
.dwFlags
|= DDHAL_EXEBUFCB32_UNLOCKEXEBUF
;
597 /* Fill some basic info for Surface */
598 ddSurfGbl
.lpDD
= &ddgbl
;
601 We need setup this also
602 This->lpLcl->lpDDCB->cbDDColorControlCallbacks
603 This->lpLcl->lpDDCB->cbDDKernelCallbacks
604 This->lpLcl->lpDDCB->cbDDMiscellaneousCallbacks
605 This->lpLcl->lpDDCB->cbDDMotionCompCallbacks
606 This->lpLcl->lpDDCB->cbDDVideoPortCallbacks
614 StartDirectDrawHal(LPDIRECTDRAW
* iface
)
616 LPDDRAWI_DIRECTDRAW_INT This
= (LPDDRAWI_DIRECTDRAW_INT
)iface
;
617 DDHAL_GETDRIVERINFODATA DriverInfo
;
620 DDHAL_CALLBACKS mCallbacks
;
621 DDHAL_DDEXEBUFCALLBACKS mD3dBufferCallbacks
;
622 D3DHAL_CALLBACKS mD3dCallbacks
;
623 D3DHAL_GLOBALDRIVERDATA mD3dDriverData
;
630 DDSURFACEDESC
*mpTextures
;
632 /* HAL Startup process */
633 BOOL newmode
= FALSE
;
636 RtlZeroMemory(&mHALInfo
, sizeof(DDHALINFO
));
637 RtlZeroMemory(&mCallbacks
, sizeof(DDHAL_CALLBACKS
));
640 Startup DX HAL step one of three
642 if (!DdCreateDirectDrawObject(This
->lpLcl
->lpGbl
, (HDC
)This
->lpLcl
->hDC
))
644 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
645 DeleteDC((HDC
)This
->lpLcl
->hDC
);
651 // Do not relase HDC it have been map in kernel mode
654 if (!DdReenableDirectDrawObject(This
->lpLcl
->lpGbl
, &newmode
))
656 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
657 DeleteDC((HDC
)This
->lpLcl
->hDC
);
663 Startup DX HAL step two of three
666 if (!DdQueryDirectDrawObject(This
->lpLcl
->lpGbl
,
669 &mCallbacks
.HALDDSurface
,
670 &mCallbacks
.HALDDPalette
,
673 &mD3dBufferCallbacks
,
678 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
679 DeleteDC((HDC
)This
->lpLcl
->hDC
);
680 // FIXME Close DX fristcall and second call
684 mcvmList
= mHALInfo
.vmiData
.dwNumHeaps
;
685 mpvmList
= (VIDMEM
*) DxHeapMemAlloc(sizeof(VIDMEM
) * mcvmList
);
686 if (mpvmList
== NULL
)
688 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
689 DeleteDC((HDC
)This
->lpLcl
->hDC
);
690 // FIXME Close DX fristcall and second call
694 mcFourCC
= mHALInfo
.ddCaps
.dwNumFourCCCodes
;
695 mpFourCC
= (DWORD
*) DxHeapMemAlloc(sizeof(DWORD
) * mcFourCC
);
696 if (mpFourCC
== NULL
)
698 DxHeapMemFree(mpvmList
);
699 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
700 DeleteDC((HDC
)This
->lpLcl
->hDC
);
701 // FIXME Close DX fristcall and second call
705 mcTextures
= mD3dDriverData
.dwNumTextureFormats
;
706 mpTextures
= (DDSURFACEDESC
*) DxHeapMemAlloc(sizeof(DDSURFACEDESC
) * mcTextures
);
707 if (mpTextures
== NULL
)
709 DxHeapMemFree( mpFourCC
);
710 DxHeapMemFree( mpvmList
);
711 DxHeapMemFree( This
->lpLcl
->lpGbl
->lpModeInfo
);
712 DeleteDC((HDC
)This
->lpLcl
->hDC
);
713 // FIXME Close DX fristcall and second call
717 mHALInfo
.vmiData
.pvmList
= mpvmList
;
718 mHALInfo
.lpdwFourCC
= mpFourCC
;
719 mD3dDriverData
.lpTextureFormats
= (DDSURFACEDESC
*) mpTextures
;
721 if (!DdQueryDirectDrawObject(
725 &mCallbacks
.HALDDSurface
,
726 &mCallbacks
.HALDDPalette
,
729 &mCallbacks
.HALDDExeBuf
,
730 (DDSURFACEDESC
*)mpTextures
,
735 DxHeapMemFree(mpTextures
);
736 DxHeapMemFree(mpFourCC
);
737 DxHeapMemFree(mpvmList
);
738 DxHeapMemFree(This
->lpLcl
->lpGbl
->lpModeInfo
);
739 DeleteDC((HDC
)This
->lpLcl
->hDC
);
740 // FIXME Close DX fristcall and second call
745 Copy over from HalInfo to DirectDrawGlobal
748 // this is wrong, cDriverName need be in ASC code not UNICODE
749 //memcpy(mDDrawGlobal.cDriverName, mDisplayAdapter, sizeof(wchar)*MAX_DRIVER_NAME);
751 memcpy(&ddgbl
.vmiData
, &mHALInfo
.vmiData
,sizeof(VIDMEMINFO
));
752 memcpy(&ddgbl
.ddCaps
, &mHALInfo
.ddCaps
,sizeof(DDCORECAPS
));
754 mHALInfo
.dwNumModes
= 1;
755 mHALInfo
.lpModeInfo
= This
->lpLcl
->lpGbl
->lpModeInfo
;
756 mHALInfo
.dwMonitorFrequency
= This
->lpLcl
->lpGbl
->lpModeInfo
[0].wRefreshRate
;
758 This
->lpLcl
->lpGbl
->dwMonitorFrequency
= mHALInfo
.dwMonitorFrequency
;
759 This
->lpLcl
->lpGbl
->dwModeIndex
= mHALInfo
.dwModeIndex
;
760 This
->lpLcl
->lpGbl
->dwNumModes
= mHALInfo
.dwNumModes
;
761 This
->lpLcl
->lpGbl
->lpModeInfo
= mHALInfo
.lpModeInfo
;
762 This
->lpLcl
->lpGbl
->hInstance
= mHALInfo
.hInstance
;
764 This
->lpLcl
->lpGbl
->lp16DD
= This
->lpLcl
->lpGbl
;
767 memset(&DriverInfo
,0, sizeof(DDHAL_GETDRIVERINFODATA
));
768 DriverInfo
.dwSize
= sizeof(DDHAL_GETDRIVERINFODATA
);
769 DriverInfo
.dwContext
= This
->lpLcl
->lpGbl
->hDD
;
771 /* Get the MiscellaneousCallbacks */
772 DriverInfo
.guidInfo
= GUID_MiscellaneousCallbacks
;
773 DriverInfo
.lpvData
= &ddgbl
.lpDDCBtmp
->HALDDMiscellaneous
;
774 DriverInfo
.dwExpectedSize
= sizeof(DDHAL_DDMISCELLANEOUSCALLBACKS
);
775 mHALInfo
.GetDriverInfo(&DriverInfo
);
779 The 3d and private data are not save at moment
781 we need lest the private data being setup
782 for some driver are puting kmode memory there
783 the memory often contain the private struct +
784 surface, see MS DDK how MS example driver using
787 the 3d interface are not so improten if u do not
788 want the 3d, and we are not writing 3d code yet
789 so we be okay for now.
797 StartDirectDrawHel(LPDIRECTDRAW
* iface
)
799 LPDDRAWI_DIRECTDRAW_INT This
= (LPDDRAWI_DIRECTDRAW_INT
)iface
;
801 This
->lpLcl
->lpDDCB
->HELDD
.CanCreateSurface
= HelDdCanCreateSurface
;
802 This
->lpLcl
->lpDDCB
->HELDD
.CreateSurface
= HelDdCreateSurface
;
803 This
->lpLcl
->lpDDCB
->HELDD
.CreatePalette
= HelDdCreatePalette
;
804 This
->lpLcl
->lpDDCB
->HELDD
.DestroyDriver
= HelDdDestroyDriver
;
805 This
->lpLcl
->lpDDCB
->HELDD
.FlipToGDISurface
= HelDdFlipToGDISurface
;
806 This
->lpLcl
->lpDDCB
->HELDD
.GetScanLine
= HelDdGetScanLine
;
807 This
->lpLcl
->lpDDCB
->HELDD
.SetColorKey
= HelDdSetColorKey
;
808 This
->lpLcl
->lpDDCB
->HELDD
.SetExclusiveMode
= HelDdSetExclusiveMode
;
809 This
->lpLcl
->lpDDCB
->HELDD
.SetMode
= HelDdSetMode
;
810 This
->lpLcl
->lpDDCB
->HELDD
.WaitForVerticalBlank
= HelDdWaitForVerticalBlank
;
814 This
->lpLcl
->lpDDCB
->HELDD
.dwFlags
= DDHAL_CB32_CANCREATESURFACE
|
815 DDHAL_CB32_CREATESURFACE
|
816 DDHAL_CB32_CREATEPALETTE
|
817 DDHAL_CB32_DESTROYDRIVER
|
818 DDHAL_CB32_FLIPTOGDISURFACE
|
819 DDHAL_CB32_GETSCANLINE
|
820 DDHAL_CB32_SETCOLORKEY
|
821 DDHAL_CB32_SETEXCLUSIVEMODE
|
823 DDHAL_CB32_WAITFORVERTICALBLANK
;
825 This
->lpLcl
->lpDDCB
->HELDD
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->HELDD
);
827 This
->lpLcl
->lpDDCB
->HELDDSurface
.AddAttachedSurface
= HelDdSurfAddAttachedSurface
;
828 This
->lpLcl
->lpDDCB
->HELDDSurface
.Blt
= HelDdSurfBlt
;
829 This
->lpLcl
->lpDDCB
->HELDDSurface
.DestroySurface
= HelDdSurfDestroySurface
;
830 This
->lpLcl
->lpDDCB
->HELDDSurface
.Flip
= HelDdSurfFlip
;
831 This
->lpLcl
->lpDDCB
->HELDDSurface
.GetBltStatus
= HelDdSurfGetBltStatus
;
832 This
->lpLcl
->lpDDCB
->HELDDSurface
.GetFlipStatus
= HelDdSurfGetFlipStatus
;
833 This
->lpLcl
->lpDDCB
->HELDDSurface
.Lock
= HelDdSurfLock
;
834 This
->lpLcl
->lpDDCB
->HELDDSurface
.reserved4
= HelDdSurfreserved4
;
835 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetClipList
= HelDdSurfSetClipList
;
836 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetColorKey
= HelDdSurfSetColorKey
;
837 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetOverlayPosition
= HelDdSurfSetOverlayPosition
;
838 This
->lpLcl
->lpDDCB
->HELDDSurface
.SetPalette
= HelDdSurfSetPalette
;
839 This
->lpLcl
->lpDDCB
->HELDDSurface
.Unlock
= HelDdSurfUnlock
;
840 This
->lpLcl
->lpDDCB
->HELDDSurface
.UpdateOverlay
= HelDdSurfUpdateOverlay
;
842 This
->lpLcl
->lpDDCB
->HELDDSurface
.dwFlags
= DDHAL_SURFCB32_ADDATTACHEDSURFACE
|
844 DDHAL_SURFCB32_DESTROYSURFACE
|
845 DDHAL_SURFCB32_FLIP
|
846 DDHAL_SURFCB32_GETBLTSTATUS
|
847 DDHAL_SURFCB32_GETFLIPSTATUS
|
848 DDHAL_SURFCB32_LOCK
|
849 DDHAL_SURFCB32_RESERVED4
|
850 DDHAL_SURFCB32_SETCLIPLIST
|
851 DDHAL_SURFCB32_SETCOLORKEY
|
852 DDHAL_SURFCB32_SETOVERLAYPOSITION
|
853 DDHAL_SURFCB32_SETPALETTE
|
854 DDHAL_SURFCB32_UNLOCK
|
855 DDHAL_SURFCB32_UPDATEOVERLAY
;
857 This
->lpLcl
->lpDDCB
->HELDDSurface
.dwSize
= sizeof(This
->lpLcl
->lpDDCB
->HELDDSurface
);
860 This->lpLcl->lpDDCB->HELDDPalette.DestroyPalette = HelDdPalDestroyPalette;
861 This->lpLcl->lpDDCB->HELDDPalette.SetEntries = HelDdPalSetEntries;
862 This->lpLcl->lpDDCB->HELDDPalette.dwSize = sizeof(This->lpLcl->lpDDCB->HELDDPalette);
866 This->lpLcl->lpDDCB->HELDDExeBuf.CanCreateExecuteBuffer = HelDdExeCanCreateExecuteBuffer;
867 This->lpLcl->lpDDCB->HELDDExeBuf.CreateExecuteBuffer = HelDdExeCreateExecuteBuffer;
868 This->lpLcl->lpDDCB->HELDDExeBuf.DestroyExecuteBuffer = HelDdExeDestroyExecuteBuffer;
869 This->lpLcl->lpDDCB->HELDDExeBuf.LockExecuteBuffer = HelDdExeLockExecuteBuffer;
870 This->lpLcl->lpDDCB->HELDDExeBuf.UnlockExecuteBuffer = HelDdExeUnlockExecuteBuffer;
878 Create_DirectDraw (LPGUID pGUID
,
879 LPDIRECTDRAW
* pIface
,
883 LPDDRAWI_DIRECTDRAW_INT This
;
887 if (!IsEqualGUID(&IID_IDirectDraw7
, id
))
889 return DDERR_INVALIDDIRECTDRAWGUID
;
892 This
= DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT
));
895 return DDERR_OUTOFMEMORY
;
898 This
->lpLcl
= DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT
));
900 if (This
->lpLcl
== NULL
)
903 return DDERR_OUTOFMEMORY
;
906 This
->lpLcl
->lpGbl
= &ddgbl
;
908 *pIface
= (LPDIRECTDRAW
)This
;
910 if(Main_DirectDraw_QueryInterface((LPDIRECTDRAW7
)This
, id
, (void**)&pIface
) != S_OK
)
912 return DDERR_INVALIDPARAMS
;
915 if (StartDirectDraw((LPDIRECTDRAW
*)This
, pGUID
) == DD_OK
);
921 return DDERR_INVALIDPARAMS
;