3 * COPYRIGHT: See COPYING in the top level directory
5 * FILE: lib/ddraw/main/surface.c
6 * PURPOSE: IDirectDrawSurface7 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 if (This
->owner
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
)
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
;
37 if (This
->owner
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.CanCreateSurface(&CanCreateData
) == DDHAL_DRIVER_NOTHANDLED
)
38 return DDERR_INVALIDPARAMS
;
40 if(CanCreateData
.ddRVal
!= DD_OK
)
41 return CanCreateData
.ddRVal
;
44 /* down here we got a crach */
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;
54 /* surface more struct */
55 DDRAWI_DDRAWSURFACE_MORE More
;
56 memset(&More
, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE
));
57 More
.dwSize
= sizeof(DDRAWI_DDRAWSURFACE_MORE
);
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
;
66 /* we need to set some flags if we create the primary surface */
67 if(pDDSD
->ddsCaps
.dwCaps
== DDSCAPS_PRIMARYSURFACE
)
69 Local
.dwFlags
|= DDRAWISURF_FRONTBUFFER
;
70 Global
.dwGlobalFlags
|= DDRAWISURFGBL_ISGDISURFACE
;
73 /* for the double pointer below */
74 DDRAWI_DDRAWSURFACE_LCL
*pLocal
[2];
76 pLocal
[1] = NULL
; // we need this one for bad written drivers
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
;
86 /* this is the call we were waiting for */
88 if(This
->owner
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.CreateSurface(&CreateData
) == DDHAL_DRIVER_NOTHANDLED
)
89 return DDERR_INVALIDPARAMS
;
91 if(CreateData
.ddRVal
!= DD_OK
)
92 return CreateData
.ddRVal
;
94 OutputDebugString(L
"This does not get hit :( ");
95 OutputDebugString(L
"Yet ;)");
100 ULONG WINAPI
Main_DDrawSurface_AddRef(LPDIRECTDRAWSURFACE7 iface
)
102 IDirectDrawSurfaceImpl
* This
= (IDirectDrawSurfaceImpl
*)iface
;
103 return InterlockedIncrement(&This
->ref
);
106 ULONG WINAPI
Main_DDrawSurface_Release(LPDIRECTDRAWSURFACE7 iface
)
108 IDirectDrawSurfaceImpl
* This
= (IDirectDrawSurfaceImpl
*)iface
;
109 ULONG ref
= InterlockedDecrement(&This
->ref
);
112 HeapFree(GetProcessHeap(), 0, This
);
120 Main_DDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE7 iface
, REFIID riid
,
123 return E_NOINTERFACE
;
126 HRESULT WINAPI
Main_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface
, LPRECT rdst
,
127 LPDIRECTDRAWSURFACE7 src
, LPRECT rsrc
, DWORD dwFlags
, LPDDBLTFX lpbltfx
)
129 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
131 if (This
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.dwFlags
& DDHAL_CB32_FLIPTOGDISURFACE
)
133 return Hal_DDrawSurface_Blt( iface
, rdst
, src
, rsrc
, dwFlags
, lpbltfx
);
136 return Hel_DDrawSurface_Blt( iface
, rdst
, src
, rsrc
, dwFlags
, lpbltfx
);
140 HRESULT WINAPI
Main_DDrawSurface_Lock (LPDIRECTDRAWSURFACE7 iface
, LPRECT prect
,
141 LPDDSURFACEDESC2 pDDSD
, DWORD flags
, HANDLE event
)
146 HRESULT WINAPI
Main_DDrawSurface_Unlock (LPDIRECTDRAWSURFACE7 iface
, LPRECT pRect
)
152 Main_DDrawSurface_AddAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
153 LPDIRECTDRAWSURFACE7 pAttach
)
158 /* MSDN: "not currently implemented." */
160 Main_DDrawSurface_AddOverlayDirtyRect(LPDIRECTDRAWSURFACE7 iface
,
167 Main_DDrawSurface_BltFast(LPDIRECTDRAWSURFACE7 iface
, DWORD dstx
,
168 DWORD dsty
, LPDIRECTDRAWSURFACE7 src
,
169 LPRECT rsrc
, DWORD trans
)
175 Main_DDrawSurface_Restore(LPDIRECTDRAWSURFACE7 iface
)
180 /* MSDN: "not currently implemented." */
182 Main_DDrawSurface_BltBatch(LPDIRECTDRAWSURFACE7 iface
,
183 LPDDBLTBATCH pBatch
, DWORD dwCount
,
190 Main_DDrawSurface_ChangeUniquenessValue(LPDIRECTDRAWSURFACE7 iface
)
196 Main_DDrawSurface_DeleteAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
198 LPDIRECTDRAWSURFACE7 pAttach
)
204 Main_DDrawSurface_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE7 iface
,
206 LPDDENUMSURFACESCALLBACK7 cb
)
212 Main_DDrawSurface_EnumOverlayZOrders(LPDIRECTDRAWSURFACE7 iface
,
213 DWORD dwFlags
, LPVOID context
,
214 LPDDENUMSURFACESCALLBACK7 cb
)
220 Main_DDrawSurface_Flip(LPDIRECTDRAWSURFACE7 iface
,
221 LPDIRECTDRAWSURFACE7 override
, DWORD dwFlags
)
227 Main_DDrawSurface_FreePrivateData(LPDIRECTDRAWSURFACE7 iface
, REFGUID tag
)
233 Main_DDrawSurface_GetAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
235 LPDIRECTDRAWSURFACE7
* ppSurface
)
241 Main_DDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
247 Main_DDrawSurface_GetCaps(LPDIRECTDRAWSURFACE7 iface
, LPDDSCAPS2 pCaps
)
253 Main_DDrawSurface_GetClipper(LPDIRECTDRAWSURFACE7 iface
,
254 LPDIRECTDRAWCLIPPER
* ppClipper
)
260 Main_DDrawSurface_GetColorKey(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
,
267 Main_DDrawSurface_GetDC(LPDIRECTDRAWSURFACE7 iface
, HDC
*phDC
)
273 Main_DDrawSurface_GetDDInterface(LPDIRECTDRAWSURFACE7 iface
, LPVOID
* pDD
)
278 Main_DDrawSurface_GetFlipStatus(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
284 Main_DDrawSurface_GetLOD(LPDIRECTDRAWSURFACE7 iface
, LPDWORD pdwMaxLOD
)
290 Main_DDrawSurface_GetOverlayPosition(LPDIRECTDRAWSURFACE7 iface
,
291 LPLONG pX
, LPLONG pY
)
296 Main_DDrawSurface_GetPalette(LPDIRECTDRAWSURFACE7 iface
,
297 LPDIRECTDRAWPALETTE
* ppPalette
)
303 Main_DDrawSurface_GetPixelFormat(LPDIRECTDRAWSURFACE7 iface
,
304 LPDDPIXELFORMAT pDDPixelFormat
)
310 Main_DDrawSurface_GetPriority(LPDIRECTDRAWSURFACE7 iface
,
317 Main_DDrawSurface_GetPrivateData(LPDIRECTDRAWSURFACE7 iface
,
318 REFGUID tag
, LPVOID pBuffer
,
319 LPDWORD pcbBufferSize
)
325 Main_DDrawSurface_GetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface
,
326 LPDDSURFACEDESC2 pDDSD
)
332 Main_DDrawSurface_GetUniquenessValue(LPDIRECTDRAWSURFACE7 iface
,
339 Main_DDrawSurface_IsLost(LPDIRECTDRAWSURFACE7 iface
)
345 Main_DDrawSurface_PageLock(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
351 Main_DDrawSurface_PageUnlock(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
357 Main_DDrawSurface_ReleaseDC(LPDIRECTDRAWSURFACE7 iface
, HDC hDC
)
363 Main_DDrawSurface_SetClipper (LPDIRECTDRAWSURFACE7 iface
,
364 LPDIRECTDRAWCLIPPER pDDClipper
)
370 Main_DDrawSurface_SetColorKey (LPDIRECTDRAWSURFACE7 iface
,
371 DWORD dwFlags
, LPDDCOLORKEY pCKey
)
377 Main_DDrawSurface_SetLOD (LPDIRECTDRAWSURFACE7 iface
, DWORD dwMaxLOD
)
383 Main_DDrawSurface_SetOverlayPosition (LPDIRECTDRAWSURFACE7 iface
,
390 Main_DDrawSurface_SetPalette (LPDIRECTDRAWSURFACE7 iface
,
391 LPDIRECTDRAWPALETTE pPalette
)
397 Main_DDrawSurface_SetPriority (LPDIRECTDRAWSURFACE7 iface
,
404 Main_DDrawSurface_SetPrivateData (LPDIRECTDRAWSURFACE7 iface
,
405 REFGUID tag
, LPVOID pData
,
406 DWORD cbSize
, DWORD dwFlags
)
412 Main_DDrawSurface_UpdateOverlay (LPDIRECTDRAWSURFACE7 iface
,
414 LPDIRECTDRAWSURFACE7 pDstSurface
,
415 LPRECT pDstRect
, DWORD dwFlags
,
421 /* MSDN: "not currently implemented." */
423 Main_DDrawSurface_UpdateOverlayDisplay (LPDIRECTDRAWSURFACE7 iface
,
429 HRESULT WINAPI
Main_DDrawSurface_UpdateOverlayZOrder (LPDIRECTDRAWSURFACE7 iface
,
430 DWORD dwFlags
, LPDIRECTDRAWSURFACE7 pDDSRef
)
435 IDirectDrawSurface7Vtbl DirectDrawSurface7_Vtable
=
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