prepare work for StartDirectDrawHel Now I need write stub for each HEL that we do...
[reactos.git] / reactos / dll / directx / ddraw / startup.c
1 /* $Id: main.c 21434 2006-04-01 19:12:56Z greatlrd $
2 *
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)
8 *
9 */
10
11 #include <windows.h>
12 #include "rosdraw.h"
13 #include "d3dhal.h"
14 #include "ddrawgdi.h"
15
16 DDRAWI_DIRECTDRAW_GBL ddgbl;
17 DDRAWI_DDRAWSURFACE_GBL ddSurfGbl;
18
19
20 HRESULT WINAPI
21 StartDirectDraw(LPDIRECTDRAW* iface, LPGUID lpGuid)
22 {
23 LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
24 DWORD hal_ret;
25 DWORD hel_ret;
26 DEVMODE devmode;
27 HBITMAP hbmp;
28 const UINT bmiSize = sizeof(BITMAPINFOHEADER) + 0x10;
29 UCHAR *pbmiData;
30 BITMAPINFO *pbmi;
31 DWORD *pMasks;
32 INT devicetypes = 0;
33
34 DX_WINDBG_trace();
35
36 RtlZeroMemory(&ddgbl, sizeof(DDRAWI_DIRECTDRAW_GBL));
37
38 ddgbl.lpDDCBtmp = (LPDDHAL_CALLBACKS) DxHeapMemAlloc(sizeof(DDHAL_CALLBACKS));
39 if (ddgbl.lpDDCBtmp == NULL)
40 {
41 DX_STUB_str("Out of memmory");
42 return DD_FALSE;
43 }
44
45 This->lpLcl->lpDDCB = ddgbl.lpDDCBtmp;
46
47
48 /* Same for HEL and HAL */
49 This->lpLcl->lpGbl->lpModeInfo = (DDHALMODEINFO*) DxHeapMemAlloc(1 * sizeof(DDHALMODEINFO));
50
51 if (This->lpLcl->lpGbl->lpModeInfo == NULL)
52 {
53 DX_STUB_str("DD_FALSE");
54 return DD_FALSE;
55 }
56
57 EnumDisplaySettings(NULL, ENUM_CURRENT_SETTINGS, &devmode);
58
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;
64
65
66 if (lpGuid == NULL)
67 {
68 devicetypes = 1;
69
70 /* Create HDC for default, hal and hel driver */
71 This->lpLcl->hDC = (ULONG_PTR) CreateDCW(L"DISPLAY",L"DISPLAY",NULL,NULL);
72
73 /* cObsolete is undoc in msdn it being use in CreateDCA */
74 RtlCopyMemory(&ddgbl.cObsolete,&"DISPLAY",7);
75 RtlCopyMemory(&ddgbl.cDriverName,&"DISPLAY",7);
76 }
77
78 else if (lpGuid == (LPGUID) DDCREATE_HARDWAREONLY)
79 {
80 devicetypes = 2;
81
82 /* Create HDC for default, hal and hel driver */
83 This->lpLcl->hDC = (ULONG_PTR)CreateDCW(L"DISPLAY",L"DISPLAY",NULL,NULL);
84
85 /* cObsolete is undoc in msdn it being use in CreateDCA */
86 RtlCopyMemory(&ddgbl.cObsolete,&"DISPLAY",7);
87 RtlCopyMemory(&ddgbl.cDriverName,&"DISPLAY",7);
88 }
89
90 else if (lpGuid == (LPGUID) DDCREATE_EMULATIONONLY)
91 {
92 devicetypes = 3;
93
94 /* Create HDC for default, hal and hel driver */
95 This->lpLcl->hDC = (ULONG_PTR) CreateDCW(L"DISPLAY",L"DISPLAY",NULL,NULL);
96
97 /* cObsolete is undoc in msdn it being use in CreateDCA */
98 RtlCopyMemory(&ddgbl.cObsolete,&"DISPLAY",7);
99 RtlCopyMemory(&ddgbl.cDriverName,&"DISPLAY",7);
100 }
101 else
102 {
103 /* FIXME : need getting driver from the GUID that have been pass in from
104 the register. we do not support that yet
105 */
106 devicetypes = 4;
107 This->lpLcl->hDC = (ULONG_PTR) NULL ;
108 }
109
110 if ( (HDC)This->lpLcl->hDC == NULL)
111 {
112 DX_STUB_str("DDERR_OUTOFMEMORY");
113 return DDERR_OUTOFMEMORY ;
114 }
115
116 hbmp = CreateCompatibleBitmap((HDC) This->lpLcl->hDC, 1, 1);
117 if (hbmp==NULL)
118 {
119 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
120 DeleteDC((HDC) This->lpLcl->hDC);
121 DX_STUB_str("DDERR_OUTOFMEMORY");
122 return DDERR_OUTOFMEMORY;
123 }
124
125 pbmiData = (UCHAR *) DxHeapMemAlloc(bmiSize);
126 pbmi = (BITMAPINFO*)pbmiData;
127
128 if (pbmiData==NULL)
129 {
130 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
131 DeleteDC((HDC) This->lpLcl->hDC);
132 DeleteObject(hbmp);
133 DX_STUB_str("DDERR_OUTOFMEMORY");
134 return DDERR_OUTOFMEMORY;
135 }
136
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;
142
143 GetDIBits((HDC) This->lpLcl->hDC, hbmp, 0, 0, NULL, pbmi, 0);
144 DeleteObject(hbmp);
145
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];
151
152 DxHeapMemFree(pbmiData);
153
154 /* Startup HEL and HAL */
155 // RtlZeroMemory(&ddgbl, sizeof(DDRAWI_DIRECTDRAW_GBL));
156
157 This->lpLcl->lpDDCB = This->lpLcl->lpGbl->lpDDCBtmp;
158 This->lpLcl->dwProcessId = GetCurrentProcessId();
159
160
161
162 hal_ret = StartDirectDrawHal(iface);
163 hel_ret = StartDirectDrawHel(iface);
164 if ((hal_ret!=DD_OK) && (hel_ret!=DD_OK))
165 {
166 DX_STUB_str("DDERR_NODIRECTDRAWSUPPORT");
167 return DDERR_NODIRECTDRAWSUPPORT;
168 }
169
170 This->lpLcl->hDD = This->lpLcl->lpGbl->hDD;
171
172
173 /* Fixme the mix betwin hel and hal */
174 This->lpLcl->lpDDCB->cbDDCallbacks.dwSize = sizeof(This->lpLcl->lpDDCB->cbDDCallbacks);
175
176 if (This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_CANCREATESURFACE)
177 {
178 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_CANCREATESURFACE;
179 This->lpLcl->lpDDCB->cbDDCallbacks.CanCreateSurface = This->lpLcl->lpDDCB->HALDD.CanCreateSurface;
180 }
181 else if (This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_CANCREATESURFACE)
182 {
183 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_CANCREATESURFACE;
184 This->lpLcl->lpDDCB->cbDDCallbacks.CanCreateSurface = This->lpLcl->lpDDCB->HELDD.CanCreateSurface;
185 }
186 if (This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_CREATESURFACE)
187 {
188 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_CREATESURFACE;
189 This->lpLcl->lpDDCB->cbDDCallbacks.CreateSurface = This->lpLcl->lpDDCB->HALDD.CreateSurface;
190 }
191 else if (This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_CREATESURFACE)
192 {
193 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_CREATESURFACE;
194 This->lpLcl->lpDDCB->cbDDCallbacks.CreateSurface = This->lpLcl->lpDDCB->HELDD.CreateSurface;
195 }
196 if (This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_CREATEPALETTE)
197 {
198 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_CREATEPALETTE;
199 This->lpLcl->lpDDCB->cbDDCallbacks.CreatePalette = This->lpLcl->lpDDCB->HALDD.CreatePalette;
200 }
201 else if (This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_CREATEPALETTE)
202 {
203 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_CREATEPALETTE;
204 This->lpLcl->lpDDCB->cbDDCallbacks.CreatePalette = This->lpLcl->lpDDCB->HELDD.CreatePalette;
205 }
206 if (This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_DESTROYDRIVER)
207 {
208 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_DESTROYDRIVER;
209 This->lpLcl->lpDDCB->cbDDCallbacks.DestroyDriver = This->lpLcl->lpDDCB->HALDD.DestroyDriver;
210 }
211 else if (This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_DESTROYDRIVER)
212 {
213 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_DESTROYDRIVER;
214 This->lpLcl->lpDDCB->cbDDCallbacks.DestroyDriver = This->lpLcl->lpDDCB->HELDD.DestroyDriver;
215 }
216 if (This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_FLIPTOGDISURFACE)
217 {
218 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_FLIPTOGDISURFACE;
219 This->lpLcl->lpDDCB->cbDDCallbacks.FlipToGDISurface = This->lpLcl->lpDDCB->HALDD.FlipToGDISurface;
220 }
221 else if (This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_FLIPTOGDISURFACE)
222 {
223 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_FLIPTOGDISURFACE;
224 This->lpLcl->lpDDCB->cbDDCallbacks.FlipToGDISurface = This->lpLcl->lpDDCB->HELDD.FlipToGDISurface;
225 }
226 if (This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_GETSCANLINE)
227 {
228 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_GETSCANLINE;
229 This->lpLcl->lpDDCB->cbDDCallbacks.GetScanLine = This->lpLcl->lpDDCB->HALDD.GetScanLine;
230 }
231 else if (This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_GETSCANLINE)
232 {
233 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_GETSCANLINE;
234 This->lpLcl->lpDDCB->cbDDCallbacks.GetScanLine = This->lpLcl->lpDDCB->HELDD.GetScanLine;
235 }
236 if (This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_SETCOLORKEY)
237 {
238 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_SETCOLORKEY;
239 This->lpLcl->lpDDCB->cbDDCallbacks.SetColorKey = This->lpLcl->lpDDCB->HALDD.SetColorKey;
240 }
241 else if (This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_SETCOLORKEY)
242 {
243 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_SETCOLORKEY;
244 This->lpLcl->lpDDCB->cbDDCallbacks.SetColorKey = This->lpLcl->lpDDCB->HELDD.SetColorKey;
245 }
246 if (This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_SETEXCLUSIVEMODE)
247 {
248 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_SETEXCLUSIVEMODE;
249 This->lpLcl->lpDDCB->cbDDCallbacks.SetExclusiveMode = This->lpLcl->lpDDCB->HALDD.SetExclusiveMode;
250 }
251 else if (This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_SETEXCLUSIVEMODE)
252 {
253 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_SETEXCLUSIVEMODE;
254 This->lpLcl->lpDDCB->cbDDCallbacks.SetExclusiveMode = This->lpLcl->lpDDCB->HELDD.SetExclusiveMode;
255 }
256 if (This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_SETMODE)
257 {
258 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_SETMODE;
259 This->lpLcl->lpDDCB->cbDDCallbacks.SetMode = This->lpLcl->lpDDCB->HALDD.SetMode;
260 }
261 else if (This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_SETMODE)
262 {
263 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_SETMODE;
264 This->lpLcl->lpDDCB->cbDDCallbacks.SetMode = This->lpLcl->lpDDCB->HELDD.SetMode;
265 }
266 if (This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_WAITFORVERTICALBLANK)
267 {
268 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_WAITFORVERTICALBLANK;
269 This->lpLcl->lpDDCB->cbDDCallbacks.WaitForVerticalBlank = This->lpLcl->lpDDCB->HALDD.WaitForVerticalBlank;
270 }
271 else if (This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_WAITFORVERTICALBLANK)
272 {
273 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags = DDHAL_CB32_WAITFORVERTICALBLANK;
274 This->lpLcl->lpDDCB->cbDDCallbacks.WaitForVerticalBlank = This->lpLcl->lpDDCB->HELDD.WaitForVerticalBlank;
275 }
276
277
278
279
280
281
282
283
284
285
286 /* Fill some basic info for Surface */
287 ddSurfGbl.lpDD = &ddgbl;
288
289
290 return DD_OK;
291 }
292
293
294 HRESULT WINAPI
295 StartDirectDrawHal(LPDIRECTDRAW* iface)
296 {
297 LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
298 DDHAL_GETDRIVERINFODATA DriverInfo;
299
300 DDHALINFO mHALInfo;
301 DDHAL_CALLBACKS mCallbacks;
302 DDHAL_DDEXEBUFCALLBACKS mD3dBufferCallbacks;
303 D3DHAL_CALLBACKS mD3dCallbacks;
304 D3DHAL_GLOBALDRIVERDATA mD3dDriverData;
305 UINT mcvmList;
306 VIDMEM *mpvmList;
307
308 UINT mcFourCC;
309 DWORD *mpFourCC;
310 UINT mcTextures;
311 DDSURFACEDESC *mpTextures;
312
313 /* HAL Startup process */
314 BOOL newmode = FALSE;
315
316
317 RtlZeroMemory(&mHALInfo, sizeof(DDHALINFO));
318 RtlZeroMemory(&mCallbacks, sizeof(DDHAL_CALLBACKS));
319
320 /*
321 Startup DX HAL step one of three
322 */
323 if (!DdCreateDirectDrawObject(This->lpLcl->lpGbl, (HDC)This->lpLcl->hDC))
324 {
325 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
326 DeleteDC((HDC)This->lpLcl->hDC);
327 return DD_FALSE;
328 }
329
330 // Do not relase HDC it have been map in kernel mode
331 // DeleteDC(hdc);
332
333 if (!DdReenableDirectDrawObject(This->lpLcl->lpGbl, &newmode))
334 {
335 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
336 DeleteDC((HDC)This->lpLcl->hDC);
337 return DD_FALSE;
338 }
339
340
341 /*
342 Startup DX HAL step two of three
343 */
344
345 if (!DdQueryDirectDrawObject(This->lpLcl->lpGbl,
346 &mHALInfo,
347 &mCallbacks.HALDD,
348 &mCallbacks.HALDDSurface,
349 &mCallbacks.HALDDPalette,
350 &mD3dCallbacks,
351 &mD3dDriverData,
352 &mD3dBufferCallbacks,
353 NULL,
354 NULL,
355 NULL))
356 {
357 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
358 DeleteDC((HDC)This->lpLcl->hDC);
359 // FIXME Close DX fristcall and second call
360 return DD_FALSE;
361 }
362
363 mcvmList = mHALInfo.vmiData.dwNumHeaps;
364 mpvmList = (VIDMEM*) DxHeapMemAlloc(sizeof(VIDMEM) * mcvmList);
365 if (mpvmList == NULL)
366 {
367 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
368 DeleteDC((HDC)This->lpLcl->hDC);
369 // FIXME Close DX fristcall and second call
370 return DD_FALSE;
371 }
372
373 mcFourCC = mHALInfo.ddCaps.dwNumFourCCCodes;
374 mpFourCC = (DWORD *) DxHeapMemAlloc(sizeof(DWORD) * mcFourCC);
375 if (mpFourCC == NULL)
376 {
377 DxHeapMemFree(mpvmList);
378 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
379 DeleteDC((HDC)This->lpLcl->hDC);
380 // FIXME Close DX fristcall and second call
381 return DD_FALSE;
382 }
383
384 mcTextures = mD3dDriverData.dwNumTextureFormats;
385 mpTextures = (DDSURFACEDESC*) DxHeapMemAlloc(sizeof(DDSURFACEDESC) * mcTextures);
386 if (mpTextures == NULL)
387 {
388 DxHeapMemFree( mpFourCC);
389 DxHeapMemFree( mpvmList);
390 DxHeapMemFree( This->lpLcl->lpGbl->lpModeInfo);
391 DeleteDC((HDC)This->lpLcl->hDC);
392 // FIXME Close DX fristcall and second call
393 return DD_FALSE;
394 }
395
396 mHALInfo.vmiData.pvmList = mpvmList;
397 mHALInfo.lpdwFourCC = mpFourCC;
398 mD3dDriverData.lpTextureFormats = (DDSURFACEDESC*) mpTextures;
399
400 if (!DdQueryDirectDrawObject(
401 This->lpLcl->lpGbl,
402 &mHALInfo,
403 &mCallbacks.HALDD,
404 &mCallbacks.HALDDSurface,
405 &mCallbacks.HALDDPalette,
406 &mD3dCallbacks,
407 &mD3dDriverData,
408 &mCallbacks.HALDDExeBuf,
409 (DDSURFACEDESC*)mpTextures,
410 mpFourCC,
411 mpvmList))
412
413 {
414 DxHeapMemFree(mpTextures);
415 DxHeapMemFree(mpFourCC);
416 DxHeapMemFree(mpvmList);
417 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
418 DeleteDC((HDC)This->lpLcl->hDC);
419 // FIXME Close DX fristcall and second call
420 return DD_FALSE;
421 }
422
423 /*
424 Copy over from HalInfo to DirectDrawGlobal
425 */
426
427 // this is wrong, cDriverName need be in ASC code not UNICODE
428 //memcpy(mDDrawGlobal.cDriverName, mDisplayAdapter, sizeof(wchar)*MAX_DRIVER_NAME);
429
430 memcpy(&ddgbl.vmiData, &mHALInfo.vmiData,sizeof(VIDMEMINFO));
431 memcpy(&ddgbl.ddCaps, &mHALInfo.ddCaps,sizeof(DDCORECAPS));
432
433 mHALInfo.dwNumModes = 1;
434 mHALInfo.lpModeInfo = This->lpLcl->lpGbl->lpModeInfo;
435 mHALInfo.dwMonitorFrequency = This->lpLcl->lpGbl->lpModeInfo[0].wRefreshRate;
436
437 This->lpLcl->lpGbl->dwMonitorFrequency = mHALInfo.dwMonitorFrequency;
438 This->lpLcl->lpGbl->dwModeIndex = mHALInfo.dwModeIndex;
439 This->lpLcl->lpGbl->dwNumModes = mHALInfo.dwNumModes;
440 This->lpLcl->lpGbl->lpModeInfo = mHALInfo.lpModeInfo;
441 This->lpLcl->lpGbl->hInstance = mHALInfo.hInstance;
442
443 This->lpLcl->lpGbl->lp16DD = This->lpLcl->lpGbl;
444
445
446 memset(&DriverInfo,0, sizeof(DDHAL_GETDRIVERINFODATA));
447 DriverInfo.dwSize = sizeof(DDHAL_GETDRIVERINFODATA);
448 DriverInfo.dwContext = This->lpLcl->lpGbl->hDD;
449
450 /* Get the MiscellaneousCallbacks */
451 DriverInfo.guidInfo = GUID_MiscellaneousCallbacks;
452 DriverInfo.lpvData = &ddgbl.lpDDCBtmp->HALDDMiscellaneous;
453 DriverInfo.dwExpectedSize = sizeof(DDHAL_DDMISCELLANEOUSCALLBACKS);
454 mHALInfo.GetDriverInfo(&DriverInfo);
455
456
457 return DD_OK;
458 }
459
460 HRESULT WINAPI
461 StartDirectDrawHel(LPDIRECTDRAW* iface)
462 {
463 LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
464
465 This->lpLcl->lpDDCB->HELDD.CanCreateSurface = HelDdCanCreateSurface;
466 This->lpLcl->lpDDCB->HELDD.CreateSurface = HelDdCreateSurface;
467 This->lpLcl->lpDDCB->HELDD.CreatePalette = HelDdCreatePalette;
468 This->lpLcl->lpDDCB->HELDD.DestroyDriver = HelDdDestroyDriver;
469 //This->lpLcl->lpDDCB->HELDD.FlipToGDISurface = HelDdFlipToGDISurface
470 This->lpLcl->lpDDCB->HELDD.GetScanLine = HelDdGetScanLine;
471 // This->lpLcl->lpDDCB->HELDD.SetColorKey = HelDdSetColorKey;
472 This->lpLcl->lpDDCB->HELDD.SetExclusiveMode = HelDdSetExclusiveMode;
473 This->lpLcl->lpDDCB->HELDD.SetMode = HelDdSetMode;
474 This->lpLcl->lpDDCB->HELDD.WaitForVerticalBlank = HelDdWaitForVerticalBlank;
475
476 This->lpLcl->lpDDCB->HELDD.dwFlags = DDHAL_CB32_CANCREATESURFACE |
477 DDHAL_CB32_CREATESURFACE |
478 DDHAL_CB32_CREATEPALETTE |
479 DDHAL_CB32_DESTROYDRIVER |
480 // DDHAL_CB32_FLIPTOGDISURFACE |
481 DDHAL_CB32_GETSCANLINE |
482 // DDHAL_CB32_SETCOLORKEY |
483 DDHAL_CB32_SETEXCLUSIVEMODE |
484 DDHAL_CB32_SETMODE |
485 DDHAL_CB32_WAITFORVERTICALBLANK ;
486
487
488 This->lpLcl->lpDDCB->HELDD.dwSize = sizeof(This->lpLcl->lpDDCB->HELDD);
489
490 /*
491 This->lpLcl->lpDDCB->HELDDSurface.AddAttachedSurface = HelDdSurfAddAttachedSurface;
492 This->lpLcl->lpDDCB->HELDDSurface.Blt = HelDdSurfBlt;
493 This->lpLcl->lpDDCB->HELDDSurface.DestroySurface = HelDdSurfDestroySurface;
494 This->lpLcl->lpDDCB->HELDDSurface.Flip = HelDdSurfFlip;
495 This->lpLcl->lpDDCB->HELDDSurface.GetBltStatus = HelDdSurfGetBltStatus;
496 This->lpLcl->lpDDCB->HELDDSurface.GetFlipStatus = HelDdSurfGetFlipStatus;
497 This->lpLcl->lpDDCB->HELDDSurface.Lock = HelDdSurfLock;
498 This->lpLcl->lpDDCB->HELDDSurface.reserved4 = HelDdSurfreserved4;
499 This->lpLcl->lpDDCB->HELDDSurface.SetClipList = HelDdSurfSetClipList;
500 This->lpLcl->lpDDCB->HELDDSurface.SetColorKey = HelDdSurfSetColorKey;
501 This->lpLcl->lpDDCB->HELDDSurface.SetOverlayPosition = HelDdSurfSetOverlayPosition;
502 This->lpLcl->lpDDCB->HELDDSurface.SetPalette = HelDdSurfSetPalette;
503 This->lpLcl->lpDDCB->HELDDSurface.Unlock = HelDdSurfUnlock;
504 This->lpLcl->lpDDCB->HELDDSurface.UpdateOverlay = HelDdSurfUpdateOverlay;
505 */
506
507 /*
508 This->lpLcl->lpDDCB->HELDDPalette.DestroyPalette = HelDdPalDestroyPalette;
509 This->lpLcl->lpDDCB->HELDDPalette.SetEntries = HelDdPalSetEntries;
510 This->lpLcl->lpDDCB->HELDDPalette.dwSize = sizeof(This->lpLcl->lpDDCB->HELDDPalette);
511 */
512
513 /*
514 This->lpLcl->lpDDCB->HELDDExeBuf.CanCreateExecuteBuffer = HelDdExeCanCreateExecuteBuffer;
515 This->lpLcl->lpDDCB->HELDDExeBuf.CreateExecuteBuffer = HelDdExeCreateExecuteBuffer;
516 This->lpLcl->lpDDCB->HELDDExeBuf.DestroyExecuteBuffer = HelDdExeDestroyExecuteBuffer;
517 This->lpLcl->lpDDCB->HELDDExeBuf.LockExecuteBuffer = HelDdExeLockExecuteBuffer;
518 This->lpLcl->lpDDCB->HELDDExeBuf.UnlockExecuteBuffer = HelDdExeUnlockExecuteBuffer;
519 */
520
521 return DD_OK;
522 }
523
524 HRESULT
525 WINAPI
526 Create_DirectDraw (LPGUID pGUID,
527 LPDIRECTDRAW* pIface,
528 REFIID id,
529 BOOL ex)
530 {
531 LPDDRAWI_DIRECTDRAW_INT This;
532
533
534 DX_WINDBG_trace();
535
536 This = DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT));
537 if (This == NULL)
538 {
539 return E_OUTOFMEMORY;
540 }
541
542 This->lpLcl = DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT));
543
544 if (This->lpLcl == NULL)
545 {
546 /* FIXME cleanup */
547 return DDERR_OUTOFMEMORY;
548 }
549
550 This->lpLcl->lpGbl = &ddgbl;
551
552 *pIface = (LPDIRECTDRAW)This;
553
554 if(Main_DirectDraw_QueryInterface((LPDIRECTDRAW7)This, id, (void**)&pIface) != S_OK)
555 {
556 return DDERR_INVALIDPARAMS;
557 }
558
559 if (StartDirectDraw((LPDIRECTDRAW*)This, pGUID) == DD_OK);
560 {
561
562 return DD_OK;
563 }
564
565 return DDERR_INVALIDPARAMS;
566 }
567
568
569