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 /************************************************************************/
17 /* DIRECT DRAW OBJECT */
18 /************************************************************************/
21 DD_Cleanup(PVOID ObjectBody
)
23 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(ObjectBody
, GDI_OBJECT_TYPE_DIRECTDRAW
);
27 pDirectDraw
->DrvDisableDirectDraw(pDirectDraw
->Global
.dhpdev
);
29 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
33 HANDLE STDCALL
NtGdiDdCreateDirectDrawObject(
37 DD_CALLBACKS callbacks
;
38 DD_SURFACECALLBACKS surface_callbacks
;
39 DD_PALETTECALLBACKS palette_callbacks
;
41 RtlZeroMemory(&callbacks
, sizeof(DD_CALLBACKS
));
42 callbacks
.dwSize
= sizeof(DD_CALLBACKS
);
43 RtlZeroMemory(&surface_callbacks
, sizeof(DD_SURFACECALLBACKS
));
44 surface_callbacks
.dwSize
= sizeof(DD_SURFACECALLBACKS
);
45 RtlZeroMemory(&palette_callbacks
, sizeof(DD_PALETTECALLBACKS
));
46 palette_callbacks
.dwSize
= sizeof(DD_PALETTECALLBACKS
);
49 DC
*pDC
= DC_LockDc(hdc
);
53 if (!pDC
->DriverFunctions
.EnableDirectDraw
)
55 // Driver doesn't support DirectDraw
60 BOOL success
= pDC
->DriverFunctions
.EnableDirectDraw(
61 pDC
->PDev
, &callbacks
, &surface_callbacks
, &palette_callbacks
);
65 // DirectDraw creation failed
70 HANDLE hDirectDraw
= GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DIRECTDRAW
);
78 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDraw
, GDI_OBJECT_TYPE_DIRECTDRAW
);
87 pDirectDraw
->Global
.dhpdev
= pDC
->PDev
;
88 pDirectDraw
->Local
.lpGbl
= &pDirectDraw
->Global
;
90 pDirectDraw
->DrvGetDirectDrawInfo
= pDC
->DriverFunctions
.GetDirectDrawInfo
;
91 pDirectDraw
->DrvDisableDirectDraw
= pDC
->DriverFunctions
.DisableDirectDraw
;
93 /* DD_CALLBACKS setup */
94 RtlMoveMemory(&pDirectDraw
->DD
, &callbacks
, sizeof(DD_CALLBACKS
));
96 /* DD_SURFACECALLBACKS setup*/
97 RtlMoveMemory(&pDirectDraw
->Surf
, &surface_callbacks
, sizeof(DD_SURFACECALLBACKS
));
99 /* DD_PALETTECALLBACKS setup*/
100 RtlMoveMemory(&pDirectDraw
->Pal
, &surface_callbacks
, sizeof(DD_PALETTECALLBACKS
));
102 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
108 BOOL STDCALL
NtGdiDdDeleteDirectDrawObject(
109 HANDLE hDirectDrawLocal
112 return GDIOBJ_FreeObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
115 BOOL STDCALL
NtGdiDdQueryDirectDrawObject(
116 HANDLE hDirectDrawLocal
,
117 DD_HALINFO
*pHalInfo
,
118 DWORD
*pCallBackFlags
,
119 LPD3DNTHAL_CALLBACKS puD3dCallbacks
,
120 LPD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData
,
121 PDD_D3DBUFCALLBACKS puD3dBufferCallbacks
,
122 LPDDSURFACEDESC puD3dTextureFormats
,
124 VIDEOMEMORY
*puvmList
,
129 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
133 BOOL success
= pDirectDraw
->DrvGetDirectDrawInfo(
134 pDirectDraw
->Global
.dhpdev
,
143 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
149 RtlMoveMemory(&pDirectDraw
->Hal
, pHalInfo
, sizeof(DD_HALINFO
));
151 if (pHalInfo
->lpD3DHALCallbacks
)
153 RtlMoveMemory(puD3dCallbacks
, pHalInfo
->lpD3DHALCallbacks
, sizeof(D3DNTHAL_CALLBACKS
));
156 if (pHalInfo
->lpD3DGlobalDriverData
)
158 RtlMoveMemory(puD3dDriverData
, pHalInfo
->lpD3DGlobalDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
160 if (pHalInfo
->lpD3DBufCallbacks
)
162 RtlMoveMemory(puD3dBufferCallbacks
, pHalInfo
->lpD3DBufCallbacks
, sizeof(DD_D3DBUFCALLBACKS
));
167 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
173 DWORD STDCALL
NtGdiDdGetDriverInfo(
174 HANDLE hDirectDrawLocal
,
175 PDD_GETDRIVERINFODATA puGetDriverInfoData
)
180 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
181 if (pDirectDraw
== NULL
)
182 return DDHAL_DRIVER_NOTHANDLED
;
184 if (!(pDirectDraw
->Hal
.dwFlags
& DDHALINFO_GETDRIVERINFOSET
))
185 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
187 ddRVal
= pDirectDraw
->Hal
.GetDriverInfo(puGetDriverInfoData
);
189 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
194 /************************************************************************/
196 /* FIXME NtGdiDdCreateSurface we do not call to ddCreateSurface */
197 /************************************************************************/
199 DWORD STDCALL
NtGdiDdCreateSurface(
200 HANDLE hDirectDrawLocal
,
202 DDSURFACEDESC
*puSurfaceDescription
,
203 DD_SURFACE_GLOBAL
*puSurfaceGlobalData
,
204 DD_SURFACE_LOCAL
*puSurfaceLocalData
,
205 DD_SURFACE_MORE
*puSurfaceMoreData
,
206 PDD_CREATESURFACEDATA puCreateSurfaceData
,
210 DWORD ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
211 PDD_DIRECTDRAW_GLOBAL lgpl
;
213 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
214 if (pDirectDraw
== NULL
)
215 return DDHAL_DRIVER_NOTHANDLED
;
217 /* backup the orignal PDev and info */
218 lgpl
= puCreateSurfaceData
->lpDD
;
220 /* use our cache version instead */
221 puCreateSurfaceData
->lpDD
= &pDirectDraw
->Global
;
224 if (!(pDirectDraw
->DD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
))
225 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
228 ddRVal
= pDirectDraw
->DD
.CreateSurface(puCreateSurfaceData
);
231 /* But back the orignal PDev */
232 puCreateSurfaceData
->lpDD
= lgpl
;
234 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
238 DWORD STDCALL
NtGdiDdWaitForVerticalBlank(
239 HANDLE hDirectDrawLocal
,
240 PDD_WAITFORVERTICALBLANKDATA puWaitForVerticalBlankData
244 PDD_DIRECTDRAW_GLOBAL lgpl
;
246 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
247 if (pDirectDraw
== NULL
)
248 return DDHAL_DRIVER_NOTHANDLED
;
250 /* backup the orignal PDev and info */
251 lgpl
= puWaitForVerticalBlankData
->lpDD
;
253 /* use our cache version instead */
254 puWaitForVerticalBlankData
->lpDD
= &pDirectDraw
->Global
;
257 if (!(pDirectDraw
->DD
.dwFlags
& DDHAL_CB32_WAITFORVERTICALBLANK
))
258 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
260 ddRVal
= pDirectDraw
->DD
.WaitForVerticalBlank(puWaitForVerticalBlankData
);
262 /* But back the orignal PDev */
263 puWaitForVerticalBlankData
->lpDD
= lgpl
;
265 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
269 DWORD STDCALL
NtGdiDdCanCreateSurface(
270 HANDLE hDirectDrawLocal
,
271 PDD_CANCREATESURFACEDATA puCanCreateSurfaceData
275 PDD_DIRECTDRAW_GLOBAL lgpl
;
277 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
278 if (pDirectDraw
== NULL
)
279 return DDHAL_DRIVER_NOTHANDLED
;
281 /* backup the orignal PDev and info */
282 lgpl
= puCanCreateSurfaceData
->lpDD
;
284 /* use our cache version instead */
285 puCanCreateSurfaceData
->lpDD
= &pDirectDraw
->Global
;
288 if (!(pDirectDraw
->DD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
))
289 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
291 ddRVal
= pDirectDraw
->DD
.CanCreateSurface(puCanCreateSurfaceData
);
293 /* But back the orignal PDev */
294 puCanCreateSurfaceData
->lpDD
= lgpl
;
296 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
300 DWORD STDCALL
NtGdiDdGetScanLine(
301 HANDLE hDirectDrawLocal
,
302 PDD_GETSCANLINEDATA puGetScanLineData
306 PDD_DIRECTDRAW_GLOBAL lgpl
;
308 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
309 if (pDirectDraw
== NULL
)
310 return DDHAL_DRIVER_NOTHANDLED
;
312 /* backup the orignal PDev and info */
313 lgpl
= puGetScanLineData
->lpDD
;
315 /* use our cache version instead */
316 puGetScanLineData
->lpDD
= &pDirectDraw
->Global
;
319 if (!(pDirectDraw
->DD
.dwFlags
& DDHAL_CB32_GETSCANLINE
))
320 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
322 ddRVal
= pDirectDraw
->DD
.GetScanLine(puGetScanLineData
);
324 /* But back the orignal PDev */
325 puGetScanLineData
->lpDD
= lgpl
;
327 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
333 /************************************************************************/
334 /* Surface CALLBACKS */
336 /* NtGdiDdDestroySurface */
337 /************************************************************************/
339 DWORD STDCALL
NtGdiDdDestroySurface(
344 DWORD ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
346 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
347 if (pDirectDraw
== NULL
)
348 return DDHAL_DRIVER_NOTHANDLED
;
350 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_DESTROYSURFACE
))
351 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
354 DD_DESTROYSURFACEDATA DestroySurf
;
358 * are we doing right ??
360 DestroySurf
.lpDD
= &pDirectDraw
->Global
;
362 DestroySurf
.lpDDSurface
= hSurface
; // ?
363 DestroySurf
.DestroySurface
= pDirectDraw
->Surf
.DestroySurface
;
365 ddRVal
= pDirectDraw
->Surf
.DestroySurface(&DestroySurf
);
369 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
373 DWORD STDCALL
NtGdiDdFlip(
374 HANDLE hSurfaceCurrent
,
375 HANDLE hSurfaceTarget
,
376 HANDLE hSurfaceCurrentLeft
,
377 HANDLE hSurfaceTargetLeft
,
378 PDD_FLIPDATA puFlipData
382 PDD_DIRECTDRAW_GLOBAL lgpl
;
384 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceTarget
, GDI_OBJECT_TYPE_DIRECTDRAW
);
385 if (pDirectDraw
== NULL
)
386 return DDHAL_DRIVER_NOTHANDLED
;
388 /* backup the orignal PDev and info */
389 lgpl
= puFlipData
->lpDD
;
391 /* use our cache version instead */
392 puFlipData
->lpDD
= &pDirectDraw
->Global
;
395 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_FLIP
))
396 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
398 ddRVal
= pDirectDraw
->Surf
.Flip(puFlipData
);
400 /* But back the orignal PDev */
401 puFlipData
->lpDD
= lgpl
;
403 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
407 DWORD STDCALL
NtGdiDdLock(
409 PDD_LOCKDATA puLockData
,
414 PDD_DIRECTDRAW_GLOBAL lgpl
;
416 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
417 if (pDirectDraw
== NULL
)
418 return DDHAL_DRIVER_NOTHANDLED
;
420 /* backup the orignal PDev and info */
421 lgpl
= puLockData
->lpDD
;
423 /* use our cache version instead */
424 puLockData
->lpDD
= &pDirectDraw
->Global
;
427 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_LOCK
))
428 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
430 ddRVal
= pDirectDraw
->Surf
.Lock(puLockData
);
432 /* But back the orignal PDev */
433 puLockData
->lpDD
= lgpl
;
435 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
439 DWORD STDCALL
NtGdiDdUnlock(
441 PDD_UNLOCKDATA puUnlockData
445 PDD_DIRECTDRAW_GLOBAL lgpl
;
447 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
448 if (pDirectDraw
== NULL
)
449 return DDHAL_DRIVER_NOTHANDLED
;
451 /* backup the orignal PDev and info */
452 lgpl
= puUnlockData
->lpDD
;
454 /* use our cache version instead */
455 puUnlockData
->lpDD
= &pDirectDraw
->Global
;
458 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_UNLOCK
))
459 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
461 ddRVal
= pDirectDraw
->Surf
.Unlock(puUnlockData
);
463 /* But back the orignal PDev */
464 puUnlockData
->lpDD
= lgpl
;
466 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
470 DWORD STDCALL
NtGdiDdBlt(
473 PDD_BLTDATA puBltData
477 PDD_DIRECTDRAW_GLOBAL lgpl
;
479 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceDest
, GDI_OBJECT_TYPE_DIRECTDRAW
);
480 if (pDirectDraw
== NULL
)
481 return DDHAL_DRIVER_NOTHANDLED
;
483 /* backup the orignal PDev and info */
484 lgpl
= puBltData
->lpDD
;
486 /* use our cache version instead */
487 puBltData
->lpDD
= &pDirectDraw
->Global
;
490 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_BLT
))
491 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
493 ddRVal
= pDirectDraw
->Surf
.Blt(puBltData
);
495 /* But back the orignal PDev */
496 puBltData
->lpDD
= lgpl
;
498 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
502 DWORD STDCALL
NtGdiDdSetColorKey(
504 PDD_SETCOLORKEYDATA puSetColorKeyData
508 PDD_DIRECTDRAW_GLOBAL lgpl
;
510 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
511 if (pDirectDraw
== NULL
)
512 return DDHAL_DRIVER_NOTHANDLED
;
514 /* backup the orignal PDev and info */
515 lgpl
= puSetColorKeyData
->lpDD
;
517 /* use our cache version instead */
518 puSetColorKeyData
->lpDD
= &pDirectDraw
->Global
;
521 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_SETCOLORKEY
))
522 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
524 ddRVal
= pDirectDraw
->Surf
.SetColorKey(puSetColorKeyData
);
526 /* But back the orignal PDev */
527 puSetColorKeyData
->lpDD
= lgpl
;
529 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
534 DWORD STDCALL
NtGdiDdAddAttachedSurface(
536 HANDLE hSurfaceAttached
,
537 PDD_ADDATTACHEDSURFACEDATA puAddAttachedSurfaceData
541 PDD_DIRECTDRAW_GLOBAL lgpl
;
543 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceAttached
, GDI_OBJECT_TYPE_DIRECTDRAW
);
544 if (pDirectDraw
== NULL
)
545 return DDHAL_DRIVER_NOTHANDLED
;
547 /* backup the orignal PDev and info */
548 lgpl
= puAddAttachedSurfaceData
->lpDD
;
550 /* use our cache version instead */
551 puAddAttachedSurfaceData
->lpDD
= &pDirectDraw
->Global
;
554 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
))
555 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
557 ddRVal
= pDirectDraw
->Surf
.AddAttachedSurface(puAddAttachedSurfaceData
);
559 /* But back the orignal PDev */
560 puAddAttachedSurfaceData
->lpDD
= lgpl
;
562 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
566 DWORD STDCALL
NtGdiDdGetBltStatus(
568 PDD_GETBLTSTATUSDATA puGetBltStatusData
572 PDD_DIRECTDRAW_GLOBAL lgpl
;
574 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
575 if (pDirectDraw
== NULL
)
576 return DDHAL_DRIVER_NOTHANDLED
;
578 /* backup the orignal PDev and info */
579 lgpl
= puGetBltStatusData
->lpDD
;
581 /* use our cache version instead */
582 puGetBltStatusData
->lpDD
= &pDirectDraw
->Global
;
585 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_GETBLTSTATUS
))
586 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
588 ddRVal
= pDirectDraw
->Surf
.GetBltStatus(puGetBltStatusData
);
590 /* But back the orignal PDev */
591 puGetBltStatusData
->lpDD
= lgpl
;
593 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
597 DWORD STDCALL
NtGdiDdGetFlipStatus(
599 PDD_GETFLIPSTATUSDATA puGetFlipStatusData
603 PDD_DIRECTDRAW_GLOBAL lgpl
;
605 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
606 if (pDirectDraw
== NULL
)
607 return DDHAL_DRIVER_NOTHANDLED
;
609 /* backup the orignal PDev and info */
610 lgpl
= puGetFlipStatusData
->lpDD
;
612 /* use our cache version instead */
613 puGetFlipStatusData
->lpDD
= &pDirectDraw
->Global
;
616 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_GETFLIPSTATUS
))
617 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
619 ddRVal
= pDirectDraw
->Surf
.GetFlipStatus(puGetFlipStatusData
);
621 /* But back the orignal PDev */
622 puGetFlipStatusData
->lpDD
= lgpl
;
624 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
628 DWORD STDCALL
NtGdiDdUpdateOverlay(
629 HANDLE hSurfaceDestination
,
630 HANDLE hSurfaceSource
,
631 PDD_UPDATEOVERLAYDATA puUpdateOverlayData
635 PDD_DIRECTDRAW_GLOBAL lgpl
;
637 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceDestination
, GDI_OBJECT_TYPE_DIRECTDRAW
);
638 if (pDirectDraw
== NULL
)
639 return DDHAL_DRIVER_NOTHANDLED
;
641 /* backup the orignal PDev and info */
642 lgpl
= puUpdateOverlayData
->lpDD
;
644 /* use our cache version instead */
645 puUpdateOverlayData
->lpDD
= &pDirectDraw
->Global
;
648 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_UPDATEOVERLAY
))
649 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
651 ddRVal
= pDirectDraw
->Surf
.UpdateOverlay(puUpdateOverlayData
);
653 /* But back the orignal PDev */
654 puUpdateOverlayData
->lpDD
= lgpl
;
656 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
660 DWORD STDCALL
NtGdiDdSetOverlayPosition(
661 HANDLE hSurfaceSource
,
662 HANDLE hSurfaceDestination
,
663 PDD_SETOVERLAYPOSITIONDATA puSetOverlayPositionData
667 PDD_DIRECTDRAW_GLOBAL lgpl
;
669 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceDestination
, GDI_OBJECT_TYPE_DIRECTDRAW
);
670 if (pDirectDraw
== NULL
)
671 return DDHAL_DRIVER_NOTHANDLED
;
673 /* backup the orignal PDev and info */
674 lgpl
= puSetOverlayPositionData
->lpDD
;
676 /* use our cache version instead */
677 puSetOverlayPositionData
->lpDD
= &pDirectDraw
->Global
;
680 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
))
681 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
683 ddRVal
= pDirectDraw
->Surf
.SetOverlayPosition(puSetOverlayPositionData
);
685 /* But back the orignal PDev */
686 puSetOverlayPositionData
->lpDD
= lgpl
;
688 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
693 /************************************************************************/
695 /************************************************************************/
698 DDSURF_Cleanup(PVOID pDDSurf
)
701 * PDD_SURFACE pDDSurf = PVOID pDDSurf
706 HANDLE STDCALL
NtGdiDdCreateSurfaceObject(
707 HANDLE hDirectDrawLocal
,
709 PDD_SURFACE_LOCAL puSurfaceLocal
,
710 PDD_SURFACE_MORE puSurfaceMore
,
711 PDD_SURFACE_GLOBAL puSurfaceGlobal
,
715 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
720 hSurface
= GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DD_SURFACE
);
722 PDD_SURFACE pSurface
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DD_SURFACE
);
723 /* FIXME - Handle pSurface == NULL!!!! */
725 RtlMoveMemory(&pSurface
->Local
, puSurfaceLocal
, sizeof(DD_SURFACE_LOCAL
));
726 RtlMoveMemory(&pSurface
->More
, puSurfaceMore
, sizeof(DD_SURFACE_MORE
));
727 RtlMoveMemory(&pSurface
->Global
, puSurfaceGlobal
, sizeof(DD_SURFACE_GLOBAL
));
728 pSurface
->Local
.lpGbl
= &pSurface
->Global
;
729 pSurface
->Local
.lpSurfMore
= &pSurface
->More
;
730 pSurface
->Local
.lpAttachList
= NULL
;
731 pSurface
->Local
.lpAttachListFrom
= NULL
;
732 pSurface
->More
.lpVideoPort
= NULL
;
733 // FIXME: figure out how to use this
734 pSurface
->bComplete
= bComplete
;
736 GDIOBJ_UnlockObjByPtr(pSurface
);
737 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
742 BOOL STDCALL
NtGdiDdDeleteSurfaceObject(
746 return GDIOBJ_FreeObj(hSurface
, GDI_OBJECT_TYPE_DD_SURFACE
);
751 /************************************************************************/
752 /* DIRECT DRAW SURFACR END */
753 /************************************************************************/
757 BOOL STDCALL NtGdiDdAttachSurface(
762 PDD_SURFACE pSurfaceFrom = GDIOBJ_LockObj(hSurfaceFrom, GDI_OBJECT_TYPE_DD_SURFACE);
765 PDD_SURFACE pSurfaceTo = GDIOBJ_LockObj(hSurfaceTo, GDI_OBJECT_TYPE_DD_SURFACE);
768 GDIOBJ_UnlockObjByPtr(pSurfaceFrom);
772 if (pSurfaceFrom->Local.lpAttachListFrom)
774 pSurfaceFrom->Local.lpAttachListFrom = pSurfaceFrom->AttachListFrom;
777 GDIOBJ_UnlockObjByPtr(pSurfaceFrom);
778 GDIOBJ_UnlockObjByPtr(pSurfaceTo);
783 DWORD STDCALL
NtGdiDdGetAvailDriverMemory(
784 HANDLE hDirectDrawLocal
,
785 PDD_GETAVAILDRIVERMEMORYDATA puGetAvailDriverMemoryData
788 DWORD ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
789 PDD_DIRECTDRAW_GLOBAL lgpl
;
791 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
793 /* backup the orignal PDev and info */
794 lgpl
= puGetAvailDriverMemoryData
->lpDD
;
796 /* use our cache version instead */
797 puGetAvailDriverMemoryData
->lpDD
= &pDirectDraw
->Global
;
800 // ddRVal = pDirectDraw->DdGetAvailDriverMemory(puGetAvailDriverMemoryData);
802 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
805 /* But back the orignal PDev */
806 puGetAvailDriverMemoryData
->lpDD
= lgpl
;
814 DWORD STDCALL
NtGdiDdSetExclusiveMode(
816 PDD_SETEXCLUSIVEMODEDATA puSetExclusiveModeData
820 PDD_DIRECTDRAW_GLOBAL lgpl
;
822 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDraw
, GDI_OBJECT_TYPE_DIRECTDRAW
);
824 /* backup the orignal PDev and info */
825 lgpl
= puSetExclusiveModeData
->lpDD
;
827 /* use our cache version instead */
828 puSetExclusiveModeData
->lpDD
= &pDirectDraw
->Global
;
831 ddRVal
= pDirectDraw
->DdSetExclusiveMode(puSetExclusiveModeData
);
833 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
835 /* But back the orignal PDev */
836 puSetExclusiveModeData
->lpDD
= lgpl
;