Remove more stub from ntdraw and implement it, (untested) it is alot of stub that...
[reactos.git] / reactos / subsys / win32k / ntddraw / ddraw.c
1 /*
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)
7 * REVISION HISTORY:
8 * 25-10-2003 PB Created
9 */
10
11 #include <w32k.h>
12
13 #define NDEBUG
14 #include <debug.h>
15
16 /************************************************************************/
17 /* DIRECT DRAW OBJECT */
18 /************************************************************************/
19
20 BOOL INTERNAL_CALL
21 DD_Cleanup(PVOID ObjectBody)
22 {
23 PDD_DIRECTDRAW pDD = (PDD_DIRECTDRAW)ObjectBody;
24 pDD->DrvDisableDirectDraw(pDD->Global.dhpdev);
25 return TRUE;
26 }
27
28 HANDLE STDCALL NtGdiDdCreateDirectDrawObject(
29 HDC hdc
30 )
31 {
32 DD_CALLBACKS callbacks;
33 DD_SURFACECALLBACKS surface_callbacks;
34 DD_PALETTECALLBACKS palette_callbacks;
35
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);
42
43 DC *pDC = DC_LockDc(hdc);
44 if (!pDC)
45 return NULL;
46
47 if (!pDC->DriverFunctions.EnableDirectDraw)
48 {
49 // Driver doesn't support DirectDraw
50 DC_UnlockDc(pDC);
51 return NULL;
52 }
53
54 BOOL success = pDC->DriverFunctions.EnableDirectDraw(
55 pDC->PDev, &callbacks, &surface_callbacks, &palette_callbacks);
56
57 if (!success)
58 {
59 // DirectDraw creation failed
60 DC_UnlockDc(pDC);
61 return NULL;
62 }
63
64 HANDLE hDirectDraw = GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DIRECTDRAW);
65 if (!hDirectDraw)
66 {
67 /* No more memmory */
68 DC_UnlockDc(pDC);
69 return NULL;
70 }
71
72 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDraw, GDI_OBJECT_TYPE_DIRECTDRAW);
73 if (!pDirectDraw)
74 {
75 /* invalid handle */
76 DC_UnlockDc(pDC);
77 return NULL;
78 }
79
80
81 pDirectDraw->Global.dhpdev = pDC->PDev;
82 pDirectDraw->Local.lpGbl = &pDirectDraw->Global;
83
84 pDirectDraw->DrvGetDirectDrawInfo = pDC->DriverFunctions.GetDirectDrawInfo;
85 pDirectDraw->DrvDisableDirectDraw = pDC->DriverFunctions.DisableDirectDraw;
86
87 /* DD_CALLBACKS setup */
88 pDirectDraw->DD.dwFlags = callbacks.dwFlags;
89
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;
109
110 /* Surface Callbacks */
111 pDirectDraw->Surf.dwFlags = surface_callbacks.dwFlags;
112
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;
140
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;
147
148 GDIOBJ_UnlockObjByPtr(pDirectDraw);
149 DC_UnlockDc(pDC);
150
151 return hDirectDraw;
152 }
153
154 BOOL STDCALL NtGdiDdDeleteDirectDrawObject(
155 HANDLE hDirectDrawLocal
156 )
157 {
158 return GDIOBJ_FreeObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
159 }
160
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,
169 DWORD *puNumHeaps,
170 VIDEOMEMORY *puvmList,
171 DWORD *puNumFourCC,
172 DWORD *puFourCC
173 )
174 {
175 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
176 if (!pDirectDraw)
177 return FALSE;
178
179 BOOL success = pDirectDraw->DrvGetDirectDrawInfo(
180 pDirectDraw->Global.dhpdev,
181 pHalInfo,
182 puNumHeaps,
183 puvmList,
184 puNumFourCC,
185 puFourCC);
186
187 if (!success)
188 {
189 GDIOBJ_UnlockObjByPtr(pDirectDraw);
190 return FALSE;
191 }
192
193 if (pHalInfo->lpD3DHALCallbacks)
194 {
195 RtlMoveMemory(puD3dCallbacks, pHalInfo->lpD3DHALCallbacks, sizeof(D3DNTHAL_CALLBACKS));
196 pDirectDraw->D3dContextCreate = puD3dCallbacks->ContextCreate;
197 pDirectDraw->D3dContextDestroy = puD3dCallbacks->ContextDestroy;
198 }
199
200 if (pHalInfo->lpD3DGlobalDriverData)
201 {
202 RtlMoveMemory(puD3dDriverData, pHalInfo->lpD3DGlobalDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA));
203 }
204
205 if (pHalInfo->lpD3DBufCallbacks)
206 {
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;
213 }
214
215
216 GDIOBJ_UnlockObjByPtr(pDirectDraw);
217
218 return TRUE;
219 }
220
221
222 /************************************************************************/
223 /* DD CALLBACKS */
224 /* FIXME NtGdiDdCreateSurface we do not call to ddCreateSurface */
225 /************************************************************************/
226
227 DWORD STDCALL NtGdiDdCreateSurface(
228 HANDLE hDirectDrawLocal,
229 HANDLE *hSurface,
230 DDSURFACEDESC *puSurfaceDescription,
231 DD_SURFACE_GLOBAL *puSurfaceGlobalData,
232 DD_SURFACE_LOCAL *puSurfaceLocalData,
233 DD_SURFACE_MORE *puSurfaceMoreData,
234 PDD_CREATESURFACEDATA puCreateSurfaceData,
235 HANDLE *puhSurface
236 )
237 {
238 DWORD ddRVal = DDHAL_DRIVER_NOTHANDLED;
239 /* DD_CREATESURFACEDATA surf; */
240
241 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
242 if (pDirectDraw == NULL)
243 return DDHAL_DRIVER_NOTHANDLED;
244
245 if (!(pDirectDraw->DD.dwFlags & DDHAL_CB32_CANCREATESURFACE))
246 ddRVal = DDHAL_DRIVER_NOTHANDLED;
247 else
248 {
249 UNIMPLEMENTED;
250 /*
251 ddRVal = pDirectDraw->DD.CreateSurface(&surf);
252 */
253 }
254
255 GDIOBJ_UnlockObjByPtr(pDirectDraw);
256 return ddRVal;
257 }
258
259 DWORD STDCALL NtGdiDdWaitForVerticalBlank(
260 HANDLE hDirectDrawLocal,
261 PDD_WAITFORVERTICALBLANKDATA puWaitForVerticalBlankData
262 )
263 {
264 DWORD ddRVal;
265 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
266 if (pDirectDraw == NULL)
267 return DDHAL_DRIVER_NOTHANDLED;
268
269 if (!(pDirectDraw->DD.dwFlags & DDHAL_CB32_WAITFORVERTICALBLANK))
270 ddRVal = DDHAL_DRIVER_NOTHANDLED;
271 else
272 ddRVal = pDirectDraw->DD.WaitForVerticalBlank(puWaitForVerticalBlankData);
273
274 GDIOBJ_UnlockObjByPtr(pDirectDraw);
275 return ddRVal;
276 }
277
278 DWORD STDCALL NtGdiDdCanCreateSurface(
279 HANDLE hDirectDrawLocal,
280 PDD_CANCREATESURFACEDATA puCanCreateSurfaceData
281 )
282 {
283 DWORD ddRVal;
284
285 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
286 if (pDirectDraw == NULL)
287 return DDHAL_DRIVER_NOTHANDLED;
288
289 if (!(pDirectDraw->DD.dwFlags & DDHAL_CB32_CANCREATESURFACE))
290 ddRVal = DDHAL_DRIVER_NOTHANDLED;
291 else
292 ddRVal = pDirectDraw->DD.CanCreateSurface(puCanCreateSurfaceData);
293
294 GDIOBJ_UnlockObjByPtr(pDirectDraw);
295 return ddRVal;
296 }
297
298 DWORD STDCALL NtGdiDdGetScanLine(
299 HANDLE hDirectDrawLocal,
300 PDD_GETSCANLINEDATA puGetScanLineData
301 )
302 {
303 DWORD ddRVal;
304
305 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
306 if (pDirectDraw == NULL)
307 return DDHAL_DRIVER_NOTHANDLED;
308
309 if (!(pDirectDraw->DD.dwFlags & DDHAL_CB32_GETSCANLINE))
310 ddRVal = DDHAL_DRIVER_NOTHANDLED;
311 else
312 ddRVal = pDirectDraw->DD.GetScanLine(puGetScanLineData);
313
314 GDIOBJ_UnlockObjByPtr(pDirectDraw);
315 return ddRVal;
316 }
317
318
319
320 /************************************************************************/
321 /* Surface CALLBACKS */
322 /* FIXME */
323 /* NtGdiDdDestroySurface */
324 /************************************************************************/
325
326 DWORD STDCALL NtGdiDdDestroySurface(
327 HANDLE hSurface,
328 BOOL bRealDestroy
329 )
330 {
331 DWORD ddRVal;
332
333 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurface, GDI_OBJECT_TYPE_DIRECTDRAW);
334 if (pDirectDraw == NULL)
335 return DDHAL_DRIVER_NOTHANDLED;
336
337 if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_DESTROYSURFACE))
338 ddRVal = DDHAL_DRIVER_NOTHANDLED;
339 else
340 {
341 /* DD_DESTROYSURFACEDATA DestroySurf; */
342 UNIMPLEMENTED;
343 /* ddRVal = pDirectDraw->Surf.DestroySurface(DestroySurf); */
344 }
345
346 GDIOBJ_UnlockObjByPtr(pDirectDraw);
347 return ddRVal;
348 }
349
350 DWORD STDCALL NtGdiDdFlip(
351 HANDLE hSurfaceCurrent,
352 HANDLE hSurfaceTarget,
353 HANDLE hSurfaceCurrentLeft,
354 HANDLE hSurfaceTargetLeft,
355 PDD_FLIPDATA puFlipData
356 )
357 {
358 DWORD ddRVal;
359
360 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurfaceTarget, GDI_OBJECT_TYPE_DIRECTDRAW);
361 if (pDirectDraw == NULL)
362 return DDHAL_DRIVER_NOTHANDLED;
363
364 if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_FLIP))
365 ddRVal = DDHAL_DRIVER_NOTHANDLED;
366 else
367 ddRVal = pDirectDraw->Surf.Flip(puFlipData);
368
369 GDIOBJ_UnlockObjByPtr(pDirectDraw);
370 return ddRVal;
371 }
372
373 DWORD STDCALL NtGdiDdLock(
374 HANDLE hSurface,
375 PDD_LOCKDATA puLockData,
376 HDC hdcClip
377 )
378 {
379 DWORD ddRVal;
380
381 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurface, GDI_OBJECT_TYPE_DIRECTDRAW);
382 if (pDirectDraw == NULL)
383 return DDHAL_DRIVER_NOTHANDLED;
384
385 if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_LOCK))
386 ddRVal = DDHAL_DRIVER_NOTHANDLED;
387 else
388 ddRVal = pDirectDraw->Surf.Lock(puLockData);
389
390 GDIOBJ_UnlockObjByPtr(pDirectDraw);
391 return ddRVal;
392 }
393
394
395 DWORD STDCALL NtGdiDdSetColorKey(
396 HANDLE hSurface,
397 PDD_SETCOLORKEYDATA puSetColorKeyData
398 )
399 {
400 DWORD ddRVal;
401
402 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurface, GDI_OBJECT_TYPE_DIRECTDRAW);
403 if (pDirectDraw == NULL)
404 return DDHAL_DRIVER_NOTHANDLED;
405
406 if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_SETCOLORKEY))
407 ddRVal = DDHAL_DRIVER_NOTHANDLED;
408 else
409 ddRVal = pDirectDraw->Surf.SetColorKey(puSetColorKeyData);
410
411 GDIOBJ_UnlockObjByPtr(pDirectDraw);
412 return ddRVal;
413 }
414
415 DWORD STDCALL NtGdiDdBlt(
416 HANDLE hSurfaceDest,
417 HANDLE hSurfaceSrc,
418 PDD_BLTDATA puBltData
419 )
420 {
421 DWORD ddRVal;
422
423 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurfaceDest, GDI_OBJECT_TYPE_DIRECTDRAW);
424 if (pDirectDraw == NULL)
425 return DDHAL_DRIVER_NOTHANDLED;
426
427 if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_BLT))
428 ddRVal = DDHAL_DRIVER_NOTHANDLED;
429 else
430 ddRVal = pDirectDraw->Surf.Blt(puBltData);
431
432 GDIOBJ_UnlockObjByPtr(pDirectDraw);
433
434 return ddRVal;
435 }
436
437 DWORD STDCALL NtGdiDdUpdateOverlay(
438 HANDLE hSurfaceDestination,
439 HANDLE hSurfaceSource,
440 PDD_UPDATEOVERLAYDATA puUpdateOverlayData
441 )
442 {
443 DWORD ddRVal;
444
445 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurfaceDestination, GDI_OBJECT_TYPE_DIRECTDRAW);
446 if (pDirectDraw == NULL)
447 return DDHAL_DRIVER_NOTHANDLED;
448
449 if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY))
450 ddRVal = DDHAL_DRIVER_NOTHANDLED;
451 else
452 ddRVal = pDirectDraw->Surf.UpdateOverlay(puUpdateOverlayData);
453
454 GDIOBJ_UnlockObjByPtr(pDirectDraw);
455 return ddRVal;
456 }
457
458 DWORD STDCALL NtGdiDdUnlock(
459 HANDLE hSurface,
460 PDD_UNLOCKDATA puUnlockData
461 )
462 {
463 DWORD ddRVal;
464
465 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hSurface, GDI_OBJECT_TYPE_DIRECTDRAW);
466 if (pDirectDraw == NULL)
467 return DDHAL_DRIVER_NOTHANDLED;
468
469 if (!(pDirectDraw->Surf.dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY))
470 ddRVal = DDHAL_DRIVER_NOTHANDLED;
471 else
472 ddRVal = pDirectDraw->Surf.Unlock(puUnlockData);
473
474 GDIOBJ_UnlockObjByPtr(pDirectDraw);
475 return ddRVal;
476 }
477
478
479 /************************************************************************/
480 /* SURFACE OBJECT */
481 /************************************************************************/
482
483 BOOL INTERNAL_CALL
484 DDSURF_Cleanup(PVOID pDDSurf)
485 {
486 /* FIXME: implement
487 * PDD_SURFACE pDDSurf = PVOID pDDSurf
488 */
489 return TRUE;
490 }
491
492 HANDLE STDCALL NtGdiDdCreateSurfaceObject(
493 HANDLE hDirectDrawLocal,
494 HANDLE hSurface,
495 PDD_SURFACE_LOCAL puSurfaceLocal,
496 PDD_SURFACE_MORE puSurfaceMore,
497 PDD_SURFACE_GLOBAL puSurfaceGlobal,
498 BOOL bComplete
499 )
500 {
501 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
502 if (!pDirectDraw)
503 return NULL;
504
505 if (!hSurface)
506 hSurface = GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DD_SURFACE);
507
508 PDD_SURFACE pSurface = GDIOBJ_LockObj(hSurface, GDI_OBJECT_TYPE_DD_SURFACE);
509 /* FIXME - Handle pSurface == NULL!!!! */
510
511 RtlMoveMemory(&pSurface->Local, puSurfaceLocal, sizeof(DD_SURFACE_LOCAL));
512 RtlMoveMemory(&pSurface->More, puSurfaceMore, sizeof(DD_SURFACE_MORE));
513 RtlMoveMemory(&pSurface->Global, puSurfaceGlobal, sizeof(DD_SURFACE_GLOBAL));
514 pSurface->Local.lpGbl = &pSurface->Global;
515 pSurface->Local.lpSurfMore = &pSurface->More;
516 pSurface->Local.lpAttachList = NULL;
517 pSurface->Local.lpAttachListFrom = NULL;
518 pSurface->More.lpVideoPort = NULL;
519 // FIXME: figure out how to use this
520 pSurface->bComplete = bComplete;
521
522 GDIOBJ_UnlockObjByPtr(pSurface);
523 GDIOBJ_UnlockObjByPtr(pDirectDraw);
524
525 return hSurface;
526 }
527
528 BOOL STDCALL NtGdiDdDeleteSurfaceObject(
529 HANDLE hSurface
530 )
531 {
532 return GDIOBJ_FreeObj(hSurface, GDI_OBJECT_TYPE_DD_SURFACE);
533 }
534
535
536
537 /************************************************************************/
538 /* DIRECT DRAW SURFACR END */
539 /************************************************************************/
540
541
542 /*
543 BOOL STDCALL NtGdiDdAttachSurface(
544 HANDLE hSurfaceFrom,
545 HANDLE hSurfaceTo
546 )
547 {
548 PDD_SURFACE pSurfaceFrom = GDIOBJ_LockObj(hSurfaceFrom, GDI_OBJECT_TYPE_DD_SURFACE);
549 if (!pSurfaceFrom)
550 return FALSE;
551 PDD_SURFACE pSurfaceTo = GDIOBJ_LockObj(hSurfaceTo, GDI_OBJECT_TYPE_DD_SURFACE);
552 if (!pSurfaceTo)
553 {
554 GDIOBJ_UnlockObjByPtr(pSurfaceFrom);
555 return FALSE;
556 }
557
558 if (pSurfaceFrom->Local.lpAttachListFrom)
559 {
560 pSurfaceFrom->Local.lpAttachListFrom = pSurfaceFrom->AttachListFrom;
561 }
562
563 GDIOBJ_UnlockObjByPtr(pSurfaceFrom);
564 GDIOBJ_UnlockObjByPtr(pSurfaceTo);
565 return TRUE;
566 }
567 */
568
569
570
571 DWORD STDCALL NtGdiDdGetDriverInfo(
572 HANDLE hDirectDrawLocal,
573 PDD_GETDRIVERINFODATA puGetDriverInfoData)
574
575 {
576 DWORD ddRVal;
577
578 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
579
580 ddRVal = pDirectDraw->DdGetDriverInfo(puGetDriverInfoData);
581
582 GDIOBJ_UnlockObjByPtr(pDirectDraw);
583
584 return ddRVal;
585 }
586
587
588
589
590
591
592
593
594
595
596
597
598 DWORD STDCALL NtGdiDdGetAvailDriverMemory(
599 HANDLE hDirectDrawLocal,
600 PDD_GETAVAILDRIVERMEMORYDATA puGetAvailDriverMemoryData
601 )
602 {
603 DWORD ddRVal;
604
605 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
606
607 ddRVal = pDirectDraw->DdGetAvailDriverMemory(puGetAvailDriverMemoryData);
608
609 GDIOBJ_UnlockObjByPtr(pDirectDraw);
610
611 return ddRVal;
612 }
613
614
615
616
617 DWORD STDCALL NtGdiDdSetExclusiveMode(
618 HANDLE hDirectDraw,
619 PDD_SETEXCLUSIVEMODEDATA puSetExclusiveModeData
620 )
621 {
622 DWORD ddRVal;
623
624 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDraw, GDI_OBJECT_TYPE_DIRECTDRAW);
625
626 ddRVal = pDirectDraw->DdSetExclusiveMode(puSetExclusiveModeData);
627
628 GDIOBJ_UnlockObjByPtr(pDirectDraw);
629
630 return ddRVal;
631 }
632
633
634
635
636 /* EOF */