1. adding surface callbacks stub, and activate them.
[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 /* Mix the DDCALLBACKS */
174 This->lpLcl->lpDDCB->cbDDCallbacks.dwSize = sizeof(This->lpLcl->lpDDCB->cbDDCallbacks);
175
176 if ((This->lpLcl->lpDDCB->HALDD.dwFlags & DDHAL_CB32_CANCREATESURFACE) && (devicetypes !=3))
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) && (devicetypes !=2))
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) && (devicetypes !=3))
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) && (devicetypes !=2))
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) && (devicetypes !=3))
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) && (devicetypes !=2))
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) && (devicetypes !=3))
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) && (devicetypes !=2))
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) && (devicetypes !=3))
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) && (devicetypes !=2))
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) && (devicetypes !=3))
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) && (devicetypes !=2))
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) && (devicetypes !=3))
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) && (devicetypes !=2))
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) && (devicetypes !=3))
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) && (devicetypes !=2))
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) && (devicetypes !=3))
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) && (devicetypes !=2))
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) && (devicetypes !=3))
267 {
268 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_WAITFORVERTICALBLANK;
269 This->lpLcl->lpDDCB->cbDDCallbacks.WaitForVerticalBlank =
270 This->lpLcl->lpDDCB->HALDD.WaitForVerticalBlank;
271 }
272 else if ((This->lpLcl->lpDDCB->HELDD.dwFlags & DDHAL_CB32_WAITFORVERTICALBLANK) && (devicetypes !=2))
273 {
274 This->lpLcl->lpDDCB->cbDDCallbacks.dwFlags |= DDHAL_CB32_WAITFORVERTICALBLANK;
275 This->lpLcl->lpDDCB->cbDDCallbacks.WaitForVerticalBlank =
276 This->lpLcl->lpDDCB->HELDD.WaitForVerticalBlank;
277 }
278
279 /* Mix the DDSURFACE CALLBACKS */
280 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwSize = sizeof(This->lpLcl->lpDDCB->cbDDSurfaceCallbacks);
281
282 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_ADDATTACHEDSURFACE) && (devicetypes !=3))
283 {
284 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_ADDATTACHEDSURFACE;
285
286 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.AddAttachedSurface =
287 This->lpLcl->lpDDCB->HALDDSurface.AddAttachedSurface;
288 }
289 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_ADDATTACHEDSURFACE) && (devicetypes !=2))
290 {
291 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_ADDATTACHEDSURFACE;
292
293 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.AddAttachedSurface =
294 This->lpLcl->lpDDCB->HELDDSurface.AddAttachedSurface;
295 }
296
297 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_BLT) && (devicetypes !=3))
298 {
299 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_BLT;
300
301 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Blt =
302 This->lpLcl->lpDDCB->HALDDSurface.Blt;
303 }
304 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_BLT) && (devicetypes !=2))
305 {
306 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_BLT;
307
308 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Blt =
309 This->lpLcl->lpDDCB->HELDDSurface.Blt;
310 }
311
312 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_DESTROYSURFACE) && (devicetypes !=3))
313 {
314 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_DESTROYSURFACE;
315
316 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.DestroySurface =
317 This->lpLcl->lpDDCB->HALDDSurface.DestroySurface;
318 }
319 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_DESTROYSURFACE) && (devicetypes !=2))
320 {
321 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_DESTROYSURFACE;
322
323 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.DestroySurface =
324 This->lpLcl->lpDDCB->HELDDSurface.DestroySurface;
325 }
326
327 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_FLIP) && (devicetypes !=3))
328 {
329 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_FLIP;
330
331 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Flip =
332 This->lpLcl->lpDDCB->HALDDSurface.Flip;
333 }
334 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_FLIP) && (devicetypes !=2))
335 {
336 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_FLIP;
337
338 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Flip =
339 This->lpLcl->lpDDCB->HELDDSurface.Flip;
340 }
341
342 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_GETBLTSTATUS) && (devicetypes !=3))
343 {
344 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_GETBLTSTATUS;
345
346 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.GetBltStatus =
347 This->lpLcl->lpDDCB->HALDDSurface.GetBltStatus;
348 }
349 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_GETBLTSTATUS) && (devicetypes !=2))
350 {
351 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_GETBLTSTATUS;
352
353 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.GetBltStatus =
354 This->lpLcl->lpDDCB->HELDDSurface.GetBltStatus;
355 }
356
357 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_GETFLIPSTATUS) && (devicetypes !=3))
358 {
359 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_GETFLIPSTATUS;
360
361 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.GetFlipStatus =
362 This->lpLcl->lpDDCB->HALDDSurface.GetFlipStatus;
363 }
364 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_GETFLIPSTATUS) && (devicetypes !=2))
365 {
366 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_GETFLIPSTATUS;
367
368 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.GetFlipStatus =
369 This->lpLcl->lpDDCB->HELDDSurface.GetFlipStatus;
370 }
371
372 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_LOCK) && (devicetypes !=3))
373 {
374 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_LOCK;
375
376 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Lock =
377 This->lpLcl->lpDDCB->HALDDSurface.Lock;
378 }
379 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_LOCK) && (devicetypes !=2))
380 {
381 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_LOCK;
382
383 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Lock =
384 This->lpLcl->lpDDCB->HELDDSurface.Lock;
385 }
386
387 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_RESERVED4) && (devicetypes !=3))
388 {
389 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_RESERVED4;
390
391 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.reserved4 =
392 This->lpLcl->lpDDCB->HALDDSurface.reserved4;
393 }
394 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_RESERVED4) && (devicetypes !=2))
395 {
396 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_RESERVED4;
397
398 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.reserved4 =
399 This->lpLcl->lpDDCB->HELDDSurface.reserved4;
400 }
401
402 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_SETCLIPLIST) && (devicetypes !=3))
403 {
404 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETCLIPLIST;
405
406 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetClipList =
407 This->lpLcl->lpDDCB->HALDDSurface.SetClipList;
408 }
409 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_SETCLIPLIST) && (devicetypes !=2))
410 {
411 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETCLIPLIST;
412
413 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetClipList =
414 This->lpLcl->lpDDCB->HELDDSurface.SetClipList;
415 }
416
417 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_SETCOLORKEY) && (devicetypes !=3))
418 {
419 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETCOLORKEY;
420
421 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetColorKey =
422 This->lpLcl->lpDDCB->HALDDSurface.SetColorKey;
423 }
424 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_SETCOLORKEY) && (devicetypes !=2))
425 {
426 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETCOLORKEY;
427
428 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetColorKey =
429 This->lpLcl->lpDDCB->HELDDSurface.SetColorKey;
430 }
431
432 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_SETOVERLAYPOSITION) && (devicetypes !=3))
433 {
434 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETOVERLAYPOSITION;
435
436 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetOverlayPosition =
437 This->lpLcl->lpDDCB->HALDDSurface.SetOverlayPosition;
438 }
439 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_SETOVERLAYPOSITION) && (devicetypes !=2))
440 {
441 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETOVERLAYPOSITION;
442
443 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetOverlayPosition =
444 This->lpLcl->lpDDCB->HELDDSurface.SetOverlayPosition;
445 }
446
447 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_SETPALETTE) && (devicetypes !=3))
448 {
449 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETPALETTE;
450
451 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetPalette =
452 This->lpLcl->lpDDCB->HALDDSurface.SetPalette;
453 }
454 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_SETPALETTE) && (devicetypes !=2))
455 {
456 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_SETPALETTE;
457
458 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.SetPalette =
459 This->lpLcl->lpDDCB->HELDDSurface.SetPalette;
460 }
461
462 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_UNLOCK) && (devicetypes !=3))
463 {
464 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_UNLOCK;
465
466 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Unlock =
467 This->lpLcl->lpDDCB->HALDDSurface.Unlock;
468 }
469 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_UNLOCK) && (devicetypes !=2))
470 {
471 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_UNLOCK;
472
473 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.Unlock =
474 This->lpLcl->lpDDCB->HELDDSurface.Unlock;
475 }
476
477 if ((This->lpLcl->lpDDCB->HALDDSurface.dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY) && (devicetypes !=3))
478 {
479 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_UPDATEOVERLAY;
480
481 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.UpdateOverlay =
482 This->lpLcl->lpDDCB->HALDDSurface.UpdateOverlay;
483 }
484 else if ((This->lpLcl->lpDDCB->HELDDSurface.dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY) && (devicetypes !=2))
485 {
486 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.dwFlags |= DDHAL_SURFCB32_UPDATEOVERLAY;
487
488 This->lpLcl->lpDDCB->cbDDSurfaceCallbacks.UpdateOverlay =
489 This->lpLcl->lpDDCB->HELDDSurface.UpdateOverlay;
490 }
491
492 /* Mix the DDPALETTE CALLBACKS */
493 This->lpLcl->lpDDCB->HALDDPalette.dwSize = sizeof(This->lpLcl->lpDDCB->HALDDPalette);
494
495 if ((This->lpLcl->lpDDCB->HALDDPalette.dwFlags & DDHAL_PALCB32_DESTROYPALETTE) && (devicetypes !=3))
496 {
497 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.dwFlags |= DDHAL_PALCB32_SETENTRIES;
498
499 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.DestroyPalette =
500 This->lpLcl->lpDDCB->HALDDPalette.DestroyPalette;
501 }
502 else if ((This->lpLcl->lpDDCB->HELDDPalette.dwFlags & DDHAL_PALCB32_DESTROYPALETTE) && (devicetypes !=2))
503 {
504 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.dwFlags |= DDHAL_PALCB32_DESTROYPALETTE;
505
506 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.DestroyPalette =
507 This->lpLcl->lpDDCB->HELDDPalette.DestroyPalette;
508 }
509
510 if ((This->lpLcl->lpDDCB->HALDDPalette.dwFlags & DDHAL_PALCB32_SETENTRIES) && (devicetypes !=3))
511 {
512 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.dwFlags |= DDHAL_PALCB32_SETENTRIES;
513
514 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.SetEntries =
515 This->lpLcl->lpDDCB->HALDDPalette.SetEntries;
516 }
517 else if ((This->lpLcl->lpDDCB->HELDDPalette.dwFlags & DDHAL_PALCB32_SETENTRIES) && (devicetypes !=2))
518 {
519 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.dwFlags |= DDHAL_PALCB32_SETENTRIES;
520
521 This->lpLcl->lpDDCB->cbDDPaletteCallbacks.SetEntries =
522 This->lpLcl->lpDDCB->HELDDPalette.SetEntries;
523 }
524
525 /* Mix the DDExeBuf CALLBACKS */
526 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwSize = sizeof(This->lpLcl->lpDDCB->cbDDExeBufCallbacks);
527
528 if ((This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_CANCREATEEXEBUF) && (devicetypes !=3))
529 {
530 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CanCreateExecuteBuffer =
531 This->lpLcl->lpDDCB->HALDDExeBuf.CanCreateExecuteBuffer;
532 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CANCREATEEXEBUF;
533 }
534 else if ((This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_CANCREATEEXEBUF) && (devicetypes !=2))
535 {
536 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CanCreateExecuteBuffer =
537 This->lpLcl->lpDDCB->HELDDExeBuf.CanCreateExecuteBuffer;
538 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CANCREATEEXEBUF;
539 }
540
541 if ((This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_CREATEEXEBUF) && (devicetypes !=3))
542 {
543 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CreateExecuteBuffer =
544 This->lpLcl->lpDDCB->HALDDExeBuf.CreateExecuteBuffer;
545 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CREATEEXEBUF;
546 }
547 else if ((This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_CREATEEXEBUF) && (devicetypes !=2))
548 {
549 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.CreateExecuteBuffer =
550 This->lpLcl->lpDDCB->HELDDExeBuf.CreateExecuteBuffer;
551 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_CREATEEXEBUF;
552 }
553
554 if ((This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_DESTROYEXEBUF) && (devicetypes !=3))
555 {
556 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.DestroyExecuteBuffer =
557 This->lpLcl->lpDDCB->HALDDExeBuf.DestroyExecuteBuffer;
558 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_DESTROYEXEBUF;
559 }
560 else if ((This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_DESTROYEXEBUF) && (devicetypes !=2))
561 {
562 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.DestroyExecuteBuffer =
563 This->lpLcl->lpDDCB->HELDDExeBuf.DestroyExecuteBuffer;
564 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_DESTROYEXEBUF;
565 }
566
567 if ((This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_LOCKEXEBUF) && (devicetypes !=3))
568 {
569 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.LockExecuteBuffer =
570 This->lpLcl->lpDDCB->HALDDExeBuf.LockExecuteBuffer;
571 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_LOCKEXEBUF;
572 }
573 else if ((This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_LOCKEXEBUF) && (devicetypes !=2))
574 {
575 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.LockExecuteBuffer =
576 This->lpLcl->lpDDCB->HELDDExeBuf.LockExecuteBuffer;
577 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_LOCKEXEBUF;
578 }
579
580 if ((This->lpLcl->lpDDCB->HALDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_UNLOCKEXEBUF) && (devicetypes !=3))
581 {
582 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.UnlockExecuteBuffer =
583 This->lpLcl->lpDDCB->HALDDExeBuf.UnlockExecuteBuffer;
584 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_UNLOCKEXEBUF;
585 }
586 else if ((This->lpLcl->lpDDCB->HELDDExeBuf.dwFlags & DDHAL_EXEBUFCB32_UNLOCKEXEBUF) && (devicetypes !=2))
587 {
588 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.UnlockExecuteBuffer =
589 This->lpLcl->lpDDCB->HELDDExeBuf.UnlockExecuteBuffer;
590 This->lpLcl->lpDDCB->cbDDExeBufCallbacks.dwFlags |= DDHAL_EXEBUFCB32_UNLOCKEXEBUF;
591 }
592
593 /* Fill some basic info for Surface */
594 ddSurfGbl.lpDD = &ddgbl;
595
596 /* FIXME
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
603 */
604
605 return DD_OK;
606 }
607
608
609 HRESULT WINAPI
610 StartDirectDrawHal(LPDIRECTDRAW* iface)
611 {
612 LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
613 DDHAL_GETDRIVERINFODATA DriverInfo;
614
615 DDHALINFO mHALInfo;
616 DDHAL_CALLBACKS mCallbacks;
617 DDHAL_DDEXEBUFCALLBACKS mD3dBufferCallbacks;
618 D3DHAL_CALLBACKS mD3dCallbacks;
619 D3DHAL_GLOBALDRIVERDATA mD3dDriverData;
620 UINT mcvmList;
621 VIDMEM *mpvmList;
622
623 UINT mcFourCC;
624 DWORD *mpFourCC;
625 UINT mcTextures;
626 DDSURFACEDESC *mpTextures;
627
628 /* HAL Startup process */
629 BOOL newmode = FALSE;
630
631
632 RtlZeroMemory(&mHALInfo, sizeof(DDHALINFO));
633 RtlZeroMemory(&mCallbacks, sizeof(DDHAL_CALLBACKS));
634
635 /*
636 Startup DX HAL step one of three
637 */
638 if (!DdCreateDirectDrawObject(This->lpLcl->lpGbl, (HDC)This->lpLcl->hDC))
639 {
640 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
641 DeleteDC((HDC)This->lpLcl->hDC);
642 return DD_FALSE;
643 }
644
645 // Do not relase HDC it have been map in kernel mode
646 // DeleteDC(hdc);
647
648 if (!DdReenableDirectDrawObject(This->lpLcl->lpGbl, &newmode))
649 {
650 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
651 DeleteDC((HDC)This->lpLcl->hDC);
652 return DD_FALSE;
653 }
654
655
656 /*
657 Startup DX HAL step two of three
658 */
659
660 if (!DdQueryDirectDrawObject(This->lpLcl->lpGbl,
661 &mHALInfo,
662 &mCallbacks.HALDD,
663 &mCallbacks.HALDDSurface,
664 &mCallbacks.HALDDPalette,
665 &mD3dCallbacks,
666 &mD3dDriverData,
667 &mD3dBufferCallbacks,
668 NULL,
669 NULL,
670 NULL))
671 {
672 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
673 DeleteDC((HDC)This->lpLcl->hDC);
674 // FIXME Close DX fristcall and second call
675 return DD_FALSE;
676 }
677
678 mcvmList = mHALInfo.vmiData.dwNumHeaps;
679 mpvmList = (VIDMEM*) DxHeapMemAlloc(sizeof(VIDMEM) * mcvmList);
680 if (mpvmList == NULL)
681 {
682 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
683 DeleteDC((HDC)This->lpLcl->hDC);
684 // FIXME Close DX fristcall and second call
685 return DD_FALSE;
686 }
687
688 mcFourCC = mHALInfo.ddCaps.dwNumFourCCCodes;
689 mpFourCC = (DWORD *) DxHeapMemAlloc(sizeof(DWORD) * mcFourCC);
690 if (mpFourCC == NULL)
691 {
692 DxHeapMemFree(mpvmList);
693 DxHeapMemFree(This->lpLcl->lpGbl->lpModeInfo);
694 DeleteDC((HDC)This->lpLcl->hDC);
695 // FIXME Close DX fristcall and second call
696 return DD_FALSE;
697 }
698
699 mcTextures = mD3dDriverData.dwNumTextureFormats;
700 mpTextures = (DDSURFACEDESC*) DxHeapMemAlloc(sizeof(DDSURFACEDESC) * mcTextures);
701 if (mpTextures == NULL)
702 {
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
708 return DD_FALSE;
709 }
710
711 mHALInfo.vmiData.pvmList = mpvmList;
712 mHALInfo.lpdwFourCC = mpFourCC;
713 mD3dDriverData.lpTextureFormats = (DDSURFACEDESC*) mpTextures;
714
715 if (!DdQueryDirectDrawObject(
716 This->lpLcl->lpGbl,
717 &mHALInfo,
718 &mCallbacks.HALDD,
719 &mCallbacks.HALDDSurface,
720 &mCallbacks.HALDDPalette,
721 &mD3dCallbacks,
722 &mD3dDriverData,
723 &mCallbacks.HALDDExeBuf,
724 (DDSURFACEDESC*)mpTextures,
725 mpFourCC,
726 mpvmList))
727
728 {
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
735 return DD_FALSE;
736 }
737
738 /*
739 Copy over from HalInfo to DirectDrawGlobal
740 */
741
742 // this is wrong, cDriverName need be in ASC code not UNICODE
743 //memcpy(mDDrawGlobal.cDriverName, mDisplayAdapter, sizeof(wchar)*MAX_DRIVER_NAME);
744
745 memcpy(&ddgbl.vmiData, &mHALInfo.vmiData,sizeof(VIDMEMINFO));
746 memcpy(&ddgbl.ddCaps, &mHALInfo.ddCaps,sizeof(DDCORECAPS));
747
748 mHALInfo.dwNumModes = 1;
749 mHALInfo.lpModeInfo = This->lpLcl->lpGbl->lpModeInfo;
750 mHALInfo.dwMonitorFrequency = This->lpLcl->lpGbl->lpModeInfo[0].wRefreshRate;
751
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;
757
758 This->lpLcl->lpGbl->lp16DD = This->lpLcl->lpGbl;
759
760
761 memset(&DriverInfo,0, sizeof(DDHAL_GETDRIVERINFODATA));
762 DriverInfo.dwSize = sizeof(DDHAL_GETDRIVERINFODATA);
763 DriverInfo.dwContext = This->lpLcl->lpGbl->hDD;
764
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);
770
771
772 /* FIXME
773 The 3d and private data are not save at moment
774
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
779 it
780
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.
784 */
785
786
787 return DD_OK;
788 }
789
790 HRESULT WINAPI
791 StartDirectDrawHel(LPDIRECTDRAW* iface)
792 {
793 LPDDRAWI_DIRECTDRAW_INT This = (LPDDRAWI_DIRECTDRAW_INT)iface;
794
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;
805
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 |
814 DDHAL_CB32_SETMODE |
815 DDHAL_CB32_WAITFORVERTICALBLANK ;
816
817 This->lpLcl->lpDDCB->HELDD.dwSize = sizeof(This->lpLcl->lpDDCB->HELDD);
818
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;
833
834 This->lpLcl->lpDDCB->HELDDSurface.dwFlags = DDHAL_SURFCB32_ADDATTACHEDSURFACE |
835 DDHAL_SURFCB32_BLT |
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;
848
849 This->lpLcl->lpDDCB->HELDDSurface.dwSize = sizeof(This->lpLcl->lpDDCB->HELDDSurface);
850
851 /*
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);
855 */
856
857 /*
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;
863 */
864
865 return DD_OK;
866 }
867
868 HRESULT
869 WINAPI
870 Create_DirectDraw (LPGUID pGUID,
871 LPDIRECTDRAW* pIface,
872 REFIID id,
873 BOOL ex)
874 {
875 LPDDRAWI_DIRECTDRAW_INT This;
876
877
878 DX_WINDBG_trace();
879
880 This = DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT));
881 if (This == NULL)
882 {
883 return E_OUTOFMEMORY;
884 }
885
886 This->lpLcl = DxHeapMemAlloc(sizeof(DDRAWI_DIRECTDRAW_INT));
887
888 if (This->lpLcl == NULL)
889 {
890 /* FIXME cleanup */
891 return DDERR_OUTOFMEMORY;
892 }
893
894 This->lpLcl->lpGbl = &ddgbl;
895
896 *pIface = (LPDIRECTDRAW)This;
897
898 if(Main_DirectDraw_QueryInterface((LPDIRECTDRAW7)This, id, (void**)&pIface) != S_OK)
899 {
900 return DDERR_INVALIDPARAMS;
901 }
902
903 if (StartDirectDraw((LPDIRECTDRAW*)This, pGUID) == DD_OK);
904 {
905
906 return DD_OK;
907 }
908
909 return DDERR_INVALIDPARAMS;
910 }
911
912
913