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 pDD
= (PDD_DIRECTDRAW
)ObjectBody
;
24 pDD
->DrvDisableDirectDraw(pDD
->Global
.dhpdev
);
28 HANDLE STDCALL
NtGdiDdCreateDirectDrawObject(
32 DD_CALLBACKS callbacks
;
33 DD_SURFACECALLBACKS surface_callbacks
;
34 DD_PALETTECALLBACKS palette_callbacks
;
36 RtlZeroMemory(&callbacks
, sizeof(callbacks
));
37 callbacks
.dwSize
= sizeof(callbacks
);
38 RtlZeroMemory(&surface_callbacks
, sizeof(surface_callbacks
));
39 surface_callbacks
.dwSize
= sizeof(surface_callbacks
);
40 RtlZeroMemory(&palette_callbacks
, sizeof(palette_callbacks
));
41 palette_callbacks
.dwSize
= sizeof(palette_callbacks
);
43 DC
*pDC
= DC_LockDc(hdc
);
47 if (!pDC
->DriverFunctions
.EnableDirectDraw
)
49 // Driver doesn't support DirectDraw
54 BOOL success
= pDC
->DriverFunctions
.EnableDirectDraw(
55 pDC
->PDev
, &callbacks
, &surface_callbacks
, &palette_callbacks
);
59 // DirectDraw creation failed
64 HANDLE hDirectDraw
= GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DIRECTDRAW
);
72 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDraw
, GDI_OBJECT_TYPE_DIRECTDRAW
);
81 pDirectDraw
->Global
.dhpdev
= pDC
->PDev
;
82 pDirectDraw
->Local
.lpGbl
= &pDirectDraw
->Global
;
84 pDirectDraw
->DrvGetDirectDrawInfo
= pDC
->DriverFunctions
.GetDirectDrawInfo
;
85 pDirectDraw
->DrvDisableDirectDraw
= pDC
->DriverFunctions
.DisableDirectDraw
;
87 /* DD_CALLBACKS setup */
88 pDirectDraw
->DD
.dwFlags
= callbacks
.dwFlags
;
90 /* DestroyDriver Unsuse in win2k or higher */
91 if (callbacks
.dwFlags
& DDHAL_CB32_DESTROYDRIVER
)
92 pDirectDraw
->DD
.DestroyDriver
= callbacks
.DestroyDriver
;
93 if (callbacks
.dwFlags
& DDHAL_CB32_CREATESURFACE
)
94 pDirectDraw
->DD
.CreateSurface
= callbacks
.CreateSurface
;
95 if (callbacks
.dwFlags
& DDHAL_CB32_SETCOLORKEY
)
96 pDirectDraw
->DD
.SetColorKey
= callbacks
.SetColorKey
;
97 if (callbacks
.dwFlags
& DDHAL_CB32_SETMODE
)
98 pDirectDraw
->DD
.SetMode
= callbacks
.SetMode
;
99 if (callbacks
.dwFlags
& DDHAL_CB32_WAITFORVERTICALBLANK
)
100 pDirectDraw
->DD
.WaitForVerticalBlank
= callbacks
.WaitForVerticalBlank
;
101 if (callbacks
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
)
102 pDirectDraw
->DD
.CanCreateSurface
= callbacks
.CanCreateSurface
;
103 if (callbacks
.dwFlags
& DDHAL_CB32_CREATEPALETTE
)
104 pDirectDraw
->DD
.CreatePalette
= callbacks
.CreatePalette
;
105 if (callbacks
.dwFlags
& DDHAL_CB32_GETSCANLINE
)
106 pDirectDraw
->DD
.GetScanLine
= callbacks
.GetScanLine
;
107 if (callbacks
.dwFlags
& DDHAL_CB32_MAPMEMORY
)
108 pDirectDraw
->DD
.MapMemory
= callbacks
.MapMemory
;
110 /* Surface Callbacks */
111 pDirectDraw
->Surf
.dwFlags
= surface_callbacks
.dwFlags
;
113 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_DESTROYSURFACE
)
114 pDirectDraw
->Surf
.DestroySurface
= surface_callbacks
.DestroySurface
;
115 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_FLIP
)
116 pDirectDraw
->Surf
.Flip
= surface_callbacks
.Flip
;
117 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_SETCLIPLIST
)
118 pDirectDraw
->Surf
.SetClipList
= surface_callbacks
.SetClipList
;
119 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_LOCK
)
120 pDirectDraw
->Surf
.Lock
= surface_callbacks
.Lock
;
121 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_UNLOCK
)
122 pDirectDraw
->Surf
.Unlock
= surface_callbacks
.Unlock
;
123 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_BLT
)
124 pDirectDraw
->Surf
.Blt
= surface_callbacks
.Blt
;
125 /* DD Callbacks SetColorKey is same as Surface callback SetColorKey */
126 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_SETCOLORKEY
)
127 pDirectDraw
->Surf
.SetColorKey
= surface_callbacks
.SetColorKey
;
128 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
)
129 pDirectDraw
->Surf
.AddAttachedSurface
= surface_callbacks
.AddAttachedSurface
;
130 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_GETBLTSTATUS
)
131 pDirectDraw
->Surf
.GetBltStatus
= surface_callbacks
.GetBltStatus
;
132 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_GETFLIPSTATUS
)
133 pDirectDraw
->Surf
.GetFlipStatus
= surface_callbacks
.GetFlipStatus
;
134 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_UPDATEOVERLAY
)
135 pDirectDraw
->Surf
.UpdateOverlay
= surface_callbacks
.UpdateOverlay
;
136 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
)
137 pDirectDraw
->Surf
.SetOverlayPosition
= surface_callbacks
.SetOverlayPosition
;
138 if (surface_callbacks
.dwFlags
& DDHAL_SURFCB32_SETPALETTE
)
139 pDirectDraw
->Surf
.SetPalette
= surface_callbacks
.SetPalette
;
141 /* Palette Callbacks */
142 pDirectDraw
->Pal
.dwFlags
= palette_callbacks
.dwFlags
;
143 if (palette_callbacks
.dwFlags
& DDHAL_PALCB32_DESTROYPALETTE
)
144 pDirectDraw
->Pal
.DestroyPalette
= palette_callbacks
.DestroyPalette
;
145 if (palette_callbacks
.dwFlags
& DDHAL_PALCB32_SETENTRIES
)
146 pDirectDraw
->Pal
.SetEntries
= palette_callbacks
.SetEntries
;
148 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
154 BOOL STDCALL
NtGdiDdDeleteDirectDrawObject(
155 HANDLE hDirectDrawLocal
158 return GDIOBJ_FreeObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
161 BOOL STDCALL
NtGdiDdQueryDirectDrawObject(
162 HANDLE hDirectDrawLocal
,
163 DD_HALINFO
*pHalInfo
,
164 DWORD
*pCallBackFlags
,
165 PD3DNTHAL_CALLBACKS puD3dCallbacks
,
166 PD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData
,
167 PDD_D3DBUFCALLBACKS puD3dBufferCallbacks
,
168 LPDDSURFACEDESC puD3dTextureFormats
,
170 VIDEOMEMORY
*puvmList
,
175 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
179 BOOL success
= pDirectDraw
->DrvGetDirectDrawInfo(
180 pDirectDraw
->Global
.dhpdev
,
189 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
193 if (pHalInfo
->lpD3DHALCallbacks
)
195 RtlMoveMemory(puD3dCallbacks
, pHalInfo
->lpD3DHALCallbacks
, sizeof(D3DNTHAL_CALLBACKS
));
196 pDirectDraw
->D3dContextCreate
= puD3dCallbacks
->ContextCreate
;
197 pDirectDraw
->D3dContextDestroy
= puD3dCallbacks
->ContextDestroy
;
200 if (pHalInfo
->lpD3DGlobalDriverData
)
202 RtlMoveMemory(puD3dDriverData
, pHalInfo
->lpD3DGlobalDriverData
, sizeof(D3DNTHAL_GLOBALDRIVERDATA
));
205 if (pHalInfo
->lpD3DBufCallbacks
)
207 RtlMoveMemory(puD3dBufferCallbacks
, pHalInfo
->lpD3DBufCallbacks
, sizeof(DD_D3DBUFCALLBACKS
));
208 pDirectDraw
->DdCanCreateD3DBuffer
= puD3dBufferCallbacks
->CanCreateD3DBuffer
;
209 pDirectDraw
->DdCreateD3DBuffer
= puD3dBufferCallbacks
->CreateD3DBuffer
;
210 pDirectDraw
->DdDestroyD3DBuffer
= puD3dBufferCallbacks
->DestroyD3DBuffer
;
211 pDirectDraw
->DdLockD3DBuffer
= puD3dBufferCallbacks
->LockD3DBuffer
;
212 pDirectDraw
->DdUnlockD3DBuffer
= puD3dBufferCallbacks
->UnlockD3DBuffer
;
216 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
222 /************************************************************************/
224 /* FIXME NtGdiDdCreateSurface we do not call to ddCreateSurface */
225 /************************************************************************/
227 DWORD STDCALL
NtGdiDdCreateSurface(
228 HANDLE hDirectDrawLocal
,
230 DDSURFACEDESC
*puSurfaceDescription
,
231 DD_SURFACE_GLOBAL
*puSurfaceGlobalData
,
232 DD_SURFACE_LOCAL
*puSurfaceLocalData
,
233 DD_SURFACE_MORE
*puSurfaceMoreData
,
234 PDD_CREATESURFACEDATA puCreateSurfaceData
,
238 DWORD ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
241 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
242 if (pDirectDraw
== NULL
)
243 return DDHAL_DRIVER_NOTHANDLED
;
245 if (!(pDirectDraw
->DD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
))
246 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
249 ddRVal
= pDirectDraw
->DD
.CreateSurface(puCreateSurfaceData
);
252 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
256 DWORD STDCALL
NtGdiDdWaitForVerticalBlank(
257 HANDLE hDirectDrawLocal
,
258 PDD_WAITFORVERTICALBLANKDATA puWaitForVerticalBlankData
262 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
263 if (pDirectDraw
== NULL
)
264 return DDHAL_DRIVER_NOTHANDLED
;
266 if (!(pDirectDraw
->DD
.dwFlags
& DDHAL_CB32_WAITFORVERTICALBLANK
))
267 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
269 ddRVal
= pDirectDraw
->DD
.WaitForVerticalBlank(puWaitForVerticalBlankData
);
271 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
275 DWORD STDCALL
NtGdiDdCanCreateSurface(
276 HANDLE hDirectDrawLocal
,
277 PDD_CANCREATESURFACEDATA puCanCreateSurfaceData
282 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
283 if (pDirectDraw
== NULL
)
284 return DDHAL_DRIVER_NOTHANDLED
;
286 if (!(pDirectDraw
->DD
.dwFlags
& DDHAL_CB32_CANCREATESURFACE
))
287 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
289 ddRVal
= pDirectDraw
->DD
.CanCreateSurface(puCanCreateSurfaceData
);
291 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
295 DWORD STDCALL
NtGdiDdGetScanLine(
296 HANDLE hDirectDrawLocal
,
297 PDD_GETSCANLINEDATA puGetScanLineData
302 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
303 if (pDirectDraw
== NULL
)
304 return DDHAL_DRIVER_NOTHANDLED
;
306 if (!(pDirectDraw
->DD
.dwFlags
& DDHAL_CB32_GETSCANLINE
))
307 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
309 ddRVal
= pDirectDraw
->DD
.GetScanLine(puGetScanLineData
);
311 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
317 /************************************************************************/
318 /* Surface CALLBACKS */
320 /* NtGdiDdDestroySurface */
321 /************************************************************************/
323 DWORD STDCALL
NtGdiDdDestroySurface(
328 DWORD ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
330 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
331 if (pDirectDraw
== NULL
)
332 return DDHAL_DRIVER_NOTHANDLED
;
334 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_DESTROYSURFACE
))
335 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
338 DD_DESTROYSURFACEDATA DestroySurf
;
342 * are we doing right ??
344 DestroySurf
.lpDD
= &pDirectDraw
->Global
;
346 DestroySurf
.lpDDSurface
= hSurface
; // ?
347 DestroySurf
.DestroySurface
= pDirectDraw
->Surf
.DestroySurface
;
349 ddRVal
= pDirectDraw
->Surf
.DestroySurface(&DestroySurf
);
352 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
356 DWORD STDCALL
NtGdiDdFlip(
357 HANDLE hSurfaceCurrent
,
358 HANDLE hSurfaceTarget
,
359 HANDLE hSurfaceCurrentLeft
,
360 HANDLE hSurfaceTargetLeft
,
361 PDD_FLIPDATA puFlipData
366 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceTarget
, GDI_OBJECT_TYPE_DIRECTDRAW
);
367 if (pDirectDraw
== NULL
)
368 return DDHAL_DRIVER_NOTHANDLED
;
370 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_FLIP
))
371 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
373 ddRVal
= pDirectDraw
->Surf
.Flip(puFlipData
);
375 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
379 DWORD STDCALL
NtGdiDdLock(
381 PDD_LOCKDATA puLockData
,
387 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
388 if (pDirectDraw
== NULL
)
389 return DDHAL_DRIVER_NOTHANDLED
;
391 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_LOCK
))
392 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
394 ddRVal
= pDirectDraw
->Surf
.Lock(puLockData
);
396 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
400 DWORD STDCALL
NtGdiDdUnlock(
402 PDD_UNLOCKDATA puUnlockData
407 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
408 if (pDirectDraw
== NULL
)
409 return DDHAL_DRIVER_NOTHANDLED
;
411 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_UNLOCK
))
412 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
414 ddRVal
= pDirectDraw
->Surf
.Unlock(puUnlockData
);
416 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
420 DWORD STDCALL
NtGdiDdBlt(
423 PDD_BLTDATA puBltData
428 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceDest
, GDI_OBJECT_TYPE_DIRECTDRAW
);
429 if (pDirectDraw
== NULL
)
430 return DDHAL_DRIVER_NOTHANDLED
;
432 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_BLT
))
433 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
435 ddRVal
= pDirectDraw
->Surf
.Blt(puBltData
);
437 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
441 DWORD STDCALL
NtGdiDdSetColorKey(
443 PDD_SETCOLORKEYDATA puSetColorKeyData
448 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
449 if (pDirectDraw
== NULL
)
450 return DDHAL_DRIVER_NOTHANDLED
;
452 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_SETCOLORKEY
))
453 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
455 ddRVal
= pDirectDraw
->Surf
.SetColorKey(puSetColorKeyData
);
457 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
462 DWORD STDCALL
NtGdiDdAddAttachedSurface(
464 HANDLE hSurfaceAttached
,
465 PDD_ADDATTACHEDSURFACEDATA puAddAttachedSurfaceData
470 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceAttached
, GDI_OBJECT_TYPE_DIRECTDRAW
);
471 if (pDirectDraw
== NULL
)
472 return DDHAL_DRIVER_NOTHANDLED
;
474 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_ADDATTACHEDSURFACE
))
475 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
477 ddRVal
= pDirectDraw
->Surf
.AddAttachedSurface(puAddAttachedSurfaceData
);
479 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
483 DWORD STDCALL
NtGdiDdGetBltStatus(
485 PDD_GETBLTSTATUSDATA puGetBltStatusData
490 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
491 if (pDirectDraw
== NULL
)
492 return DDHAL_DRIVER_NOTHANDLED
;
494 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_GETBLTSTATUS
))
495 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
497 ddRVal
= pDirectDraw
->Surf
.GetBltStatus(puGetBltStatusData
);
499 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
503 DWORD STDCALL
NtGdiDdGetFlipStatus(
505 PDD_GETFLIPSTATUSDATA puGetFlipStatusData
510 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DIRECTDRAW
);
511 if (pDirectDraw
== NULL
)
512 return DDHAL_DRIVER_NOTHANDLED
;
514 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_GETFLIPSTATUS
))
515 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
517 ddRVal
= pDirectDraw
->Surf
.GetFlipStatus(puGetFlipStatusData
);
519 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
523 DWORD STDCALL
NtGdiDdUpdateOverlay(
524 HANDLE hSurfaceDestination
,
525 HANDLE hSurfaceSource
,
526 PDD_UPDATEOVERLAYDATA puUpdateOverlayData
531 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceDestination
, GDI_OBJECT_TYPE_DIRECTDRAW
);
532 if (pDirectDraw
== NULL
)
533 return DDHAL_DRIVER_NOTHANDLED
;
535 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_UPDATEOVERLAY
))
536 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
538 ddRVal
= pDirectDraw
->Surf
.UpdateOverlay(puUpdateOverlayData
);
540 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
544 DWORD STDCALL
NtGdiDdSetOverlayPosition(
545 HANDLE hSurfaceSource
,
546 HANDLE hSurfaceDestination
,
547 PDD_SETOVERLAYPOSITIONDATA puSetOverlayPositionData
552 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hSurfaceDestination
, GDI_OBJECT_TYPE_DIRECTDRAW
);
553 if (pDirectDraw
== NULL
)
554 return DDHAL_DRIVER_NOTHANDLED
;
556 if (!(pDirectDraw
->Surf
.dwFlags
& DDHAL_SURFCB32_SETOVERLAYPOSITION
))
557 ddRVal
= DDHAL_DRIVER_NOTHANDLED
;
559 ddRVal
= pDirectDraw
->Surf
.SetOverlayPosition(puSetOverlayPositionData
);
561 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
566 /************************************************************************/
568 /************************************************************************/
571 DDSURF_Cleanup(PVOID pDDSurf
)
574 * PDD_SURFACE pDDSurf = PVOID pDDSurf
579 HANDLE STDCALL
NtGdiDdCreateSurfaceObject(
580 HANDLE hDirectDrawLocal
,
582 PDD_SURFACE_LOCAL puSurfaceLocal
,
583 PDD_SURFACE_MORE puSurfaceMore
,
584 PDD_SURFACE_GLOBAL puSurfaceGlobal
,
588 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
593 hSurface
= GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DD_SURFACE
);
595 PDD_SURFACE pSurface
= GDIOBJ_LockObj(hSurface
, GDI_OBJECT_TYPE_DD_SURFACE
);
596 /* FIXME - Handle pSurface == NULL!!!! */
598 RtlMoveMemory(&pSurface
->Local
, puSurfaceLocal
, sizeof(DD_SURFACE_LOCAL
));
599 RtlMoveMemory(&pSurface
->More
, puSurfaceMore
, sizeof(DD_SURFACE_MORE
));
600 RtlMoveMemory(&pSurface
->Global
, puSurfaceGlobal
, sizeof(DD_SURFACE_GLOBAL
));
601 pSurface
->Local
.lpGbl
= &pSurface
->Global
;
602 pSurface
->Local
.lpSurfMore
= &pSurface
->More
;
603 pSurface
->Local
.lpAttachList
= NULL
;
604 pSurface
->Local
.lpAttachListFrom
= NULL
;
605 pSurface
->More
.lpVideoPort
= NULL
;
606 // FIXME: figure out how to use this
607 pSurface
->bComplete
= bComplete
;
609 GDIOBJ_UnlockObjByPtr(pSurface
);
610 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
615 BOOL STDCALL
NtGdiDdDeleteSurfaceObject(
619 return GDIOBJ_FreeObj(hSurface
, GDI_OBJECT_TYPE_DD_SURFACE
);
624 /************************************************************************/
625 /* DIRECT DRAW SURFACR END */
626 /************************************************************************/
630 BOOL STDCALL NtGdiDdAttachSurface(
635 PDD_SURFACE pSurfaceFrom = GDIOBJ_LockObj(hSurfaceFrom, GDI_OBJECT_TYPE_DD_SURFACE);
638 PDD_SURFACE pSurfaceTo = GDIOBJ_LockObj(hSurfaceTo, GDI_OBJECT_TYPE_DD_SURFACE);
641 GDIOBJ_UnlockObjByPtr(pSurfaceFrom);
645 if (pSurfaceFrom->Local.lpAttachListFrom)
647 pSurfaceFrom->Local.lpAttachListFrom = pSurfaceFrom->AttachListFrom;
650 GDIOBJ_UnlockObjByPtr(pSurfaceFrom);
651 GDIOBJ_UnlockObjByPtr(pSurfaceTo);
658 DWORD STDCALL
NtGdiDdGetDriverInfo(
659 HANDLE hDirectDrawLocal
,
660 PDD_GETDRIVERINFODATA puGetDriverInfoData
)
665 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
667 ddRVal
= pDirectDraw
->DdGetDriverInfo(puGetDriverInfoData
);
669 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
685 DWORD STDCALL
NtGdiDdGetAvailDriverMemory(
686 HANDLE hDirectDrawLocal
,
687 PDD_GETAVAILDRIVERMEMORYDATA puGetAvailDriverMemoryData
692 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDrawLocal
, GDI_OBJECT_TYPE_DIRECTDRAW
);
694 ddRVal
= pDirectDraw
->DdGetAvailDriverMemory(puGetAvailDriverMemoryData
);
696 GDIOBJ_UnlockObjByPtr(pDirectDraw
);
704 DWORD STDCALL
NtGdiDdSetExclusiveMode(
706 PDD_SETEXCLUSIVEMODEDATA puSetExclusiveModeData
711 PDD_DIRECTDRAW pDirectDraw
= GDIOBJ_LockObj(hDirectDraw
, GDI_OBJECT_TYPE_DIRECTDRAW
);
713 ddRVal
= pDirectDraw
->DdSetExclusiveMode(puSetExclusiveModeData
);
715 GDIOBJ_UnlockObjByPtr(pDirectDraw
);