Reactos
1/*
2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: Native DirectDraw implementation
5 * FILE: win32ss/reactx/ntddraw/ddsurf.c
6 * PROGRAMER: Magnus Olsen (greatlord@reactos.org)
7 * REVISION HISTORY:
8 * 19/7-2006 Magnus Olsen
9 */
10
11#include <win32k.h>
12
13// #define NDEBUG
14#include <debug.h>
15
16/************************************************************************/
17/* NtGdiDdDestroySurface */
18/************************************************************************/
19DWORD
20APIENTRY
21NtGdiDdDestroySurface(HANDLE hSurface, BOOL bRealDestroy)
22{
23 PGD_DXDDDESTROYSURFACE pfnDdDestroySurface = (PGD_DXDDDESTROYSURFACE)gpDxFuncs[DXG_INDEX_DxDdDestroySurface].pfn;
24
25 if (pfnDdDestroySurface == NULL)
26 {
27 DPRINT1("Warning: no pfnDdDestroySurface\n");
28 return DDHAL_DRIVER_NOTHANDLED;
29 }
30
31 DPRINT("Calling dxg.sys pfnDdDestroySurface\n");
32 return pfnDdDestroySurface(hSurface, bRealDestroy);
33}
34
35/************************************************************************/
36/* NtGdiDdFlip */
37/************************************************************************/
38DWORD
39APIENTRY
40NtGdiDdFlip(HANDLE hSurfaceCurrent,
41 HANDLE hSurfaceTarget,
42 HANDLE hSurfaceCurrentLeft,
43 HANDLE hSurfaceTargetLeft,
44 PDD_FLIPDATA puFlipData)
45{
46 PGD_DXDDFLIP pfnDdDdFlip = (PGD_DXDDFLIP)gpDxFuncs[DXG_INDEX_DxDdFlip].pfn;
47
48 if (pfnDdDdFlip == NULL)
49 {
50 DPRINT1("Warning: no pfnDdDdFlip\n");
51 return DDHAL_DRIVER_NOTHANDLED;
52 }
53
54 DPRINT("Calling dxg.sys pfnDdDdFlip\n");
55 return pfnDdDdFlip(hSurfaceCurrent, hSurfaceTarget, hSurfaceCurrentLeft, hSurfaceTargetLeft, puFlipData);
56}
57
58/************************************************************************/
59/* NtGdiDdUnlock */
60/************************************************************************/
61DWORD
62APIENTRY
63NtGdiDdLock(HANDLE hSurface,
64 PDD_LOCKDATA puLockData,
65 HDC hdcClip)
66{
67 PGD_DXDDLOCK pfnDdLock = (PGD_DXDDLOCK)gpDxFuncs[DXG_INDEX_DxDdLock].pfn;
68
69 if (pfnDdLock == NULL)
70 {
71 DPRINT1("Warning: no pfnDdLock\n");
72 return DDHAL_DRIVER_NOTHANDLED;
73 }
74
75 DPRINT("Calling dxg.sys pfnDdLock\n");
76 return pfnDdLock(hSurface, puLockData, hdcClip);
77}
78
79/************************************************************************/
80/* NtGdiDdunlock */
81/************************************************************************/
82DWORD
83APIENTRY
84NtGdiDdUnlock(HANDLE hSurface,
85 PDD_UNLOCKDATA puUnlockData)
86{
87 PGD_DXDDUNLOCK pfnDdUnlock = (PGD_DXDDUNLOCK)gpDxFuncs[DXG_INDEX_DxDdUnlock].pfn;
88
89 if (pfnDdUnlock == NULL)
90 {
91 DPRINT1("Warning: no pfnDdUnlock\n");
92 return DDHAL_DRIVER_NOTHANDLED;
93 }
94
95 DPRINT("Calling dxg.sys pfnDdUnlock\n");
96 return pfnDdUnlock(hSurface, puUnlockData);
97}
98
99/************************************************************************/
100/* NtGdiDdBlt */
101/************************************************************************/
102DWORD
103APIENTRY
104NtGdiDdBlt(HANDLE hSurfaceDest,
105 HANDLE hSurfaceSrc,
106 PDD_BLTDATA puBltData)
107{
108 PGD_DDBLT pfnDdBlt = (PGD_DDBLT)gpDxFuncs[DXG_INDEX_DxDdBlt].pfn;
109
110 if (pfnDdBlt == NULL)
111 {
112 DPRINT1("Warning: no pfnDdBlt\n");
113 return DDHAL_DRIVER_NOTHANDLED;
114 }
115
116 DPRINT("Calling dxg.sys pfnDdBlt\n");
117 return pfnDdBlt(hSurfaceDest,hSurfaceSrc,puBltData);
118}
119
120/************************************************************************/
121/* NtGdiDdSetColorKey */
122/************************************************************************/
123DWORD
124APIENTRY
125NtGdiDdSetColorKey(HANDLE hSurface,
126 PDD_SETCOLORKEYDATA puSetColorKeyData)
127{
128 PGD_DXDDSETCOLORKEY pfnDdSetColorKey = (PGD_DXDDSETCOLORKEY)gpDxFuncs[DXG_INDEX_DxDdSetColorKey].pfn;
129
130 if (pfnDdSetColorKey == NULL)
131 {
132 DPRINT1("Warning: no pfnDdSetColorKey\n");
133 return DDHAL_DRIVER_NOTHANDLED;
134 }
135
136 DPRINT("Calling dxg.sys pfnDdSetColorKey\n");
137 return pfnDdSetColorKey(hSurface,puSetColorKeyData);
138}
139
140/************************************************************************/
141/* NtGdiDdAddAttachedSurface */
142/************************************************************************/
143DWORD
144APIENTRY
145NtGdiDdAddAttachedSurface(HANDLE hSurface,
146 HANDLE hSurfaceAttached,
147 PDD_ADDATTACHEDSURFACEDATA puAddAttachedSurfaceData)
148{
149 PGD_DDADDATTACHEDSURFACE pfnDdAddAttachedSurface = (PGD_DDADDATTACHEDSURFACE)gpDxFuncs[DXG_INDEX_DxDdAddAttachedSurface].pfn;
150
151 if (pfnDdAddAttachedSurface == NULL)
152 {
153 DPRINT1("Warning: no pfnDdAddAttachedSurface\n");
154 return DDHAL_DRIVER_NOTHANDLED;
155 }
156
157 DPRINT("Calling dxg.sys pfnDdAddAttachedSurface\n");
158 return pfnDdAddAttachedSurface(hSurface,hSurfaceAttached,puAddAttachedSurfaceData);
159}
160
161/************************************************************************/
162/* NtGdiDdGetBltStatus */
163/************************************************************************/
164DWORD
165APIENTRY
166NtGdiDdGetBltStatus(HANDLE hSurface,
167 PDD_GETBLTSTATUSDATA puGetBltStatusData)
168{
169 PGD_DXDDGETBLTSTATUS pfnDdGetBltStatus = (PGD_DXDDGETBLTSTATUS)gpDxFuncs[DXG_INDEX_DxDdGetBltStatus].pfn;
170
171 if (pfnDdGetBltStatus == NULL)
172 {
173 DPRINT1("Warning: no pfnDdGetBltStatus\n");
174 return DDHAL_DRIVER_NOTHANDLED;
175 }
176
177 DPRINT("Calling dxg.sys pfnDdGetBltStatus\n");
178 return pfnDdGetBltStatus(hSurface,puGetBltStatusData);
179}
180
181/************************************************************************/
182/* NtGdiDdGetFlipStatus */
183/************************************************************************/
184DWORD
185APIENTRY
186NtGdiDdGetFlipStatus(HANDLE hSurface,
187 PDD_GETFLIPSTATUSDATA puGetFlipStatusData)
188{
189 PGD_DXDDGETFLIPSTATUS pfnDdGetFlipStatus = (PGD_DXDDGETFLIPSTATUS)gpDxFuncs[DXG_INDEX_DxDdGetFlipStatus].pfn;
190
191 if (pfnDdGetFlipStatus == NULL)
192 {
193 DPRINT1("Warning: no pfnDdGetFlipStatus\n");
194 return DDHAL_DRIVER_NOTHANDLED;
195 }
196
197 DPRINT("Calling dxg.sys pfnDdGetFlipStatus\n");
198 return pfnDdGetFlipStatus(hSurface,puGetFlipStatusData);
199}
200
201/************************************************************************/
202/* NtGdiDdUpdateOverlay */
203/************************************************************************/
204DWORD
205APIENTRY
206NtGdiDdUpdateOverlay(HANDLE hSurfaceDestination,
207 HANDLE hSurfaceSource,
208 PDD_UPDATEOVERLAYDATA puUpdateOverlayData)
209{
210 PGD_DXDDUPDATEOVERLAY pfnDdUpdateOverlay = (PGD_DXDDUPDATEOVERLAY)gpDxFuncs[DXG_INDEX_DxDdUpdateOverlay].pfn;
211
212 if (pfnDdUpdateOverlay == NULL)
213 {
214 DPRINT1("Warning: no pfnDdUpdateOverlay\n");
215 return DDHAL_DRIVER_NOTHANDLED;
216 }
217
218 DPRINT("Calling dxg.sys pfnDdUpdateOverlay\n");
219 return pfnDdUpdateOverlay(hSurfaceDestination,hSurfaceSource,puUpdateOverlayData);
220}
221
222/************************************************************************/
223/* NtGdiDdSetOverlayPosition */
224/************************************************************************/
225DWORD
226APIENTRY
227NtGdiDdSetOverlayPosition(HANDLE hSurfaceSource,
228 HANDLE hSurfaceDestination,
229 PDD_SETOVERLAYPOSITIONDATA puSetOverlayPositionData)
230{
231 PGD_DXDDSETOVERLAYPOSITION pfnDdSetOverlayPosition = (PGD_DXDDSETOVERLAYPOSITION)gpDxFuncs[DXG_INDEX_DxDdSetOverlayPosition].pfn;
232
233 if (pfnDdSetOverlayPosition == NULL)
234 {
235 DPRINT1("Warning: no pfnDdSetOverlayPosition\n");
236 return DDHAL_DRIVER_NOTHANDLED;
237 }
238
239 DPRINT("Calling dxg.sys pfnDdSetOverlayPosition\n");
240 return pfnDdSetOverlayPosition(hSurfaceSource,hSurfaceDestination,puSetOverlayPositionData);
241}
242
243/************************************************************************/
244/* This is not part of the ddsurface interface but it */
245/* deals with the surface */
246/************************************************************************/
247
248
249/************************************************************************/
250/* NtGdiDdAlphaBlt */
251/************************************************************************/
252DWORD
253APIENTRY
254NtGdiDdAlphaBlt(HANDLE hSurfaceDest,
255 HANDLE hSurfaceSrc,
256 PDD_BLTDATA puBltData)
257{
258 PGD_DDALPHABLT pfnDdAlphaBlt = (PGD_DDALPHABLT)gpDxFuncs[DXG_INDEX_DxDdAlphaBlt].pfn;
259
260 if (pfnDdAlphaBlt == NULL)
261 {
262 DPRINT1("Warning: no pfnDdAlphaBlt\n");
263 return DDHAL_DRIVER_NOTHANDLED;
264 }
265
266 DPRINT("Calling dxg.sys pfnDdAlphaBlt\n");
267 return pfnDdAlphaBlt(hSurfaceDest,hSurfaceSrc,puBltData);
268}
269
270/************************************************************************/
271/* NtGdiDdAttachSurface */
272/************************************************************************/
273BOOL
274APIENTRY
275NtGdiDdAttachSurface(HANDLE hSurfaceFrom,
276 HANDLE hSurfaceTo
277)
278{
279 PGD_DDATTACHSURFACE pfnDdAttachSurface = (PGD_DDATTACHSURFACE)gpDxFuncs[DXG_INDEX_DxDdAttachSurface].pfn;
280
281 if (pfnDdAttachSurface == NULL)
282 {
283 DPRINT1("Warning: no pfnDdAttachSurface\n");
284 return DDHAL_DRIVER_NOTHANDLED;
285 }
286
287 DPRINT("Calling dxg.sys pfnDdAttachSurface\n");
288 return pfnDdAttachSurface(hSurfaceFrom,hSurfaceTo);
289}
290
291/************************************************************************/
292/* NtGdiDdUnattachSurface */
293/************************************************************************/
294/* Note: MSDN protypes is VOID APIENTRY NtGdiDdUnattachSurface(HANDLE hSurface, HANDLE hSurfaceAttached)
295 But it say it return either DDHAL_DRIVER_NOTHANDLED or DDHAL_DRIVER_HANDLED
296 so I guess it is a typo in MSDN for this prototype for the info contradicts itself.
297*/
298NTSTATUS
299APIENTRY
300NtGdiDdUnattachSurface(HANDLE hSurface,
301 HANDLE hSurfaceAttached)
302{
303 PGD_DXDDUNATTACHSURFACE pfnDdUnattachSurface = (PGD_DXDDUNATTACHSURFACE)gpDxFuncs[DXG_INDEX_DxDdUnattachSurface].pfn;
304 if (pfnDdUnattachSurface == NULL)
305 {
306 DPRINT1("Warning: no pfnDdUnattachSurface\n");
307 //return DDHAL_DRIVER_NOTHANDLED;
308 return STATUS_NOT_IMPLEMENTED;
309 }
310
311 DPRINT("Calling dxg.sys pfnDdUnattachSurface\n");
312 return pfnDdUnattachSurface(hSurface,hSurfaceAttached);
313}