fix a minor bug, for bad writen driver. some drv checking for two DDRAWI_DDRAWSURFACE...
[reactos.git] / reactos / lib / ddraw / main / surface.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS
5 * FILE: lib/ddraw/main/surface.c
6 * PURPOSE: DirectDraw Implementation
7 * PROGRAMMER: Magnus Olsen, Maarten Bosma
8 *
9 */
10
11 #include "rosdraw.h"
12
13
14 HRESULT WINAPI Main_DDrawSurface_Initialize (LPDIRECTDRAWSURFACE7 iface, LPDIRECTDRAW pDD, LPDDSURFACEDESC2 pDDSD)
15 {
16 IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface;
17
18 if (This->owner)
19 return DDERR_ALREADYINITIALIZED;
20
21 if(sizeof(DDSURFACEDESC2) != pDDSD->dwSize)
22 return DDERR_UNSUPPORTED;
23
24 if(!(pDDSD->dwFlags & DDSD_CAPS))
25 return DDERR_INVALIDPARAMS;
26
27 This->owner = (IDirectDrawImpl*)pDD;
28
29 // Surface Global Struct
30 DDRAWI_DDRAWSURFACE_GBL Global;
31 memset(&Global, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL));
32
33 if(pDDSD->ddsCaps.dwCaps == DDSCAPS_PRIMARYSURFACE)
34 Global.dwGlobalFlags |= DDRAWISURFGBL_ISGDISURFACE;
35
36 Global.lpDD = &This->owner->DirectDrawGlobal;
37 Global.wHeight = This->owner->Height;
38 Global.wWidth = This->owner->Width;
39 Global.dwLinearSize = Global.wWidth * This->owner->Bpp/8;
40
41 // Surface More Struct
42 DDRAWI_DDRAWSURFACE_MORE More;
43 memset(&More, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE));
44 More.dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE);
45
46 // Surface Local Struct
47 DDRAWI_DDRAWSURFACE_LCL Local;
48 memset(&Local, 0, sizeof(DDRAWI_DDRAWSURFACE_LCL));
49 Local.lpGbl = &Global;
50 Local.lpSurfMore = &More;
51 Local.ddsCaps = *(DDSCAPS*)&pDDSD->ddsCaps;
52
53 // BitDepth = DDSurf_BitDepth(psurf); ?
54
55
56 if(pDDSD->ddsCaps.dwCaps == DDSCAPS_PRIMARYSURFACE)
57 Local.dwFlags |= DDRAWISURF_FRONTBUFFER;
58
59 DDRAWI_DDRAWSURFACE_LCL *pLocal[2]; // for stupid double pointer below
60
61 pLocal[0] = &Local;
62 pLocal[1] = NULL;
63
64 // The Parameter Struct
65 DDHAL_CREATESURFACEDATA CreateData;
66 memset(&CreateData, 0, sizeof(DDHAL_CREATESURFACEDATA));
67 CreateData.lpDD = &This->owner->DirectDrawGlobal;
68 CreateData.lpDDSurfaceDesc = (DDSURFACEDESC*)pDDSD;
69 CreateData.dwSCnt = 1;
70 CreateData.lplpSList = pLocal;
71
72
73
74 DDHAL_CANCREATESURFACEDATA CanCreateData;
75 memset(&CanCreateData, 0, sizeof(DD_CANCREATESURFACEDATA));
76 CanCreateData.lpDD = &This->owner->DirectDrawGlobal;
77 CanCreateData.lpDDSurfaceDesc = (DDSURFACEDESC*)pDDSD;
78
79
80 if (This->owner->DriverCallbacks.DdMain.CanCreateSurface (&CanCreateData) == DDHAL_DRIVER_NOTHANDLED)
81 return DDERR_INVALIDPARAMS;
82
83 if(CanCreateData.ddRVal != DD_OK)
84 return CanCreateData.ddRVal;
85
86
87 if(This->owner->DriverCallbacks.DdMain.CreateSurface (&CreateData) == DDHAL_DRIVER_NOTHANDLED)
88 return DDERR_INVALIDPARAMS;
89
90 if(CreateData.ddRVal != DD_OK)
91 return CreateData.ddRVal;
92
93
94 OutputDebugString(L"This does not get hit.");
95
96 return DD_OK;
97 }
98
99 HRESULT WINAPI Main_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rdst,
100 LPDIRECTDRAWSURFACE7 src, LPRECT rsrc, DWORD dwFlags, LPDDBLTFX lpbltfx)
101 {
102 return DD_OK;
103 }
104
105 HRESULT WINAPI Main_DDrawSurface_Lock (LPDIRECTDRAWSURFACE7 iface, LPRECT prect,
106 LPDDSURFACEDESC2 pDDSD, DWORD flags, HANDLE event)
107 {
108 return DD_OK;
109 }
110
111 HRESULT WINAPI Main_DDrawSurface_Unlock (LPDIRECTDRAWSURFACE7 iface, LPRECT pRect)
112 {
113 return DD_OK;
114 }
115
116
117 ULONG WINAPI Main_DDrawSurface_AddRef(LPDIRECTDRAWSURFACE7 iface)
118 {
119 IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface;
120 return InterlockedIncrement(&This->ref);
121 }
122
123 ULONG WINAPI Main_DDrawSurface_Release(LPDIRECTDRAWSURFACE7 iface)
124 {
125 IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
126 ULONG ref = InterlockedDecrement(&This->ref);
127
128 if (ref == 0)
129 HeapFree(GetProcessHeap(), 0, This);
130
131 return ref;
132 }
133
134 /**** Stubs ****/
135
136 HRESULT WINAPI
137 Main_DDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE7 iface, REFIID riid,
138 LPVOID* ppObj)
139 {
140 return DDERR_UNSUPPORTED;
141 }
142
143 HRESULT WINAPI
144 Main_DDrawSurface_AddAttachedSurface(LPDIRECTDRAWSURFACE7 iface,
145 LPDIRECTDRAWSURFACE7 pAttach)
146 {
147 return DDERR_UNSUPPORTED;
148 }
149
150 /* MSDN: "not currently implemented." */
151 HRESULT WINAPI
152 Main_DDrawSurface_AddOverlayDirtyRect(LPDIRECTDRAWSURFACE7 iface,
153 LPRECT pRect)
154 {
155 return DDERR_UNSUPPORTED;
156 }
157
158 HRESULT WINAPI
159 Main_DDrawSurface_BltFast(LPDIRECTDRAWSURFACE7 iface, DWORD dstx,
160 DWORD dsty, LPDIRECTDRAWSURFACE7 src,
161 LPRECT rsrc, DWORD trans)
162 {
163 return DDERR_UNSUPPORTED;
164 }
165
166 HRESULT WINAPI
167 Main_DDrawSurface_Restore(LPDIRECTDRAWSURFACE7 iface)
168 {
169 return DDERR_UNSUPPORTED;
170 }
171
172 /* MSDN: "not currently implemented." */
173 HRESULT WINAPI
174 Main_DDrawSurface_BltBatch(LPDIRECTDRAWSURFACE7 iface,
175 LPDDBLTBATCH pBatch, DWORD dwCount,
176 DWORD dwFlags)
177 {
178 return DDERR_UNSUPPORTED;
179 }
180
181 HRESULT WINAPI
182 Main_DDrawSurface_ChangeUniquenessValue(LPDIRECTDRAWSURFACE7 iface)
183 {
184 return DDERR_UNSUPPORTED;
185 }
186
187 HRESULT WINAPI
188 Main_DDrawSurface_DeleteAttachedSurface(LPDIRECTDRAWSURFACE7 iface,
189 DWORD dwFlags,
190 LPDIRECTDRAWSURFACE7 pAttach)
191 {
192 return DDERR_UNSUPPORTED;
193 }
194
195 HRESULT WINAPI
196 Main_DDrawSurface_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE7 iface,
197 LPVOID context,
198 LPDDENUMSURFACESCALLBACK7 cb)
199 {
200 return DDERR_UNSUPPORTED;
201 }
202
203 HRESULT WINAPI
204 Main_DDrawSurface_EnumOverlayZOrders(LPDIRECTDRAWSURFACE7 iface,
205 DWORD dwFlags, LPVOID context,
206 LPDDENUMSURFACESCALLBACK7 cb)
207 {
208 return DDERR_UNSUPPORTED;
209 }
210
211 HRESULT WINAPI
212 Main_DDrawSurface_Flip(LPDIRECTDRAWSURFACE7 iface,
213 LPDIRECTDRAWSURFACE7 override, DWORD dwFlags)
214 {
215 return DDERR_UNSUPPORTED;
216 }
217
218 HRESULT WINAPI
219 Main_DDrawSurface_FreePrivateData(LPDIRECTDRAWSURFACE7 iface, REFGUID tag)
220 {
221 return DDERR_UNSUPPORTED;
222 }
223
224 HRESULT WINAPI
225 Main_DDrawSurface_GetAttachedSurface(LPDIRECTDRAWSURFACE7 iface,
226 LPDDSCAPS2 pCaps,
227 LPDIRECTDRAWSURFACE7* ppSurface)
228 {
229 return DDERR_UNSUPPORTED;
230 }
231
232 HRESULT WINAPI
233 Main_DDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags)
234 {
235 return DDERR_UNSUPPORTED;
236 }
237
238 HRESULT WINAPI
239 Main_DDrawSurface_GetCaps(LPDIRECTDRAWSURFACE7 iface, LPDDSCAPS2 pCaps)
240 {
241 return DDERR_UNSUPPORTED;
242 }
243
244 HRESULT WINAPI
245 Main_DDrawSurface_GetClipper(LPDIRECTDRAWSURFACE7 iface,
246 LPDIRECTDRAWCLIPPER* ppClipper)
247 {
248 return DDERR_UNSUPPORTED;
249 }
250
251 HRESULT WINAPI
252 Main_DDrawSurface_GetColorKey(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags,
253 LPDDCOLORKEY pCKey)
254 {
255 return DDERR_UNSUPPORTED;
256 }
257
258 HRESULT WINAPI
259 Main_DDrawSurface_GetDC(LPDIRECTDRAWSURFACE7 iface, HDC *phDC)
260 {
261 return DDERR_UNSUPPORTED;
262 }
263
264 HRESULT WINAPI
265 Main_DDrawSurface_GetDDInterface(LPDIRECTDRAWSURFACE7 iface, LPVOID* pDD)
266 {
267 return DDERR_UNSUPPORTED;
268 }
269 HRESULT WINAPI
270 Main_DDrawSurface_GetFlipStatus(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags)
271 {
272 return DDERR_UNSUPPORTED;
273 }
274
275 HRESULT WINAPI
276 Main_DDrawSurface_GetLOD(LPDIRECTDRAWSURFACE7 iface, LPDWORD pdwMaxLOD)
277 {
278 return DDERR_UNSUPPORTED;
279 }
280
281 HRESULT WINAPI
282 Main_DDrawSurface_GetOverlayPosition(LPDIRECTDRAWSURFACE7 iface,
283 LPLONG pX, LPLONG pY)
284 {
285 return DDERR_UNSUPPORTED;
286 }
287 HRESULT WINAPI
288 Main_DDrawSurface_GetPalette(LPDIRECTDRAWSURFACE7 iface,
289 LPDIRECTDRAWPALETTE* ppPalette)
290 {
291 return DDERR_UNSUPPORTED;
292 }
293
294 HRESULT WINAPI
295 Main_DDrawSurface_GetPixelFormat(LPDIRECTDRAWSURFACE7 iface,
296 LPDDPIXELFORMAT pDDPixelFormat)
297 {
298 return DDERR_UNSUPPORTED;
299 }
300
301 HRESULT WINAPI
302 Main_DDrawSurface_GetPriority(LPDIRECTDRAWSURFACE7 iface,
303 LPDWORD pdwPriority)
304 {
305 return DDERR_UNSUPPORTED;
306 }
307
308 HRESULT WINAPI
309 Main_DDrawSurface_GetPrivateData(LPDIRECTDRAWSURFACE7 iface,
310 REFGUID tag, LPVOID pBuffer,
311 LPDWORD pcbBufferSize)
312 {
313 return DDERR_UNSUPPORTED;
314 }
315
316 HRESULT WINAPI
317 Main_DDrawSurface_GetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface,
318 LPDDSURFACEDESC2 pDDSD)
319 {
320 return DDERR_UNSUPPORTED;
321 }
322
323 HRESULT WINAPI
324 Main_DDrawSurface_GetUniquenessValue(LPDIRECTDRAWSURFACE7 iface,
325 LPDWORD pValue)
326 {
327 return DDERR_UNSUPPORTED;
328 }
329
330 HRESULT WINAPI
331 Main_DDrawSurface_IsLost(LPDIRECTDRAWSURFACE7 iface)
332 {
333 return DDERR_UNSUPPORTED;
334 }
335
336 HRESULT WINAPI
337 Main_DDrawSurface_PageLock(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags)
338 {
339 return DDERR_UNSUPPORTED;
340 }
341
342 HRESULT WINAPI
343 Main_DDrawSurface_PageUnlock(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags)
344 {
345 return DDERR_UNSUPPORTED;
346 }
347
348 HRESULT WINAPI
349 Main_DDrawSurface_ReleaseDC(LPDIRECTDRAWSURFACE7 iface, HDC hDC)
350 {
351 return DDERR_UNSUPPORTED;
352 }
353
354 HRESULT WINAPI
355 Main_DDrawSurface_SetClipper (LPDIRECTDRAWSURFACE7 iface,
356 LPDIRECTDRAWCLIPPER pDDClipper)
357 {
358 return DDERR_UNSUPPORTED;
359 }
360
361 HRESULT WINAPI
362 Main_DDrawSurface_SetColorKey (LPDIRECTDRAWSURFACE7 iface,
363 DWORD dwFlags, LPDDCOLORKEY pCKey)
364 {
365 return DDERR_UNSUPPORTED;
366 }
367
368 HRESULT WINAPI
369 Main_DDrawSurface_SetLOD (LPDIRECTDRAWSURFACE7 iface, DWORD dwMaxLOD)
370 {
371 return DDERR_UNSUPPORTED;
372 }
373
374 HRESULT WINAPI
375 Main_DDrawSurface_SetOverlayPosition (LPDIRECTDRAWSURFACE7 iface,
376 LONG X, LONG Y)
377 {
378 return DDERR_UNSUPPORTED;
379 }
380
381 HRESULT WINAPI
382 Main_DDrawSurface_SetPalette (LPDIRECTDRAWSURFACE7 iface,
383 LPDIRECTDRAWPALETTE pPalette)
384 {
385 return DDERR_UNSUPPORTED;
386 }
387
388 HRESULT WINAPI
389 Main_DDrawSurface_SetPriority (LPDIRECTDRAWSURFACE7 iface,
390 DWORD dwPriority)
391 {
392 return DDERR_UNSUPPORTED;
393 }
394
395 /* Be careful when locking this: it is risky to call the object's AddRef
396 * or Release holding a lock. */
397 HRESULT WINAPI
398 Main_DDrawSurface_SetPrivateData (LPDIRECTDRAWSURFACE7 iface,
399 REFGUID tag, LPVOID pData,
400 DWORD cbSize, DWORD dwFlags)
401 {
402 return DDERR_UNSUPPORTED;
403 }
404
405 HRESULT WINAPI
406 Main_DDrawSurface_UpdateOverlay (LPDIRECTDRAWSURFACE7 iface,
407 LPRECT pSrcRect,
408 LPDIRECTDRAWSURFACE7 pDstSurface,
409 LPRECT pDstRect, DWORD dwFlags,
410 LPDDOVERLAYFX pFX)
411 {
412 return DDERR_UNSUPPORTED;
413 }
414
415 /* MSDN: "not currently implemented." */
416 HRESULT WINAPI
417 Main_DDrawSurface_UpdateOverlayDisplay (LPDIRECTDRAWSURFACE7 iface,
418 DWORD dwFlags)
419 {
420 return DDERR_UNSUPPORTED;
421 }
422
423 HRESULT WINAPI Main_DDrawSurface_UpdateOverlayZOrder (LPDIRECTDRAWSURFACE7 iface,
424 DWORD dwFlags, LPDIRECTDRAWSURFACE7 pDDSRef)
425 {
426 return DDERR_NOTAOVERLAYSURFACE;
427 }
428
429 IDirectDrawSurface7Vtbl DDrawSurface_VTable =
430 {
431 Main_DDrawSurface_QueryInterface,
432 Main_DDrawSurface_AddRef,
433 Main_DDrawSurface_Release,
434 Main_DDrawSurface_AddAttachedSurface,
435 Main_DDrawSurface_AddOverlayDirtyRect,
436 Main_DDrawSurface_Blt,
437 Main_DDrawSurface_BltBatch,
438 Main_DDrawSurface_BltFast,
439 Main_DDrawSurface_DeleteAttachedSurface,
440 Main_DDrawSurface_EnumAttachedSurfaces,
441 Main_DDrawSurface_EnumOverlayZOrders,
442 Main_DDrawSurface_Flip,
443 Main_DDrawSurface_GetAttachedSurface,
444 Main_DDrawSurface_GetBltStatus,
445 Main_DDrawSurface_GetCaps,
446 Main_DDrawSurface_GetClipper,
447 Main_DDrawSurface_GetColorKey,
448 Main_DDrawSurface_GetDC,
449 Main_DDrawSurface_GetFlipStatus,
450 Main_DDrawSurface_GetOverlayPosition,
451 Main_DDrawSurface_GetPalette,
452 Main_DDrawSurface_GetPixelFormat,
453 Main_DDrawSurface_GetSurfaceDesc,
454 Main_DDrawSurface_Initialize,
455 Main_DDrawSurface_IsLost,
456 Main_DDrawSurface_Lock,
457 Main_DDrawSurface_ReleaseDC,
458 Main_DDrawSurface_Restore,
459 Main_DDrawSurface_SetClipper,
460 Main_DDrawSurface_SetColorKey,
461 Main_DDrawSurface_SetOverlayPosition,
462 Main_DDrawSurface_SetPalette,
463 Main_DDrawSurface_Unlock,
464 Main_DDrawSurface_UpdateOverlay,
465 Main_DDrawSurface_UpdateOverlayDisplay,
466 Main_DDrawSurface_UpdateOverlayZOrder
467 };