1. remove mouse cursor hacks from eng/mouse
[reactos.git] / reactos / subsys / win32k / ntddraw / ddraw.c
1 /*
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS kernel
5 * PURPOSE: Native DirectDraw implementation
6 * FILE: subsys/win32k/ntddraw/ddraw.c
7 * PROGRAMER: Peter Bajusz (hyp-x@stormregion.com)
8 * REVISION HISTORY:
9 * 25-10-2003 PB Created
10 */
11
12 #include <ddk/ntddk.h>
13 #include <win32k/ntddraw.h>
14 #include <win32k/win32k.h>
15 #include <include/intddraw.h>
16 #include <win32k/gdiobj.h>
17
18 #define NDEBUG
19 #include <debug.h>
20
21 /************************************************************************/
22 /* DIRECT DRAW OBJECT */
23 /************************************************************************/
24
25 BOOL FASTCALL
26 DD_Cleanup(PDD_DIRECTDRAW pDD)
27 {
28 pDD->DrvDisableDirectDraw(pDD->Global.dhpdev);
29 return TRUE;
30 }
31
32 HANDLE STDCALL NtGdiDdCreateDirectDrawObject(
33 HDC hdc
34 )
35 {
36 DD_CALLBACKS callbacks;
37 DD_SURFACECALLBACKS surface_callbacks;
38 DD_PALETTECALLBACKS palette_callbacks;
39
40 RtlZeroMemory(&callbacks, sizeof(callbacks));
41 callbacks.dwSize = sizeof(callbacks);
42 RtlZeroMemory(&surface_callbacks, sizeof(surface_callbacks));
43 surface_callbacks.dwSize = sizeof(surface_callbacks);
44 RtlZeroMemory(&palette_callbacks, sizeof(palette_callbacks));
45 palette_callbacks.dwSize = sizeof(palette_callbacks);
46
47 DC *pDC = DC_LockDc(hdc);
48 if (!pDC)
49 return NULL;
50
51 if (!pDC->DriverFunctions.EnableDirectDraw)
52 {
53 // Driver doesn't support DirectDraw
54 DC_UnlockDc(hdc);
55 return NULL;
56 }
57
58 BOOL success = pDC->DriverFunctions.EnableDirectDraw(
59 pDC->PDev, &callbacks, &surface_callbacks, &palette_callbacks);
60
61 if (!success)
62 {
63 // DirectDraw creation failed
64 DC_UnlockDc(hdc);
65 return NULL;
66 }
67
68 HANDLE hDirectDraw = GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DIRECTDRAW);
69 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDraw, GDI_OBJECT_TYPE_DIRECTDRAW);
70
71 pDirectDraw->Global.dhpdev = pDC->PDev;
72 pDirectDraw->Local.lpGbl = &pDirectDraw->Global;
73
74 pDirectDraw->DrvGetDirectDrawInfo = pDC->DriverFunctions.GetDirectDrawInfo;
75 pDirectDraw->DrvDisableDirectDraw = pDC->DriverFunctions.DisableDirectDraw;
76
77 if (callbacks.dwFlags & DDHAL_CB32_CREATESURFACE)
78 pDirectDraw->DdCreateSurface = callbacks.CreateSurface;
79 if (callbacks.dwFlags & DDHAL_CB32_SETCOLORKEY)
80 pDirectDraw->DdDrvSetColorKey = callbacks.SetColorKey;
81 if (callbacks.dwFlags & DDHAL_CB32_WAITFORVERTICALBLANK)
82 pDirectDraw->DdWaitForVerticalBlank = callbacks.WaitForVerticalBlank;
83 if (callbacks.dwFlags & DDHAL_CB32_CANCREATESURFACE)
84 pDirectDraw->DdCanCreateSurface = callbacks.CanCreateSurface;
85 if (callbacks.dwFlags & DDHAL_CB32_CREATEPALETTE)
86 pDirectDraw->DdCreatePalette = callbacks.CreatePalette;
87 if (callbacks.dwFlags & DDHAL_CB32_GETSCANLINE)
88 pDirectDraw->DdGetScanLine = callbacks.GetScanLine;
89 if (callbacks.dwFlags & DDHAL_CB32_MAPMEMORY)
90 pDirectDraw->DdMapMemory = callbacks.MapMemory;
91
92 if (surface_callbacks.dwFlags & DDHAL_SURFCB32_DESTROYSURFACE)
93 pDirectDraw->DdDestroySurface = surface_callbacks.DestroySurface;
94 if (surface_callbacks.dwFlags & DDHAL_SURFCB32_FLIP)
95 pDirectDraw->DdFlip = surface_callbacks.Flip;
96 if (surface_callbacks.dwFlags & DDHAL_SURFCB32_SETCLIPLIST)
97 pDirectDraw->DdSetClipList = surface_callbacks.SetClipList;
98 if (surface_callbacks.dwFlags & DDHAL_SURFCB32_LOCK)
99 pDirectDraw->DdLock = surface_callbacks.Lock;
100 if (surface_callbacks.dwFlags & DDHAL_SURFCB32_UNLOCK)
101 pDirectDraw->DdUnlock = surface_callbacks.Unlock;
102 if (surface_callbacks.dwFlags & DDHAL_SURFCB32_BLT)
103 pDirectDraw->DdBlt = surface_callbacks.Blt;
104 if (surface_callbacks.dwFlags & DDHAL_SURFCB32_SETCOLORKEY)
105 pDirectDraw->DdSetColorKey = surface_callbacks.SetColorKey;
106 if (surface_callbacks.dwFlags & DDHAL_SURFCB32_ADDATTACHEDSURFACE)
107 pDirectDraw->DdAddAttachedSurface = surface_callbacks.AddAttachedSurface;
108 if (surface_callbacks.dwFlags & DDHAL_SURFCB32_GETBLTSTATUS)
109 pDirectDraw->DdGetBltStatus = surface_callbacks.GetBltStatus;
110 if (surface_callbacks.dwFlags & DDHAL_SURFCB32_GETFLIPSTATUS)
111 pDirectDraw->DdGetFlipStatus = surface_callbacks.GetFlipStatus;
112 if (surface_callbacks.dwFlags & DDHAL_SURFCB32_UPDATEOVERLAY)
113 pDirectDraw->DdUpdateOverlay = surface_callbacks.UpdateOverlay;
114 if (surface_callbacks.dwFlags & DDHAL_SURFCB32_SETOVERLAYPOSITION)
115 pDirectDraw->DdSetOverlayPosition = surface_callbacks.SetOverlayPosition;
116 if (surface_callbacks.dwFlags & DDHAL_SURFCB32_SETPALETTE)
117 pDirectDraw->DdSetPalette = surface_callbacks.SetPalette;
118
119 if (palette_callbacks.dwFlags & DDHAL_PALCB32_DESTROYPALETTE)
120 pDirectDraw->DdDestroyPalette = palette_callbacks.DestroyPalette;
121 if (palette_callbacks.dwFlags & DDHAL_PALCB32_SETENTRIES)
122 pDirectDraw->DdSetEntries = palette_callbacks.SetEntries;
123
124 GDIOBJ_UnlockObj(hDirectDraw);
125 DC_UnlockDc(hdc);
126
127 return hDirectDraw;
128 }
129
130 BOOL STDCALL NtGdiDdDeleteDirectDrawObject(
131 HANDLE hDirectDrawLocal
132 )
133 {
134 return GDIOBJ_FreeObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
135 }
136
137 BOOL STDCALL NtGdiDdQueryDirectDrawObject(
138 HANDLE hDirectDrawLocal,
139 DD_HALINFO *pHalInfo,
140 DWORD *pCallBackFlags,
141 PD3DNTHAL_CALLBACKS puD3dCallbacks,
142 PD3DNTHAL_GLOBALDRIVERDATA puD3dDriverData,
143 PDD_D3DBUFCALLBACKS puD3dBufferCallbacks,
144 LPDDSURFACEDESC puD3dTextureFormats,
145 DWORD *puNumHeaps,
146 VIDEOMEMORY *puvmList,
147 DWORD *puNumFourCC,
148 DWORD *puFourCC
149 )
150 {
151 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
152 if (!pDirectDraw)
153 return FALSE;
154
155 BOOL success = pDirectDraw->DrvGetDirectDrawInfo(
156 pDirectDraw->Global.dhpdev,
157 pHalInfo,
158 puNumHeaps,
159 puvmList,
160 puNumFourCC,
161 puFourCC);
162
163 if (!success)
164 {
165 GDIOBJ_UnlockObj(hDirectDrawLocal);
166 return FALSE;
167 }
168
169 if (pHalInfo->lpD3DHALCallbacks)
170 {
171 RtlMoveMemory(puD3dCallbacks, pHalInfo->lpD3DHALCallbacks, sizeof(D3DNTHAL_CALLBACKS));
172 pDirectDraw->D3dContextCreate = puD3dCallbacks->ContextCreate;
173 pDirectDraw->D3dContextDestroy = puD3dCallbacks->ContextDestroy;
174 }
175
176 if (pHalInfo->lpD3DGlobalDriverData)
177 {
178 RtlMoveMemory(puD3dDriverData, pHalInfo->lpD3DGlobalDriverData, sizeof(D3DNTHAL_GLOBALDRIVERDATA));
179 }
180
181 if (pHalInfo->lpD3DBufCallbacks)
182 {
183 RtlMoveMemory(puD3dBufferCallbacks, pHalInfo->lpD3DBufCallbacks, sizeof(DD_D3DBUFCALLBACKS));
184 pDirectDraw->DdCanCreateD3DBuffer = puD3dBufferCallbacks->CanCreateD3DBuffer;
185 pDirectDraw->DdCreateD3DBuffer = puD3dBufferCallbacks->CreateD3DBuffer;
186 pDirectDraw->DdDestroyD3DBuffer = puD3dBufferCallbacks->DestroyD3DBuffer;
187 pDirectDraw->DdLockD3DBuffer = puD3dBufferCallbacks->LockD3DBuffer;
188 pDirectDraw->DdUnlockD3DBuffer = puD3dBufferCallbacks->UnlockD3DBuffer;
189 }
190
191 GDIOBJ_UnlockObj(hDirectDrawLocal);
192
193 return TRUE;
194 }
195
196 /************************************************************************/
197 /* SURFACE OBJECT */
198 /************************************************************************/
199
200 BOOL FASTCALL
201 DDSURF_Cleanup(PDD_SURFACE pDDSurf)
202 {
203 //FIXME: implement
204 return TRUE;
205 }
206
207 HANDLE STDCALL NtGdiDdCreateSurfaceObject(
208 HANDLE hDirectDrawLocal,
209 HANDLE hSurface,
210 PDD_SURFACE_LOCAL puSurfaceLocal,
211 PDD_SURFACE_MORE puSurfaceMore,
212 PDD_SURFACE_GLOBAL puSurfaceGlobal,
213 BOOL bComplete
214 )
215 {
216 PDD_DIRECTDRAW pDirectDraw = GDIOBJ_LockObj(hDirectDrawLocal, GDI_OBJECT_TYPE_DIRECTDRAW);
217 if (!pDirectDraw)
218 return NULL;
219
220 if (!hSurface)
221 hSurface = GDIOBJ_AllocObj(GDI_OBJECT_TYPE_DD_SURFACE);
222
223 PDD_SURFACE pSurface = GDIOBJ_LockObj(hSurface, GDI_OBJECT_TYPE_DD_SURFACE);
224 /* FIXME - Handle pSurface == NULL!!!! */
225
226 RtlMoveMemory(&pSurface->Local, puSurfaceLocal, sizeof(DD_SURFACE_LOCAL));
227 RtlMoveMemory(&pSurface->More, puSurfaceMore, sizeof(DD_SURFACE_MORE));
228 RtlMoveMemory(&pSurface->Global, puSurfaceGlobal, sizeof(DD_SURFACE_GLOBAL));
229 pSurface->Local.lpGbl = &pSurface->Global;
230 pSurface->Local.lpSurfMore = &pSurface->More;
231 pSurface->Local.lpAttachList = NULL;
232 pSurface->Local.lpAttachListFrom = NULL;
233 pSurface->More.lpVideoPort = NULL;
234 // FIXME: figure out how to use this
235 pSurface->bComplete = bComplete;
236
237 GDIOBJ_UnlockObj(hSurface);
238 GDIOBJ_UnlockObj(hDirectDrawLocal);
239
240 return hSurface;
241 }
242
243 BOOL STDCALL NtGdiDdDeleteSurfaceObject(
244 HANDLE hSurface
245 )
246 {
247 return GDIOBJ_FreeObj(hSurface, GDI_OBJECT_TYPE_DD_SURFACE);
248 }
249
250 /*
251 BOOL STDCALL NtGdiDdAttachSurface(
252 HANDLE hSurfaceFrom,
253 HANDLE hSurfaceTo
254 )
255 {
256 PDD_SURFACE pSurfaceFrom = GDIOBJ_LockObj(hSurfaceFrom, GDI_OBJECT_TYPE_DD_SURFACE);
257 if (!pSurfaceFrom)
258 return FALSE;
259 PDD_SURFACE pSurfaceTo = GDIOBJ_LockObj(hSurfaceTo, GDI_OBJECT_TYPE_DD_SURFACE);
260 if (!pSurfaceTo)
261 {
262 GDIOBJ_UnlockObj(hSurfaceFrom);
263 return FALSE;
264 }
265
266 if (pSurfaceFrom->Local.lpAttachListFrom)
267 {
268 pSurfaceFrom->Local.lpAttachListFrom = pSurfaceFrom->AttachListFrom;
269 }
270
271 GDIOBJ_UnlockObj(hSurfaceFrom);
272 GDIOBJ_UnlockObj(hSurfaceTo);
273 return TRUE;
274 }
275 */
276
277 /* EOF */