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 ******************************************************************/
19 /* DATA **********************************************************************/
24 #define GetDdHandle(Handle) ((HANDLE)Handle ? (HANDLE)Handle : ghDirectDraw)
27 /* CALLBACKS *****************************************************************/
30 * Dd Surface Callbacks
34 DdAddAttachedSurface(LPDDHAL_ADDATTACHEDSURFACEDATA Attach
)
37 return NtGdiDdAddAttachedSurface((HANDLE
)Attach
->lpDDSurface
->hDDSurface
,
38 (HANDLE
)Attach
->lpSurfAttached
->hDDSurface
,
39 (PDD_ADDATTACHEDSURFACEDATA
)Attach
);
44 DdBlt(LPDDHAL_BLTDATA Blt
)
48 /* Use the right surface */
49 if (Blt
->lpDDSrcSurface
) Surface
= (HANDLE
)Blt
->lpDDSrcSurface
->hDDSurface
;
52 return NtGdiDdBlt((HANDLE
)Blt
->lpDDDestSurface
->hDDSurface
, Surface
, (PDD_BLTDATA
)Blt
);
57 DdDestroySurface(LPDDHAL_DESTROYSURFACEDATA pDestroySurface
)
59 DWORD Return
= DDHAL_DRIVER_NOTHANDLED
;
60 BOOL RealDestroy
= TRUE
;
61 LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
;
63 /* Get the local surface */
64 pSurfaceLocal
= pDestroySurface
->lpDDSurface
;
66 /* Make sure there's a surface */
67 if (pSurfaceLocal
->hDDSurface
)
69 /* Check if we shoudl really destroy it */
70 if ((pSurfaceLocal
->dwFlags
& DDRAWISURF_DRIVERMANAGED
) &&
71 (pSurfaceLocal
->dwFlags
& DDRAWISURF_INVALID
))
77 Return
= NtGdiDdDestroySurface((HANDLE
)pSurfaceLocal
->hDDSurface
,
86 DdFlip(LPDDHAL_FLIPDATA Flip
)
90 return NtGdiDdFlip( (HANDLE
)Flip
->lpSurfCurr
->hDDSurface
,
91 (HANDLE
)Flip
->lpSurfTarg
->hDDSurface
,
92 /* FIXME the two last should be current left handler */
93 (HANDLE
)Flip
->lpSurfCurr
->hDDSurface
,
94 (HANDLE
)Flip
->lpSurfTarg
->hDDSurface
,
100 DdLock(LPDDHAL_LOCKDATA Lock
)
103 return NtGdiDdLock((HANDLE
)Lock
->lpDDSurface
->hDDSurface
,
105 (HANDLE
)Lock
->lpDDSurface
->hDC
);
110 DdUnlock(LPDDHAL_UNLOCKDATA Unlock
)
113 return NtGdiDdUnlock((HANDLE
)Unlock
->lpDDSurface
->hDDSurface
,
114 (PDD_UNLOCKDATA
)Unlock
);
119 DdGetBltStatus(LPDDHAL_GETBLTSTATUSDATA GetBltStatus
)
122 return NtGdiDdGetBltStatus((HANDLE
)GetBltStatus
->lpDDSurface
->hDDSurface
,
123 (PDD_GETBLTSTATUSDATA
)GetBltStatus
);
128 DdGetFlipStatus(LPDDHAL_GETFLIPSTATUSDATA GetFlipStatus
)
131 return NtGdiDdGetFlipStatus((HANDLE
)GetFlipStatus
->lpDDSurface
->hDDSurface
,
132 (PDD_GETFLIPSTATUSDATA
)GetFlipStatus
);
137 DdUpdateOverlay(LPDDHAL_UPDATEOVERLAYDATA UpdateOverlay
)
139 /* We have to handle this manually here */
140 if (UpdateOverlay
->dwFlags
& DDOVER_KEYDEST
)
142 /* Use the override */
143 UpdateOverlay
->dwFlags
&= ~DDOVER_KEYDEST
;
144 UpdateOverlay
->dwFlags
|= DDOVER_KEYDESTOVERRIDE
;
146 /* Set the overlay */
147 UpdateOverlay
->overlayFX
.dckDestColorkey
=
148 UpdateOverlay
->lpDDDestSurface
->ddckCKDestOverlay
;
150 if (UpdateOverlay
->dwFlags
& DDOVER_KEYSRC
)
152 /* Use the override */
153 UpdateOverlay
->dwFlags
&= ~DDOVER_KEYSRC
;
154 UpdateOverlay
->dwFlags
|= DDOVER_KEYSRCOVERRIDE
;
156 /* Set the overlay */
157 UpdateOverlay
->overlayFX
.dckSrcColorkey
=
158 UpdateOverlay
->lpDDSrcSurface
->ddckCKSrcOverlay
;
162 return NtGdiDdUpdateOverlay((HANDLE
)UpdateOverlay
->lpDDDestSurface
->hDDSurface
,
163 (HANDLE
)UpdateOverlay
->lpDDSrcSurface
->hDDSurface
,
164 (PDD_UPDATEOVERLAYDATA
)UpdateOverlay
);
169 DdSetOverlayPosition(LPDDHAL_SETOVERLAYPOSITIONDATA SetOverlayPosition
)
172 return NtGdiDdSetOverlayPosition((HANDLE
)SetOverlayPosition
->
173 lpDDSrcSurface
->hDDSurface
,
174 (HANDLE
)SetOverlayPosition
->
175 lpDDDestSurface
->hDDSurface
,
176 (PDD_SETOVERLAYPOSITIONDATA
)
185 DdWaitForVerticalBlank(LPDDHAL_WAITFORVERTICALBLANKDATA WaitForVerticalBlank
)
188 return NtGdiDdWaitForVerticalBlank(GetDdHandle(
189 WaitForVerticalBlank
->lpDD
->hDD
),
190 (PDD_WAITFORVERTICALBLANKDATA
)
191 WaitForVerticalBlank
);
196 DdCanCreateSurface(LPDDHAL_CANCREATESURFACEDATA CanCreateSurface
)
199 return NtGdiDdCanCreateSurface(GetDdHandle(CanCreateSurface
->lpDD
->hDD
),
200 (PDD_CANCREATESURFACEDATA
)CanCreateSurface
);
205 DdCreateSurface(LPDDHAL_CREATESURFACEDATA pCreateSurface
)
207 DWORD Return
= DDHAL_DRIVER_NOTHANDLED
;
208 ULONG SurfaceCount
= pCreateSurface
->dwSCnt
;
209 DD_SURFACE_LOCAL DdSurfaceLocal
;
210 DD_SURFACE_MORE DdSurfaceMore
;
211 DD_SURFACE_GLOBAL DdSurfaceGlobal
;
212 HANDLE hPrevSurface
, hSurface
;
213 DD_SURFACE_LOCAL
* pDdSurfaceLocal
;
214 DD_SURFACE_MORE
* pDdSurfaceMore
;
215 DD_SURFACE_GLOBAL
* pDdSurfaceGlobal
;
216 LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
;
217 //LPDDRAWI_DDRAWSURFACE_MORE pSurfaceMore;
218 LPDDRAWI_DDRAWSURFACE_GBL pSurfaceGlobal
;
219 PHANDLE phSurface
= NULL
, puhSurface
= NULL
;
221 LPDDSURFACEDESC pSurfaceDesc
;
223 /* Check how many surfaces there are */
224 if (SurfaceCount
!= 1)
226 /* We'll have to allocate more data, our stack isn't big enough */
231 /* We'll use what we have on the stack */
232 pDdSurfaceLocal
= &DdSurfaceLocal
;
233 pDdSurfaceMore
= &DdSurfaceMore
;
234 pDdSurfaceGlobal
= &DdSurfaceGlobal
;
235 phSurface
= &hPrevSurface
;
236 puhSurface
= &hSurface
;
238 /* Clear the structures */
239 RtlZeroMemory(&DdSurfaceLocal
, sizeof(DdSurfaceLocal
));
240 RtlZeroMemory(&DdSurfaceGlobal
, sizeof(DdSurfaceGlobal
));
241 RtlZeroMemory(&DdSurfaceMore
, sizeof(DdSurfaceMore
));
244 /* Loop for each surface */
245 for (i
= 0; i
< pCreateSurface
->dwSCnt
; i
++)
248 pSurfaceLocal
= pCreateSurface
->lplpSList
[i
];
249 pSurfaceGlobal
= pSurfaceLocal
->lpGbl
;
250 pSurfaceDesc
= pCreateSurface
->lpDDSurfaceDesc
;
252 /* Check if it has pixel data */
253 if (pSurfaceDesc
->dwFlags
& DDRAWISURF_HASPIXELFORMAT
)
255 /* Use its pixel data */
256 DdSurfaceGlobal
.ddpfSurface
= pSurfaceDesc
->ddpfPixelFormat
;
257 DdSurfaceGlobal
.ddpfSurface
.dwSize
= sizeof(DDPIXELFORMAT
);
261 /* Use the one from the global surface */
262 DdSurfaceGlobal
.ddpfSurface
= pSurfaceGlobal
->lpDD
->vmiData
.ddpfDisplay
;
266 DdSurfaceGlobal
.wWidth
= pSurfaceGlobal
->wWidth
;
267 DdSurfaceGlobal
.wHeight
= pSurfaceGlobal
->wHeight
;
268 DdSurfaceGlobal
.lPitch
= pSurfaceGlobal
->lPitch
;
269 DdSurfaceGlobal
.fpVidMem
= pSurfaceGlobal
->fpVidMem
;
270 DdSurfaceGlobal
.dwBlockSizeX
= pSurfaceGlobal
->dwBlockSizeX
;
271 DdSurfaceGlobal
.dwBlockSizeY
= pSurfaceGlobal
->dwBlockSizeY
;
272 // DdSurfaceGlobal.ddsCaps = pSurfaceLocal->ddsCaps | 0xBF0000;
274 /* FIXME: Ddscapsex stuff missing */
276 /* Call win32k now */
277 pCreateSurface
->ddRVal
= E_FAIL
;
279 Return
= NtGdiDdCreateSurface(GetDdHandle(pCreateSurface
->lpDD
->hDD
),
285 (PDD_CREATESURFACEDATA
)pCreateSurface
,
289 /* FIXME: Ddscapsex stuff missing */
291 /* Convert the data back */
292 pSurfaceGlobal
->lPitch
= DdSurfaceGlobal
.lPitch
;
293 pSurfaceGlobal
->fpVidMem
= DdSurfaceGlobal
.fpVidMem
;
294 pSurfaceGlobal
->dwBlockSizeX
= DdSurfaceGlobal
.dwBlockSizeX
;
295 pSurfaceGlobal
->dwBlockSizeY
= DdSurfaceGlobal
.dwBlockSizeY
;
296 pCreateSurface
->lplpSList
[i
]->hDDSurface
= (DWORD
) hSurface
;
298 /* FIXME: Ddscapsex stuff missing */
301 /* Check if we have to free all our local allocations */
302 if (SurfaceCount
> 1)
313 DdSetColorKey(LPDDHAL_SETCOLORKEYDATA pSetColorKey
)
316 return NtGdiDdSetColorKey((HANDLE
)pSetColorKey
->lpDDSurface
->hDDSurface
,
317 (PDD_SETCOLORKEYDATA
)pSetColorKey
);
322 DdGetScanLine(LPDDHAL_GETSCANLINEDATA pGetScanLine
)
325 return NtGdiDdGetScanLine(GetDdHandle(pGetScanLine
->lpDD
->hDD
),
326 (PDD_GETSCANLINEDATA
)pGetScanLine
);
329 /* PRIVATE FUNCTIONS *********************************************************/
330 static ULONG RemberDdQueryDisplaySettingsUniquenessID
= 0;
334 bDDCreateSurface(LPDDRAWI_DDRAWSURFACE_LCL pSurface
,
337 DD_SURFACE_LOCAL SurfaceLocal
;
338 DD_SURFACE_GLOBAL SurfaceGlobal
;
339 DD_SURFACE_MORE SurfaceMore
;
342 RtlZeroMemory(&SurfaceLocal
, sizeof(DD_SURFACE_LOCAL
));
343 RtlZeroMemory(&SurfaceGlobal
, sizeof(DD_SURFACE_GLOBAL
));
344 RtlZeroMemory(&SurfaceMore
, sizeof(DD_SURFACE_MORE
));
346 /* Set up SurfaceLocal struct */
347 SurfaceLocal
.ddsCaps
.dwCaps
= pSurface
->ddsCaps
.dwCaps
;
348 SurfaceLocal
.dwFlags
= pSurface
->dwFlags
;
350 /* Set up SurfaceMore struct */
351 RtlMoveMemory(&SurfaceMore
.ddsCapsEx
,
352 &pSurface
->ddckCKDestBlt
,
354 SurfaceMore
.dwSurfaceHandle
= (DWORD
)pSurface
->dbnOverlayNode
.object_int
->lpVtbl
;
356 /* Set up SurfaceGlobal struct */
357 SurfaceGlobal
.fpVidMem
= pSurface
->lpGbl
->fpVidMem
;
358 SurfaceGlobal
.dwLinearSize
= pSurface
->lpGbl
->dwLinearSize
;
359 SurfaceGlobal
.wHeight
= pSurface
->lpGbl
->wHeight
;
360 SurfaceGlobal
.wWidth
= pSurface
->lpGbl
->wWidth
;
362 /* Check if we have a pixel format */
363 if (pSurface
->dwFlags
& DDSD_PIXELFORMAT
)
366 SurfaceGlobal
.ddpfSurface
= pSurface
->lpGbl
->lpDD
->vmiData
.ddpfDisplay
;
367 SurfaceGlobal
.ddpfSurface
.dwSize
= sizeof(DDPIXELFORMAT
);
372 SurfaceGlobal
.ddpfSurface
= pSurface
->lpGbl
->lpDD
->vmiData
.ddpfDisplay
;
375 /* Create the object */
376 pSurface
->hDDSurface
= (DWORD
)NtGdiDdCreateSurfaceObject(GetDdHandle(pSurface
->lpGbl
->lpDD
->hDD
),
377 (HANDLE
)pSurface
->hDDSurface
,
384 if (pSurface
->hDDSurface
) return TRUE
;
388 /* PUBLIC FUNCTIONS **********************************************************/
397 DdCreateDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal
,
402 /* Check if the global hDC (hdc == 0) is being used */
405 /* We'll only allow this if the global object doesn't exist yet */
409 if ((hdc
= CreateDC(L
"Display", NULL
, NULL
, NULL
)))
411 /* Create the DDraw Object */
412 ghDirectDraw
= NtGdiDdCreateDirectDrawObject(hdc
);
415 NtGdiDeleteObjectApp(hdc
);
419 /* If we created the object, or had one ...*/
422 /* Increase count and set success */
427 /* Zero the handle */
428 pDirectDrawGlobal
->hDD
= 0;
432 /* Using the per-process object, so create it */
433 pDirectDrawGlobal
->hDD
= (ULONG_PTR
)NtGdiDdCreateDirectDrawObject(hdc
);
435 /* Set the return value */
436 Return
= pDirectDrawGlobal
->hDD
? TRUE
: FALSE
;
439 /* Return to caller */
450 DdQueryDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal
,
451 LPDDHALINFO pHalInfo
,
452 LPDDHAL_DDCALLBACKS pDDCallbacks
,
453 LPDDHAL_DDSURFACECALLBACKS pDDSurfaceCallbacks
,
454 LPDDHAL_DDPALETTECALLBACKS pDDPaletteCallbacks
,
455 LPD3DHAL_CALLBACKS pD3dCallbacks
,
456 LPD3DHAL_GLOBALDRIVERDATA pD3dDriverData
,
457 LPDDHAL_DDEXEBUFCALLBACKS pD3dBufferCallbacks
,
458 LPDDSURFACEDESC pD3dTextureFormats
,
462 PVIDEOMEMORY VidMemList
= NULL
;
464 D3DNTHAL_CALLBACKS D3dCallbacks
;
465 D3DNTHAL_GLOBALDRIVERDATA D3dDriverData
;
466 DD_D3DBUFCALLBACKS D3dBufferCallbacks
;
467 DWORD CallbackFlags
[3];
468 DWORD dwNumHeaps
=0, FourCCs
=0;
471 /* Clear the structures */
472 RtlZeroMemory(&HalInfo
, sizeof(DD_HALINFO
));
473 RtlZeroMemory(&D3dCallbacks
, sizeof(D3DNTHAL_CALLBACKS
));
474 RtlZeroMemory(&D3dDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
475 RtlZeroMemory(&D3dBufferCallbacks
, sizeof(DD_D3DBUFCALLBACKS
));
476 RtlZeroMemory(CallbackFlags
, sizeof(DWORD
)*3);
478 /* Check if we got a list pointer */
481 /* Allocate memory for it */
482 VidMemList
= LocalAlloc(LMEM_ZEROINIT
,
483 sizeof(VIDEOMEMORY
) *
484 pHalInfo
->vmiData
.dwNumHeaps
);
488 if (!NtGdiDdQueryDirectDrawObject(GetDdHandle(pDirectDrawGlobal
->hDD
),
500 /* We failed, free the memory and return */
501 if (VidMemList
) LocalFree(VidMemList
);
505 /* Clear the incoming pointer */
506 RtlZeroMemory(pHalInfo
, sizeof(DDHALINFO
));
508 /* Convert all the data */
509 pHalInfo
->dwSize
= sizeof(DDHALINFO
);
510 pHalInfo
->lpDDCallbacks
= pDDCallbacks
;
511 pHalInfo
->lpDDSurfaceCallbacks
= pDDSurfaceCallbacks
;
512 pHalInfo
->lpDDPaletteCallbacks
= pDDPaletteCallbacks
;
514 /* Check for NT5+ D3D Data */
515 if (D3dCallbacks
.dwSize
&& D3dDriverData
.dwSize
)
517 /* Write these down */
518 pHalInfo
->lpD3DGlobalDriverData
= (ULONG_PTR
)pD3dDriverData
;
519 pHalInfo
->lpD3DHALCallbacks
= (ULONG_PTR
)pD3dCallbacks
;
521 /* Check for Buffer Callbacks */
522 if (D3dBufferCallbacks
.dwSize
)
524 /* Write this one too */
525 pHalInfo
->lpDDExeBufCallbacks
= pD3dBufferCallbacks
;
529 /* Continue converting the rest */
530 pHalInfo
->vmiData
.dwFlags
= HalInfo
.vmiData
.dwFlags
;
531 pHalInfo
->vmiData
.dwDisplayWidth
= HalInfo
.vmiData
.dwDisplayWidth
;
532 pHalInfo
->vmiData
.dwDisplayHeight
= HalInfo
.vmiData
.dwDisplayHeight
;
533 pHalInfo
->vmiData
.lDisplayPitch
= HalInfo
.vmiData
.lDisplayPitch
;
534 pHalInfo
->vmiData
.fpPrimary
= 0;
536 RtlCopyMemory( &pHalInfo
->vmiData
.ddpfDisplay
,
537 &HalInfo
.vmiData
.ddpfDisplay
,
538 sizeof(DDPIXELFORMAT
));
540 pHalInfo
->vmiData
.dwOffscreenAlign
= HalInfo
.vmiData
.dwOffscreenAlign
;
541 pHalInfo
->vmiData
.dwOverlayAlign
= HalInfo
.vmiData
.dwOverlayAlign
;
542 pHalInfo
->vmiData
.dwTextureAlign
= HalInfo
.vmiData
.dwTextureAlign
;
543 pHalInfo
->vmiData
.dwZBufferAlign
= HalInfo
.vmiData
.dwZBufferAlign
;
544 pHalInfo
->vmiData
.dwAlphaAlign
= HalInfo
.vmiData
.dwAlphaAlign
;
545 pHalInfo
->vmiData
.dwNumHeaps
= dwNumHeaps
;
546 pHalInfo
->vmiData
.pvmList
= pvmList
;
548 RtlCopyMemory( &pHalInfo
->ddCaps
, &HalInfo
.ddCaps
,sizeof(DDCORECAPS
));
550 pHalInfo
->ddCaps
.dwNumFourCCCodes
= FourCCs
;
551 pHalInfo
->lpdwFourCC
= pdwFourCC
;
552 pHalInfo
->ddCaps
.dwRops
[6] = 0x1000;
554 /* FIXME implement DdGetDriverInfo */
555 // pHalInfo->dwFlags = HalInfo.dwFlags | DDHALINFO_GETDRIVERINFOSET;
556 // pHalInfo->GetDriverInfo = DdGetDriverInfo;
558 /* Now check if we got any DD callbacks */
561 /* Zero the structure */
562 RtlZeroMemory(pDDCallbacks
, sizeof(DDHAL_DDCALLBACKS
));
564 /* Set the flags for this structure */
565 Flags
= CallbackFlags
[0];
567 /* Write the header */
568 pDDCallbacks
->dwSize
= sizeof(DDHAL_DDCALLBACKS
);
569 pDDCallbacks
->dwFlags
= Flags
;
571 /* Now write the pointers, if applicable */
572 if (Flags
& DDHAL_CB32_CREATESURFACE
)
574 pDDCallbacks
->CreateSurface
= DdCreateSurface
;
576 if (Flags
& DDHAL_CB32_WAITFORVERTICALBLANK
)
578 pDDCallbacks
->WaitForVerticalBlank
= DdWaitForVerticalBlank
;
580 if (Flags
& DDHAL_CB32_CANCREATESURFACE
)
582 pDDCallbacks
->CanCreateSurface
= DdCanCreateSurface
;
584 if (Flags
& DDHAL_CB32_GETSCANLINE
)
586 pDDCallbacks
->GetScanLine
= DdGetScanLine
;
590 /* Check for DD Surface Callbacks */
591 if (pDDSurfaceCallbacks
)
593 /* Zero the structures */
594 RtlZeroMemory(pDDSurfaceCallbacks
, sizeof(DDHAL_DDSURFACECALLBACKS
));
596 /* Set the flags for this one */
597 Flags
= CallbackFlags
[1];
599 /* Write the header, note that some functions are always exposed */
600 pDDSurfaceCallbacks
->dwSize
= sizeof(DDHAL_DDSURFACECALLBACKS
);
602 pDDSurfaceCallbacks
->dwFlags
= Flags
;
604 pDDSurfaceCallBacks->dwFlags = (DDHAL_SURFCB32_LOCK |
605 DDHAL_SURFCB32_UNLOCK |
606 DDHAL_SURFCB32_SETCOLORKEY |
607 DDHAL_SURFCB32_DESTROYSURFACE) | Flags;
610 /* Write the always-on functions */
611 pDDSurfaceCallbacks
->Lock
= DdLock
;
612 pDDSurfaceCallbacks
->Unlock
= DdUnlock
;
613 pDDSurfaceCallbacks
->SetColorKey
= DdSetColorKey
;
614 pDDSurfaceCallbacks
->DestroySurface
= DdDestroySurface
;
616 /* Write the optional ones */
617 if (Flags
& DDHAL_SURFCB32_FLIP
)
619 pDDSurfaceCallbacks
->Flip
= DdFlip
;
621 if (Flags
& DDHAL_SURFCB32_BLT
)
623 pDDSurfaceCallbacks
->Blt
= DdBlt
;
625 if (Flags
& DDHAL_SURFCB32_GETBLTSTATUS
)
627 pDDSurfaceCallbacks
->GetBltStatus
= DdGetBltStatus
;
629 if (Flags
& DDHAL_SURFCB32_GETFLIPSTATUS
)
631 pDDSurfaceCallbacks
->GetFlipStatus
= DdGetFlipStatus
;
633 if (Flags
& DDHAL_SURFCB32_UPDATEOVERLAY
)
635 pDDSurfaceCallbacks
->UpdateOverlay
= DdUpdateOverlay
;
637 if (Flags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
)
639 pDDSurfaceCallbacks
->SetOverlayPosition
= DdSetOverlayPosition
;
641 if (Flags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
)
643 pDDSurfaceCallbacks
->AddAttachedSurface
= DdAddAttachedSurface
;
647 /* Check for DD Palette Callbacks */
648 if (pDDPaletteCallbacks
)
650 /* Zero the struct */
651 RtlZeroMemory(pDDPaletteCallbacks
, sizeof(DDHAL_DDPALETTECALLBACKS
));
653 /* Get the flags for this one */
654 Flags
= CallbackFlags
[2];
656 /* Write the header */
657 pDDPaletteCallbacks
->dwSize
= sizeof(DDHAL_DDPALETTECALLBACKS
);
658 pDDPaletteCallbacks
->dwFlags
= Flags
;
661 /* Check for D3D Callbacks */
664 /* Zero the struct */
665 RtlZeroMemory(pD3dCallbacks
, sizeof(D3DHAL_CALLBACKS
));
667 /* Check if we have one */
668 if (D3dCallbacks
.dwSize
)
670 /* Write the header */
671 pD3dCallbacks
->dwSize
= sizeof(D3DHAL_CALLBACKS
);
673 /* Now check for each callback */
674 if (D3dCallbacks
.ContextCreate
)
677 pD3dCallbacks->ContextCreate = D3dContextCreate;
680 if (D3dCallbacks
.ContextDestroy
)
682 pD3dCallbacks
->ContextDestroy
= (LPD3DHAL_CONTEXTDESTROYCB
) NtGdiD3dContextDestroy
;
684 if (D3dCallbacks
.ContextDestroyAll
)
687 pD3dCallbacks->ContextDestroyAll = (LPD3DHAL_CONTEXTDESTROYALLCB) NtGdiD3dContextDestroyAll;
693 /* Check for D3D Driver Data */
696 /* Copy the struct */
697 RtlMoveMemory(pD3dDriverData
,
699 sizeof(D3DHAL_GLOBALDRIVERDATA
));
701 /* Write the pointer to the texture formats */
702 pD3dDriverData
->lpTextureFormats
= pD3dTextureFormats
;
705 /* FIXME: Check for D3D Buffer Callbacks */
707 /* Check if we have a video memory list */
710 /* Start a loop here */
711 PVIDEOMEMORY VidMem
= VidMemList
;
713 /* Loop all the heaps we have */
716 /* Copy from one format to the other */
717 pvmList
->dwFlags
= VidMem
->dwFlags
;
718 pvmList
->fpStart
= VidMem
->fpStart
;
719 pvmList
->fpEnd
= VidMem
->fpEnd
;
720 pvmList
->ddsCaps
= VidMem
->ddsCaps
;
721 pvmList
->ddsCapsAlt
= VidMem
->ddsCapsAlt
;
722 pvmList
->dwHeight
= VidMem
->dwHeight
;
724 /* Advance in both structures */
729 /* Free our structure */
730 LocalFree(VidMemList
);
744 DdDeleteDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal
)
748 /* If this is the global object */
749 if(pDirectDrawGlobal
->hDD
)
752 Return
= NtGdiDdDeleteDirectDrawObject((HANDLE
)pDirectDrawGlobal
->hDD
);
755 pDirectDrawGlobal
->hDD
= 0;
758 else if (ghDirectDraw
)
760 /* Always success here */
763 /* Make sure this is the last instance */
764 if (!(--gcDirectDraw
))
766 /* Delete the object */
767 Return
= NtGdiDdDeleteDirectDrawObject(ghDirectDraw
);
786 DdCreateSurfaceObject( LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
,
787 BOOL bPrimarySurface
)
789 return bDDCreateSurface(pSurfaceLocal
, TRUE
);
790 //return bDdCreateSurfaceObject(pSurfaceLocal, TRUE);
801 DdDeleteSurfaceObject(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
)
805 /* Make sure there is one */
806 if (pSurfaceLocal
->hDDSurface
)
809 Return
= NtGdiDdDeleteSurfaceObject((HANDLE
)pSurfaceLocal
->hDDSurface
);
810 pSurfaceLocal
->hDDSurface
= 0;
823 DdResetVisrgn(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
,
826 /* Call win32k directly */
827 return NtGdiDdResetVisrgn((HANDLE
) pSurfaceLocal
->hDDSurface
, hWnd
);
837 DdGetDC(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
,
838 LPPALETTEENTRY pColorTable
)
840 /* Call win32k directly */
841 return NtGdiDdGetDC(pColorTable
, (HANDLE
) pSurfaceLocal
->hDDSurface
);
851 DdReleaseDC(LPDDRAWI_DDRAWSURFACE_LCL pSurfaceLocal
)
853 /* Call win32k directly */
854 return NtGdiDdReleaseDC((HANDLE
) pSurfaceLocal
->hDDSurface
);
863 DdCreateDIBSection(HDC hdc
,
864 CONST BITMAPINFO
*pbmi
,
870 SetLastError(ERROR_CALL_NOT_IMPLEMENTED
);
881 DdReenableDirectDrawObject(LPDDRAWI_DIRECTDRAW_GBL pDirectDrawGlobal
,
884 /* Call win32k directly */
885 return NtGdiDdReenableDirectDrawObject(GetDdHandle(pDirectDrawGlobal
->hDD
),
897 DdAttachSurface( LPDDRAWI_DDRAWSURFACE_LCL pSurfaceFrom
,
898 LPDDRAWI_DDRAWSURFACE_LCL pSurfaceTo
)
900 /* Create Surface if it does not exits one */
901 if (pSurfaceFrom
->hDDSurface
)
903 if (!bDDCreateSurface(pSurfaceFrom
, FALSE
))
909 /* Create Surface if it does not exits one */
910 if (pSurfaceTo
->hDDSurface
)
912 if (!bDDCreateSurface(pSurfaceTo
, FALSE
))
919 return NtGdiDdAttachSurface((HANDLE
)pSurfaceFrom
->hDDSurface
,
920 (HANDLE
)pSurfaceTo
->hDDSurface
);
930 DdUnattachSurface(LPDDRAWI_DDRAWSURFACE_LCL pSurface
,
931 LPDDRAWI_DDRAWSURFACE_LCL pSurfaceAttached
)
934 NtGdiDdUnattachSurface((HANDLE
)pSurface
->hDDSurface
,
935 (HANDLE
)pSurfaceAttached
->hDDSurface
);
945 DdQueryDisplaySettingsUniqueness()
947 return RemberDdQueryDisplaySettingsUniquenessID
;
957 DdGetDxHandle(LPDDRAWI_DIRECTDRAW_LCL pDDraw
,
958 LPDDRAWI_DDRAWSURFACE_LCL pSurface
,
962 HANDLE hSurface
= (HANDLE
)pSurface
->hDDSurface
;
964 /* Check if we already have a surface */
967 /* We don't have one, use the DirectDraw Object handle instead */
969 hDD
= GetDdHandle(pDDraw
->lpGbl
->hDD
);
973 return (HANDLE
)NtGdiDdGetDxHandle(hDD
, hSurface
, bRelease
);
983 DdSetGammaRamp(LPDDRAWI_DIRECTDRAW_LCL pDDraw
,
987 /* Call win32k directly */
988 return NtGdiDdSetGammaRamp(GetDdHandle(pDDraw
->lpGbl
->hDD
),
999 DdSwapTextureHandles(LPDDRAWI_DIRECTDRAW_LCL pDDraw
,
1000 LPDDRAWI_DDRAWSURFACE_LCL pDDSLcl1
,
1001 LPDDRAWI_DDRAWSURFACE_LCL pDDSLcl2
)
1003 /* Always returns success */