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
)
132 HRESULT WINAPI
Main_DDrawSurface_Lock (LPDIRECTDRAWSURFACE7 iface
, LPRECT prect
,
133 LPDDSURFACEDESC2 pDDSD
, DWORD flags
, HANDLE event
)
138 HRESULT WINAPI
Main_DDrawSurface_Unlock (LPDIRECTDRAWSURFACE7 iface
, LPRECT pRect
)
144 Main_DDrawSurface_AddAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
145 LPDIRECTDRAWSURFACE7 pAttach
)
150 /* MSDN: "not currently implemented." */
152 Main_DDrawSurface_AddOverlayDirtyRect(LPDIRECTDRAWSURFACE7 iface
,
159 Main_DDrawSurface_BltFast(LPDIRECTDRAWSURFACE7 iface
, DWORD dstx
,
160 DWORD dsty
, LPDIRECTDRAWSURFACE7 src
,
161 LPRECT rsrc
, DWORD trans
)
167 Main_DDrawSurface_Restore(LPDIRECTDRAWSURFACE7 iface
)
172 /* MSDN: "not currently implemented." */
174 Main_DDrawSurface_BltBatch(LPDIRECTDRAWSURFACE7 iface
,
175 LPDDBLTBATCH pBatch
, DWORD dwCount
,
182 Main_DDrawSurface_ChangeUniquenessValue(LPDIRECTDRAWSURFACE7 iface
)
188 Main_DDrawSurface_DeleteAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
190 LPDIRECTDRAWSURFACE7 pAttach
)
196 Main_DDrawSurface_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE7 iface
,
198 LPDDENUMSURFACESCALLBACK7 cb
)
204 Main_DDrawSurface_EnumOverlayZOrders(LPDIRECTDRAWSURFACE7 iface
,
205 DWORD dwFlags
, LPVOID context
,
206 LPDDENUMSURFACESCALLBACK7 cb
)
212 Main_DDrawSurface_Flip(LPDIRECTDRAWSURFACE7 iface
,
213 LPDIRECTDRAWSURFACE7 override
, DWORD dwFlags
)
219 Main_DDrawSurface_FreePrivateData(LPDIRECTDRAWSURFACE7 iface
, REFGUID tag
)
225 Main_DDrawSurface_GetAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
227 LPDIRECTDRAWSURFACE7
* ppSurface
)
233 Main_DDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
239 Main_DDrawSurface_GetCaps(LPDIRECTDRAWSURFACE7 iface
, LPDDSCAPS2 pCaps
)
245 Main_DDrawSurface_GetClipper(LPDIRECTDRAWSURFACE7 iface
,
246 LPDIRECTDRAWCLIPPER
* ppClipper
)
252 Main_DDrawSurface_GetColorKey(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
,
259 Main_DDrawSurface_GetDC(LPDIRECTDRAWSURFACE7 iface
, HDC
*phDC
)
265 Main_DDrawSurface_GetDDInterface(LPDIRECTDRAWSURFACE7 iface
, LPVOID
* pDD
)
270 Main_DDrawSurface_GetFlipStatus(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
276 Main_DDrawSurface_GetLOD(LPDIRECTDRAWSURFACE7 iface
, LPDWORD pdwMaxLOD
)
282 Main_DDrawSurface_GetOverlayPosition(LPDIRECTDRAWSURFACE7 iface
,
283 LPLONG pX
, LPLONG pY
)
288 Main_DDrawSurface_GetPalette(LPDIRECTDRAWSURFACE7 iface
,
289 LPDIRECTDRAWPALETTE
* ppPalette
)
295 Main_DDrawSurface_GetPixelFormat(LPDIRECTDRAWSURFACE7 iface
,
296 LPDDPIXELFORMAT pDDPixelFormat
)
302 Main_DDrawSurface_GetPriority(LPDIRECTDRAWSURFACE7 iface
,
309 Main_DDrawSurface_GetPrivateData(LPDIRECTDRAWSURFACE7 iface
,
310 REFGUID tag
, LPVOID pBuffer
,
311 LPDWORD pcbBufferSize
)
317 Main_DDrawSurface_GetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface
,
318 LPDDSURFACEDESC2 pDDSD
)
324 Main_DDrawSurface_GetUniquenessValue(LPDIRECTDRAWSURFACE7 iface
,
331 Main_DDrawSurface_IsLost(LPDIRECTDRAWSURFACE7 iface
)
337 Main_DDrawSurface_PageLock(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
343 Main_DDrawSurface_PageUnlock(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
349 Main_DDrawSurface_ReleaseDC(LPDIRECTDRAWSURFACE7 iface
, HDC hDC
)
355 Main_DDrawSurface_SetClipper (LPDIRECTDRAWSURFACE7 iface
,
356 LPDIRECTDRAWCLIPPER pDDClipper
)
362 Main_DDrawSurface_SetColorKey (LPDIRECTDRAWSURFACE7 iface
,
363 DWORD dwFlags
, LPDDCOLORKEY pCKey
)
369 Main_DDrawSurface_SetLOD (LPDIRECTDRAWSURFACE7 iface
, DWORD dwMaxLOD
)
375 Main_DDrawSurface_SetOverlayPosition (LPDIRECTDRAWSURFACE7 iface
,
382 Main_DDrawSurface_SetPalette (LPDIRECTDRAWSURFACE7 iface
,
383 LPDIRECTDRAWPALETTE pPalette
)
389 Main_DDrawSurface_SetPriority (LPDIRECTDRAWSURFACE7 iface
,
396 Main_DDrawSurface_SetPrivateData (LPDIRECTDRAWSURFACE7 iface
,
397 REFGUID tag
, LPVOID pData
,
398 DWORD cbSize
, DWORD dwFlags
)
404 Main_DDrawSurface_UpdateOverlay (LPDIRECTDRAWSURFACE7 iface
,
406 LPDIRECTDRAWSURFACE7 pDstSurface
,
407 LPRECT pDstRect
, DWORD dwFlags
,
413 /* MSDN: "not currently implemented." */
415 Main_DDrawSurface_UpdateOverlayDisplay (LPDIRECTDRAWSURFACE7 iface
,
421 HRESULT WINAPI
Main_DDrawSurface_UpdateOverlayZOrder (LPDIRECTDRAWSURFACE7 iface
,
422 DWORD dwFlags
, LPDIRECTDRAWSURFACE7 pDDSRef
)
427 IDirectDrawSurface7Vtbl DirectDrawSurface7_Vtable
=
429 Main_DDrawSurface_QueryInterface
,
430 Main_DDrawSurface_AddRef
,
431 Main_DDrawSurface_Release
,
432 Main_DDrawSurface_AddAttachedSurface
,
433 Main_DDrawSurface_AddOverlayDirtyRect
,
434 Main_DDrawSurface_Blt
,
435 Main_DDrawSurface_BltBatch
,
436 Main_DDrawSurface_BltFast
,
437 Main_DDrawSurface_DeleteAttachedSurface
,
438 Main_DDrawSurface_EnumAttachedSurfaces
,
439 Main_DDrawSurface_EnumOverlayZOrders
,
440 Main_DDrawSurface_Flip
,
441 Main_DDrawSurface_GetAttachedSurface
,
442 Main_DDrawSurface_GetBltStatus
,
443 Main_DDrawSurface_GetCaps
,
444 Main_DDrawSurface_GetClipper
,
445 Main_DDrawSurface_GetColorKey
,
446 Main_DDrawSurface_GetDC
,
447 Main_DDrawSurface_GetFlipStatus
,
448 Main_DDrawSurface_GetOverlayPosition
,
449 Main_DDrawSurface_GetPalette
,
450 Main_DDrawSurface_GetPixelFormat
,
451 Main_DDrawSurface_GetSurfaceDesc
,
452 Main_DDrawSurface_Initialize
,
453 Main_DDrawSurface_IsLost
,
454 Main_DDrawSurface_Lock
,
455 Main_DDrawSurface_ReleaseDC
,
456 Main_DDrawSurface_Restore
,
457 Main_DDrawSurface_SetClipper
,
458 Main_DDrawSurface_SetColorKey
,
459 Main_DDrawSurface_SetOverlayPosition
,
460 Main_DDrawSurface_SetPalette
,
461 Main_DDrawSurface_Unlock
,
462 Main_DDrawSurface_UpdateOverlay
,
463 Main_DDrawSurface_UpdateOverlayDisplay
,
464 Main_DDrawSurface_UpdateOverlayZOrder