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
)
17 IDirectDrawSurfaceImpl
* This
= (IDirectDrawSurfaceImpl
*)iface
;
20 return DDERR_ALREADYINITIALIZED
;
22 if(sizeof(DDSURFACEDESC2
) != pDDSD
->dwSize
)
23 return DDERR_UNSUPPORTED
;
25 if(!(pDDSD
->dwFlags
& DDSD_CAPS
))
26 return DDERR_INVALIDPARAMS
;
28 This
->owner
= (IDirectDrawImpl
*)pDD
;
30 /* can the driver create the surface */
31 DDHAL_CANCREATESURFACEDATA CanCreateData
;
32 memset(&CanCreateData
, 0, sizeof(DDHAL_CANCREATESURFACEDATA
));
33 CanCreateData
.lpDD
= &This
->owner
->DirectDrawGlobal
;
34 CanCreateData
.lpDDSurfaceDesc
= (DDSURFACEDESC
*)pDDSD
;
35 CanCreateData
.CanCreateSurface
= This
->owner
->HalInfo
.lpDDCallbacks
->CanCreateSurface
;
37 if (CanCreateData
.CanCreateSurface(&CanCreateData
) == DDHAL_DRIVER_NOTHANDLED
)
38 return DDERR_INVALIDPARAMS
;
40 if(CanCreateData
.ddRVal
!= DD_OK
)
41 return CanCreateData
.ddRVal
;
43 /* surface global struct */
44 DDRAWI_DDRAWSURFACE_GBL Global
;
45 memset(&Global
, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL
));
46 Global
.lpDD
= &This
->owner
->DirectDrawGlobal
;
47 Global
.wHeight
= This
->owner
->Height
;
48 Global
.wWidth
= This
->owner
->Width
;
49 Global
.dwLinearSize
= Global
.wWidth
* This
->owner
->Bpp
/8;
51 /* surface more struct */
52 DDRAWI_DDRAWSURFACE_MORE More
;
53 memset(&More
, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE
));
54 More
.dwSize
= sizeof(DDRAWI_DDRAWSURFACE_MORE
);
56 /* surface local struct */
57 DDRAWI_DDRAWSURFACE_LCL Local
;
58 memset(&Local
, 0, sizeof(DDRAWI_DDRAWSURFACE_LCL
));
59 Local
.lpGbl
= &Global
;
60 Local
.lpSurfMore
= &More
;
61 Local
.ddsCaps
= *(DDSCAPS
*)&pDDSD
->ddsCaps
;
63 /* we need to set some flags if we create the primary surface */
64 if(pDDSD
->ddsCaps
.dwCaps
== DDSCAPS_PRIMARYSURFACE
)
66 Local
.dwFlags
|= DDRAWISURF_FRONTBUFFER
;
67 Global
.dwGlobalFlags
|= DDRAWISURFGBL_ISGDISURFACE
;
70 /* for the double pointer below */
71 DDRAWI_DDRAWSURFACE_LCL
*pLocal
[2];
73 pLocal
[1] = NULL
; // we need this one for bad written drivers
75 /* the parameter struct */
76 DDHAL_CREATESURFACEDATA CreateData
;
77 memset(&CreateData
, 0, sizeof(DDHAL_CREATESURFACEDATA
));
78 CreateData
.lpDD
= &This
->owner
->DirectDrawGlobal
;
79 CreateData
.lpDDSurfaceDesc
= (DDSURFACEDESC
*)pDDSD
;
80 CreateData
.dwSCnt
= 1;
81 CreateData
.lplpSList
= pLocal
;
82 CreateData
.CreateSurface
= This
->owner
->HalInfo
.lpDDCallbacks
->CreateSurface
;
84 /* this is the call we were waiting for */
85 if(CreateData
.CreateSurface(&CreateData
) == DDHAL_DRIVER_NOTHANDLED
)
86 return DDERR_INVALIDPARAMS
;
88 if(CreateData
.ddRVal
!= DD_OK
)
89 return CreateData
.ddRVal
;
91 OutputDebugString(L
"This does not get hit :( ");
92 OutputDebugString(L
"Yet ;)");
97 ULONG WINAPI
Main_DDrawSurface_AddRef(LPDIRECTDRAWSURFACE7 iface
)
99 IDirectDrawSurfaceImpl
* This
= (IDirectDrawSurfaceImpl
*)iface
;
100 return InterlockedIncrement(&This
->ref
);
103 ULONG WINAPI
Main_DDrawSurface_Release(LPDIRECTDRAWSURFACE7 iface
)
105 IDirectDrawSurfaceImpl
* This
= (IDirectDrawSurfaceImpl
*)iface
;
106 ULONG ref
= InterlockedDecrement(&This
->ref
);
109 HeapFree(GetProcessHeap(), 0, This
);
117 Main_DDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE7 iface
, REFIID riid
,
120 return E_NOINTERFACE
;
123 HRESULT WINAPI
Main_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface
, LPRECT rdst
,
124 LPDIRECTDRAWSURFACE7 src
, LPRECT rsrc
, DWORD dwFlags
, LPDDBLTFX lpbltfx
)
129 HRESULT WINAPI
Main_DDrawSurface_Lock (LPDIRECTDRAWSURFACE7 iface
, LPRECT prect
,
130 LPDDSURFACEDESC2 pDDSD
, DWORD flags
, HANDLE event
)
135 HRESULT WINAPI
Main_DDrawSurface_Unlock (LPDIRECTDRAWSURFACE7 iface
, LPRECT pRect
)
141 Main_DDrawSurface_AddAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
142 LPDIRECTDRAWSURFACE7 pAttach
)
147 /* MSDN: "not currently implemented." */
149 Main_DDrawSurface_AddOverlayDirtyRect(LPDIRECTDRAWSURFACE7 iface
,
156 Main_DDrawSurface_BltFast(LPDIRECTDRAWSURFACE7 iface
, DWORD dstx
,
157 DWORD dsty
, LPDIRECTDRAWSURFACE7 src
,
158 LPRECT rsrc
, DWORD trans
)
164 Main_DDrawSurface_Restore(LPDIRECTDRAWSURFACE7 iface
)
169 /* MSDN: "not currently implemented." */
171 Main_DDrawSurface_BltBatch(LPDIRECTDRAWSURFACE7 iface
,
172 LPDDBLTBATCH pBatch
, DWORD dwCount
,
179 Main_DDrawSurface_ChangeUniquenessValue(LPDIRECTDRAWSURFACE7 iface
)
185 Main_DDrawSurface_DeleteAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
187 LPDIRECTDRAWSURFACE7 pAttach
)
193 Main_DDrawSurface_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE7 iface
,
195 LPDDENUMSURFACESCALLBACK7 cb
)
201 Main_DDrawSurface_EnumOverlayZOrders(LPDIRECTDRAWSURFACE7 iface
,
202 DWORD dwFlags
, LPVOID context
,
203 LPDDENUMSURFACESCALLBACK7 cb
)
209 Main_DDrawSurface_Flip(LPDIRECTDRAWSURFACE7 iface
,
210 LPDIRECTDRAWSURFACE7 override
, DWORD dwFlags
)
216 Main_DDrawSurface_FreePrivateData(LPDIRECTDRAWSURFACE7 iface
, REFGUID tag
)
222 Main_DDrawSurface_GetAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
224 LPDIRECTDRAWSURFACE7
* ppSurface
)
230 Main_DDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
236 Main_DDrawSurface_GetCaps(LPDIRECTDRAWSURFACE7 iface
, LPDDSCAPS2 pCaps
)
242 Main_DDrawSurface_GetClipper(LPDIRECTDRAWSURFACE7 iface
,
243 LPDIRECTDRAWCLIPPER
* ppClipper
)
249 Main_DDrawSurface_GetColorKey(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
,
256 Main_DDrawSurface_GetDC(LPDIRECTDRAWSURFACE7 iface
, HDC
*phDC
)
262 Main_DDrawSurface_GetDDInterface(LPDIRECTDRAWSURFACE7 iface
, LPVOID
* pDD
)
267 Main_DDrawSurface_GetFlipStatus(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
273 Main_DDrawSurface_GetLOD(LPDIRECTDRAWSURFACE7 iface
, LPDWORD pdwMaxLOD
)
279 Main_DDrawSurface_GetOverlayPosition(LPDIRECTDRAWSURFACE7 iface
,
280 LPLONG pX
, LPLONG pY
)
285 Main_DDrawSurface_GetPalette(LPDIRECTDRAWSURFACE7 iface
,
286 LPDIRECTDRAWPALETTE
* ppPalette
)
292 Main_DDrawSurface_GetPixelFormat(LPDIRECTDRAWSURFACE7 iface
,
293 LPDDPIXELFORMAT pDDPixelFormat
)
299 Main_DDrawSurface_GetPriority(LPDIRECTDRAWSURFACE7 iface
,
306 Main_DDrawSurface_GetPrivateData(LPDIRECTDRAWSURFACE7 iface
,
307 REFGUID tag
, LPVOID pBuffer
,
308 LPDWORD pcbBufferSize
)
314 Main_DDrawSurface_GetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface
,
315 LPDDSURFACEDESC2 pDDSD
)
321 Main_DDrawSurface_GetUniquenessValue(LPDIRECTDRAWSURFACE7 iface
,
328 Main_DDrawSurface_IsLost(LPDIRECTDRAWSURFACE7 iface
)
334 Main_DDrawSurface_PageLock(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
340 Main_DDrawSurface_PageUnlock(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
346 Main_DDrawSurface_ReleaseDC(LPDIRECTDRAWSURFACE7 iface
, HDC hDC
)
352 Main_DDrawSurface_SetClipper (LPDIRECTDRAWSURFACE7 iface
,
353 LPDIRECTDRAWCLIPPER pDDClipper
)
359 Main_DDrawSurface_SetColorKey (LPDIRECTDRAWSURFACE7 iface
,
360 DWORD dwFlags
, LPDDCOLORKEY pCKey
)
366 Main_DDrawSurface_SetLOD (LPDIRECTDRAWSURFACE7 iface
, DWORD dwMaxLOD
)
372 Main_DDrawSurface_SetOverlayPosition (LPDIRECTDRAWSURFACE7 iface
,
379 Main_DDrawSurface_SetPalette (LPDIRECTDRAWSURFACE7 iface
,
380 LPDIRECTDRAWPALETTE pPalette
)
386 Main_DDrawSurface_SetPriority (LPDIRECTDRAWSURFACE7 iface
,
393 Main_DDrawSurface_SetPrivateData (LPDIRECTDRAWSURFACE7 iface
,
394 REFGUID tag
, LPVOID pData
,
395 DWORD cbSize
, DWORD dwFlags
)
401 Main_DDrawSurface_UpdateOverlay (LPDIRECTDRAWSURFACE7 iface
,
403 LPDIRECTDRAWSURFACE7 pDstSurface
,
404 LPRECT pDstRect
, DWORD dwFlags
,
410 /* MSDN: "not currently implemented." */
412 Main_DDrawSurface_UpdateOverlayDisplay (LPDIRECTDRAWSURFACE7 iface
,
418 HRESULT WINAPI
Main_DDrawSurface_UpdateOverlayZOrder (LPDIRECTDRAWSURFACE7 iface
,
419 DWORD dwFlags
, LPDIRECTDRAWSURFACE7 pDDSRef
)
424 IDirectDrawSurface7Vtbl DirectDrawSurface7_Vtable
=
426 Main_DDrawSurface_QueryInterface
,
427 Main_DDrawSurface_AddRef
,
428 Main_DDrawSurface_Release
,
429 Main_DDrawSurface_AddAttachedSurface
,
430 Main_DDrawSurface_AddOverlayDirtyRect
,
431 Main_DDrawSurface_Blt
,
432 Main_DDrawSurface_BltBatch
,
433 Main_DDrawSurface_BltFast
,
434 Main_DDrawSurface_DeleteAttachedSurface
,
435 Main_DDrawSurface_EnumAttachedSurfaces
,
436 Main_DDrawSurface_EnumOverlayZOrders
,
437 Main_DDrawSurface_Flip
,
438 Main_DDrawSurface_GetAttachedSurface
,
439 Main_DDrawSurface_GetBltStatus
,
440 Main_DDrawSurface_GetCaps
,
441 Main_DDrawSurface_GetClipper
,
442 Main_DDrawSurface_GetColorKey
,
443 Main_DDrawSurface_GetDC
,
444 Main_DDrawSurface_GetFlipStatus
,
445 Main_DDrawSurface_GetOverlayPosition
,
446 Main_DDrawSurface_GetPalette
,
447 Main_DDrawSurface_GetPixelFormat
,
448 Main_DDrawSurface_GetSurfaceDesc
,
449 Main_DDrawSurface_Initialize
,
450 Main_DDrawSurface_IsLost
,
451 Main_DDrawSurface_Lock
,
452 Main_DDrawSurface_ReleaseDC
,
453 Main_DDrawSurface_Restore
,
454 Main_DDrawSurface_SetClipper
,
455 Main_DDrawSurface_SetColorKey
,
456 Main_DDrawSurface_SetOverlayPosition
,
457 Main_DDrawSurface_SetPalette
,
458 Main_DDrawSurface_Unlock
,
459 Main_DDrawSurface_UpdateOverlay
,
460 Main_DDrawSurface_UpdateOverlayDisplay
,
461 Main_DDrawSurface_UpdateOverlayZOrder