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 pDDSD2
)
16 IDirectDrawSurfaceImpl
* This
= (IDirectDrawSurfaceImpl
*)iface
;
18 if(sizeof(DDSURFACEDESC2
) != pDDSD2
->dwSize
)
19 return DDERR_UNSUPPORTED
;
21 This
->owner
= (IDirectDrawImpl
*)pDD
;
23 /************ fill the discription of our primary surface ***********************/
24 memset (&ddsd
, 0, sizeof(DDSURFACEDESC
));
25 ddsd
.dwSize
= sizeof(DDSURFACEDESC
);
27 RtlCopyMemory(&ddsd
.ddckCKDestBlt
,&pDDSD2
->ddckCKDestBlt
,sizeof(ddsd
.ddckCKDestBlt
));
28 RtlCopyMemory(&ddsd
.ddckCKDestOverlay
,&pDDSD2
->ddckCKDestOverlay
,sizeof(ddsd
.ddckCKDestOverlay
));
29 RtlCopyMemory(&ddsd
.ddckCKSrcBlt
,&pDDSD2
->ddckCKSrcBlt
,sizeof(ddsd
.ddckCKSrcBlt
));
30 RtlCopyMemory(&ddsd
.ddckCKSrcOverlay
,&pDDSD2
->ddckCKSrcOverlay
,sizeof(ddsd
.ddckCKSrcOverlay
));
31 RtlCopyMemory(&ddsd
.ddpfPixelFormat
,&pDDSD2
->ddpfPixelFormat
,sizeof(ddsd
.ddpfPixelFormat
));
32 RtlCopyMemory(&ddsd
.ddsCaps
,&pDDSD2
->ddsCaps
,sizeof(ddsd
.ddsCaps
));
34 ddsd
.dwAlphaBitDepth
= pDDSD2
->dwAlphaBitDepth
;
35 ddsd
.dwBackBufferCount
= pDDSD2
->dwBackBufferCount
;
36 ddsd
.dwFlags
= pDDSD2
->dwFlags
;
37 ddsd
.dwHeight
= pDDSD2
->dwHeight
;
38 ddsd
.dwLinearSize
= pDDSD2
->dwLinearSize
;
39 ddsd
.dwMipMapCount
= pDDSD2
->dwMipMapCount
;
40 ddsd
.dwRefreshRate
= pDDSD2
->dwRefreshRate
;
41 ddsd
.dwReserved
= pDDSD2
->dwReserved
;
42 ddsd
.dwWidth
= pDDSD2
->dwWidth
;
43 ddsd
.lPitch
= pDDSD2
->lPitch
;
44 ddsd
.lpSurface
= pDDSD2
->lpSurface
;
46 /************ Test see if we can Create Surface ***********************/
47 if (This
->owner
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
)
49 /* can the driver create the surface */
50 DDHAL_CANCREATESURFACEDATA CanCreateData
;
51 memset(&CanCreateData
, 0, sizeof(DDHAL_CANCREATESURFACEDATA
));
52 CanCreateData
.lpDD
= &This
->owner
->DirectDrawGlobal
;
53 CanCreateData
.lpDDSurfaceDesc
= (LPDDSURFACEDESC
)&ddsd
;
55 if (This
->owner
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.CanCreateSurface(&CanCreateData
) == DDHAL_DRIVER_NOTHANDLED
)
56 return DDERR_INVALIDPARAMS
;
58 if(CanCreateData
.ddRVal
!= DD_OK
)
59 return CanCreateData
.ddRVal
;
62 /************ Create Surface ***********************/
64 /* FIXME we are skipping filling in some data, I do not care for now */
66 LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal
= &This
->owner
->DirectDrawGlobal
;
67 ddsd
.dwFlags
= DDSD_CAPS
;
68 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_PRIMARYSURFACE
;
70 /* surface global struct */
71 memset(&This
->Global
, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL
));
72 This
->Global
.lpDD
= &This
->owner
->DirectDrawGlobal
;
73 This
->Global
.wHeight
= This
->owner
->DirectDrawGlobal
.vmiData
.dwDisplayHeight
;
74 This
->Global
.wWidth
= This
->owner
->DirectDrawGlobal
.vmiData
.dwDisplayWidth
;
75 This
->Global
.dwLinearSize
= This
->owner
->DirectDrawGlobal
.vmiData
.lDisplayPitch
;
78 /* surface more struct */
79 memset(&This
->More
, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE
));
80 This
->More
.dwSize
= sizeof(DDRAWI_DDRAWSURFACE_MORE
);
82 /* surface local struct */
84 memset(&This
->Local
, 0, sizeof(DDRAWI_DDRAWSURFACE_LCL
));
85 This
->Local
.lpGbl
= &This
->Global
;
86 This
->Local
.lpSurfMore
= &This
->More
;
88 /* FIXME do a memcopy */
89 This
->Local
.ddsCaps
= *(DDSCAPS
*)&ddsd
.ddsCaps
;
91 /* for the double pointer below */
92 DDRAWI_DDRAWSURFACE_LCL
*pLocal
[2];
93 pLocal
[0] = &This
->Local
;
96 /* the parameter struct */
97 DDHAL_CREATESURFACEDATA CreateData
;
98 memset(&CreateData
, 0, sizeof(DDHAL_CREATESURFACEDATA
));
99 CreateData
.lpDD
= pDirectDrawGlobal
;
100 CreateData
.lpDDSurfaceDesc
= (LPDDSURFACEDESC
) &ddsd
;
101 CreateData
.dwSCnt
= 1;
102 CreateData
.lplpSList
= pLocal
;
103 CreateData
.ddRVal
= DD_FALSE
;
105 /* this is the call we were waiting for */
106 if(This
->owner
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.CreateSurface(&CreateData
) == DDHAL_DRIVER_NOTHANDLED
)
107 return DDERR_INVALIDPARAMS
;
109 /* FIXME remove the if and debug string*/
110 if(CreateData
.ddRVal
!= DD_OK
)
111 return CreateData
.ddRVal
;
113 OutputDebugString(L
"This does hit By Ati Readon but not for nvida :( ");
114 OutputDebugString(L
"Yet ;)");
119 ULONG WINAPI
Main_DDrawSurface_AddRef(LPDIRECTDRAWSURFACE7 iface
)
121 IDirectDrawSurfaceImpl
* This
= (IDirectDrawSurfaceImpl
*)iface
;
123 return InterlockedIncrement((PLONG
)&This
->owner
->DirectDrawGlobal
.dsList
->dwIntRefCnt
);
126 ULONG WINAPI
Main_DDrawSurface_Release(LPDIRECTDRAWSURFACE7 iface
)
128 IDirectDrawSurfaceImpl
* This
= (IDirectDrawSurfaceImpl
*)iface
;
129 ULONG ref
= InterlockedDecrement((PLONG
)&This
->owner
->DirectDrawGlobal
.dsList
->dwIntRefCnt
);
132 HeapFree(GetProcessHeap(), 0, This
);
140 Main_DDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE7 iface
, REFIID riid
,
143 return E_NOINTERFACE
;
146 HRESULT WINAPI
Main_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface
, LPRECT rdst
,
147 LPDIRECTDRAWSURFACE7 src
, LPRECT rsrc
, DWORD dwFlags
, LPDDBLTFX lpbltfx
)
149 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
153 if (This
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.dwFlags
& DDHAL_CB32_FLIPTOGDISURFACE
)
155 return Hal_DDrawSurface_Blt( iface
, rdst
, src
, rsrc
, dwFlags
, lpbltfx
);
158 return Hel_DDrawSurface_Blt( iface
, rdst
, src
, rsrc
, dwFlags
, lpbltfx
);
162 HRESULT WINAPI
Main_DDrawSurface_Lock (LPDIRECTDRAWSURFACE7 iface
, LPRECT prect
,
163 LPDDSURFACEDESC2 pDDSD
, DWORD flags
, HANDLE event
)
168 HRESULT WINAPI
Main_DDrawSurface_Unlock (LPDIRECTDRAWSURFACE7 iface
, LPRECT pRect
)
174 Main_DDrawSurface_AddAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
175 LPDIRECTDRAWSURFACE7 pAttach
)
180 /* MSDN: "not currently implemented." */
182 Main_DDrawSurface_AddOverlayDirtyRect(LPDIRECTDRAWSURFACE7 iface
,
189 Main_DDrawSurface_BltFast(LPDIRECTDRAWSURFACE7 iface
, DWORD dstx
,
190 DWORD dsty
, LPDIRECTDRAWSURFACE7 src
,
191 LPRECT rsrc
, DWORD trans
)
197 Main_DDrawSurface_Restore(LPDIRECTDRAWSURFACE7 iface
)
202 /* MSDN: "not currently implemented." */
204 Main_DDrawSurface_BltBatch(LPDIRECTDRAWSURFACE7 iface
,
205 LPDDBLTBATCH pBatch
, DWORD dwCount
,
212 Main_DDrawSurface_ChangeUniquenessValue(LPDIRECTDRAWSURFACE7 iface
)
218 Main_DDrawSurface_DeleteAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
220 LPDIRECTDRAWSURFACE7 pAttach
)
226 Main_DDrawSurface_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE7 iface
,
228 LPDDENUMSURFACESCALLBACK7 cb
)
234 Main_DDrawSurface_EnumOverlayZOrders(LPDIRECTDRAWSURFACE7 iface
,
235 DWORD dwFlags
, LPVOID context
,
236 LPDDENUMSURFACESCALLBACK7 cb
)
242 Main_DDrawSurface_Flip(LPDIRECTDRAWSURFACE7 iface
,
243 LPDIRECTDRAWSURFACE7 override
, DWORD dwFlags
)
249 Main_DDrawSurface_FreePrivateData(LPDIRECTDRAWSURFACE7 iface
, REFGUID tag
)
255 Main_DDrawSurface_GetAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
257 LPDIRECTDRAWSURFACE7
* ppSurface
)
263 Main_DDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
269 Main_DDrawSurface_GetCaps(LPDIRECTDRAWSURFACE7 iface
, LPDDSCAPS2 pCaps
)
275 Main_DDrawSurface_GetClipper(LPDIRECTDRAWSURFACE7 iface
,
276 LPDIRECTDRAWCLIPPER
* ppClipper
)
282 Main_DDrawSurface_GetColorKey(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
,
289 Main_DDrawSurface_GetDC(LPDIRECTDRAWSURFACE7 iface
, HDC
*phDC
)
295 Main_DDrawSurface_GetDDInterface(LPDIRECTDRAWSURFACE7 iface
, LPVOID
* pDD
)
300 Main_DDrawSurface_GetFlipStatus(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
306 Main_DDrawSurface_GetLOD(LPDIRECTDRAWSURFACE7 iface
, LPDWORD pdwMaxLOD
)
312 Main_DDrawSurface_GetOverlayPosition(LPDIRECTDRAWSURFACE7 iface
,
313 LPLONG pX
, LPLONG pY
)
318 Main_DDrawSurface_GetPalette(LPDIRECTDRAWSURFACE7 iface
,
319 LPDIRECTDRAWPALETTE
* ppPalette
)
325 Main_DDrawSurface_GetPixelFormat(LPDIRECTDRAWSURFACE7 iface
,
326 LPDDPIXELFORMAT pDDPixelFormat
)
332 Main_DDrawSurface_GetPriority(LPDIRECTDRAWSURFACE7 iface
,
339 Main_DDrawSurface_GetPrivateData(LPDIRECTDRAWSURFACE7 iface
,
340 REFGUID tag
, LPVOID pBuffer
,
341 LPDWORD pcbBufferSize
)
347 Main_DDrawSurface_GetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface
,
348 LPDDSURFACEDESC2 pDDSD
)
354 Main_DDrawSurface_GetUniquenessValue(LPDIRECTDRAWSURFACE7 iface
,
361 Main_DDrawSurface_IsLost(LPDIRECTDRAWSURFACE7 iface
)
367 Main_DDrawSurface_PageLock(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
373 Main_DDrawSurface_PageUnlock(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
379 Main_DDrawSurface_ReleaseDC(LPDIRECTDRAWSURFACE7 iface
, HDC hDC
)
385 Main_DDrawSurface_SetClipper (LPDIRECTDRAWSURFACE7 iface
,
386 LPDIRECTDRAWCLIPPER pDDClipper
)
392 Main_DDrawSurface_SetColorKey (LPDIRECTDRAWSURFACE7 iface
,
393 DWORD dwFlags
, LPDDCOLORKEY pCKey
)
399 Main_DDrawSurface_SetLOD (LPDIRECTDRAWSURFACE7 iface
, DWORD dwMaxLOD
)
405 Main_DDrawSurface_SetOverlayPosition (LPDIRECTDRAWSURFACE7 iface
,
412 Main_DDrawSurface_SetPalette (LPDIRECTDRAWSURFACE7 iface
,
413 LPDIRECTDRAWPALETTE pPalette
)
419 Main_DDrawSurface_SetPriority (LPDIRECTDRAWSURFACE7 iface
,
426 Main_DDrawSurface_SetPrivateData (LPDIRECTDRAWSURFACE7 iface
,
427 REFGUID tag
, LPVOID pData
,
428 DWORD cbSize
, DWORD dwFlags
)
434 Main_DDrawSurface_UpdateOverlay (LPDIRECTDRAWSURFACE7 iface
,
436 LPDIRECTDRAWSURFACE7 pDstSurface
,
437 LPRECT pDstRect
, DWORD dwFlags
,
443 /* MSDN: "not currently implemented." */
445 Main_DDrawSurface_UpdateOverlayDisplay (LPDIRECTDRAWSURFACE7 iface
,
451 HRESULT WINAPI
Main_DDrawSurface_UpdateOverlayZOrder (LPDIRECTDRAWSURFACE7 iface
,
452 DWORD dwFlags
, LPDIRECTDRAWSURFACE7 pDDSRef
)
457 IDirectDrawSurface7Vtbl DirectDrawSurface7_Vtable
=
459 Main_DDrawSurface_QueryInterface
,
460 Main_DDrawSurface_AddRef
,
461 Main_DDrawSurface_Release
,
462 Main_DDrawSurface_AddAttachedSurface
,
463 Main_DDrawSurface_AddOverlayDirtyRect
,
464 Main_DDrawSurface_Blt
,
465 Main_DDrawSurface_BltBatch
,
466 Main_DDrawSurface_BltFast
,
467 Main_DDrawSurface_DeleteAttachedSurface
,
468 Main_DDrawSurface_EnumAttachedSurfaces
,
469 Main_DDrawSurface_EnumOverlayZOrders
,
470 Main_DDrawSurface_Flip
,
471 Main_DDrawSurface_GetAttachedSurface
,
472 Main_DDrawSurface_GetBltStatus
,
473 Main_DDrawSurface_GetCaps
,
474 Main_DDrawSurface_GetClipper
,
475 Main_DDrawSurface_GetColorKey
,
476 Main_DDrawSurface_GetDC
,
477 Main_DDrawSurface_GetFlipStatus
,
478 Main_DDrawSurface_GetOverlayPosition
,
479 Main_DDrawSurface_GetPalette
,
480 Main_DDrawSurface_GetPixelFormat
,
481 Main_DDrawSurface_GetSurfaceDesc
,
482 Main_DDrawSurface_Initialize
,
483 Main_DDrawSurface_IsLost
,
484 Main_DDrawSurface_Lock
,
485 Main_DDrawSurface_ReleaseDC
,
486 Main_DDrawSurface_Restore
,
487 Main_DDrawSurface_SetClipper
,
488 Main_DDrawSurface_SetColorKey
,
489 Main_DDrawSurface_SetOverlayPosition
,
490 Main_DDrawSurface_SetPalette
,
491 Main_DDrawSurface_Unlock
,
492 Main_DDrawSurface_UpdateOverlay
,
493 Main_DDrawSurface_UpdateOverlayDisplay
,
494 Main_DDrawSurface_UpdateOverlayZOrder