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