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
;
22 This
->owner
= (IDirectDrawImpl
*)pDD
;
24 /************ fill the discription of our primary surface ***********************/
26 memset (&ddsd
, 0, sizeof(DDSURFACEDESC
));
27 ddsd
.dwSize
= sizeof(DDSURFACEDESC
);
29 /* FIXME Fill the rest from ddsd2 to ddsd */
31 RtlCopyMemory(&ddsd
.ddckCKDestBlt
,&pDDSD2
->ddckCKDestBlt
,sizeof(ddsd
.ddckCKDestBlt
));
32 RtlCopyMemory(&ddsd
.ddckCKDestOverlay
,&pDDSD2
->ddckCKDestOverlay
,sizeof(ddsd
.ddckCKDestOverlay
));
33 RtlCopyMemory(&ddsd
.ddckCKSrcBlt
,&pDDSD2
->ddckCKSrcBlt
,sizeof(ddsd
.ddckCKSrcBlt
));
34 RtlCopyMemory(&ddsd
.ddckCKSrcOverlay
,&pDDSD2
->ddckCKSrcOverlay
,sizeof(ddsd
.ddckCKSrcOverlay
));
35 RtlCopyMemory(&ddsd
.ddpfPixelFormat
,&pDDSD2
->ddpfPixelFormat
,sizeof(ddsd
.ddpfPixelFormat
));
36 RtlCopyMemory(&ddsd
.ddsCaps
,&pDDSD2
->ddsCaps
,sizeof(ddsd
.ddsCaps
));
38 ddsd
.dwAlphaBitDepth
= pDDSD2
->dwAlphaBitDepth
;
39 ddsd
.dwBackBufferCount
= pDDSD2
->dwBackBufferCount
;
40 ddsd
.dwFlags
= pDDSD2
->dwFlags
;
41 ddsd
.dwHeight
= pDDSD2
->dwHeight
;
42 /* FIXME ddsd.dwLinearSize = pDDSD2->dwLinearSize; Problem with our header for dx */
43 ddsd
.dwMipMapCount
= pDDSD2
->dwMipMapCount
;
44 ddsd
.dwRefreshRate
= pDDSD2
->dwRefreshRate
;
45 ddsd
.dwReserved
= pDDSD2
->dwReserved
;
46 ddsd
.dwWidth
= pDDSD2
->dwWidth
;
47 /* FIXME ddsd.dwZBufferBitDepth where in pDDSD2 */
48 /* FIXME ddsd.lPitch = pDDSD2->lPitch; Problem with our header for dx */
49 ddsd
.lpSurface
= pDDSD2
->lpSurface
;
54 /************ Test see if we can Create Surface ***********************/
55 if (This
->owner
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
)
57 /* can the driver create the surface */
58 DDHAL_CANCREATESURFACEDATA CanCreateData
;
59 memset(&CanCreateData
, 0, sizeof(DDHAL_CANCREATESURFACEDATA
));
60 CanCreateData
.lpDD
= &This
->owner
->DirectDrawGlobal
;
61 CanCreateData
.lpDDSurfaceDesc
= (LPDDSURFACEDESC
)&ddsd
;
63 if (This
->owner
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.CanCreateSurface(&CanCreateData
) == DDHAL_DRIVER_NOTHANDLED
)
64 return DDERR_INVALIDPARAMS
;
66 if(CanCreateData
.ddRVal
!= DD_OK
)
67 return CanCreateData
.ddRVal
;
71 /************ Create Surface ***********************/
73 /* FIXME we are skipping filling in some data, I do not care for now */
75 LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal
= &This
->owner
->DirectDrawGlobal
;
76 ddsd
.dwFlags
= DDSD_CAPS
;
77 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_PRIMARYSURFACE
;
79 /* surface global struct */
80 memset(&This
->Global
, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL
));
81 This
->Global
.lpDD
= &This
->owner
->DirectDrawGlobal
;
82 This
->Global
.wHeight
= This
->owner
->DirectDrawGlobal
.vmiData
.dwDisplayHeight
;
83 This
->Global
.wWidth
= This
->owner
->DirectDrawGlobal
.vmiData
.dwDisplayWidth
;
84 This
->Global
.dwLinearSize
= This
->owner
->DirectDrawGlobal
.vmiData
.lDisplayPitch
;
87 /* surface more struct */
88 memset(&This
->More
, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE
));
89 This
->More
.dwSize
= sizeof(DDRAWI_DDRAWSURFACE_MORE
);
91 /* surface local struct */
93 memset(&This
->Local
, 0, sizeof(DDRAWI_DDRAWSURFACE_LCL
));
94 This
->Local
.lpGbl
= &This
->Global
;
95 This
->Local
.lpSurfMore
= &This
->More
;
97 /* FIXME do a memcopy */
98 This
->Local
.ddsCaps
= *(DDSCAPS
*)&ddsd
.ddsCaps
;
100 /* for the double pointer below */
101 DDRAWI_DDRAWSURFACE_LCL
*pLocal
[2];
102 pLocal
[0] = &This
->Local
;
105 /* the parameter struct */
106 DDHAL_CREATESURFACEDATA CreateData
;
107 memset(&CreateData
, 0, sizeof(DDHAL_CREATESURFACEDATA
));
108 CreateData
.lpDD
= pDirectDrawGlobal
;
109 CreateData
.lpDDSurfaceDesc
= (LPDDSURFACEDESC
) &ddsd
;
110 CreateData
.dwSCnt
= 1;
111 CreateData
.lplpSList
= pLocal
;
112 CreateData
.ddRVal
= DD_FALSE
;
115 /* this is the call we were waiting for */
116 if(This
->owner
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.CreateSurface(&CreateData
) == DDHAL_DRIVER_NOTHANDLED
)
117 return DDERR_INVALIDPARAMS
;
119 /* FIXME remove the if and debug string*/
120 if(CreateData
.ddRVal
!= DD_OK
)
121 return CreateData
.ddRVal
;
123 OutputDebugString(L
"This does hit By Ati Readon but not for nvida :( ");
124 OutputDebugString(L
"Yet ;)");
129 ULONG WINAPI
Main_DDrawSurface_AddRef(LPDIRECTDRAWSURFACE7 iface
)
131 IDirectDrawSurfaceImpl
* This
= (IDirectDrawSurfaceImpl
*)iface
;
133 return InterlockedIncrement((PLONG
)&This
->owner
->DirectDrawGlobal
.dsList
->dwIntRefCnt
);
136 ULONG WINAPI
Main_DDrawSurface_Release(LPDIRECTDRAWSURFACE7 iface
)
138 IDirectDrawSurfaceImpl
* This
= (IDirectDrawSurfaceImpl
*)iface
;
139 ULONG ref
= InterlockedDecrement((PLONG
)&This
->owner
->DirectDrawGlobal
.dsList
->dwIntRefCnt
);
142 HeapFree(GetProcessHeap(), 0, This
);
150 Main_DDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE7 iface
, REFIID riid
,
153 return E_NOINTERFACE
;
156 HRESULT WINAPI
Main_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface
, LPRECT rdst
,
157 LPDIRECTDRAWSURFACE7 src
, LPRECT rsrc
, DWORD dwFlags
, LPDDBLTFX lpbltfx
)
159 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
163 if (This
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.dwFlags
& DDHAL_CB32_FLIPTOGDISURFACE
)
165 return Hal_DDrawSurface_Blt( iface
, rdst
, src
, rsrc
, dwFlags
, lpbltfx
);
168 return Hel_DDrawSurface_Blt( iface
, rdst
, src
, rsrc
, dwFlags
, lpbltfx
);
172 HRESULT WINAPI
Main_DDrawSurface_Lock (LPDIRECTDRAWSURFACE7 iface
, LPRECT prect
,
173 LPDDSURFACEDESC2 pDDSD
, DWORD flags
, HANDLE event
)
178 HRESULT WINAPI
Main_DDrawSurface_Unlock (LPDIRECTDRAWSURFACE7 iface
, LPRECT pRect
)
184 Main_DDrawSurface_AddAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
185 LPDIRECTDRAWSURFACE7 pAttach
)
190 /* MSDN: "not currently implemented." */
192 Main_DDrawSurface_AddOverlayDirtyRect(LPDIRECTDRAWSURFACE7 iface
,
199 Main_DDrawSurface_BltFast(LPDIRECTDRAWSURFACE7 iface
, DWORD dstx
,
200 DWORD dsty
, LPDIRECTDRAWSURFACE7 src
,
201 LPRECT rsrc
, DWORD trans
)
207 Main_DDrawSurface_Restore(LPDIRECTDRAWSURFACE7 iface
)
212 /* MSDN: "not currently implemented." */
214 Main_DDrawSurface_BltBatch(LPDIRECTDRAWSURFACE7 iface
,
215 LPDDBLTBATCH pBatch
, DWORD dwCount
,
222 Main_DDrawSurface_ChangeUniquenessValue(LPDIRECTDRAWSURFACE7 iface
)
228 Main_DDrawSurface_DeleteAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
230 LPDIRECTDRAWSURFACE7 pAttach
)
236 Main_DDrawSurface_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE7 iface
,
238 LPDDENUMSURFACESCALLBACK7 cb
)
244 Main_DDrawSurface_EnumOverlayZOrders(LPDIRECTDRAWSURFACE7 iface
,
245 DWORD dwFlags
, LPVOID context
,
246 LPDDENUMSURFACESCALLBACK7 cb
)
252 Main_DDrawSurface_Flip(LPDIRECTDRAWSURFACE7 iface
,
253 LPDIRECTDRAWSURFACE7 override
, DWORD dwFlags
)
259 Main_DDrawSurface_FreePrivateData(LPDIRECTDRAWSURFACE7 iface
, REFGUID tag
)
265 Main_DDrawSurface_GetAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
267 LPDIRECTDRAWSURFACE7
* ppSurface
)
273 Main_DDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
279 Main_DDrawSurface_GetCaps(LPDIRECTDRAWSURFACE7 iface
, LPDDSCAPS2 pCaps
)
285 Main_DDrawSurface_GetClipper(LPDIRECTDRAWSURFACE7 iface
,
286 LPDIRECTDRAWCLIPPER
* ppClipper
)
292 Main_DDrawSurface_GetColorKey(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
,
299 Main_DDrawSurface_GetDC(LPDIRECTDRAWSURFACE7 iface
, HDC
*phDC
)
305 Main_DDrawSurface_GetDDInterface(LPDIRECTDRAWSURFACE7 iface
, LPVOID
* pDD
)
310 Main_DDrawSurface_GetFlipStatus(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
316 Main_DDrawSurface_GetLOD(LPDIRECTDRAWSURFACE7 iface
, LPDWORD pdwMaxLOD
)
322 Main_DDrawSurface_GetOverlayPosition(LPDIRECTDRAWSURFACE7 iface
,
323 LPLONG pX
, LPLONG pY
)
328 Main_DDrawSurface_GetPalette(LPDIRECTDRAWSURFACE7 iface
,
329 LPDIRECTDRAWPALETTE
* ppPalette
)
335 Main_DDrawSurface_GetPixelFormat(LPDIRECTDRAWSURFACE7 iface
,
336 LPDDPIXELFORMAT pDDPixelFormat
)
342 Main_DDrawSurface_GetPriority(LPDIRECTDRAWSURFACE7 iface
,
349 Main_DDrawSurface_GetPrivateData(LPDIRECTDRAWSURFACE7 iface
,
350 REFGUID tag
, LPVOID pBuffer
,
351 LPDWORD pcbBufferSize
)
357 Main_DDrawSurface_GetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface
,
358 LPDDSURFACEDESC2 pDDSD
)
364 Main_DDrawSurface_GetUniquenessValue(LPDIRECTDRAWSURFACE7 iface
,
371 Main_DDrawSurface_IsLost(LPDIRECTDRAWSURFACE7 iface
)
377 Main_DDrawSurface_PageLock(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
383 Main_DDrawSurface_PageUnlock(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
389 Main_DDrawSurface_ReleaseDC(LPDIRECTDRAWSURFACE7 iface
, HDC hDC
)
395 Main_DDrawSurface_SetClipper (LPDIRECTDRAWSURFACE7 iface
,
396 LPDIRECTDRAWCLIPPER pDDClipper
)
402 Main_DDrawSurface_SetColorKey (LPDIRECTDRAWSURFACE7 iface
,
403 DWORD dwFlags
, LPDDCOLORKEY pCKey
)
409 Main_DDrawSurface_SetLOD (LPDIRECTDRAWSURFACE7 iface
, DWORD dwMaxLOD
)
415 Main_DDrawSurface_SetOverlayPosition (LPDIRECTDRAWSURFACE7 iface
,
422 Main_DDrawSurface_SetPalette (LPDIRECTDRAWSURFACE7 iface
,
423 LPDIRECTDRAWPALETTE pPalette
)
429 Main_DDrawSurface_SetPriority (LPDIRECTDRAWSURFACE7 iface
,
436 Main_DDrawSurface_SetPrivateData (LPDIRECTDRAWSURFACE7 iface
,
437 REFGUID tag
, LPVOID pData
,
438 DWORD cbSize
, DWORD dwFlags
)
444 Main_DDrawSurface_UpdateOverlay (LPDIRECTDRAWSURFACE7 iface
,
446 LPDIRECTDRAWSURFACE7 pDstSurface
,
447 LPRECT pDstRect
, DWORD dwFlags
,
453 /* MSDN: "not currently implemented." */
455 Main_DDrawSurface_UpdateOverlayDisplay (LPDIRECTDRAWSURFACE7 iface
,
461 HRESULT WINAPI
Main_DDrawSurface_UpdateOverlayZOrder (LPDIRECTDRAWSURFACE7 iface
,
462 DWORD dwFlags
, LPDIRECTDRAWSURFACE7 pDDSRef
)
467 IDirectDrawSurface7Vtbl DirectDrawSurface7_Vtable
=
469 Main_DDrawSurface_QueryInterface
,
470 Main_DDrawSurface_AddRef
,
471 Main_DDrawSurface_Release
,
472 Main_DDrawSurface_AddAttachedSurface
,
473 Main_DDrawSurface_AddOverlayDirtyRect
,
474 Main_DDrawSurface_Blt
,
475 Main_DDrawSurface_BltBatch
,
476 Main_DDrawSurface_BltFast
,
477 Main_DDrawSurface_DeleteAttachedSurface
,
478 Main_DDrawSurface_EnumAttachedSurfaces
,
479 Main_DDrawSurface_EnumOverlayZOrders
,
480 Main_DDrawSurface_Flip
,
481 Main_DDrawSurface_GetAttachedSurface
,
482 Main_DDrawSurface_GetBltStatus
,
483 Main_DDrawSurface_GetCaps
,
484 Main_DDrawSurface_GetClipper
,
485 Main_DDrawSurface_GetColorKey
,
486 Main_DDrawSurface_GetDC
,
487 Main_DDrawSurface_GetFlipStatus
,
488 Main_DDrawSurface_GetOverlayPosition
,
489 Main_DDrawSurface_GetPalette
,
490 Main_DDrawSurface_GetPixelFormat
,
491 Main_DDrawSurface_GetSurfaceDesc
,
492 Main_DDrawSurface_Initialize
,
493 Main_DDrawSurface_IsLost
,
494 Main_DDrawSurface_Lock
,
495 Main_DDrawSurface_ReleaseDC
,
496 Main_DDrawSurface_Restore
,
497 Main_DDrawSurface_SetClipper
,
498 Main_DDrawSurface_SetColorKey
,
499 Main_DDrawSurface_SetOverlayPosition
,
500 Main_DDrawSurface_SetPalette
,
501 Main_DDrawSurface_Unlock
,
502 Main_DDrawSurface_UpdateOverlay
,
503 Main_DDrawSurface_UpdateOverlayDisplay
,
504 Main_DDrawSurface_UpdateOverlayZOrder