2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: Native DirectDraw implementation
5 * FILE: subsys/win32k/ntddraw/ddraw.c
6 * PROGRAMER: Peter Bajusz (hyp-x@stormregion.com)
8 * 25-10-2003 PB Created
16 /* swtich this off to get rid of all dx debug msg */
20 /************************************************************************/
21 /* DIRECT DRAW OBJECT */
22 /************************************************************************/
25 DD_Cleanup(PVOID ObjectBody
)
27 PDD_DIRECTDRAW pDirectDraw
= (PDD_DIRECTDRAW
) ObjectBody
;
29 DPRINT1("DD_Cleanup\n");
35 if (pDirectDraw
->Global
.dhpdev
== NULL
)
38 if (pDirectDraw
->DrvDisableDirectDraw
== NULL
)
41 pDirectDraw
->DrvDisableDirectDraw(pDirectDraw
->Global
.dhpdev
);
45 HANDLE STDCALL
NtGdiDdCreateDirectDrawObject(
49 DD_CALLBACKS callbacks
;
50 DD_SURFACECALLBACKS surface_callbacks
;
51 DD_PALETTECALLBACKS palette_callbacks
;
53 DPRINT1("NtGdiDdCreateDirectDrawObject\n");
56 RtlZeroMemory(&callbacks
, sizeof(DD_CALLBACKS
));
57 callbacks
.dwSize
= sizeof(DD_CALLBACKS
);
58 RtlZeroMemory(&surface_callbacks
, sizeof(DD_SURFACECALLBACKS
));
59 surface_callbacks
.dwSize
= sizeof(DD_SURFACECALLBACKS
);
60 RtlZeroMemory(&palette_callbacks
, sizeof(DD_PALETTECALLBACKS
));
61 palette_callbacks
.dwSize
= sizeof(DD_PALETTECALLBACKS
);
63 /* FIXME hdc can be zero for d3d9 */
64 /* we need create it, if in that case */
70 DC
*pDC
= DC_LockDc(hdc
);
74 if (!pDC
->DriverFunctions
.EnableDirectDraw
)
76 // Driver doesn't support DirectDraw
81 BOOL success
= pDC
->DriverFunctions
.EnableDirectDraw(
82 pDC
->PDev
, &callbacks
, &surface_callbacks
, &palette_callbacks
);
87 DPRINT1("DirectDraw creation failed\n");
89 // DirectDraw creation failed
94 HANDLE hDirectDraw
= GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DIRECTDRAW
);
99 DPRINT1("No more memmory\n");
105 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDraw
, GDI_OBJECT_TYPE_DIRECTDRAW
);
110 DPRINT1("invalid handle\n");
117 pDirectDraw
->Global
.dhpdev
= pDC
->PDev
;
118 pDirectDraw
->Local
.lpGbl
= &pDirectDraw
->Global
;
120 pDirectDraw
->DrvGetDirectDrawInfo
= pDC
->DriverFunctions
.GetDirectDrawInfo
;
121 pDirectDraw
->DrvDisableDirectDraw
= pDC
->DriverFunctions
.DisableDirectDraw
;
123 /* DD_CALLBACKS setup */
124 RtlMoveMemory(&pDirectDraw
->DD
, &callbacks
, sizeof(DD_CALLBACKS
));
126 /* DD_SURFACECALLBACKS setup*/
127 RtlMoveMemory(&pDirectDraw
->Surf
, &surface_callbacks
, sizeof(DD_SURFACECALLBACKS
));
129 /* DD_PALETTECALLBACKS setup*/
130 RtlMoveMemory(&pDirectDraw
->Pal
, &surface_callbacks
, sizeof(DD_PALETTECALLBACKS
));
132 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
138 BOOL STDCALL
NtGdiDdDeleteDirectDrawObject(
139 HANDLE hDirectDrawLocal
143 DPRINT1("NtGdiDdDeleteDirectDrawObject\n");
145 return GDIOBJ_FreeObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
148 BOOL STDCALL
NtGdiDdQueryDirectDrawObject(
149 HANDLE hDirectDrawLocal
,
150 DD_HALINFO
*pHalInfo
,
151 DWORD
*pCallBackFlags
,
152 LPD3DNTHAL_CALLBACKS puD3dCallbacks
,
153 LPD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData
,
154 PDD_D3DBUFCALLBACKS puD3dBufferCallbacks
,
155 LPDDSURFACEDESC puD3dTextureFormats
,
157 VIDEOMEMORY
*puvmList
,
163 DPRINT1("NtGdiDdQueryDirectDrawObject\n");
166 /* Check for NULL pointer to prevent any one doing a mistake */
168 if (hDirectDrawLocal
== NULL
)
171 DPRINT1("warning hDirectDraw handler is NULL, the handler is DDRAWI_DIRECTDRAW_GBL.hDD\n");
172 DPRINT1("and it is NtGdiDdCreateDirectDrawObject return value\n");
178 if (pHalInfo
== NULL
)
181 DPRINT1("warning pHalInfo buffer is NULL \n");
186 if ( pCallBackFlags
== NULL
)
189 DPRINT1("warning pCallBackFlags s NULL, the size must be 3*DWORD in follow order \n");
190 DPRINT1("pCallBackFlags[0] = flags in DD_CALLBACKS\n");
191 DPRINT1("pCallBackFlags[1] = flags in DD_SURFACECALLBACKS\n");
192 DPRINT1("pCallBackFlags[2] = flags in DD_PALETTECALLBACKS\n");
198 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
203 /* Fail to Lock DirectDraw handle */
205 DPRINT1(" Fail to Lock DirectDraw handle \n");
210 BOOL success
= pDirectDraw
->DrvGetDirectDrawInfo(
211 pDirectDraw
->Global
.dhpdev
,
221 DPRINT1(" Fail to get DirectDraw driver info \n");
223 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
228 /* rest the flag so we do not need do it later */
237 DDHALINFO
* pHalInfo2
= ((DDHALINFO
*) pHalInfo
);
239 DPRINT1("Found DirectDraw CallBack for 2D and 3D Hal\n");
241 RtlMoveMemory(&pDirectDraw
->Hal
, pHalInfo2
, sizeof(DDHALINFO
));
243 if (pHalInfo2
->lpDDExeBufCallbacks
)
246 DPRINT1("Found DirectDraw CallBack for 3D Hal Bufffer \n");
248 /* msdn DDHAL_D3DBUFCALLBACKS = DD_D3DBUFCALLBACKS */
249 RtlMoveMemory(puD3dBufferCallbacks
, pHalInfo2
->lpDDExeBufCallbacks
, sizeof(DD_D3DBUFCALLBACKS
));
253 DPRINT1("Do not support CallBack for 3D Hal\n");
255 /* FIXME we need D3DHAL be include
257 if (pHalInfo2->lpD3DHALCallbacks )
260 DPRINT1("Found DirectDraw CallBack for 3D Hal\n");
262 RtlMoveMemory(puD3dCallbacks, (ULONG *)pHalInfo2->lpD3DHALCallbacks, sizeof( D3DHAL_CALLBACKS ));
267 /* msdn say D3DHAL_GLOBALDRIVERDATA and D3DNTHAL_GLOBALDRIVERDATA are not same
268 but if u compare these in msdn it is exacly same */
270 if (pHalInfo
->lpD3DGlobalDriverData
)
273 DPRINT1("Found DirectDraw CallBack for 3D Hal Private \n");
275 RtlMoveMemory(puD3dDriverData
, (ULONG
*)pHalInfo2
->lpD3DGlobalDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
280 if (pHalInfo2
->lpDDCallbacks
!=NULL
)
283 DPRINT1("Dectect DirectDraw lpDDCallbacks for 2D Hal flag = %d\n",pHalInfo2
->lpDDCallbacks
->dwFlags
);
285 pCallBackFlags
[0] = pHalInfo2
->lpDDCallbacks
->dwFlags
;
288 if (pHalInfo2
->lpDDCallbacks
!=NULL
)
291 DPRINT1("Dectect DirectDraw lpDDSurfaceCallbacks for 2D Hal flag = %d\n",pHalInfo2
->lpDDSurfaceCallbacks
->dwFlags
);
293 pCallBackFlags
[1] = pHalInfo2
->lpDDSurfaceCallbacks
->dwFlags
;
296 if (pHalInfo2
->lpDDCallbacks
!=NULL
)
299 DPRINT1("Dectect DirectDraw lpDDCallbacks for 2D Hal flag = %d\n",pHalInfo2
->lpDDPaletteCallbacks
->dwFlags
);
301 pCallBackFlags
[2] = pHalInfo2
->lpDDPaletteCallbacks
->dwFlags
;
307 DPRINT1("Found DirectDraw CallBack for 3D Hal\n");
309 RtlMoveMemory(&pDirectDraw
->Hal
, pHalInfo
, sizeof(DD_HALINFO
));
311 if (pHalInfo
->lpD3DBufCallbacks
)
314 DPRINT1("Found DirectDraw CallBack for 3D Hal Bufffer \n");
316 RtlMoveMemory(puD3dBufferCallbacks
, pHalInfo
->lpD3DBufCallbacks
, sizeof(DD_D3DBUFCALLBACKS
));
319 if (pHalInfo
->lpD3DHALCallbacks
)
322 DPRINT1("Found DirectDraw CallBack for 3D Hal\n");
324 RtlMoveMemory(puD3dCallbacks
, pHalInfo
->lpD3DHALCallbacks
, sizeof(D3DNTHAL_CALLBACKS
));
327 if (pHalInfo
->lpD3DGlobalDriverData
)
330 DPRINT1("Found DirectDraw CallBack for 3D Hal Private \n");
332 RtlMoveMemory(puD3dDriverData
, pHalInfo
->lpD3DGlobalDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
336 DPRINT1("Unkown DirectX driver interface\n");
344 DPRINT1("No DirectDraw Hal info have been found, it did not fail, it did gather some other info \n");
348 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
354 DWORD STDCALL
NtGdiDdGetDriverInfo(
355 HANDLE hDirectDrawLocal
,
356 PDD_GETDRIVERINFODATA puGetDriverInfoData
)
361 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
363 DPRINT1("NtGdiDdGetDriverInfo\n");
366 if (pDirectDraw
== NULL
)
369 DPRINT1("Can not lock DirectDraw handle \n");
371 return DDHAL_DRIVER_NOTHANDLED
;
375 /* it exsist two version of NtGdiDdGetDriverInfo we need check for both flags */
376 if (!(pDirectDraw
->Hal
.dwFlags
& DDHALINFO_GETDRIVERINFOSET
))
379 if (!(pDirectDraw
->Hal
.dwFlags
& DDHALINFO_GETDRIVERINFO2
))
383 /* Now we are doing the call to drv DrvGetDriverInfo */
387 DPRINT1("NtGdiDdGetDriverInfo DDHAL_DRIVER_NOTHANDLED");
389 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
392 ddRVal
= pDirectDraw
->Hal
.GetDriverInfo(puGetDriverInfoData
);
394 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
399 /************************************************************************/
401 /* FIXME NtGdiDdCreateSurface we do not call to ddCreateSurface */
402 /************************************************************************/
404 DWORD STDCALL
NtGdiDdCreateSurface(
405 HANDLE hDirectDrawLocal
,
407 DDSURFACEDESC
*puSurfaceDescription
,
408 DD_SURFACE_GLOBAL
*puSurfaceGlobalData
,
409 DD_SURFACE_LOCAL
*puSurfaceLocalData
,
410 DD_SURFACE_MORE
*puSurfaceMoreData
,
411 PDD_CREATESURFACEDATA puCreateSurfaceData
,
415 DWORD ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
416 PDD_DIRECTDRAW_GLOBAL lgpl
;
418 DPRINT1("NtGdiDdCreateSurface\n");
421 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
422 if (pDirectDraw
== NULL
)
425 DPRINT1("Can not lock the DirectDraw handle\n");
427 return DDHAL_DRIVER_NOTHANDLED
;
430 /* backup the orignal PDev and info */
431 lgpl
= puCreateSurfaceData
->lpDD
;
433 /* use our cache version instead */
434 puCreateSurfaceData
->lpDD
= &pDirectDraw
->Global
;
437 if (!(pDirectDraw
->DD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
))
440 DPRINT1("DirectDraw HAL does not support Create Surface");
442 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
446 ddRVal
= pDirectDraw
->DD
.CreateSurface(puCreateSurfaceData
);
449 /* But back the orignal PDev */
450 puCreateSurfaceData
->lpDD
= lgpl
;
452 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
456 DWORD STDCALL
NtGdiDdWaitForVerticalBlank(
457 HANDLE hDirectDrawLocal
,
458 PDD_WAITFORVERTICALBLANKDATA puWaitForVerticalBlankData
462 PDD_DIRECTDRAW_GLOBAL lgpl
;
464 DPRINT1("NtGdiDdWaitForVerticalBlank\n");
468 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
469 if (pDirectDraw
== NULL
)
470 return DDHAL_DRIVER_NOTHANDLED
;
472 /* backup the orignal PDev and info */
473 lgpl
= puWaitForVerticalBlankData
->lpDD
;
475 /* use our cache version instead */
476 puWaitForVerticalBlankData
->lpDD
= &pDirectDraw
->Global
;
479 if (!(pDirectDraw
->DD
.dwFlags
& DDHAL_CB32_WAITFORVERTICALBLANK
))
480 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
482 ddRVal
= pDirectDraw
->DD
.WaitForVerticalBlank(puWaitForVerticalBlankData
);
484 /* But back the orignal PDev */
485 puWaitForVerticalBlankData
->lpDD
= lgpl
;
487 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
491 DWORD STDCALL
NtGdiDdCanCreateSurface(
492 HANDLE hDirectDrawLocal
,
493 PDD_CANCREATESURFACEDATA puCanCreateSurfaceData
497 PDD_DIRECTDRAW_GLOBAL lgpl
;
499 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
501 DPRINT1("NtGdiDdCanCreateSurface\n");
503 if (pDirectDraw
== NULL
)
504 return DDHAL_DRIVER_NOTHANDLED
;
506 /* backup the orignal PDev and info */
507 lgpl
= puCanCreateSurfaceData
->lpDD
;
509 /* use our cache version instead */
510 puCanCreateSurfaceData
->lpDD
= &pDirectDraw
->Global
;
513 if (!(pDirectDraw
->DD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
))
514 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
516 ddRVal
= pDirectDraw
->DD
.CanCreateSurface(puCanCreateSurfaceData
);
518 /* But back the orignal PDev */
519 puCanCreateSurfaceData
->lpDD
= lgpl
;
521 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
525 DWORD STDCALL
NtGdiDdGetScanLine(
526 HANDLE hDirectDrawLocal
,
527 PDD_GETSCANLINEDATA puGetScanLineData
531 PDD_DIRECTDRAW_GLOBAL lgpl
;
533 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
535 DPRINT1("NtGdiDdGetScanLine\n");
537 if (pDirectDraw
== NULL
)
538 return DDHAL_DRIVER_NOTHANDLED
;
540 /* backup the orignal PDev and info */
541 lgpl
= puGetScanLineData
->lpDD
;
543 /* use our cache version instead */
544 puGetScanLineData
->lpDD
= &pDirectDraw
->Global
;
547 if (!(pDirectDraw
->DD
.dwFlags
& DDHAL_CB32_GETSCANLINE
))
548 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
550 ddRVal
= pDirectDraw
->DD
.GetScanLine(puGetScanLineData
);
552 /* But back the orignal PDev */
553 puGetScanLineData
->lpDD
= lgpl
;
555 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
561 /************************************************************************/
562 /* Surface CALLBACKS */
564 /* NtGdiDdDestroySurface */
565 /************************************************************************/
567 DWORD STDCALL
NtGdiDdDestroySurface(
572 DWORD ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
574 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
576 DPRINT1("NtGdiDdDestroySurface\n");
578 if (pDirectDraw
== NULL
)
579 return DDHAL_DRIVER_NOTHANDLED
;
581 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_DESTROYSURFACE
))
582 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
585 DD_DESTROYSURFACEDATA DestroySurf
;
589 * are we doing right ??
591 DestroySurf
.lpDD
= &pDirectDraw
->Global
;
593 DestroySurf
.lpDDSurface
= hSurface
; // ?
594 DestroySurf
.DestroySurface
= pDirectDraw
->Surf
.DestroySurface
;
596 ddRVal
= pDirectDraw
->Surf
.DestroySurface(&DestroySurf
);
600 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
604 DWORD STDCALL
NtGdiDdFlip(
605 HANDLE hSurfaceCurrent
,
606 HANDLE hSurfaceTarget
,
607 HANDLE hSurfaceCurrentLeft
,
608 HANDLE hSurfaceTargetLeft
,
609 PDD_FLIPDATA puFlipData
613 PDD_DIRECTDRAW_GLOBAL lgpl
;
615 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceTarget
, GDI_OBJECT_TYPE_DIRECTDRAW
);
617 DPRINT1("NtGdiDdFlip\n");
620 if (pDirectDraw
== NULL
)
621 return DDHAL_DRIVER_NOTHANDLED
;
623 /* backup the orignal PDev and info */
624 lgpl
= puFlipData
->lpDD
;
626 /* use our cache version instead */
627 puFlipData
->lpDD
= &pDirectDraw
->Global
;
630 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_FLIP
))
631 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
633 ddRVal
= pDirectDraw
->Surf
.Flip(puFlipData
);
635 /* But back the orignal PDev */
636 puFlipData
->lpDD
= lgpl
;
638 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
642 DWORD STDCALL
NtGdiDdLock(
644 PDD_LOCKDATA puLockData
,
649 PDD_DIRECTDRAW_GLOBAL lgpl
;
651 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
653 DPRINT1("NtGdiDdLock\n");
655 if (pDirectDraw
== NULL
)
656 return DDHAL_DRIVER_NOTHANDLED
;
658 /* backup the orignal PDev and info */
659 lgpl
= puLockData
->lpDD
;
661 /* use our cache version instead */
662 puLockData
->lpDD
= &pDirectDraw
->Global
;
665 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_LOCK
))
666 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
668 ddRVal
= pDirectDraw
->Surf
.Lock(puLockData
);
670 /* But back the orignal PDev */
671 puLockData
->lpDD
= lgpl
;
673 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
677 DWORD STDCALL
NtGdiDdUnlock(
679 PDD_UNLOCKDATA puUnlockData
683 PDD_DIRECTDRAW_GLOBAL lgpl
;
685 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
687 DPRINT1("NtGdiDdUnlock\n");
689 if (pDirectDraw
== NULL
)
690 return DDHAL_DRIVER_NOTHANDLED
;
692 /* backup the orignal PDev and info */
693 lgpl
= puUnlockData
->lpDD
;
695 /* use our cache version instead */
696 puUnlockData
->lpDD
= &pDirectDraw
->Global
;
699 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_UNLOCK
))
700 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
702 ddRVal
= pDirectDraw
->Surf
.Unlock(puUnlockData
);
704 /* But back the orignal PDev */
705 puUnlockData
->lpDD
= lgpl
;
707 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
711 DWORD STDCALL
NtGdiDdBlt(
714 PDD_BLTDATA puBltData
718 PDD_DIRECTDRAW_GLOBAL lgpl
;
720 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceDest
, GDI_OBJECT_TYPE_DIRECTDRAW
);
722 DPRINT1("NtGdiDdBlt\n");
724 if (pDirectDraw
== NULL
)
725 return DDHAL_DRIVER_NOTHANDLED
;
727 /* backup the orignal PDev and info */
728 lgpl
= puBltData
->lpDD
;
730 /* use our cache version instead */
731 puBltData
->lpDD
= &pDirectDraw
->Global
;
734 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_BLT
))
735 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
737 ddRVal
= pDirectDraw
->Surf
.Blt(puBltData
);
739 /* But back the orignal PDev */
740 puBltData
->lpDD
= lgpl
;
742 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
746 DWORD STDCALL
NtGdiDdSetColorKey(
748 PDD_SETCOLORKEYDATA puSetColorKeyData
752 PDD_DIRECTDRAW_GLOBAL lgpl
;
754 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
756 DPRINT1("NtGdiDdSetColorKey\n");
758 if (pDirectDraw
== NULL
)
759 return DDHAL_DRIVER_NOTHANDLED
;
761 /* backup the orignal PDev and info */
762 lgpl
= puSetColorKeyData
->lpDD
;
764 /* use our cache version instead */
765 puSetColorKeyData
->lpDD
= &pDirectDraw
->Global
;
768 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_SETCOLORKEY
))
769 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
771 ddRVal
= pDirectDraw
->Surf
.SetColorKey(puSetColorKeyData
);
773 /* But back the orignal PDev */
774 puSetColorKeyData
->lpDD
= lgpl
;
776 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
781 DWORD STDCALL
NtGdiDdAddAttachedSurface(
783 HANDLE hSurfaceAttached
,
784 PDD_ADDATTACHEDSURFACEDATA puAddAttachedSurfaceData
788 PDD_DIRECTDRAW_GLOBAL lgpl
;
790 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceAttached
, GDI_OBJECT_TYPE_DIRECTDRAW
);
792 DPRINT1("NtGdiDdAddAttachedSurface\n");
794 if (pDirectDraw
== NULL
)
795 return DDHAL_DRIVER_NOTHANDLED
;
797 /* backup the orignal PDev and info */
798 lgpl
= puAddAttachedSurfaceData
->lpDD
;
800 /* use our cache version instead */
801 puAddAttachedSurfaceData
->lpDD
= &pDirectDraw
->Global
;
804 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
))
805 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
807 ddRVal
= pDirectDraw
->Surf
.AddAttachedSurface(puAddAttachedSurfaceData
);
809 /* But back the orignal PDev */
810 puAddAttachedSurfaceData
->lpDD
= lgpl
;
812 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
816 DWORD STDCALL
NtGdiDdGetBltStatus(
818 PDD_GETBLTSTATUSDATA puGetBltStatusData
822 PDD_DIRECTDRAW_GLOBAL lgpl
;
824 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
826 DPRINT1("NtGdiDdGetBltStatus\n");
828 if (pDirectDraw
== NULL
)
829 return DDHAL_DRIVER_NOTHANDLED
;
831 /* backup the orignal PDev and info */
832 lgpl
= puGetBltStatusData
->lpDD
;
834 /* use our cache version instead */
835 puGetBltStatusData
->lpDD
= &pDirectDraw
->Global
;
838 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_GETBLTSTATUS
))
839 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
841 ddRVal
= pDirectDraw
->Surf
.GetBltStatus(puGetBltStatusData
);
843 /* But back the orignal PDev */
844 puGetBltStatusData
->lpDD
= lgpl
;
846 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
850 DWORD STDCALL
NtGdiDdGetFlipStatus(
852 PDD_GETFLIPSTATUSDATA puGetFlipStatusData
856 PDD_DIRECTDRAW_GLOBAL lgpl
;
858 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
860 DPRINT1("NtGdiDdGetFlipStatus\n");
862 if (pDirectDraw
== NULL
)
863 return DDHAL_DRIVER_NOTHANDLED
;
865 /* backup the orignal PDev and info */
866 lgpl
= puGetFlipStatusData
->lpDD
;
868 /* use our cache version instead */
869 puGetFlipStatusData
->lpDD
= &pDirectDraw
->Global
;
872 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_GETFLIPSTATUS
))
873 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
875 ddRVal
= pDirectDraw
->Surf
.GetFlipStatus(puGetFlipStatusData
);
877 /* But back the orignal PDev */
878 puGetFlipStatusData
->lpDD
= lgpl
;
880 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
884 DWORD STDCALL
NtGdiDdUpdateOverlay(
885 HANDLE hSurfaceDestination
,
886 HANDLE hSurfaceSource
,
887 PDD_UPDATEOVERLAYDATA puUpdateOverlayData
891 PDD_DIRECTDRAW_GLOBAL lgpl
;
893 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceDestination
, GDI_OBJECT_TYPE_DIRECTDRAW
);
895 DPRINT1("NtGdiDdUpdateOverlay\n");
897 if (pDirectDraw
== NULL
)
898 return DDHAL_DRIVER_NOTHANDLED
;
900 /* backup the orignal PDev and info */
901 lgpl
= puUpdateOverlayData
->lpDD
;
903 /* use our cache version instead */
904 puUpdateOverlayData
->lpDD
= &pDirectDraw
->Global
;
907 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_UPDATEOVERLAY
))
908 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
910 ddRVal
= pDirectDraw
->Surf
.UpdateOverlay(puUpdateOverlayData
);
912 /* But back the orignal PDev */
913 puUpdateOverlayData
->lpDD
= lgpl
;
915 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
919 DWORD STDCALL
NtGdiDdSetOverlayPosition(
920 HANDLE hSurfaceSource
,
921 HANDLE hSurfaceDestination
,
922 PDD_SETOVERLAYPOSITIONDATA puSetOverlayPositionData
926 PDD_DIRECTDRAW_GLOBAL lgpl
;
928 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceDestination
, GDI_OBJECT_TYPE_DIRECTDRAW
);
930 DPRINT1("NtGdiDdSetOverlayPosition\n");
932 if (pDirectDraw
== NULL
)
933 return DDHAL_DRIVER_NOTHANDLED
;
935 /* backup the orignal PDev and info */
936 lgpl
= puSetOverlayPositionData
->lpDD
;
938 /* use our cache version instead */
939 puSetOverlayPositionData
->lpDD
= &pDirectDraw
->Global
;
942 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
))
943 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
945 ddRVal
= pDirectDraw
->Surf
.SetOverlayPosition(puSetOverlayPositionData
);
947 /* But back the orignal PDev */
948 puSetOverlayPositionData
->lpDD
= lgpl
;
950 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
955 /************************************************************************/
957 /************************************************************************/
960 DDSURF_Cleanup(PVOID pDDSurf
)
963 * PDD_SURFACE pDDSurf = PVOID pDDSurf
966 DPRINT1("DDSURF_Cleanup\n");
971 HANDLE STDCALL
NtGdiDdCreateSurfaceObject(
972 HANDLE hDirectDrawLocal
,
974 PDD_SURFACE_LOCAL puSurfaceLocal
,
975 PDD_SURFACE_MORE puSurfaceMore
,
976 PDD_SURFACE_GLOBAL puSurfaceGlobal
,
980 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
982 DPRINT1("NtGdiDdCreateSurfaceObject\n");
988 hSurface
= GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DD_SURFACE
);
990 PDD_SURFACE pSurface
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DD_SURFACE
);
991 /* FIXME - Handle pSurface == NULL!!!! */
993 RtlMoveMemory(&pSurface
->Local
, puSurfaceLocal
, sizeof(DD_SURFACE_LOCAL
));
994 RtlMoveMemory(&pSurface
->More
, puSurfaceMore
, sizeof(DD_SURFACE_MORE
));
995 RtlMoveMemory(&pSurface
->Global
, puSurfaceGlobal
, sizeof(DD_SURFACE_GLOBAL
));
996 pSurface
->Local
.lpGbl
= &pSurface
->Global
;
997 pSurface
->Local
.lpSurfMore
= &pSurface
->More
;
998 pSurface
->Local
.lpAttachList
= NULL
;
999 pSurface
->Local
.lpAttachListFrom
= NULL
;
1000 pSurface
->More
.lpVideoPort
= NULL
;
1001 // FIXME: figure out how to use this
1002 pSurface
->bComplete
= bComplete
;
1004 GDIOBJ_UnlockObjByPtr(pSurface
);
1005 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
1010 BOOL STDCALL
NtGdiDdDeleteSurfaceObject(
1015 DPRINT1("NtGdiDdDeleteSurfaceObject\n");
1017 /* FIXME add right GDI_OBJECT_TYPE_ for everthing for now
1018 we are using same type */
1019 /* return GDIOBJ_FreeObj(hSurface, GDI_OBJECT_TYPE_DD_SURFACE); */
1020 return GDIOBJ_FreeObj(hSurface
, GDI_OBJECT_TYPE_DD_SURFACE
);
1026 /************************************************************************/
1027 /* DIRECT DRAW SURFACR END */
1028 /************************************************************************/
1032 BOOL STDCALL NtGdiDdAttachSurface(
1033 HANDLE hSurfaceFrom,
1037 PDD_SURFACE pSurfaceFrom = GDIOBJ_LockObj(hSurfaceFrom, GDI_OBJECT_TYPE_DD_SURFACE);
1040 PDD_SURFACE pSurfaceTo = GDIOBJ_LockObj(hSurfaceTo, GDI_OBJECT_TYPE_DD_SURFACE);
1043 GDIOBJ_UnlockObjByPtr(pSurfaceFrom);
1047 if (pSurfaceFrom->Local.lpAttachListFrom)
1049 pSurfaceFrom->Local.lpAttachListFrom = pSurfaceFrom->AttachListFrom;
1052 GDIOBJ_UnlockObjByPtr(pSurfaceFrom);
1053 GDIOBJ_UnlockObjByPtr(pSurfaceTo);
1058 DWORD STDCALL
NtGdiDdGetAvailDriverMemory(
1059 HANDLE hDirectDrawLocal
,
1060 PDD_GETAVAILDRIVERMEMORYDATA puGetAvailDriverMemoryData
1063 DWORD ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
1064 PDD_DIRECTDRAW_GLOBAL lgpl
;
1066 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
1068 DPRINT1("NtGdiDdGetAvailDriverMemory\n");
1071 /* backup the orignal PDev and info */
1072 lgpl
= puGetAvailDriverMemoryData
->lpDD
;
1074 /* use our cache version instead */
1075 puGetAvailDriverMemoryData
->lpDD
= &pDirectDraw
->Global
;
1078 // ddRVal = pDirectDraw->DdGetAvailDriverMemory(puGetAvailDriverMemoryData);
1080 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
1083 /* But back the orignal PDev */
1084 puGetAvailDriverMemoryData
->lpDD
= lgpl
;
1092 DWORD STDCALL
NtGdiDdSetExclusiveMode(
1094 PDD_SETEXCLUSIVEMODEDATA puSetExclusiveModeData
1098 PDD_DIRECTDRAW_GLOBAL lgpl
;
1100 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDraw
, GDI_OBJECT_TYPE_DIRECTDRAW
);
1103 DPRINT1("NtGdiDdSetExclusiveMode\n");
1106 /* backup the orignal PDev and info */
1107 lgpl
= puSetExclusiveModeData
->lpDD
;
1109 /* use our cache version instead */
1110 puSetExclusiveModeData
->lpDD
= &pDirectDraw
->Global
;
1113 ddRVal
= pDirectDraw
->DdSetExclusiveMode(puSetExclusiveModeData
);
1115 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
1117 /* But back the orignal PDev */
1118 puSetExclusiveModeData
->lpDD
= lgpl
;