adding check if it is IID_IDirectDraw7 on right place and learn it is lpDD->QueryInte...
[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
163 hel_ret = StartDirectDrawHel(iface);
164 hal_ret = StartDirectDrawHal(iface);
165
166
167
168 if ((hal_ret!=DD_OK) && (hel_ret!=DD_OK))
169 {
170 DX_STUB_str("DDERR_NODIRECTDRAWSUPPORT");
171 return DDERR_NODIRECTDRAWSUPPORT;
172 }
173
174 This->lpLcl->hDD = This->lpLcl->lpGbl->hDD;
175
176
177 /* Mix the DDCALLBACKS */
178 This->lpLcl->lpDDCB->cbDDCallbacks.dwSize = sizeof(This->lpLcl->lpDDCB->cbDDCallbacks);
179
180 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_CANCREATESURFACE) && (devicetypes !=3))
181 {
182 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_CANCREATESURFACE;
183 This->lpLcl->lpDDCB->cbDDCallbacks.CanCreateSurface = This->lpLcl->lpDDCB->HALDD.CanCreateSurface;
184 }
185 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_CANCREATESURFACE) && (devicetypes !=2))
186 {
187 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_CANCREATESURFACE;
188 This->lpLcl->lpDDCB->cbDDCallbacks.CanCreateSurface = This->lpLcl->lpDDCB->HELDD.CanCreateSurface;
189 }
190 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_CREATESURFACE) && (devicetypes !=3))
191 {
192 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_CREATESURFACE;
193 This->lpLcl->lpDDCB->cbDDCallbacks.CreateSurface = This->lpLcl->lpDDCB->HALDD.CreateSurface;
194 }
195 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_CREATESURFACE) && (devicetypes !=2))
196 {
197 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_CREATESURFACE;
198 This->lpLcl->lpDDCB->cbDDCallbacks.CreateSurface = This->lpLcl->lpDDCB->HELDD.CreateSurface;
199 }
200 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_CREATEPALETTE) && (devicetypes !=3))
201 {
202 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_CREATEPALETTE;
203 This->lpLcl->lpDDCB->cbDDCallbacks.CreatePalette = This->lpLcl->lpDDCB->HALDD.CreatePalette;
204 }
205 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_CREATEPALETTE) && (devicetypes !=2))
206 {
207 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_CREATEPALETTE;
208 This->lpLcl->lpDDCB->cbDDCallbacks.CreatePalette = This->lpLcl->lpDDCB->HELDD.CreatePalette;
209 }
210 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_DESTROYDRIVER) && (devicetypes !=3))
211 {
212 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_DESTROYDRIVER;
213 This->lpLcl->lpDDCB->cbDDCallbacks.DestroyDriver = This->lpLcl->lpDDCB->HALDD.DestroyDriver;
214 }
215 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_DESTROYDRIVER) && (devicetypes !=2))
216 {
217 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_DESTROYDRIVER;
218 This->lpLcl->lpDDCB->cbDDCallbacks.DestroyDriver = This->lpLcl->lpDDCB->HELDD.DestroyDriver;
219 }
220 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_FLIPTOGDISURFACE) && (devicetypes !=3))
221 {
222 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_FLIPTOGDISURFACE;
223 This->lpLcl->lpDDCB->cbDDCallbacks.FlipToGDISurface = This->lpLcl->lpDDCB->HALDD.FlipToGDISurface;
224 }
225 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_FLIPTOGDISURFACE) && (devicetypes !=2))
226 {
227 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_FLIPTOGDISURFACE;
228 This->lpLcl->lpDDCB->cbDDCallbacks.FlipToGDISurface = This->lpLcl->lpDDCB->HELDD.FlipToGDISurface;
229 }
230 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_GETSCANLINE) && (devicetypes !=3))
231 {
232 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_GETSCANLINE;
233 This->lpLcl->lpDDCB->cbDDCallbacks.GetScanLine = This->lpLcl->lpDDCB->HALDD.GetScanLine;
234 }
235 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_GETSCANLINE) && (devicetypes !=2))
236 {
237 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_GETSCANLINE;
238 This->lpLcl->lpDDCB->cbDDCallbacks.GetScanLine = This->lpLcl->lpDDCB->HELDD.GetScanLine;
239 }
240 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_SETCOLORKEY) && (devicetypes !=3))
241 {
242 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_SETCOLORKEY;
243 This->lpLcl->lpDDCB->cbDDCallbacks.SetColorKey = This->lpLcl->lpDDCB->HALDD.SetColorKey;
244 }
245 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_SETCOLORKEY) && (devicetypes !=2))
246 {
247 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_SETCOLORKEY;
248 This->lpLcl->lpDDCB->cbDDCallbacks.SetColorKey = This->lpLcl->lpDDCB->HELDD.SetColorKey;
249 }
250 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_SETEXCLUSIVEMODE) && (devicetypes !=3))
251 {
252 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_SETEXCLUSIVEMODE;
253 This->lpLcl->lpDDCB->cbDDCallbacks.SetExclusiveMode = This->lpLcl->lpDDCB->HALDD.SetExclusiveMode;
254 }
255 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_SETEXCLUSIVEMODE) && (devicetypes !=2))
256 {
257 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_SETEXCLUSIVEMODE;
258 This->lpLcl->lpDDCB->cbDDCallbacks.SetExclusiveMode = This->lpLcl->lpDDCB->HELDD.SetExclusiveMode;
259 }
260 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_SETMODE) && (devicetypes !=3))
261 {
262 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_SETMODE;
263 This->lpLcl->lpDDCB->cbDDCallbacks.SetMode = This->lpLcl->lpDDCB->HALDD.SetMode;
264 }
265 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_SETMODE) && (devicetypes !=2))
266 {
267 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_SETMODE;
268 This->lpLcl->lpDDCB->cbDDCallbacks.SetMode = This->lpLcl->lpDDCB->HELDD.SetMode;
269 }
270 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_WAITFORVERTICALBLANK) && (devicetypes !=3))
271 {
272 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_WAITFORVERTICALBLANK;
273 This->lpLcl->lpDDCB->cbDDCallbacks.WaitForVerticalBlank =
274 This->lpLcl->lpDDCB->HALDD.WaitForVerticalBlank;
275 }
276 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_WAITFORVERTICALBLANK) && (devicetypes !=2))
277 {
278 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_WAITFORVERTICALBLANK;
279 This->lpLcl->lpDDCB->cbDDCallbacks.WaitForVerticalBlank =
280 This->lpLcl->lpDDCB->HELDD.WaitForVerticalBlank;
281 }
282
283 /* Mix the DDSURFACE CALLBACKS */
284 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwSize = sizeof(This->lpLcl->lpDDCB->cbDDSurfaceCallbacks);
285
286 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_ADDATTACHEDSURFACE) && (devicetypes !=3))
287 {
288 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_ADDATTACHEDSURFACE;
289
290 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.AddAttachedSurface =
291 This->lpLcl->lpDDCB->HALDDSurface.AddAttachedSurface;
292 }
293 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_ADDATTACHEDSURFACE) && (devicetypes !=2))
294 {
295 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_ADDATTACHEDSURFACE;
296
297 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.AddAttachedSurface =
298 This->lpLcl->lpDDCB->HELDDSurface.AddAttachedSurface;
299 }
300
301 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_BLT) && (devicetypes !=3))
302 {
303 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_BLT;
304
305 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Blt =
306 This->lpLcl->lpDDCB->HALDDSurface.Blt;
307 }
308 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_BLT) && (devicetypes !=2))
309 {
310 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_BLT;
311
312 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Blt =
313 This->lpLcl->lpDDCB->HELDDSurface.Blt;
314 }
315
316 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_DESTROYSURFACE) && (devicetypes !=3))
317 {
318 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_DESTROYSURFACE;
319
320 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.DestroySurface =
321 This->lpLcl->lpDDCB->HALDDSurface.DestroySurface;
322 }
323 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_DESTROYSURFACE) && (devicetypes !=2))
324 {
325 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_DESTROYSURFACE;
326
327 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.DestroySurface =
328 This->lpLcl->lpDDCB->HELDDSurface.DestroySurface;
329 }
330
331 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_FLIP) && (devicetypes !=3))
332 {
333 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_FLIP;
334
335 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Flip =
336 This->lpLcl->lpDDCB->HALDDSurface.Flip;
337 }
338 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_FLIP) && (devicetypes !=2))
339 {
340 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_FLIP;
341
342 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Flip =
343 This->lpLcl->lpDDCB->HELDDSurface.Flip;
344 }
345
346 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_GETBLTSTATUS) && (devicetypes !=3))
347 {
348 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_GETBLTSTATUS;
349
350 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.GetBltStatus =
351 This->lpLcl->lpDDCB->HALDDSurface.GetBltStatus;
352 }
353 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_GETBLTSTATUS) && (devicetypes !=2))
354 {
355 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_GETBLTSTATUS;
356
357 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.GetBltStatus =
358 This->lpLcl->lpDDCB->HELDDSurface.GetBltStatus;
359 }
360
361 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_GETFLIPSTATUS) && (devicetypes !=3))
362 {
363 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_GETFLIPSTATUS;
364
365 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.GetFlipStatus =
366 This->lpLcl->lpDDCB->HALDDSurface.GetFlipStatus;
367 }
368 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_GETFLIPSTATUS) && (devicetypes !=2))
369 {
370 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_GETFLIPSTATUS;
371
372 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.GetFlipStatus =
373 This->lpLcl->lpDDCB->HELDDSurface.GetFlipStatus;
374 }
375
376 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_LOCK) && (devicetypes !=3))
377 {
378 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_LOCK;
379
380 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Lock =
381 This->lpLcl->lpDDCB->HALDDSurface.Lock;
382 }
383 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_LOCK) && (devicetypes !=2))
384 {
385 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_LOCK;
386
387 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Lock =
388 This->lpLcl->lpDDCB->HELDDSurface.Lock;
389 }
390
391 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_RESERVED4) && (devicetypes !=3))
392 {
393 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_RESERVED4;
394
395 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.reserved4 =
396 This->lpLcl->lpDDCB->HALDDSurface.reserved4;
397 }
398 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_RESERVED4) && (devicetypes !=2))
399 {
400 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_RESERVED4;
401
402 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.reserved4 =
403 This->lpLcl->lpDDCB->HELDDSurface.reserved4;
404 }
405
406 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_SETCLIPLIST) && (devicetypes !=3))
407 {
408 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETCLIPLIST;
409
410 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetClipList =
411 This->lpLcl->lpDDCB->HALDDSurface.SetClipList;
412 }
413 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_SETCLIPLIST) && (devicetypes !=2))
414 {
415 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETCLIPLIST;
416
417 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetClipList =
418 This->lpLcl->lpDDCB->HELDDSurface.SetClipList;
419 }
420
421 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_SETCOLORKEY) && (devicetypes !=3))
422 {
423 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETCOLORKEY;
424
425 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetColorKey =
426 This->lpLcl->lpDDCB->HALDDSurface.SetColorKey;
427 }
428 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_SETCOLORKEY) && (devicetypes !=2))
429 {
430 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETCOLORKEY;
431
432 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetColorKey =
433 This->lpLcl->lpDDCB->HELDDSurface.SetColorKey;
434 }
435
436 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_SETOVERLAYPOSITION) && (devicetypes !=3))
437 {
438 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETOVERLAYPOSITION;
439
440 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetOverlayPosition =
441 This->lpLcl->lpDDCB->HALDDSurface.SetOverlayPosition;
442 }
443 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_SETOVERLAYPOSITION) && (devicetypes !=2))
444 {
445 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETOVERLAYPOSITION;
446
447 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetOverlayPosition =
448 This->lpLcl->lpDDCB->HELDDSurface.SetOverlayPosition;
449 }
450
451 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_SETPALETTE) && (devicetypes !=3))
452 {
453 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETPALETTE;
454
455 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetPalette =
456 This->lpLcl->lpDDCB->HALDDSurface.SetPalette;
457 }
458 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_SETPALETTE) && (devicetypes !=2))
459 {
460 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETPALETTE;
461
462 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetPalette =
463 This->lpLcl->lpDDCB->HELDDSurface.SetPalette;
464 }
465
466 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_UNLOCK) && (devicetypes !=3))
467 {
468 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_UNLOCK;
469
470 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Unlock =
471 This->lpLcl->lpDDCB->HALDDSurface.Unlock;
472 }
473 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_UNLOCK) && (devicetypes !=2))
474 {
475 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_UNLOCK;
476
477 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Unlock =
478 This->lpLcl->lpDDCB->HELDDSurface.Unlock;
479 }
480
481 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY) && (devicetypes !=3))
482 {
483 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_UPDATEOVERLAY;
484
485 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.UpdateOverlay =
486 This->lpLcl->lpDDCB->HALDDSurface.UpdateOverlay;
487 }
488 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY) && (devicetypes !=2))
489 {
490 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_UPDATEOVERLAY;
491
492 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.UpdateOverlay =
493 This->lpLcl->lpDDCB->HELDDSurface.UpdateOverlay;
494 }
495
496 /* Mix the DDPALETTE CALLBACKS */
497 This->lpLcl->lpDDCB->HALDDPalette.dwSize = sizeof(This->lpLcl->lpDDCB->HALDDPalette);
498
499 if ((This->lpLcl->lpDDCB->HALDDPalette.dwFlags & DDHAL_PALCB32_DESTROYPALETTE) && (devicetypes !=3))
500 {
501 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.dwFlags |= DDHAL_PALCB32_SETENTRIES;
502
503 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.DestroyPalette =
504 This->lpLcl->lpDDCB->HALDDPalette.DestroyPalette;
505 }
506 else if ((This->lpLcl->lpDDCB->HELDDPalette.dwFlags & DDHAL_PALCB32_DESTROYPALETTE) && (devicetypes !=2))
507 {
508 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.dwFlags |= DDHAL_PALCB32_DESTROYPALETTE;
509
510 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.DestroyPalette =
511 This->lpLcl->lpDDCB->HELDDPalette.DestroyPalette;
512 }
513
514 if ((This->lpLcl->lpDDCB->HALDDPalette.dwFlags & DDHAL_PALCB32_SETENTRIES) && (devicetypes !=3))
515 {
516 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.dwFlags |= DDHAL_PALCB32_SETENTRIES;
517
518 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.SetEntries =
519 This->lpLcl->lpDDCB->HALDDPalette.SetEntries;
520 }
521 else if ((This->lpLcl->lpDDCB->HELDDPalette.dwFlags & DDHAL_PALCB32_SETENTRIES) && (devicetypes !=2))
522 {
523 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.dwFlags |= DDHAL_PALCB32_SETENTRIES;
524
525 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.SetEntries =
526 This->lpLcl->lpDDCB->HELDDPalette.SetEntries;
527 }
528
529 /* Mix the DDExeBuf CALLBACKS */
530 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwSize = sizeof(This->lpLcl->lpDDCB->cbDDExeBufCallbacks);
531
532 if ((This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_CANCREATEEXEBUF) && (devicetypes !=3))
533 {
534 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CanCreateExecuteBuffer =
535 This->lpLcl->lpDDCB->HALDDExeBuf.CanCreateExecuteBuffer;
536 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CANCREATEEXEBUF;
537 }
538 else if ((This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_CANCREATEEXEBUF) && (devicetypes !=2))
539 {
540 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CanCreateExecuteBuffer =
541 This->lpLcl->lpDDCB->HELDDExeBuf.CanCreateExecuteBuffer;
542 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CANCREATEEXEBUF;
543 }
544
545 if ((This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_CREATEEXEBUF) && (devicetypes !=3))
546 {
547 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CreateExecuteBuffer =
548 This->lpLcl->lpDDCB->HALDDExeBuf.CreateExecuteBuffer;
549 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CREATEEXEBUF;
550 }
551 else if ((This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_CREATEEXEBUF) && (devicetypes !=2))
552 {
553 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CreateExecuteBuffer =
554 This->lpLcl->lpDDCB->HELDDExeBuf.CreateExecuteBuffer;
555 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CREATEEXEBUF;
556 }
557
558 if ((This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_DESTROYEXEBUF) && (devicetypes !=3))
559 {
560 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.DestroyExecuteBuffer =
561 This->lpLcl->lpDDCB->HALDDExeBuf.DestroyExecuteBuffer;
562 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_DESTROYEXEBUF;
563 }
564 else if ((This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_DESTROYEXEBUF) && (devicetypes !=2))
565 {
566 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.DestroyExecuteBuffer =
567 This->lpLcl->lpDDCB->HELDDExeBuf.DestroyExecuteBuffer;
568 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_DESTROYEXEBUF;
569 }
570
571 if ((This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_LOCKEXEBUF) && (devicetypes !=3))
572 {
573 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.LockExecuteBuffer =
574 This->lpLcl->lpDDCB->HALDDExeBuf.LockExecuteBuffer;
575 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_LOCKEXEBUF;
576 }
577 else if ((This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_LOCKEXEBUF) && (devicetypes !=2))
578 {
579 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.LockExecuteBuffer =
580 This->lpLcl->lpDDCB->HELDDExeBuf.LockExecuteBuffer;
581 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_LOCKEXEBUF;
582 }
583
584 if ((This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_UNLOCKEXEBUF) && (devicetypes !=3))
585 {
586 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.UnlockExecuteBuffer =
587 This->lpLcl->lpDDCB->HALDDExeBuf.UnlockExecuteBuffer;
588 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_UNLOCKEXEBUF;
589 }
590 else if ((This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_UNLOCKEXEBUF) && (devicetypes !=2))
591 {
592 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.UnlockExecuteBuffer =
593 This->lpLcl->lpDDCB->HELDDExeBuf.UnlockExecuteBuffer;
594 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_UNLOCKEXEBUF;
595 }
596
597 /* Fill some basic info for Surface */
598 ddSurfGbl.lpDD = &ddgbl;
599
600 /* FIXME
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
607 */
608
609 return DD_OK;
610 }
611
612
613 HRESULT WINAPI
614 StartDirectDrawHal(LPDIRECTDRAW* iface)
615 {
616 LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
617 DDHAL_GETDRIVERINFODATA DriverInfo;
618
619 DDHALINFO mHALInfo;
620 DDHAL_CALLBACKS mCallbacks;
621 DDHAL_DDEXEBUFCALLBACKS mD3dBufferCallbacks;
622 D3DHAL_CALLBACKS mD3dCallbacks;
623 D3DHAL_GLOBALDRIVERDATA mD3dDriverData;
624 UINT mcvmList;
625 VIDMEM *mpvmList;
626
627 UINT mcFourCC;
628 DWORD *mpFourCC;
629 UINT mcTextures;
630 DDSURFACEDESC *mpTextures;
631
632 /* HAL Startup process */
633 BOOL newmode = FALSE;
634
635
636 RtlZeroMemory(&mHALInfo, sizeof(DDHALINFO));
637 RtlZeroMemory(&mCallbacks, sizeof(DDHAL_CALLBACKS));
638
639 /*
640 Startup DX HAL step one of three
641 */
642 if (!DdCreateDirectDrawObject(This->lpLcl->lpGbl, (HDC)This->lpLcl->hDC))
643 {
644 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
645 DeleteDC((HDC)This->lpLcl->hDC);
646 return DD_FALSE;
647 }
648
649 return DD_OK;
650
651 // Do not relase HDC it have been map in kernel mode
652 // DeleteDC(hdc);
653
654 if (!DdReenableDirectDrawObject(This->lpLcl->lpGbl, &newmode))
655 {
656 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
657 DeleteDC((HDC)This->lpLcl->hDC);
658 return DD_FALSE;
659 }
660
661
662 /*
663 Startup DX HAL step two of three
664 */
665
666 if (!DdQueryDirectDrawObject(This->lpLcl->lpGbl,
667 &mHALInfo,
668 &mCallbacks.HALDD,
669 &mCallbacks.HALDDSurface,
670 &mCallbacks.HALDDPalette,
671 &mD3dCallbacks,
672 &mD3dDriverData,
673 &mD3dBufferCallbacks,
674 NULL,
675 NULL,
676 NULL))
677 {
678 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
679 DeleteDC((HDC)This->lpLcl->hDC);
680 // FIXME Close DX fristcall and second call
681 return DD_FALSE;
682 }
683
684 mcvmList = mHALInfo.vmiData.dwNumHeaps;
685 mpvmList = (VIDMEM*) DxHeapMemAlloc(sizeof(VIDMEM) * mcvmList);
686 if (mpvmList == NULL)
687 {
688 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
689 DeleteDC((HDC)This->lpLcl->hDC);
690 // FIXME Close DX fristcall and second call
691 return DD_FALSE;
692 }
693
694 mcFourCC = mHALInfo.ddCaps.dwNumFourCCCodes;
695 mpFourCC = (DWORD *) DxHeapMemAlloc(sizeof(DWORD) * mcFourCC);
696 if (mpFourCC == NULL)
697 {
698 DxHeapMemFree(mpvmList);
699 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
700 DeleteDC((HDC)This->lpLcl->hDC);
701 // FIXME Close DX fristcall and second call
702 return DD_FALSE;
703 }
704
705 mcTextures = mD3dDriverData.dwNumTextureFormats;
706 mpTextures = (DDSURFACEDESC*) DxHeapMemAlloc(sizeof(DDSURFACEDESC) * mcTextures);
707 if (mpTextures == NULL)
708 {
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
714 return DD_FALSE;
715 }
716
717 mHALInfo.vmiData.pvmList = mpvmList;
718 mHALInfo.lpdwFourCC = mpFourCC;
719 mD3dDriverData.lpTextureFormats = (DDSURFACEDESC*) mpTextures;
720
721 if (!DdQueryDirectDrawObject(
722 This->lpLcl->lpGbl,
723 &mHALInfo,
724 &mCallbacks.HALDD,
725 &mCallbacks.HALDDSurface,
726 &mCallbacks.HALDDPalette,
727 &mD3dCallbacks,
728 &mD3dDriverData,
729 &mCallbacks.HALDDExeBuf,
730 (DDSURFACEDESC*)mpTextures,
731 mpFourCC,
732 mpvmList))
733
734 {
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
741 return DD_FALSE;
742 }
743
744 /*
745 Copy over from HalInfo to DirectDrawGlobal
746 */
747
748 // this is wrong, cDriverName need be in ASC code not UNICODE
749 //memcpy(mDDrawGlobal.cDriverName, mDisplayAdapter, sizeof(wchar)*MAX_DRIVER_NAME);
750
751 memcpy(&ddgbl.vmiData, &mHALInfo.vmiData,sizeof(VIDMEMINFO));
752 memcpy(&ddgbl.ddCaps, &mHALInfo.ddCaps,sizeof(DDCORECAPS));
753
754 mHALInfo.dwNumModes = 1;
755 mHALInfo.lpModeInfo = This->lpLcl->lpGbl->lpModeInfo;
756 mHALInfo.dwMonitorFrequency = This->lpLcl->lpGbl->lpModeInfo[0].wRefreshRate;
757
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;
763
764 This->lpLcl->lpGbl->lp16DD = This->lpLcl->lpGbl;
765
766
767 memset(&DriverInfo,0, sizeof(DDHAL_GETDRIVERINFODATA));
768 DriverInfo.dwSize = sizeof(DDHAL_GETDRIVERINFODATA);
769 DriverInfo.dwContext = This->lpLcl->lpGbl->hDD;
770
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);
776
777
778 /* FIXME
779 The 3d and private data are not save at moment
780
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
785 it
786
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.
790 */
791
792
793 return DD_OK;
794 }
795
796 HRESULT WINAPI
797 StartDirectDrawHel(LPDIRECTDRAW* iface)
798 {
799 LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
800
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;
811
812
813
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 |
822 DDHAL_CB32_SETMODE |
823 DDHAL_CB32_WAITFORVERTICALBLANK ;
824
825 This->lpLcl->lpDDCB->HELDD.dwSize = sizeof(This->lpLcl->lpDDCB->HELDD);
826
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;
841
842 This->lpLcl->lpDDCB->HELDDSurface.dwFlags = DDHAL_SURFCB32_ADDATTACHEDSURFACE |
843 DDHAL_SURFCB32_BLT |
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;
856
857 This->lpLcl->lpDDCB->HELDDSurface.dwSize = sizeof(This->lpLcl->lpDDCB->HELDDSurface);
858
859 /*
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);
863 */
864
865 /*
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;
871 */
872
873 return DD_OK;
874 }
875
876 HRESULT
877 WINAPI
878 Create_DirectDraw (LPGUID pGUID,
879 LPDIRECTDRAW* pIface,
880 REFIID id,
881 BOOL ex)
882 {
883 LPDDRAWI_DIRECTDRAW_INT This;
884
885 DX_WINDBG_trace();
886
887 if (!IsEqualGUID(&IID_IDirectDraw7, id))
888 {
889 return DDERR_INVALIDDIRECTDRAWGUID;
890 }
891
892 This = DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT));
893 if (This == NULL)
894 {
895 return DDERR_OUTOFMEMORY;
896 }
897
898 This->lpLcl = DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT));
899
900 if (This->lpLcl == NULL)
901 {
902 /* FIXME cleanup */
903 return DDERR_OUTOFMEMORY;
904 }
905
906 This->lpLcl->lpGbl = &ddgbl;
907
908 *pIface = (LPDIRECTDRAW)This;
909
910 if(Main_DirectDraw_QueryInterface((LPDIRECTDRAW7)This, id, (void**)&pIface) != S_OK)
911 {
912 return DDERR_INVALIDPARAMS;
913 }
914
915 if (StartDirectDraw((LPDIRECTDRAW*)This, pGUID) == DD_OK);
916 {
917
918 return DD_OK;
919 }
920
921 return DDERR_INVALIDPARAMS;
922 }
923
924
925