3 * COPYRIGHT: See COPYING in the top level directory
5 * FILE: lib/ddraw/main/surface.c
6 * PURPOSE: DirectDraw Implementation
7 * PROGRAMMER: Magnus Olsen, Maarten Bosma
14 HRESULT WINAPI
Main_DDrawSurface_Initialize (LPDIRECTDRAWSURFACE7 iface
, LPDIRECTDRAW pDD
, LPDDSURFACEDESC2 pDDSD
)
16 IDirectDrawSurfaceImpl
* This
= (IDirectDrawSurfaceImpl
*)iface
;
19 return DDERR_ALREADYINITIALIZED
;
21 if(sizeof(DDSURFACEDESC2
) != pDDSD
->dwSize
)
22 return DDERR_UNSUPPORTED
;
24 if(!(pDDSD
->dwFlags
& DDSD_CAPS
))
25 return DDERR_INVALIDPARAMS
;
27 This
->owner
= (IDirectDrawImpl
*)pDD
;
29 // Surface Global Struct
30 DDRAWI_DDRAWSURFACE_GBL Global
;
31 memset(&Global
, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL
));
33 if(pDDSD
->ddsCaps
.dwCaps
== DDSCAPS_PRIMARYSURFACE
)
34 Global
.dwGlobalFlags
|= DDRAWISURFGBL_ISGDISURFACE
;
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;
41 // Surface More Struct
42 DDRAWI_DDRAWSURFACE_MORE More
;
43 memset(&More
, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE
));
44 More
.dwSize
= sizeof(DDRAWI_DDRAWSURFACE_MORE
);
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
;
53 // BitDepth = DDSurf_BitDepth(psurf); ?
56 if(pDDSD
->ddsCaps
.dwCaps
== DDSCAPS_PRIMARYSURFACE
)
57 Local
.dwFlags
|= DDRAWISURF_FRONTBUFFER
;
59 DDRAWI_DDRAWSURFACE_LCL
*pLocal
[2]; // for stupid double pointer below
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
;
74 DDHAL_CANCREATESURFACEDATA CanCreateData
;
75 memset(&CanCreateData
, 0, sizeof(DD_CANCREATESURFACEDATA
));
76 CanCreateData
.lpDD
= &This
->owner
->DirectDrawGlobal
;
77 CanCreateData
.lpDDSurfaceDesc
= (DDSURFACEDESC
*)pDDSD
;
80 if (This
->owner
->DriverCallbacks
.DdMain
.CanCreateSurface (&CanCreateData
) == DDHAL_DRIVER_NOTHANDLED
)
81 return DDERR_INVALIDPARAMS
;
83 if(CanCreateData
.ddRVal
!= DD_OK
)
84 return CanCreateData
.ddRVal
;
87 if(This
->owner
->DriverCallbacks
.DdMain
.CreateSurface (&CreateData
) == DDHAL_DRIVER_NOTHANDLED
)
88 return DDERR_INVALIDPARAMS
;
90 if(CreateData
.ddRVal
!= DD_OK
)
91 return CreateData
.ddRVal
;
94 OutputDebugString(L
"This does not get hit.");
99 HRESULT WINAPI
Main_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface
, LPRECT rdst
,
100 LPDIRECTDRAWSURFACE7 src
, LPRECT rsrc
, DWORD dwFlags
, LPDDBLTFX lpbltfx
)
105 HRESULT WINAPI
Main_DDrawSurface_Lock (LPDIRECTDRAWSURFACE7 iface
, LPRECT prect
,
106 LPDDSURFACEDESC2 pDDSD
, DWORD flags
, HANDLE event
)
111 HRESULT WINAPI
Main_DDrawSurface_Unlock (LPDIRECTDRAWSURFACE7 iface
, LPRECT pRect
)
117 ULONG WINAPI
Main_DDrawSurface_AddRef(LPDIRECTDRAWSURFACE7 iface
)
119 IDirectDrawSurfaceImpl
* This
= (IDirectDrawSurfaceImpl
*)iface
;
120 return InterlockedIncrement(&This
->ref
);
123 ULONG WINAPI
Main_DDrawSurface_Release(LPDIRECTDRAWSURFACE7 iface
)
125 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
126 ULONG ref
= InterlockedDecrement(&This
->ref
);
129 HeapFree(GetProcessHeap(), 0, This
);
137 Main_DDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE7 iface
, REFIID riid
,
140 return DDERR_UNSUPPORTED
;
144 Main_DDrawSurface_AddAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
145 LPDIRECTDRAWSURFACE7 pAttach
)
147 return DDERR_UNSUPPORTED
;
150 /* MSDN: "not currently implemented." */
152 Main_DDrawSurface_AddOverlayDirtyRect(LPDIRECTDRAWSURFACE7 iface
,
155 return DDERR_UNSUPPORTED
;
159 Main_DDrawSurface_BltFast(LPDIRECTDRAWSURFACE7 iface
, DWORD dstx
,
160 DWORD dsty
, LPDIRECTDRAWSURFACE7 src
,
161 LPRECT rsrc
, DWORD trans
)
163 return DDERR_UNSUPPORTED
;
167 Main_DDrawSurface_Restore(LPDIRECTDRAWSURFACE7 iface
)
169 return DDERR_UNSUPPORTED
;
172 /* MSDN: "not currently implemented." */
174 Main_DDrawSurface_BltBatch(LPDIRECTDRAWSURFACE7 iface
,
175 LPDDBLTBATCH pBatch
, DWORD dwCount
,
178 return DDERR_UNSUPPORTED
;
182 Main_DDrawSurface_ChangeUniquenessValue(LPDIRECTDRAWSURFACE7 iface
)
184 return DDERR_UNSUPPORTED
;
188 Main_DDrawSurface_DeleteAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
190 LPDIRECTDRAWSURFACE7 pAttach
)
192 return DDERR_UNSUPPORTED
;
196 Main_DDrawSurface_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE7 iface
,
198 LPDDENUMSURFACESCALLBACK7 cb
)
200 return DDERR_UNSUPPORTED
;
204 Main_DDrawSurface_EnumOverlayZOrders(LPDIRECTDRAWSURFACE7 iface
,
205 DWORD dwFlags
, LPVOID context
,
206 LPDDENUMSURFACESCALLBACK7 cb
)
208 return DDERR_UNSUPPORTED
;
212 Main_DDrawSurface_Flip(LPDIRECTDRAWSURFACE7 iface
,
213 LPDIRECTDRAWSURFACE7 override
, DWORD dwFlags
)
215 return DDERR_UNSUPPORTED
;
219 Main_DDrawSurface_FreePrivateData(LPDIRECTDRAWSURFACE7 iface
, REFGUID tag
)
221 return DDERR_UNSUPPORTED
;
225 Main_DDrawSurface_GetAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
227 LPDIRECTDRAWSURFACE7
* ppSurface
)
229 return DDERR_UNSUPPORTED
;
233 Main_DDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
235 return DDERR_UNSUPPORTED
;
239 Main_DDrawSurface_GetCaps(LPDIRECTDRAWSURFACE7 iface
, LPDDSCAPS2 pCaps
)
241 return DDERR_UNSUPPORTED
;
245 Main_DDrawSurface_GetClipper(LPDIRECTDRAWSURFACE7 iface
,
246 LPDIRECTDRAWCLIPPER
* ppClipper
)
248 return DDERR_UNSUPPORTED
;
252 Main_DDrawSurface_GetColorKey(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
,
255 return DDERR_UNSUPPORTED
;
259 Main_DDrawSurface_GetDC(LPDIRECTDRAWSURFACE7 iface
, HDC
*phDC
)
261 return DDERR_UNSUPPORTED
;
265 Main_DDrawSurface_GetDDInterface(LPDIRECTDRAWSURFACE7 iface
, LPVOID
* pDD
)
267 return DDERR_UNSUPPORTED
;
270 Main_DDrawSurface_GetFlipStatus(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
272 return DDERR_UNSUPPORTED
;
276 Main_DDrawSurface_GetLOD(LPDIRECTDRAWSURFACE7 iface
, LPDWORD pdwMaxLOD
)
278 return DDERR_UNSUPPORTED
;
282 Main_DDrawSurface_GetOverlayPosition(LPDIRECTDRAWSURFACE7 iface
,
283 LPLONG pX
, LPLONG pY
)
285 return DDERR_UNSUPPORTED
;
288 Main_DDrawSurface_GetPalette(LPDIRECTDRAWSURFACE7 iface
,
289 LPDIRECTDRAWPALETTE
* ppPalette
)
291 return DDERR_UNSUPPORTED
;
295 Main_DDrawSurface_GetPixelFormat(LPDIRECTDRAWSURFACE7 iface
,
296 LPDDPIXELFORMAT pDDPixelFormat
)
298 return DDERR_UNSUPPORTED
;
302 Main_DDrawSurface_GetPriority(LPDIRECTDRAWSURFACE7 iface
,
305 return DDERR_UNSUPPORTED
;
309 Main_DDrawSurface_GetPrivateData(LPDIRECTDRAWSURFACE7 iface
,
310 REFGUID tag
, LPVOID pBuffer
,
311 LPDWORD pcbBufferSize
)
313 return DDERR_UNSUPPORTED
;
317 Main_DDrawSurface_GetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface
,
318 LPDDSURFACEDESC2 pDDSD
)
320 return DDERR_UNSUPPORTED
;
324 Main_DDrawSurface_GetUniquenessValue(LPDIRECTDRAWSURFACE7 iface
,
327 return DDERR_UNSUPPORTED
;
331 Main_DDrawSurface_IsLost(LPDIRECTDRAWSURFACE7 iface
)
333 return DDERR_UNSUPPORTED
;
337 Main_DDrawSurface_PageLock(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
339 return DDERR_UNSUPPORTED
;
343 Main_DDrawSurface_PageUnlock(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
345 return DDERR_UNSUPPORTED
;
349 Main_DDrawSurface_ReleaseDC(LPDIRECTDRAWSURFACE7 iface
, HDC hDC
)
351 return DDERR_UNSUPPORTED
;
355 Main_DDrawSurface_SetClipper (LPDIRECTDRAWSURFACE7 iface
,
356 LPDIRECTDRAWCLIPPER pDDClipper
)
358 return DDERR_UNSUPPORTED
;
362 Main_DDrawSurface_SetColorKey (LPDIRECTDRAWSURFACE7 iface
,
363 DWORD dwFlags
, LPDDCOLORKEY pCKey
)
365 return DDERR_UNSUPPORTED
;
369 Main_DDrawSurface_SetLOD (LPDIRECTDRAWSURFACE7 iface
, DWORD dwMaxLOD
)
371 return DDERR_UNSUPPORTED
;
375 Main_DDrawSurface_SetOverlayPosition (LPDIRECTDRAWSURFACE7 iface
,
378 return DDERR_UNSUPPORTED
;
382 Main_DDrawSurface_SetPalette (LPDIRECTDRAWSURFACE7 iface
,
383 LPDIRECTDRAWPALETTE pPalette
)
385 return DDERR_UNSUPPORTED
;
389 Main_DDrawSurface_SetPriority (LPDIRECTDRAWSURFACE7 iface
,
392 return DDERR_UNSUPPORTED
;
395 /* Be careful when locking this: it is risky to call the object's AddRef
396 * or Release holding a lock. */
398 Main_DDrawSurface_SetPrivateData (LPDIRECTDRAWSURFACE7 iface
,
399 REFGUID tag
, LPVOID pData
,
400 DWORD cbSize
, DWORD dwFlags
)
402 return DDERR_UNSUPPORTED
;
406 Main_DDrawSurface_UpdateOverlay (LPDIRECTDRAWSURFACE7 iface
,
408 LPDIRECTDRAWSURFACE7 pDstSurface
,
409 LPRECT pDstRect
, DWORD dwFlags
,
412 return DDERR_UNSUPPORTED
;
415 /* MSDN: "not currently implemented." */
417 Main_DDrawSurface_UpdateOverlayDisplay (LPDIRECTDRAWSURFACE7 iface
,
420 return DDERR_UNSUPPORTED
;
423 HRESULT WINAPI
Main_DDrawSurface_UpdateOverlayZOrder (LPDIRECTDRAWSURFACE7 iface
,
424 DWORD dwFlags
, LPDIRECTDRAWSURFACE7 pDDSRef
)
426 return DDERR_NOTAOVERLAYSURFACE
;
429 IDirectDrawSurface7Vtbl DDrawSurface_VTable
=
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