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 if(!(pDDSD2
->dwFlags
& DDSD_CAPS
))
22 return DDERR_INVALIDPARAMS
;
24 This
->owner
= (IDirectDrawImpl
*)pDD
;
26 /************ fill the discription of our primary surface ***********************/
28 memset (&ddsd
, 0, sizeof(DDSURFACEDESC
));
29 ddsd
.dwSize
= sizeof(DDSURFACEDESC
);
31 /* FIXME Fill the rest from ddsd2 to ddsd */
33 /************ Test see if we can Create Surface ***********************/
34 if (This
->owner
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
)
36 /* can the driver create the surface */
37 DDHAL_CANCREATESURFACEDATA CanCreateData
;
38 memset(&CanCreateData
, 0, sizeof(DDHAL_CANCREATESURFACEDATA
));
39 CanCreateData
.lpDD
= &This
->owner
->DirectDrawGlobal
;
40 CanCreateData
.lpDDSurfaceDesc
= (LPDDSURFACEDESC
)&ddsd
;
42 if (This
->owner
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.CanCreateSurface(&CanCreateData
) == DDHAL_DRIVER_NOTHANDLED
)
43 return DDERR_INVALIDPARAMS
;
45 if(CanCreateData
.ddRVal
!= DD_OK
)
46 return CanCreateData
.ddRVal
;
50 /************ Create Surface ***********************/
52 /* FIXME we are skipping filling in some data, I do not care for now */
54 LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal
= &This
->owner
->DirectDrawGlobal
;
55 ddsd
.dwFlags
= DDSD_CAPS
;
56 ddsd
.ddsCaps
.dwCaps
= DDSCAPS_PRIMARYSURFACE
;
58 /* surface global struct */
59 memset(&This
->Global
, 0, sizeof(DDRAWI_DDRAWSURFACE_GBL
));
60 This
->Global
.lpDD
= &This
->owner
->DirectDrawGlobal
;
61 This
->Global
.wHeight
= This
->owner
->DirectDrawGlobal
.vmiData
.dwDisplayHeight
;
62 This
->Global
.wWidth
= This
->owner
->DirectDrawGlobal
.vmiData
.dwDisplayWidth
;
63 This
->Global
.dwLinearSize
= This
->owner
->DirectDrawGlobal
.vmiData
.lDisplayPitch
;
66 /* surface more struct */
67 memset(&This
->More
, 0, sizeof(DDRAWI_DDRAWSURFACE_MORE
));
68 This
->More
.dwSize
= sizeof(DDRAWI_DDRAWSURFACE_MORE
);
70 /* surface local struct */
72 memset(&This
->Local
, 0, sizeof(DDRAWI_DDRAWSURFACE_LCL
));
73 This
->Local
.lpGbl
= &This
->Global
;
74 This
->Local
.lpSurfMore
= &This
->More
;
76 /* FIXME do a memcopy */
77 This
->Local
.ddsCaps
= *(DDSCAPS
*)&ddsd
.ddsCaps
;
79 /* for the double pointer below */
80 DDRAWI_DDRAWSURFACE_LCL
*pLocal
[2];
81 pLocal
[0] = &This
->Local
;
84 /* the parameter struct */
85 DDHAL_CREATESURFACEDATA CreateData
;
86 memset(&CreateData
, 0, sizeof(DDHAL_CREATESURFACEDATA
));
87 CreateData
.lpDD
= pDirectDrawGlobal
;
88 CreateData
.lpDDSurfaceDesc
= (LPDDSURFACEDESC
) &ddsd
;
89 CreateData
.dwSCnt
= 1;
90 CreateData
.lplpSList
= pLocal
;
91 CreateData
.ddRVal
= DD_FALSE
;
94 /* this is the call we were waiting for */
95 if(This
->owner
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.CreateSurface(&CreateData
) == DDHAL_DRIVER_NOTHANDLED
)
96 return DDERR_INVALIDPARAMS
;
98 /* FIXME remove the if and debug string*/
99 if(CreateData
.ddRVal
!= DD_OK
)
100 return CreateData
.ddRVal
;
102 OutputDebugString(L
"This does hit By Ati Readon but not for nvida :( ");
103 OutputDebugString(L
"Yet ;)");
108 ULONG WINAPI
Main_DDrawSurface_AddRef(LPDIRECTDRAWSURFACE7 iface
)
110 IDirectDrawSurfaceImpl
* This
= (IDirectDrawSurfaceImpl
*)iface
;
112 return InterlockedIncrement((PLONG
)&This
->owner
->DirectDrawGlobal
.dsList
->dwIntRefCnt
);
115 ULONG WINAPI
Main_DDrawSurface_Release(LPDIRECTDRAWSURFACE7 iface
)
117 IDirectDrawSurfaceImpl
* This
= (IDirectDrawSurfaceImpl
*)iface
;
118 ULONG ref
= InterlockedDecrement((PLONG
)&This
->owner
->DirectDrawGlobal
.dsList
->dwIntRefCnt
);
121 HeapFree(GetProcessHeap(), 0, This
);
129 Main_DDrawSurface_QueryInterface(LPDIRECTDRAWSURFACE7 iface
, REFIID riid
,
132 return E_NOINTERFACE
;
135 HRESULT WINAPI
Main_DDrawSurface_Blt(LPDIRECTDRAWSURFACE7 iface
, LPRECT rdst
,
136 LPDIRECTDRAWSURFACE7 src
, LPRECT rsrc
, DWORD dwFlags
, LPDDBLTFX lpbltfx
)
138 IDirectDrawImpl
* This
= (IDirectDrawImpl
*)iface
;
142 if (This
->DirectDrawGlobal
.lpDDCBtmp
->HALDD
.dwFlags
& DDHAL_CB32_FLIPTOGDISURFACE
)
144 return Hal_DDrawSurface_Blt( iface
, rdst
, src
, rsrc
, dwFlags
, lpbltfx
);
147 return Hel_DDrawSurface_Blt( iface
, rdst
, src
, rsrc
, dwFlags
, lpbltfx
);
151 HRESULT WINAPI
Main_DDrawSurface_Lock (LPDIRECTDRAWSURFACE7 iface
, LPRECT prect
,
152 LPDDSURFACEDESC2 pDDSD
, DWORD flags
, HANDLE event
)
157 HRESULT WINAPI
Main_DDrawSurface_Unlock (LPDIRECTDRAWSURFACE7 iface
, LPRECT pRect
)
163 Main_DDrawSurface_AddAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
164 LPDIRECTDRAWSURFACE7 pAttach
)
169 /* MSDN: "not currently implemented." */
171 Main_DDrawSurface_AddOverlayDirtyRect(LPDIRECTDRAWSURFACE7 iface
,
178 Main_DDrawSurface_BltFast(LPDIRECTDRAWSURFACE7 iface
, DWORD dstx
,
179 DWORD dsty
, LPDIRECTDRAWSURFACE7 src
,
180 LPRECT rsrc
, DWORD trans
)
186 Main_DDrawSurface_Restore(LPDIRECTDRAWSURFACE7 iface
)
191 /* MSDN: "not currently implemented." */
193 Main_DDrawSurface_BltBatch(LPDIRECTDRAWSURFACE7 iface
,
194 LPDDBLTBATCH pBatch
, DWORD dwCount
,
201 Main_DDrawSurface_ChangeUniquenessValue(LPDIRECTDRAWSURFACE7 iface
)
207 Main_DDrawSurface_DeleteAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
209 LPDIRECTDRAWSURFACE7 pAttach
)
215 Main_DDrawSurface_EnumAttachedSurfaces(LPDIRECTDRAWSURFACE7 iface
,
217 LPDDENUMSURFACESCALLBACK7 cb
)
223 Main_DDrawSurface_EnumOverlayZOrders(LPDIRECTDRAWSURFACE7 iface
,
224 DWORD dwFlags
, LPVOID context
,
225 LPDDENUMSURFACESCALLBACK7 cb
)
231 Main_DDrawSurface_Flip(LPDIRECTDRAWSURFACE7 iface
,
232 LPDIRECTDRAWSURFACE7 override
, DWORD dwFlags
)
238 Main_DDrawSurface_FreePrivateData(LPDIRECTDRAWSURFACE7 iface
, REFGUID tag
)
244 Main_DDrawSurface_GetAttachedSurface(LPDIRECTDRAWSURFACE7 iface
,
246 LPDIRECTDRAWSURFACE7
* ppSurface
)
252 Main_DDrawSurface_GetBltStatus(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
258 Main_DDrawSurface_GetCaps(LPDIRECTDRAWSURFACE7 iface
, LPDDSCAPS2 pCaps
)
264 Main_DDrawSurface_GetClipper(LPDIRECTDRAWSURFACE7 iface
,
265 LPDIRECTDRAWCLIPPER
* ppClipper
)
271 Main_DDrawSurface_GetColorKey(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
,
278 Main_DDrawSurface_GetDC(LPDIRECTDRAWSURFACE7 iface
, HDC
*phDC
)
284 Main_DDrawSurface_GetDDInterface(LPDIRECTDRAWSURFACE7 iface
, LPVOID
* pDD
)
289 Main_DDrawSurface_GetFlipStatus(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
295 Main_DDrawSurface_GetLOD(LPDIRECTDRAWSURFACE7 iface
, LPDWORD pdwMaxLOD
)
301 Main_DDrawSurface_GetOverlayPosition(LPDIRECTDRAWSURFACE7 iface
,
302 LPLONG pX
, LPLONG pY
)
307 Main_DDrawSurface_GetPalette(LPDIRECTDRAWSURFACE7 iface
,
308 LPDIRECTDRAWPALETTE
* ppPalette
)
314 Main_DDrawSurface_GetPixelFormat(LPDIRECTDRAWSURFACE7 iface
,
315 LPDDPIXELFORMAT pDDPixelFormat
)
321 Main_DDrawSurface_GetPriority(LPDIRECTDRAWSURFACE7 iface
,
328 Main_DDrawSurface_GetPrivateData(LPDIRECTDRAWSURFACE7 iface
,
329 REFGUID tag
, LPVOID pBuffer
,
330 LPDWORD pcbBufferSize
)
336 Main_DDrawSurface_GetSurfaceDesc(LPDIRECTDRAWSURFACE7 iface
,
337 LPDDSURFACEDESC2 pDDSD
)
343 Main_DDrawSurface_GetUniquenessValue(LPDIRECTDRAWSURFACE7 iface
,
350 Main_DDrawSurface_IsLost(LPDIRECTDRAWSURFACE7 iface
)
356 Main_DDrawSurface_PageLock(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
362 Main_DDrawSurface_PageUnlock(LPDIRECTDRAWSURFACE7 iface
, DWORD dwFlags
)
368 Main_DDrawSurface_ReleaseDC(LPDIRECTDRAWSURFACE7 iface
, HDC hDC
)
374 Main_DDrawSurface_SetClipper (LPDIRECTDRAWSURFACE7 iface
,
375 LPDIRECTDRAWCLIPPER pDDClipper
)
381 Main_DDrawSurface_SetColorKey (LPDIRECTDRAWSURFACE7 iface
,
382 DWORD dwFlags
, LPDDCOLORKEY pCKey
)
388 Main_DDrawSurface_SetLOD (LPDIRECTDRAWSURFACE7 iface
, DWORD dwMaxLOD
)
394 Main_DDrawSurface_SetOverlayPosition (LPDIRECTDRAWSURFACE7 iface
,
401 Main_DDrawSurface_SetPalette (LPDIRECTDRAWSURFACE7 iface
,
402 LPDIRECTDRAWPALETTE pPalette
)
408 Main_DDrawSurface_SetPriority (LPDIRECTDRAWSURFACE7 iface
,
415 Main_DDrawSurface_SetPrivateData (LPDIRECTDRAWSURFACE7 iface
,
416 REFGUID tag
, LPVOID pData
,
417 DWORD cbSize
, DWORD dwFlags
)
423 Main_DDrawSurface_UpdateOverlay (LPDIRECTDRAWSURFACE7 iface
,
425 LPDIRECTDRAWSURFACE7 pDstSurface
,
426 LPRECT pDstRect
, DWORD dwFlags
,
432 /* MSDN: "not currently implemented." */
434 Main_DDrawSurface_UpdateOverlayDisplay (LPDIRECTDRAWSURFACE7 iface
,
440 HRESULT WINAPI
Main_DDrawSurface_UpdateOverlayZOrder (LPDIRECTDRAWSURFACE7 iface
,
441 DWORD dwFlags
, LPDIRECTDRAWSURFACE7 pDDSRef
)
446 IDirectDrawSurface7Vtbl DirectDrawSurface7_Vtable
=
448 Main_DDrawSurface_QueryInterface
,
449 Main_DDrawSurface_AddRef
,
450 Main_DDrawSurface_Release
,
451 Main_DDrawSurface_AddAttachedSurface
,
452 Main_DDrawSurface_AddOverlayDirtyRect
,
453 Main_DDrawSurface_Blt
,
454 Main_DDrawSurface_BltBatch
,
455 Main_DDrawSurface_BltFast
,
456 Main_DDrawSurface_DeleteAttachedSurface
,
457 Main_DDrawSurface_EnumAttachedSurfaces
,
458 Main_DDrawSurface_EnumOverlayZOrders
,
459 Main_DDrawSurface_Flip
,
460 Main_DDrawSurface_GetAttachedSurface
,
461 Main_DDrawSurface_GetBltStatus
,
462 Main_DDrawSurface_GetCaps
,
463 Main_DDrawSurface_GetClipper
,
464 Main_DDrawSurface_GetColorKey
,
465 Main_DDrawSurface_GetDC
,
466 Main_DDrawSurface_GetFlipStatus
,
467 Main_DDrawSurface_GetOverlayPosition
,
468 Main_DDrawSurface_GetPalette
,
469 Main_DDrawSurface_GetPixelFormat
,
470 Main_DDrawSurface_GetSurfaceDesc
,
471 Main_DDrawSurface_Initialize
,
472 Main_DDrawSurface_IsLost
,
473 Main_DDrawSurface_Lock
,
474 Main_DDrawSurface_ReleaseDC
,
475 Main_DDrawSurface_Restore
,
476 Main_DDrawSurface_SetClipper
,
477 Main_DDrawSurface_SetColorKey
,
478 Main_DDrawSurface_SetOverlayPosition
,
479 Main_DDrawSurface_SetPalette
,
480 Main_DDrawSurface_Unlock
,
481 Main_DDrawSurface_UpdateOverlay
,
482 Main_DDrawSurface_UpdateOverlayDisplay
,
483 Main_DDrawSurface_UpdateOverlayZOrder