2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS GDI32
4 * PURPOSE: GDI DirectX inteface
5 * FILE: lib/gdi32/misc/gdientry.c
6 * PROGRAMERS: Alex Ionescu (alex@relsoft.net)
7 * Magnus Olsen (magnus@greatlord.com)
10 /* INCLUDES ******************************************************************/
20 /* DATA **********************************************************************/
25 #define GetDdHandle(Handle) ((HANDLE)Handle ? (HANDLE)Handle : ghDirectDraw)
28 /* CALLBACKS *****************************************************************/
31 * Dd Surface Callbacks
35 DdAddAttachedSurface(LPDDHAL_ADDATTACHEDSURFACEDATA Attach
)
38 return NtGdiDdAddAttachedSurface((HANDLE
)Attach
->lpDDSurface
->hDDSurface
,
39 (HANDLE
)Attach
->lpSurfAttached
->hDDSurface
,
40 (PDD_ADDATTACHEDSURFACEDATA
)Attach
);
45 DdBlt(LPDDHAL_BLTDATA Blt
)
49 /* Use the right surface */
50 if (Blt
->lpDDSrcSurface
) Surface
= (HANDLE
)Blt
->lpDDSrcSurface
->hDDSurface
;
53 return NtGdiDdBlt((HANDLE
)Blt
->lpDDDestSurface
->hDDSurface
, Surface
, (PDD_BLTDATA
)Blt
);
58 DdDestroySurface(LPDDHAL_DESTROYSURFACEDATA pDestroySurface
)
60 DWORD Return
= DDHAL_DRIVER_NOTHANDLED
;
61 BOOL RealDestroy
= TRUE
;
62 LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
;
64 /* Get the local surface */
65 pSurfaceLocal
= pDestroySurface
->lpDDSurface
;
67 /* Make sure there's a surface */
68 if (pSurfaceLocal
->hDDSurface
)
70 /* Check if we shoudl really destroy it */
71 if ((pSurfaceLocal
->dwFlags
& DDRAWISURF_DRIVERMANAGED
) &&
72 (pSurfaceLocal
->dwFlags
& DDRAWISURF_INVALID
))
78 Return
= NtGdiDdDestroySurface((HANDLE
)pSurfaceLocal
->hDDSurface
,
87 DdFlip(LPDDHAL_FLIPDATA Flip
)
91 return NtGdiDdFlip( (HANDLE
)Flip
->lpSurfCurr
->hDDSurface
,
92 (HANDLE
)Flip
->lpSurfTarg
->hDDSurface
,
93 /* FIXME the two last should be current left handler */
94 (HANDLE
)Flip
->lpSurfCurr
->hDDSurface
,
95 (HANDLE
)Flip
->lpSurfTarg
->hDDSurface
,
101 DdLock(LPDDHAL_LOCKDATA Lock
)
104 return NtGdiDdLock((HANDLE
)Lock
->lpDDSurface
->hDDSurface
,
106 (HANDLE
)Lock
->lpDDSurface
->hDC
);
111 DdUnlock(LPDDHAL_UNLOCKDATA Unlock
)
114 return NtGdiDdUnlock((HANDLE
)Unlock
->lpDDSurface
->hDDSurface
,
115 (PDD_UNLOCKDATA
)Unlock
);
120 DdGetBltStatus(LPDDHAL_GETBLTSTATUSDATA GetBltStatus
)
123 return NtGdiDdGetBltStatus((HANDLE
)GetBltStatus
->lpDDSurface
->hDDSurface
,
124 (PDD_GETBLTSTATUSDATA
)GetBltStatus
);
129 DdGetFlipStatus(LPDDHAL_GETFLIPSTATUSDATA GetFlipStatus
)
132 return NtGdiDdGetFlipStatus((HANDLE
)GetFlipStatus
->lpDDSurface
->hDDSurface
,
133 (PDD_GETFLIPSTATUSDATA
)GetFlipStatus
);
138 DdUpdateOverlay(LPDDHAL_UPDATEOVERLAYDATA UpdateOverlay
)
140 /* We have to handle this manually here */
141 if (UpdateOverlay
->dwFlags
& DDOVER_KEYDEST
)
143 /* Use the override */
144 UpdateOverlay
->dwFlags
&= ~DDOVER_KEYDEST
;
145 UpdateOverlay
->dwFlags
|= DDOVER_KEYDESTOVERRIDE
;
147 /* Set the overlay */
148 UpdateOverlay
->overlayFX
.dckDestColorkey
=
149 UpdateOverlay
->lpDDDestSurface
->ddckCKDestOverlay
;
151 if (UpdateOverlay
->dwFlags
& DDOVER_KEYSRC
)
153 /* Use the override */
154 UpdateOverlay
->dwFlags
&= ~DDOVER_KEYSRC
;
155 UpdateOverlay
->dwFlags
|= DDOVER_KEYSRCOVERRIDE
;
157 /* Set the overlay */
158 UpdateOverlay
->overlayFX
.dckSrcColorkey
=
159 UpdateOverlay
->lpDDSrcSurface
->ddckCKSrcOverlay
;
163 return NtGdiDdUpdateOverlay((HANDLE
)UpdateOverlay
->lpDDDestSurface
->hDDSurface
,
164 (HANDLE
)UpdateOverlay
->lpDDSrcSurface
->hDDSurface
,
165 (PDD_UPDATEOVERLAYDATA
)UpdateOverlay
);
170 DdSetOverlayPosition(LPDDHAL_SETOVERLAYPOSITIONDATA SetOverlayPosition
)
173 return NtGdiDdSetOverlayPosition((HANDLE
)SetOverlayPosition
->
174 lpDDSrcSurface
->hDDSurface
,
175 (HANDLE
)SetOverlayPosition
->
176 lpDDDestSurface
->hDDSurface
,
177 (PDD_SETOVERLAYPOSITIONDATA
)
186 DdWaitForVerticalBlank(LPDDHAL_WAITFORVERTICALBLANKDATA WaitForVerticalBlank
)
189 return NtGdiDdWaitForVerticalBlank(GetDdHandle(
190 WaitForVerticalBlank
->lpDD
->hDD
),
191 (PDD_WAITFORVERTICALBLANKDATA
)
192 WaitForVerticalBlank
);
197 DdCanCreateSurface(LPDDHAL_CANCREATESURFACEDATA CanCreateSurface
)
200 return NtGdiDdCanCreateSurface(GetDdHandle(CanCreateSurface
->lpDD
->hDD
),
201 (PDD_CANCREATESURFACEDATA
)CanCreateSurface
);
206 DdCreateSurface(LPDDHAL_CREATESURFACEDATA pCreateSurface
)
208 DWORD Return
= DDHAL_DRIVER_NOTHANDLED
;
209 ULONG SurfaceCount
= pCreateSurface
->dwSCnt
;
210 DD_SURFACE_LOCAL DdSurfaceLocal
;
211 DD_SURFACE_MORE DdSurfaceMore
;
212 DD_SURFACE_GLOBAL DdSurfaceGlobal
;
214 HANDLE hPrevSurface
, hSurface
;
217 PDD_SURFACE_LOCAL pDdSurfaceLocal
= NULL
;
218 PDD_SURFACE_MORE pDdSurfaceMore
= NULL
;
219 PDD_SURFACE_GLOBAL pDdSurfaceGlobal
= NULL
;
221 PDD_SURFACE_LOCAL ptmpDdSurfaceLocal
= NULL
;
222 PDD_SURFACE_MORE ptmpDdSurfaceMore
= NULL
;
223 PDD_SURFACE_GLOBAL ptmpDdSurfaceGlobal
= NULL
;
224 PHANDLE phSurface
= NULL
, puhSurface
= NULL
;
226 LPDDSURFACEDESC pSurfaceDesc
= NULL
;
228 /* Check how many surfaces there are */
229 if (SurfaceCount
!= 1)
231 /* We'll have to allocate more data, our stack isn't big enough */
236 /* We'll use what we have on the stack */
237 pDdSurfaceLocal
= &DdSurfaceLocal
;
238 pDdSurfaceMore
= &DdSurfaceMore
;
239 pDdSurfaceGlobal
= &DdSurfaceGlobal
;
240 phSurface
= &hPrevSurface
;
241 puhSurface
= &hSurface
;
243 /* Clear the structures */
244 RtlZeroMemory(&DdSurfaceLocal
, sizeof(DdSurfaceLocal
));
245 RtlZeroMemory(&DdSurfaceGlobal
, sizeof(DdSurfaceGlobal
));
246 RtlZeroMemory(&DdSurfaceMore
, sizeof(DdSurfaceMore
));
249 /* check if we got a surface or not */
252 /* Loop for each surface */
253 ptmpDdSurfaceGlobal
= pDdSurfaceGlobal
;
254 ptmpDdSurfaceLocal
= pDdSurfaceLocal
;
255 ptmpDdSurfaceMore
= pDdSurfaceMore
;
256 pSurfaceDesc
= pCreateSurface
->lpDDSurfaceDesc
;
258 for (i
= 0; i
< SurfaceCount
; i
++)
260 LPDDRAWI_DDRAWSURFACE_LCL lcl
= pCreateSurface
->lplpSList
[i
];
261 LPDDRAWI_DDRAWSURFACE_GBL gpl
= pCreateSurface
->lplpSList
[i
]->lpGbl
;
263 phSurface
[i
] = (HANDLE
)lcl
->hDDSurface
;
264 ptmpDdSurfaceLocal
->ddsCaps
.dwCaps
= lcl
->ddsCaps
.dwCaps
;
266 ptmpDdSurfaceLocal
->dwFlags
= (ptmpDdSurfaceLocal
->dwFlags
&
267 (0xB0000000 | DDRAWISURF_INMASTERSPRITELIST
|
268 DDRAWISURF_HELCB
| DDRAWISURF_FRONTBUFFER
|
269 DDRAWISURF_BACKBUFFER
| DDRAWISURF_INVALID
|
270 DDRAWISURF_DCIBUSY
| DDRAWISURF_DCILOCK
)) |
271 (lcl
->dwFlags
& DDRAWISURF_DRIVERMANAGED
);
273 ptmpDdSurfaceGlobal
->wWidth
= gpl
->wWidth
;
274 ptmpDdSurfaceGlobal
->wHeight
= gpl
->wHeight
;
275 ptmpDdSurfaceGlobal
->lPitch
= gpl
->lPitch
;
276 ptmpDdSurfaceGlobal
->fpVidMem
= gpl
->fpVidMem
;
277 ptmpDdSurfaceGlobal
->dwBlockSizeX
= gpl
->dwBlockSizeX
;
278 ptmpDdSurfaceGlobal
->dwBlockSizeY
= gpl
->dwBlockSizeY
;
280 if (lcl
->dwFlags
& DDRAWISURF_HASPIXELFORMAT
)
282 RtlCopyMemory( &ptmpDdSurfaceGlobal
->ddpfSurface
,
284 sizeof(DDPIXELFORMAT
));
286 ptmpDdSurfaceGlobal
->ddpfSurface
.dwSize
= sizeof(DDPIXELFORMAT
);
290 RtlCopyMemory( &ptmpDdSurfaceGlobal
->ddpfSurface
,
291 &gpl
->lpDD
->vmiData
.ddpfDisplay
,
292 sizeof(DDPIXELFORMAT
));
297 ptmpDdSurfaceMore
->ddsCapsEx
.dwCaps2
= lcl
->lpSurfMore
->ddsCapsEx
.dwCaps2
;
298 ptmpDdSurfaceMore
->ddsCapsEx
.dwCaps3
= lcl
->lpSurfMore
->ddsCapsEx
.dwCaps3
;
299 ptmpDdSurfaceMore
->ddsCapsEx
.dwCaps4
= lcl
->lpSurfMore
->ddsCapsEx
.dwCaps4
;
300 ptmpDdSurfaceMore
->dwSurfaceHandle
= (DWORD
) pCreateSurface
->lplpSList
[i
]->dbnOverlayNode
.object_int
;
303 /* FIXME count to next SurfaceCount for
304 ptmpDdSurfaceGlobal = pDdSurfaceGlobal;
305 ptmpDdSurfaceLocal = pDdSurfaceLocal;
306 ptmpDdSurfaceMore = pDdSurfaceMore;
308 we only support one surface create at moment
313 /* Call win32k now */
314 pCreateSurface
->ddRVal
= DDERR_GENERIC
;
316 Return
= NtGdiDdCreateSurface(GetDdHandle(pCreateSurface
->lpDD
->hDD
),
322 (PDD_CREATESURFACEDATA
)pCreateSurface
,
325 if (SurfaceCount
== 0)
327 pCreateSurface
->ddRVal
= DDERR_GENERIC
;
331 ptmpDdSurfaceMore
= pDdSurfaceMore
;
332 ptmpDdSurfaceGlobal
= pDdSurfaceGlobal
;
333 ptmpDdSurfaceLocal
= pDdSurfaceLocal
;
335 for (i
=0;i
<SurfaceCount
;i
++)
337 LPDDRAWI_DDRAWSURFACE_LCL lcl
= pCreateSurface
->lplpSList
[i
];
338 LPDDRAWI_DDRAWSURFACE_GBL gpl
= pCreateSurface
->lplpSList
[i
]->lpGbl
;
340 gpl
->lPitch
= ptmpDdSurfaceGlobal
->lPitch
;
341 gpl
->fpVidMem
= ptmpDdSurfaceGlobal
->fpVidMem
;
342 gpl
->dwBlockSizeX
= ptmpDdSurfaceGlobal
->dwBlockSizeX
;
343 gpl
->dwBlockSizeY
= ptmpDdSurfaceGlobal
->dwBlockSizeY
;
345 if (lcl
->dwFlags
& DDRAWISURF_HASPIXELFORMAT
)
347 RtlCopyMemory( &gpl
->ddpfSurface
, &ptmpDdSurfaceGlobal
->ddpfSurface
, sizeof(DDPIXELFORMAT
));
350 if (pCreateSurface
->ddRVal
!= DD_OK
)
355 NtGdiDdDeleteSurfaceObject( (HANDLE
)lcl
->hDDSurface
);
362 lcl
->hDDSurface
= (ULONG_PTR
) puhSurface
[i
];
365 lcl
->ddsCaps
.dwCaps
= ptmpDdSurfaceLocal
->ddsCaps
.dwCaps
;
368 lcl
->lpSurfMore
->ddsCapsEx
.dwCaps2
= ptmpDdSurfaceMore
->ddsCapsEx
.dwCaps2
;
369 lcl
->lpSurfMore
->ddsCapsEx
.dwCaps3
= ptmpDdSurfaceMore
->ddsCapsEx
.dwCaps3
;
370 lcl
->lpSurfMore
->ddsCapsEx
.dwCaps4
= ptmpDdSurfaceMore
->ddsCapsEx
.dwCaps4
;
372 /* FIXME count to next SurfaceCount for
373 ptmpDdSurfaceGlobal = pDdSurfaceGlobal;
374 ptmpDdSurfaceLocal = pDdSurfaceLocal;
375 ptmpDdSurfaceMore = pDdSurfaceMore;
376 we only support one surface create at moment
381 /* Check if we have to free all our local allocations */
382 if (SurfaceCount
> 1)
393 DdSetColorKey(LPDDHAL_SETCOLORKEYDATA pSetColorKey
)
396 return NtGdiDdSetColorKey((HANDLE
)pSetColorKey
->lpDDSurface
->hDDSurface
,
397 (PDD_SETCOLORKEYDATA
)pSetColorKey
);
402 DdGetScanLine(LPDDHAL_GETSCANLINEDATA pGetScanLine
)
405 return NtGdiDdGetScanLine(GetDdHandle(pGetScanLine
->lpDD
->hDD
),
406 (PDD_GETSCANLINEDATA
)pGetScanLine
);
409 /* PRIVATE FUNCTIONS *********************************************************/
413 bDDCreateSurface(LPDDRAWI_DDRAWSURFACE_LCL pSurface
,
416 DD_SURFACE_LOCAL SurfaceLocal
;
417 DD_SURFACE_GLOBAL SurfaceGlobal
;
418 DD_SURFACE_MORE SurfaceMore
;
421 RtlZeroMemory(&SurfaceLocal
, sizeof(DD_SURFACE_LOCAL
));
422 RtlZeroMemory(&SurfaceGlobal
, sizeof(DD_SURFACE_GLOBAL
));
423 RtlZeroMemory(&SurfaceMore
, sizeof(DD_SURFACE_MORE
));
425 /* Set up SurfaceLocal struct */
426 SurfaceLocal
.ddsCaps
.dwCaps
= pSurface
->ddsCaps
.dwCaps
;
427 SurfaceLocal
.dwFlags
= pSurface
->dwFlags
;
429 /* Set up SurfaceMore struct */
430 RtlMoveMemory(&SurfaceMore
.ddsCapsEx
,
431 &pSurface
->ddckCKDestBlt
,
433 SurfaceMore
.dwSurfaceHandle
= (DWORD
)pSurface
->dbnOverlayNode
.object_int
->lpVtbl
;
435 /* Set up SurfaceGlobal struct */
436 SurfaceGlobal
.fpVidMem
= pSurface
->lpGbl
->fpVidMem
;
437 SurfaceGlobal
.dwLinearSize
= pSurface
->lpGbl
->dwLinearSize
;
438 SurfaceGlobal
.wHeight
= pSurface
->lpGbl
->wHeight
;
439 SurfaceGlobal
.wWidth
= pSurface
->lpGbl
->wWidth
;
441 /* Check if we have a pixel format */
442 if (pSurface
->dwFlags
& DDSD_PIXELFORMAT
)
445 SurfaceGlobal
.ddpfSurface
= pSurface
->lpGbl
->lpDD
->vmiData
.ddpfDisplay
;
446 SurfaceGlobal
.ddpfSurface
.dwSize
= sizeof(DDPIXELFORMAT
);
451 SurfaceGlobal
.ddpfSurface
= pSurface
->lpGbl
->lpDD
->vmiData
.ddpfDisplay
;
454 /* Create the object */
455 pSurface
->hDDSurface
= (DWORD
)NtGdiDdCreateSurfaceObject(GetDdHandle(pSurface
->lpGbl
->lpDD
->hDD
),
456 (HANDLE
)pSurface
->hDDSurface
,
463 if (pSurface
->hDDSurface
) return TRUE
;
467 /* PUBLIC FUNCTIONS **********************************************************/
476 DdCreateDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal
,
481 /* Check if the global hDC (hdc == 0) is being used */
484 /* We'll only allow this if the global object doesn't exist yet */
488 if ((hdc
= CreateDCW(L
"Display", NULL
, NULL
, NULL
)))
490 /* Create the DDraw Object */
491 ghDirectDraw
= NtGdiDdCreateDirectDrawObject(hdc
);
494 NtGdiDeleteObjectApp(hdc
);
498 /* If we created the object, or had one ...*/
501 /* Increase count and set success */
506 /* Zero the handle */
507 pDirectDrawGlobal
->hDD
= 0;
511 /* Using the per-process object, so create it */
512 pDirectDrawGlobal
->hDD
= (ULONG_PTR
)NtGdiDdCreateDirectDrawObject(hdc
);
514 /* Set the return value */
515 Return
= pDirectDrawGlobal
->hDD
? TRUE
: FALSE
;
518 /* Return to caller */
529 DdQueryDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal
,
530 LPDDHALINFO pHalInfo
,
531 LPDDHAL_DDCALLBACKS pDDCallbacks
,
532 LPDDHAL_DDSURFACECALLBACKS pDDSurfaceCallbacks
,
533 LPDDHAL_DDPALETTECALLBACKS pDDPaletteCallbacks
,
534 LPD3DHAL_CALLBACKS pD3dCallbacks
,
535 LPD3DHAL_GLOBALDRIVERDATA pD3dDriverData
,
536 LPDDHAL_DDEXEBUFCALLBACKS pD3dBufferCallbacks
,
537 LPDDSURFACEDESC pD3dTextureFormats
,
541 PVIDEOMEMORY VidMemList
= NULL
;
543 D3DNTHAL_CALLBACKS D3dCallbacks
;
544 D3DNTHAL_GLOBALDRIVERDATA D3dDriverData
;
545 DD_D3DBUFCALLBACKS D3dBufferCallbacks
;
546 DWORD CallbackFlags
[3];
547 DWORD dwNumHeaps
=0, FourCCs
=0;
550 /* Clear the structures */
551 RtlZeroMemory(&HalInfo
, sizeof(DD_HALINFO
));
552 RtlZeroMemory(&D3dCallbacks
, sizeof(D3DNTHAL_CALLBACKS
));
553 RtlZeroMemory(&D3dDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
554 RtlZeroMemory(&D3dBufferCallbacks
, sizeof(DD_D3DBUFCALLBACKS
));
555 RtlZeroMemory(CallbackFlags
, sizeof(DWORD
)*3);
560 if (!NtGdiDdQueryDirectDrawObject(GetDdHandle(pDirectDrawGlobal
->hDD
),
572 /* We failed, free the memory and return */
576 /* Clear the incoming pointer */
577 RtlZeroMemory(pHalInfo
, sizeof(DDHALINFO
));
579 /* Convert all the data */
580 pHalInfo
->dwSize
= sizeof(DDHALINFO
);
581 pHalInfo
->lpDDCallbacks
= pDDCallbacks
;
582 pHalInfo
->lpDDSurfaceCallbacks
= pDDSurfaceCallbacks
;
583 pHalInfo
->lpDDPaletteCallbacks
= pDDPaletteCallbacks
;
585 /* Check for NT5+ D3D Data */
586 if (D3dCallbacks
.dwSize
&& D3dDriverData
.dwSize
)
588 /* Write these down */
589 pHalInfo
->lpD3DGlobalDriverData
= (ULONG_PTR
)pD3dDriverData
;
590 pHalInfo
->lpD3DHALCallbacks
= (ULONG_PTR
)pD3dCallbacks
;
592 /* Check for Buffer Callbacks */
593 if (D3dBufferCallbacks
.dwSize
)
595 /* Write this one too */
596 pHalInfo
->lpDDExeBufCallbacks
= pD3dBufferCallbacks
;
600 /* Continue converting the rest */
601 pHalInfo
->vmiData
.dwFlags
= HalInfo
.vmiData
.dwFlags
;
602 pHalInfo
->vmiData
.dwDisplayWidth
= HalInfo
.vmiData
.dwDisplayWidth
;
603 pHalInfo
->vmiData
.dwDisplayHeight
= HalInfo
.vmiData
.dwDisplayHeight
;
604 pHalInfo
->vmiData
.lDisplayPitch
= HalInfo
.vmiData
.lDisplayPitch
;
605 pHalInfo
->vmiData
.fpPrimary
= 0;
607 RtlCopyMemory( &pHalInfo
->vmiData
.ddpfDisplay
,
608 &HalInfo
.vmiData
.ddpfDisplay
,
609 sizeof(DDPIXELFORMAT
));
611 pHalInfo
->vmiData
.dwOffscreenAlign
= HalInfo
.vmiData
.dwOffscreenAlign
;
612 pHalInfo
->vmiData
.dwOverlayAlign
= HalInfo
.vmiData
.dwOverlayAlign
;
613 pHalInfo
->vmiData
.dwTextureAlign
= HalInfo
.vmiData
.dwTextureAlign
;
614 pHalInfo
->vmiData
.dwZBufferAlign
= HalInfo
.vmiData
.dwZBufferAlign
;
615 pHalInfo
->vmiData
.dwAlphaAlign
= HalInfo
.vmiData
.dwAlphaAlign
;
616 pHalInfo
->vmiData
.dwNumHeaps
= 0;
617 pHalInfo
->vmiData
.pvmList
= pvmList
;
619 RtlCopyMemory( &pHalInfo
->ddCaps
, &HalInfo
.ddCaps
,sizeof(DDCORECAPS
));
621 pHalInfo
->ddCaps
.dwNumFourCCCodes
= FourCCs
;
622 pHalInfo
->lpdwFourCC
= pdwFourCC
;
623 pHalInfo
->ddCaps
.dwRops
[6] = 0x1000;
625 /* FIXME implement DdGetDriverInfo */
626 // pHalInfo->dwFlags = HalInfo.dwFlags | DDHALINFO_GETDRIVERINFOSET;
627 // pHalInfo->GetDriverInfo = DdGetDriverInfo;
629 /* Now check if we got any DD callbacks */
632 /* Zero the structure */
633 RtlZeroMemory(pDDCallbacks
, sizeof(DDHAL_DDCALLBACKS
));
635 /* Set the flags for this structure */
636 Flags
= CallbackFlags
[0];
638 /* Write the header */
639 pDDCallbacks
->dwSize
= sizeof(DDHAL_DDCALLBACKS
);
640 pDDCallbacks
->dwFlags
= Flags
;
642 /* Now write the pointers, if applicable */
643 if (Flags
& DDHAL_CB32_CREATESURFACE
)
645 pDDCallbacks
->CreateSurface
= DdCreateSurface
;
647 if (Flags
& DDHAL_CB32_WAITFORVERTICALBLANK
)
649 pDDCallbacks
->WaitForVerticalBlank
= DdWaitForVerticalBlank
;
651 if (Flags
& DDHAL_CB32_CANCREATESURFACE
)
653 pDDCallbacks
->CanCreateSurface
= DdCanCreateSurface
;
655 if (Flags
& DDHAL_CB32_GETSCANLINE
)
657 pDDCallbacks
->GetScanLine
= DdGetScanLine
;
661 /* Check for DD Surface Callbacks */
662 if (pDDSurfaceCallbacks
)
664 /* Zero the structures */
665 RtlZeroMemory(pDDSurfaceCallbacks
, sizeof(DDHAL_DDSURFACECALLBACKS
));
667 /* Set the flags for this one */
668 Flags
= CallbackFlags
[1];
670 /* Write the header, note that some functions are always exposed */
671 pDDSurfaceCallbacks
->dwSize
= sizeof(DDHAL_DDSURFACECALLBACKS
);
673 pDDSurfaceCallbacks
->dwFlags
= Flags
;
675 pDDSurfaceCallBacks->dwFlags = (DDHAL_SURFCB32_LOCK |
676 DDHAL_SURFCB32_UNLOCK |
677 DDHAL_SURFCB32_SETCOLORKEY |
678 DDHAL_SURFCB32_DESTROYSURFACE) | Flags;
681 /* Write the always-on functions */
682 pDDSurfaceCallbacks
->Lock
= DdLock
;
683 pDDSurfaceCallbacks
->Unlock
= DdUnlock
;
684 pDDSurfaceCallbacks
->SetColorKey
= DdSetColorKey
;
685 pDDSurfaceCallbacks
->DestroySurface
= DdDestroySurface
;
687 /* Write the optional ones */
688 if (Flags
& DDHAL_SURFCB32_FLIP
)
690 pDDSurfaceCallbacks
->Flip
= DdFlip
;
692 if (Flags
& DDHAL_SURFCB32_BLT
)
694 pDDSurfaceCallbacks
->Blt
= DdBlt
;
696 if (Flags
& DDHAL_SURFCB32_GETBLTSTATUS
)
698 pDDSurfaceCallbacks
->GetBltStatus
= DdGetBltStatus
;
700 if (Flags
& DDHAL_SURFCB32_GETFLIPSTATUS
)
702 pDDSurfaceCallbacks
->GetFlipStatus
= DdGetFlipStatus
;
704 if (Flags
& DDHAL_SURFCB32_UPDATEOVERLAY
)
706 pDDSurfaceCallbacks
->UpdateOverlay
= DdUpdateOverlay
;
708 if (Flags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
)
710 pDDSurfaceCallbacks
->SetOverlayPosition
= DdSetOverlayPosition
;
712 if (Flags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
)
714 pDDSurfaceCallbacks
->AddAttachedSurface
= DdAddAttachedSurface
;
718 /* Check for DD Palette Callbacks */
719 if (pDDPaletteCallbacks
)
721 /* Zero the struct */
722 RtlZeroMemory(pDDPaletteCallbacks
, sizeof(DDHAL_DDPALETTECALLBACKS
));
724 /* Get the flags for this one */
725 Flags
= CallbackFlags
[2];
727 /* Write the header */
728 pDDPaletteCallbacks
->dwSize
= sizeof(DDHAL_DDPALETTECALLBACKS
);
729 pDDPaletteCallbacks
->dwFlags
= Flags
;
732 /* Check for D3D Callbacks */
735 /* Zero the struct */
736 RtlZeroMemory(pD3dCallbacks
, sizeof(D3DHAL_CALLBACKS
));
738 /* Check if we have one */
739 if (D3dCallbacks
.dwSize
)
741 /* Write the header */
742 pD3dCallbacks
->dwSize
= sizeof(D3DHAL_CALLBACKS
);
744 /* Now check for each callback */
745 if (D3dCallbacks
.ContextCreate
)
748 pD3dCallbacks->ContextCreate = D3dContextCreate;
751 if (D3dCallbacks
.ContextDestroy
)
753 pD3dCallbacks
->ContextDestroy
= (LPD3DHAL_CONTEXTDESTROYCB
) NtGdiD3dContextDestroy
;
755 if (D3dCallbacks
.ContextDestroyAll
)
758 pD3dCallbacks->ContextDestroyAll = (LPD3DHAL_CONTEXTDESTROYALLCB) NtGdiD3dContextDestroyAll;
764 /* Check for D3D Driver Data */
767 /* Copy the struct */
768 RtlMoveMemory(pD3dDriverData
,
770 sizeof(D3DHAL_GLOBALDRIVERDATA
));
772 /* Write the pointer to the texture formats */
773 pD3dDriverData
->lpTextureFormats
= pD3dTextureFormats
;
776 /* FIXME: Check for D3D Buffer Callbacks */
788 DdDeleteDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal
)
792 /* If this is the global object */
793 if(pDirectDrawGlobal
->hDD
)
796 Return
= NtGdiDdDeleteDirectDrawObject((HANDLE
)pDirectDrawGlobal
->hDD
);
799 pDirectDrawGlobal
->hDD
= 0;
802 else if (ghDirectDraw
)
804 /* Always success here */
807 /* Make sure this is the last instance */
808 if (!(--gcDirectDraw
))
810 /* Delete the object */
811 Return
= NtGdiDdDeleteDirectDrawObject(ghDirectDraw
);
830 DdCreateSurfaceObject( LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
,
831 BOOL bPrimarySurface
)
833 return bDDCreateSurface(pSurfaceLocal
, TRUE
);
844 DdDeleteSurfaceObject(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
)
848 /* Make sure there is one */
849 if (pSurfaceLocal
->hDDSurface
)
852 Return
= NtGdiDdDeleteSurfaceObject((HANDLE
)pSurfaceLocal
->hDDSurface
);
853 pSurfaceLocal
->hDDSurface
= 0;
866 DdResetVisrgn(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
,
869 /* Call win32k directly */
870 return NtGdiDdResetVisrgn((HANDLE
) pSurfaceLocal
->hDDSurface
, hWnd
);
880 DdGetDC(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
,
881 LPPALETTEENTRY pColorTable
)
883 /* Call win32k directly */
884 return NtGdiDdGetDC(pColorTable
, (HANDLE
) pSurfaceLocal
->hDDSurface
);
894 DdReleaseDC(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
)
896 /* Call win32k directly */
897 return NtGdiDdReleaseDC((HANDLE
) pSurfaceLocal
->hDDSurface
);
906 DdCreateDIBSection(HDC hdc
,
907 CONST BITMAPINFO
*pbmi
,
913 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
924 DdReenableDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal
,
927 /* Call win32k directly */
928 return NtGdiDdReenableDirectDrawObject(GetDdHandle(pDirectDrawGlobal
->hDD
),
940 DdAttachSurface( LPDDRAWI_DDRAWSURFACE_LCL pSurfaceFrom
,
941 LPDDRAWI_DDRAWSURFACE_LCL pSurfaceTo
)
943 /* Create Surface if it does not exits one */
944 if (!pSurfaceFrom
->hDDSurface
)
946 if (!bDDCreateSurface(pSurfaceFrom
, FALSE
))
952 /* Create Surface if it does not exits one */
953 if (!pSurfaceTo
->hDDSurface
)
955 if (!bDDCreateSurface(pSurfaceTo
, FALSE
))
962 return NtGdiDdAttachSurface((HANDLE
)pSurfaceFrom
->hDDSurface
,
963 (HANDLE
)pSurfaceTo
->hDDSurface
);
973 DdUnattachSurface(LPDDRAWI_DDRAWSURFACE_LCL pSurface
,
974 LPDDRAWI_DDRAWSURFACE_LCL pSurfaceAttached
)
977 NtGdiDdUnattachSurface((HANDLE
)pSurface
->hDDSurface
,
978 (HANDLE
)pSurfaceAttached
->hDDSurface
);
988 DdQueryDisplaySettingsUniqueness()
990 return GdiSharedHandleTable
->flDeviceUniq
;
1000 DdGetDxHandle(LPDDRAWI_DIRECTDRAW_LCL pDDraw
,
1001 LPDDRAWI_DDRAWSURFACE_LCL pSurface
,
1005 HANDLE hSurface
= (HANDLE
)pSurface
->hDDSurface
;
1007 /* Check if we already have a surface */
1010 /* We don't have one, use the DirectDraw Object handle instead */
1012 hDD
= GetDdHandle(pDDraw
->lpGbl
->hDD
);
1016 return (HANDLE
)NtGdiDdGetDxHandle(hDD
, hSurface
, bRelease
);
1026 DdSetGammaRamp(LPDDRAWI_DIRECTDRAW_LCL pDDraw
,
1030 /* Call win32k directly */
1031 return NtGdiDdSetGammaRamp(GetDdHandle(pDDraw
->lpGbl
->hDD
),