Fix someprat of Createsurface now it is working for ati readon, the code is not complete.
[reactos.git] / reactos / lib / ddraw / main / surface_main.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: IDirectDrawSurface7 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 pDDSD2)
15 {
16 IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface;
17
18 if(sizeof(DDSURFACEDESC2) != pDDSD2->dwSize)
19 return DDERR_UNSUPPORTED;
20
21 if(!(pDDSD2->dwFlags & DDSD_CAPS))
22 return DDERR_INVALIDPARAMS;
23
24 This->owner = (IDirectDrawImpl*)pDD;
25
26 /************ fill the discription of our primary surface ***********************/
27 DDSURFACEDESC ddsd;
28 memset (&ddsd, 0, sizeof(DDSURFACEDESC));
29 ddsd.dwSize = sizeof(DDSURFACEDESC);
30
31 /* FIXME Fill the rest from ddsd2 to ddsd */
32
33 /************ Test see if we can Create Surface ***********************/
34 if (This->owner->DirectDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_CANCREATESURFACE)
35 {
36 /* can the driver create the surface */
37 DDHAL_CANCREATESURFACEDATA CanCreateData;
38 memset(&CanCreateData, 0, sizeof(DDHAL_CANCREATESURFACEDATA));
39 CanCreateData.lpDD = &This->owner->DirectDrawGlobal;
40 CanCreateData.lpDDSurfaceDesc = (LPDDSURFACEDESC)&ddsd;
41
42 if (This->owner->DirectDrawGlobal.lpDDCBtmp->HALDD.CanCreateSurface(&CanCreateData) == DDHAL_DRIVER_NOTHANDLED)
43 return DDERR_INVALIDPARAMS;
44
45 if(CanCreateData.ddRVal != DD_OK)
46 return CanCreateData.ddRVal;
47 }
48
49
50 /************ Create Surface ***********************/
51
52 /* FIXME we are skipping filling in some data, I do not care for now */
53
54 LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal = &This->owner->DirectDrawGlobal;
55 ddsd.dwFlags = DDSD_CAPS;
56 ddsd.ddsCaps.dwCaps = DDSCAPS_PRIMARYSURFACE;
57
58 /* surface global struct */
59 memset(&This->Global, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL));
60 This->Global.lpDD = &This->owner->DirectDrawGlobal;
61 This->Global.wHeight = This->owner->DirectDrawGlobal.vmiData.dwDisplayHeight;
62 This->Global.wWidth = This->owner->DirectDrawGlobal.vmiData.dwDisplayWidth;
63 This->Global.dwLinearSize = This->owner->DirectDrawGlobal.vmiData.lDisplayPitch;
64
65
66 /* surface more struct */
67 memset(&This->More, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE));
68 This->More.dwSize = sizeof(DDRAWI_DDRAWSURFACE_MORE);
69
70 /* surface local struct */
71
72 memset(&This->Local, 0, sizeof(DDRAWI_DDRAWSURFACE_LCL));
73 This->Local.lpGbl = &This->Global;
74 This->Local.lpSurfMore = &This->More;
75
76 /* FIXME do a memcopy */
77 This->Local.ddsCaps = *(DDSCAPS*)&ddsd.ddsCaps;
78
79 /* for the double pointer below */
80 DDRAWI_DDRAWSURFACE_LCL *pLocal[2];
81 pLocal[0] = &This->Local;
82 pLocal[1] = NULL;
83
84 /* the parameter struct */
85 DDHAL_CREATESURFACEDATA CreateData;
86 memset(&CreateData, 0, sizeof(DDHAL_CREATESURFACEDATA));
87 CreateData.lpDD = pDirectDrawGlobal;
88 CreateData.lpDDSurfaceDesc = (LPDDSURFACEDESC) &ddsd;
89 CreateData.dwSCnt = 1;
90 CreateData.lplpSList = pLocal;
91 CreateData.ddRVal = DD_FALSE;
92
93
94 /* this is the call we were waiting for */
95 if(This->owner->DirectDrawGlobal.lpDDCBtmp->HALDD.CreateSurface(&CreateData) == DDHAL_DRIVER_NOTHANDLED)
96 return DDERR_INVALIDPARAMS;
97
98 /* FIXME remove the if and debug string*/
99 if(CreateData.ddRVal != DD_OK)
100 return CreateData.ddRVal;
101
102 OutputDebugString(L"This does hit By Ati Readon but not for nvida :( ");
103 OutputDebugString(L"Yet ;)");
104
105 return DD_OK;
106 }
107
108 ULONG WINAPI Main_DDrawSurface_AddRef(LPDIRECTDRAWSURFACE7 iface)
109 {
110 IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface;
111
112 return InterlockedIncrement((PLONG)&This->owner->DirectDrawGlobal.dsList->dwIntRefCnt);
113 }
114
115 ULONG WINAPI Main_DDrawSurface_Release(LPDIRECTDRAWSURFACE7 iface)
116 {
117 IDirectDrawSurfaceImpl* This = (IDirectDrawSurfaceImpl*)iface;
118 ULONG ref = InterlockedDecrement((PLONG)&This->owner->DirectDrawGlobal.dsList->dwIntRefCnt);
119
120 if (ref == 0)
121 HeapFree(GetProcessHeap(), 0, This);
122
123 return ref;
124 }
125
126 /**** Stubs ****/
127
128 HRESULT WINAPI
129 Main_DDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE7 iface, REFIID riid,
130 LPVOID* ppObj)
131 {
132 return E_NOINTERFACE;
133 }
134
135 HRESULT WINAPI Main_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface, LPRECT rdst,
136 LPDIRECTDRAWSURFACE7 src, LPRECT rsrc, DWORD dwFlags, LPDDBLTFX lpbltfx)
137 {
138 IDirectDrawImpl* This = (IDirectDrawImpl*)iface;
139
140 DX_STUB;
141
142 if (This->DirectDrawGlobal.lpDDCBtmp->HALDD.dwFlags & DDHAL_CB32_FLIPTOGDISURFACE)
143 {
144 return Hal_DDrawSurface_Blt( iface, rdst, src, rsrc, dwFlags, lpbltfx);
145 }
146
147 return Hel_DDrawSurface_Blt( iface, rdst, src, rsrc, dwFlags, lpbltfx);
148 }
149
150
151 HRESULT WINAPI Main_DDrawSurface_Lock (LPDIRECTDRAWSURFACE7 iface, LPRECT prect,
152 LPDDSURFACEDESC2 pDDSD, DWORD flags, HANDLE event)
153 {
154 DX_STUB;
155 }
156
157 HRESULT WINAPI Main_DDrawSurface_Unlock (LPDIRECTDRAWSURFACE7 iface, LPRECT pRect)
158 {
159 DX_STUB;
160 }
161
162 HRESULT WINAPI
163 Main_DDrawSurface_AddAttachedSurface(LPDIRECTDRAWSURFACE7 iface,
164 LPDIRECTDRAWSURFACE7 pAttach)
165 {
166 DX_STUB;
167 }
168
169 /* MSDN: "not currently implemented." */
170 HRESULT WINAPI
171 Main_DDrawSurface_AddOverlayDirtyRect(LPDIRECTDRAWSURFACE7 iface,
172 LPRECT pRect)
173 {
174 DX_STUB;
175 }
176
177 HRESULT WINAPI
178 Main_DDrawSurface_BltFast(LPDIRECTDRAWSURFACE7 iface, DWORD dstx,
179 DWORD dsty, LPDIRECTDRAWSURFACE7 src,
180 LPRECT rsrc, DWORD trans)
181 {
182 DX_STUB;
183 }
184
185 HRESULT WINAPI
186 Main_DDrawSurface_Restore(LPDIRECTDRAWSURFACE7 iface)
187 {
188 DX_STUB;
189 }
190
191 /* MSDN: "not currently implemented." */
192 HRESULT WINAPI
193 Main_DDrawSurface_BltBatch(LPDIRECTDRAWSURFACE7 iface,
194 LPDDBLTBATCH pBatch, DWORD dwCount,
195 DWORD dwFlags)
196 {
197 DX_STUB;
198 }
199
200 HRESULT WINAPI
201 Main_DDrawSurface_ChangeUniquenessValue(LPDIRECTDRAWSURFACE7 iface)
202 {
203 DX_STUB;
204 }
205
206 HRESULT WINAPI
207 Main_DDrawSurface_DeleteAttachedSurface(LPDIRECTDRAWSURFACE7 iface,
208 DWORD dwFlags,
209 LPDIRECTDRAWSURFACE7 pAttach)
210 {
211 DX_STUB;
212 }
213
214 HRESULT WINAPI
215 Main_DDrawSurface_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE7 iface,
216 LPVOID context,
217 LPDDENUMSURFACESCALLBACK7 cb)
218 {
219 DX_STUB;
220 }
221
222 HRESULT WINAPI
223 Main_DDrawSurface_EnumOverlayZOrders(LPDIRECTDRAWSURFACE7 iface,
224 DWORD dwFlags, LPVOID context,
225 LPDDENUMSURFACESCALLBACK7 cb)
226 {
227 DX_STUB;
228 }
229
230 HRESULT WINAPI
231 Main_DDrawSurface_Flip(LPDIRECTDRAWSURFACE7 iface,
232 LPDIRECTDRAWSURFACE7 override, DWORD dwFlags)
233 {
234 DX_STUB;
235 }
236
237 HRESULT WINAPI
238 Main_DDrawSurface_FreePrivateData(LPDIRECTDRAWSURFACE7 iface, REFGUID tag)
239 {
240 DX_STUB;
241 }
242
243 HRESULT WINAPI
244 Main_DDrawSurface_GetAttachedSurface(LPDIRECTDRAWSURFACE7 iface,
245 LPDDSCAPS2 pCaps,
246 LPDIRECTDRAWSURFACE7* ppSurface)
247 {
248 DX_STUB;
249 }
250
251 HRESULT WINAPI
252 Main_DDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags)
253 {
254 DX_STUB;
255 }
256
257 HRESULT WINAPI
258 Main_DDrawSurface_GetCaps(LPDIRECTDRAWSURFACE7 iface, LPDDSCAPS2 pCaps)
259 {
260 DX_STUB;
261 }
262
263 HRESULT WINAPI
264 Main_DDrawSurface_GetClipper(LPDIRECTDRAWSURFACE7 iface,
265 LPDIRECTDRAWCLIPPER* ppClipper)
266 {
267 DX_STUB;
268 }
269
270 HRESULT WINAPI
271 Main_DDrawSurface_GetColorKey(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags,
272 LPDDCOLORKEY pCKey)
273 {
274 DX_STUB;
275 }
276
277 HRESULT WINAPI
278 Main_DDrawSurface_GetDC(LPDIRECTDRAWSURFACE7 iface, HDC *phDC)
279 {
280 DX_STUB;
281 }
282
283 HRESULT WINAPI
284 Main_DDrawSurface_GetDDInterface(LPDIRECTDRAWSURFACE7 iface, LPVOID* pDD)
285 {
286 DX_STUB;
287 }
288 HRESULT WINAPI
289 Main_DDrawSurface_GetFlipStatus(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags)
290 {
291 DX_STUB;
292 }
293
294 HRESULT WINAPI
295 Main_DDrawSurface_GetLOD(LPDIRECTDRAWSURFACE7 iface, LPDWORD pdwMaxLOD)
296 {
297 DX_STUB;
298 }
299
300 HRESULT WINAPI
301 Main_DDrawSurface_GetOverlayPosition(LPDIRECTDRAWSURFACE7 iface,
302 LPLONG pX, LPLONG pY)
303 {
304 DX_STUB;
305 }
306 HRESULT WINAPI
307 Main_DDrawSurface_GetPalette(LPDIRECTDRAWSURFACE7 iface,
308 LPDIRECTDRAWPALETTE* ppPalette)
309 {
310 DX_STUB;
311 }
312
313 HRESULT WINAPI
314 Main_DDrawSurface_GetPixelFormat(LPDIRECTDRAWSURFACE7 iface,
315 LPDDPIXELFORMAT pDDPixelFormat)
316 {
317 DX_STUB;
318 }
319
320 HRESULT WINAPI
321 Main_DDrawSurface_GetPriority(LPDIRECTDRAWSURFACE7 iface,
322 LPDWORD pdwPriority)
323 {
324 DX_STUB;
325 }
326
327 HRESULT WINAPI
328 Main_DDrawSurface_GetPrivateData(LPDIRECTDRAWSURFACE7 iface,
329 REFGUID tag, LPVOID pBuffer,
330 LPDWORD pcbBufferSize)
331 {
332 DX_STUB;
333 }
334
335 HRESULT WINAPI
336 Main_DDrawSurface_GetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface,
337 LPDDSURFACEDESC2 pDDSD)
338 {
339 DX_STUB;
340 }
341
342 HRESULT WINAPI
343 Main_DDrawSurface_GetUniquenessValue(LPDIRECTDRAWSURFACE7 iface,
344 LPDWORD pValue)
345 {
346 DX_STUB;
347 }
348
349 HRESULT WINAPI
350 Main_DDrawSurface_IsLost(LPDIRECTDRAWSURFACE7 iface)
351 {
352 DX_STUB;
353 }
354
355 HRESULT WINAPI
356 Main_DDrawSurface_PageLock(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags)
357 {
358 DX_STUB;
359 }
360
361 HRESULT WINAPI
362 Main_DDrawSurface_PageUnlock(LPDIRECTDRAWSURFACE7 iface, DWORD dwFlags)
363 {
364 DX_STUB;
365 }
366
367 HRESULT WINAPI
368 Main_DDrawSurface_ReleaseDC(LPDIRECTDRAWSURFACE7 iface, HDC hDC)
369 {
370 DX_STUB;
371 }
372
373 HRESULT WINAPI
374 Main_DDrawSurface_SetClipper (LPDIRECTDRAWSURFACE7 iface,
375 LPDIRECTDRAWCLIPPER pDDClipper)
376 {
377 DX_STUB;
378 }
379
380 HRESULT WINAPI
381 Main_DDrawSurface_SetColorKey (LPDIRECTDRAWSURFACE7 iface,
382 DWORD dwFlags, LPDDCOLORKEY pCKey)
383 {
384 DX_STUB;
385 }
386
387 HRESULT WINAPI
388 Main_DDrawSurface_SetLOD (LPDIRECTDRAWSURFACE7 iface, DWORD dwMaxLOD)
389 {
390 DX_STUB;
391 }
392
393 HRESULT WINAPI
394 Main_DDrawSurface_SetOverlayPosition (LPDIRECTDRAWSURFACE7 iface,
395 LONG X, LONG Y)
396 {
397 DX_STUB;
398 }
399
400 HRESULT WINAPI
401 Main_DDrawSurface_SetPalette (LPDIRECTDRAWSURFACE7 iface,
402 LPDIRECTDRAWPALETTE pPalette)
403 {
404 DX_STUB;
405 }
406
407 HRESULT WINAPI
408 Main_DDrawSurface_SetPriority (LPDIRECTDRAWSURFACE7 iface,
409 DWORD dwPriority)
410 {
411 DX_STUB;
412 }
413
414 HRESULT WINAPI
415 Main_DDrawSurface_SetPrivateData (LPDIRECTDRAWSURFACE7 iface,
416 REFGUID tag, LPVOID pData,
417 DWORD cbSize, DWORD dwFlags)
418 {
419 DX_STUB;
420 }
421
422 HRESULT WINAPI
423 Main_DDrawSurface_UpdateOverlay (LPDIRECTDRAWSURFACE7 iface,
424 LPRECT pSrcRect,
425 LPDIRECTDRAWSURFACE7 pDstSurface,
426 LPRECT pDstRect, DWORD dwFlags,
427 LPDDOVERLAYFX pFX)
428 {
429 DX_STUB;
430 }
431
432 /* MSDN: "not currently implemented." */
433 HRESULT WINAPI
434 Main_DDrawSurface_UpdateOverlayDisplay (LPDIRECTDRAWSURFACE7 iface,
435 DWORD dwFlags)
436 {
437 DX_STUB;
438 }
439
440 HRESULT WINAPI Main_DDrawSurface_UpdateOverlayZOrder (LPDIRECTDRAWSURFACE7 iface,
441 DWORD dwFlags, LPDIRECTDRAWSURFACE7 pDDSRef)
442 {
443 DX_STUB;
444 }
445
446 IDirectDrawSurface7Vtbl DirectDrawSurface7_Vtable =
447 {
448 Main_DDrawSurface_QueryInterface,
449 Main_DDrawSurface_AddRef,
450 Main_DDrawSurface_Release,
451 Main_DDrawSurface_AddAttachedSurface,
452 Main_DDrawSurface_AddOverlayDirtyRect,
453 Main_DDrawSurface_Blt,
454 Main_DDrawSurface_BltBatch,
455 Main_DDrawSurface_BltFast,
456 Main_DDrawSurface_DeleteAttachedSurface,
457 Main_DDrawSurface_EnumAttachedSurfaces,
458 Main_DDrawSurface_EnumOverlayZOrders,
459 Main_DDrawSurface_Flip,
460 Main_DDrawSurface_GetAttachedSurface,
461 Main_DDrawSurface_GetBltStatus,
462 Main_DDrawSurface_GetCaps,
463 Main_DDrawSurface_GetClipper,
464 Main_DDrawSurface_GetColorKey,
465 Main_DDrawSurface_GetDC,
466 Main_DDrawSurface_GetFlipStatus,
467 Main_DDrawSurface_GetOverlayPosition,
468 Main_DDrawSurface_GetPalette,
469 Main_DDrawSurface_GetPixelFormat,
470 Main_DDrawSurface_GetSurfaceDesc,
471 Main_DDrawSurface_Initialize,
472 Main_DDrawSurface_IsLost,
473 Main_DDrawSurface_Lock,
474 Main_DDrawSurface_ReleaseDC,
475 Main_DDrawSurface_Restore,
476 Main_DDrawSurface_SetClipper,
477 Main_DDrawSurface_SetColorKey,
478 Main_DDrawSurface_SetOverlayPosition,
479 Main_DDrawSurface_SetPalette,
480 Main_DDrawSurface_Unlock,
481 Main_DDrawSurface_UpdateOverlay,
482 Main_DDrawSurface_UpdateOverlayDisplay,
483 Main_DDrawSurface_UpdateOverlayZOrder
484 };