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