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 /* surface global struct */
45 memset(&This
->Global
, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL
));
46 This
->Global
.lpDD
= &This
->owner
->DirectDrawThis
->Global
;
47 This
->Global
.wHeight
= This
->owner
->Height
;
48 This
->Global
.wWidth
= This
->owner
->Width
;
49 This
->Global
.dwLinearSize
= This
->Global
.wWidth
* This
->owner
->Bpp
/8;
51 /* surface more struct */
52 memset(&This
->More
, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE
));
53 This
->More
.dwSize
= sizeof(DDRAWI_DDRAWSURFACE_MORE
);
55 /* surface local struct */
56 memset(&This
->Local
, 0, sizeof(DDRAWI_DDRAWSURFACE_LCL
));
57 This
->Local
.lpGbl
= &This
->Global
;
58 This
->Local
.lpSurfMore
= &This
->More
;
59 This
->Local
.ddsCaps
= *(DDSCAPS
*)&pDDSD
->ddsCaps
;
61 /* we need to set some flags if we create the primary surface */
62 if(pDDSD
->ddsCaps
.dwCaps
== DDSCAPS_PRIMARYSURFACE
)
64 This
->Local
.dwFlags
|= DDRAWISURF_FRONTBUFFER
;
65 This
->Global
.dwGlobalFlags
|= DDRAWISURFGBL_ISGDISURFACE
;
68 /* for the double pointer below */
69 DDRAWI_DDRAWSURFACE_LCL
*pLocal
[2];
70 pLocal
[0] = &This
->Local
;
71 pLocal
[1] = NULL
; // we need this one for bad written drivers
73 /* the parameter struct */
74 DDHAL_CREATESURFACEDATA CreateData
;
75 memset(&CreateData
, 0, sizeof(DDHAL_CREATESURFACEDATA
));
76 CreateData
.lpDD
= &This
->owner
->DirectDrawGlobal
;
77 CreateData
.lpDDSurfaceDesc
= (DDSURFACEDESC
*)pDDSD
;
78 CreateData
.dwSCnt
= 1;
79 CreateData
.lplpSList
= pLocal
;
81 /* this is the call we were waiting for */
82 if(This
->owner
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.CreateSurface(&CreateData
) == DDHAL_DRIVER_NOTHANDLED
)
83 return DDERR_INVALIDPARAMS
;
85 if(CreateData
.ddRVal
!= DD_OK
)
86 return CreateData
.ddRVal
;
88 OutputDebugString(L
"This does not get hit :( ");
89 OutputDebugString(L
"Yet ;)");
94 ULONG WINAPI
Main_DDrawSurface_AddRef(LPDIRECTDRAWSURFACE7 iface
)
96 IDirectDrawSurfaceImpl
* This
= (IDirectDrawSurfaceImpl
*)iface
;
97 return InterlockedIncrement(&This
->ref
);
100 ULONG WINAPI
Main_DDrawSurface_Release(LPDIRECTDRAWSURFACE7 iface
)
102 IDirectDrawSurfaceImpl
* This
= (IDirectDrawSurfaceImpl
*)iface
;
103 ULONG ref
= InterlockedDecrement(&This
->ref
);
106 HeapFree(GetProcessHeap(), 0, This
);
114 Main_DDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE7 iface
, REFIID riid
,
117 return E_NOINTERFACE
;
120 HRESULT WINAPI
Main_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface
, LPRECT rdst
,
121 LPDIRECTDRAWSURFACE7 src
, LPRECT rsrc
, DWORD dwFlags
, LPDDBLTFX lpbltfx
)
123 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
125 if (This
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.dwFlags
& DDHAL_CB32_FLIPTOGDISURFACE
)
127 return Hal_DDrawSurface_Blt( iface
, rdst
, src
, rsrc
, dwFlags
, lpbltfx
);
130 return Hel_DDrawSurface_Blt( iface
, rdst
, src
, rsrc
, dwFlags
, lpbltfx
);
134 HRESULT WINAPI
Main_DDrawSurface_Lock (LPDIRECTDRAWSURFACE7 iface
, LPRECT prect
,
135 LPDDSURFACEDESC2 pDDSD
, DWORD flags
, HANDLE event
)
140 HRESULT WINAPI
Main_DDrawSurface_Unlock (LPDIRECTDRAWSURFACE7 iface
, LPRECT pRect
)
146 Main_DDrawSurface_AddAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
147 LPDIRECTDRAWSURFACE7 pAttach
)
152 /* MSDN: "not currently implemented." */
154 Main_DDrawSurface_AddOverlayDirtyRect(LPDIRECTDRAWSURFACE7 iface
,
161 Main_DDrawSurface_BltFast(LPDIRECTDRAWSURFACE7 iface
, DWORD dstx
,
162 DWORD dsty
, LPDIRECTDRAWSURFACE7 src
,
163 LPRECT rsrc
, DWORD trans
)
169 Main_DDrawSurface_Restore(LPDIRECTDRAWSURFACE7 iface
)
174 /* MSDN: "not currently implemented." */
176 Main_DDrawSurface_BltBatch(LPDIRECTDRAWSURFACE7 iface
,
177 LPDDBLTBATCH pBatch
, DWORD dwCount
,
184 Main_DDrawSurface_ChangeUniquenessValue(LPDIRECTDRAWSURFACE7 iface
)
190 Main_DDrawSurface_DeleteAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
192 LPDIRECTDRAWSURFACE7 pAttach
)
198 Main_DDrawSurface_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE7 iface
,
200 LPDDENUMSURFACESCALLBACK7 cb
)
206 Main_DDrawSurface_EnumOverlayZOrders(LPDIRECTDRAWSURFACE7 iface
,
207 DWORD dwFlags
, LPVOID context
,
208 LPDDENUMSURFACESCALLBACK7 cb
)
214 Main_DDrawSurface_Flip(LPDIRECTDRAWSURFACE7 iface
,
215 LPDIRECTDRAWSURFACE7 override
, DWORD dwFlags
)
221 Main_DDrawSurface_FreePrivateData(LPDIRECTDRAWSURFACE7 iface
, REFGUID tag
)
227 Main_DDrawSurface_GetAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
229 LPDIRECTDRAWSURFACE7
* ppSurface
)
235 Main_DDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
241 Main_DDrawSurface_GetCaps(LPDIRECTDRAWSURFACE7 iface
, LPDDSCAPS2 pCaps
)
247 Main_DDrawSurface_GetClipper(LPDIRECTDRAWSURFACE7 iface
,
248 LPDIRECTDRAWCLIPPER
* ppClipper
)
254 Main_DDrawSurface_GetColorKey(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
,
261 Main_DDrawSurface_GetDC(LPDIRECTDRAWSURFACE7 iface
, HDC
*phDC
)
267 Main_DDrawSurface_GetDDInterface(LPDIRECTDRAWSURFACE7 iface
, LPVOID
* pDD
)
272 Main_DDrawSurface_GetFlipStatus(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
278 Main_DDrawSurface_GetLOD(LPDIRECTDRAWSURFACE7 iface
, LPDWORD pdwMaxLOD
)
284 Main_DDrawSurface_GetOverlayPosition(LPDIRECTDRAWSURFACE7 iface
,
285 LPLONG pX
, LPLONG pY
)
290 Main_DDrawSurface_GetPalette(LPDIRECTDRAWSURFACE7 iface
,
291 LPDIRECTDRAWPALETTE
* ppPalette
)
297 Main_DDrawSurface_GetPixelFormat(LPDIRECTDRAWSURFACE7 iface
,
298 LPDDPIXELFORMAT pDDPixelFormat
)
304 Main_DDrawSurface_GetPriority(LPDIRECTDRAWSURFACE7 iface
,
311 Main_DDrawSurface_GetPrivateData(LPDIRECTDRAWSURFACE7 iface
,
312 REFGUID tag
, LPVOID pBuffer
,
313 LPDWORD pcbBufferSize
)
319 Main_DDrawSurface_GetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface
,
320 LPDDSURFACEDESC2 pDDSD
)
326 Main_DDrawSurface_GetUniquenessValue(LPDIRECTDRAWSURFACE7 iface
,
333 Main_DDrawSurface_IsLost(LPDIRECTDRAWSURFACE7 iface
)
339 Main_DDrawSurface_PageLock(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
345 Main_DDrawSurface_PageUnlock(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
351 Main_DDrawSurface_ReleaseDC(LPDIRECTDRAWSURFACE7 iface
, HDC hDC
)
357 Main_DDrawSurface_SetClipper (LPDIRECTDRAWSURFACE7 iface
,
358 LPDIRECTDRAWCLIPPER pDDClipper
)
364 Main_DDrawSurface_SetColorKey (LPDIRECTDRAWSURFACE7 iface
,
365 DWORD dwFlags
, LPDDCOLORKEY pCKey
)
371 Main_DDrawSurface_SetLOD (LPDIRECTDRAWSURFACE7 iface
, DWORD dwMaxLOD
)
377 Main_DDrawSurface_SetOverlayPosition (LPDIRECTDRAWSURFACE7 iface
,
384 Main_DDrawSurface_SetPalette (LPDIRECTDRAWSURFACE7 iface
,
385 LPDIRECTDRAWPALETTE pPalette
)
391 Main_DDrawSurface_SetPriority (LPDIRECTDRAWSURFACE7 iface
,
398 Main_DDrawSurface_SetPrivateData (LPDIRECTDRAWSURFACE7 iface
,
399 REFGUID tag
, LPVOID pData
,
400 DWORD cbSize
, DWORD dwFlags
)
406 Main_DDrawSurface_UpdateOverlay (LPDIRECTDRAWSURFACE7 iface
,
408 LPDIRECTDRAWSURFACE7 pDstSurface
,
409 LPRECT pDstRect
, DWORD dwFlags
,
415 /* MSDN: "not currently implemented." */
417 Main_DDrawSurface_UpdateOverlayDisplay (LPDIRECTDRAWSURFACE7 iface
,
423 HRESULT WINAPI
Main_DDrawSurface_UpdateOverlayZOrder (LPDIRECTDRAWSURFACE7 iface
,
424 DWORD dwFlags
, LPDIRECTDRAWSURFACE7 pDDSRef
)
429 IDirectDrawSurface7Vtbl DirectDrawSurface7_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