1 /**************************************************************************
2 *
3 * Copyright 2008 VMware, Inc.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL VMWARE AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28 /**
29 * @file
30 *
31 * Fake WGL gallium frontend.
32 *
33 * These functions implement the WGL API, on top of the ICD DDI, so that the
34 * resulting DLL can be used as a drop-in replacement for the system's
35 * opengl32.dll.
36 *
37 * These functions never get called for ICD drivers, which use exclusively the
38 * ICD DDI, i.e., the Drv* entrypoints.
39 */
40
41 #include <windows.h>
42 #include <GL/gl.h>
43
44 #include "util/u_debug.h"
45 #include "gldrv.h"
46 #include "stw_context.h"
47 #include "stw_pixelformat.h"
48 #include "stw_wgl.h"
49 #include "stw_ext_context.h"
50
51 WINGDIAPI BOOL APIENTRY
wglCopyContext(HGLRC hglrcSrc,HGLRC hglrcDst,UINT mask)52 wglCopyContext(
53 HGLRC hglrcSrc,
54 HGLRC hglrcDst,
55 UINT mask )
56 {
57 return DrvCopyContext( (DHGLRC)(UINT_PTR)hglrcSrc,
58 (DHGLRC)(UINT_PTR)hglrcDst,
59 mask );
60 }
61
62 WINGDIAPI HGLRC APIENTRY
wglCreateContext(HDC hdc)63 wglCreateContext(
64 HDC hdc )
65 {
66 stw_override_opengl32_entry_points(&wglCreateContext, &wglDeleteContext);
67 return (HGLRC)(UINT_PTR)DrvCreateContext(hdc);
68 }
69
70 WINGDIAPI HGLRC APIENTRY
wglCreateLayerContext(HDC hdc,int iLayerPlane)71 wglCreateLayerContext(
72 HDC hdc,
73 int iLayerPlane )
74 {
75 stw_override_opengl32_entry_points(&wglCreateContext, &wglDeleteContext);
76 return (HGLRC)(UINT_PTR)DrvCreateLayerContext( hdc, iLayerPlane );
77 }
78
79 WINGDIAPI BOOL APIENTRY
wglDeleteContext(HGLRC hglrc)80 wglDeleteContext(
81 HGLRC hglrc )
82 {
83 return DrvDeleteContext((DHGLRC)(UINT_PTR)hglrc );
84 }
85
86
87 WINGDIAPI HGLRC APIENTRY
wglGetCurrentContext(VOID)88 wglGetCurrentContext( VOID )
89 {
90 return (HGLRC)(UINT_PTR)stw_get_current_context();
91 }
92
93 WINGDIAPI HDC APIENTRY
wglGetCurrentDC(VOID)94 wglGetCurrentDC( VOID )
95 {
96 return stw_get_current_dc();
97 }
98
99
100 WINGDIAPI BOOL APIENTRY
wglMakeCurrent(HDC hdc,HGLRC hglrc)101 wglMakeCurrent(
102 HDC hdc,
103 HGLRC hglrc )
104 {
105 return DrvSetContext( hdc, (DHGLRC)(UINT_PTR)hglrc, NULL ) ? TRUE : FALSE;
106 }
107
108
109 WINGDIAPI BOOL APIENTRY
wglSwapBuffers(HDC hdc)110 wglSwapBuffers(
111 HDC hdc )
112 {
113 return DrvSwapBuffers( hdc );
114 }
115
116
117 WINGDIAPI DWORD WINAPI
wglSwapMultipleBuffers(UINT n,CONST WGLSWAP * ps)118 wglSwapMultipleBuffers(UINT n,
119 CONST WGLSWAP *ps)
120 {
121 UINT i;
122
123 for (i =0; i < n; ++i)
124 wglSwapBuffers(ps->hdc);
125
126 return 0;
127 }
128
129
130 WINGDIAPI BOOL APIENTRY
wglSwapLayerBuffers(HDC hdc,UINT fuPlanes)131 wglSwapLayerBuffers(
132 HDC hdc,
133 UINT fuPlanes )
134 {
135 return DrvSwapLayerBuffers( hdc, fuPlanes );
136 }
137
138 WINGDIAPI PROC APIENTRY
wglGetProcAddress(LPCSTR lpszProc)139 wglGetProcAddress(
140 LPCSTR lpszProc )
141 {
142 return DrvGetProcAddress( lpszProc );
143 }
144
145
146 WINGDIAPI int APIENTRY
wglChoosePixelFormat(HDC hdc,CONST PIXELFORMATDESCRIPTOR * ppfd)147 wglChoosePixelFormat(
148 HDC hdc,
149 CONST PIXELFORMATDESCRIPTOR *ppfd )
150 {
151 if (ppfd->nSize != sizeof( PIXELFORMATDESCRIPTOR ) || ppfd->nVersion != 1)
152 return 0;
153 if (ppfd->iPixelType != PFD_TYPE_RGBA)
154 return 0;
155 if (!(ppfd->dwFlags & PFD_DRAW_TO_WINDOW))
156 return 0;
157 if (!(ppfd->dwFlags & PFD_SUPPORT_OPENGL))
158 return 0;
159 if (ppfd->dwFlags & PFD_DRAW_TO_BITMAP)
160 return 0;
161 if (!(ppfd->dwFlags & PFD_STEREO_DONTCARE) && (ppfd->dwFlags & PFD_STEREO))
162 return 0;
163
164 return stw_pixelformat_choose( hdc, ppfd );
165 }
166
167 WINGDIAPI int APIENTRY
wglDescribePixelFormat(HDC hdc,int iPixelFormat,UINT nBytes,LPPIXELFORMATDESCRIPTOR ppfd)168 wglDescribePixelFormat(
169 HDC hdc,
170 int iPixelFormat,
171 UINT nBytes,
172 LPPIXELFORMATDESCRIPTOR ppfd )
173 {
174 return DrvDescribePixelFormat( hdc, iPixelFormat, nBytes, ppfd );
175 }
176
177 WINGDIAPI int APIENTRY
wglGetPixelFormat(HDC hdc)178 wglGetPixelFormat(
179 HDC hdc )
180 {
181 return stw_pixelformat_get( hdc );
182 }
183
184 WINGDIAPI BOOL APIENTRY
wglSetPixelFormat(HDC hdc,int iPixelFormat,const PIXELFORMATDESCRIPTOR * ppfd)185 wglSetPixelFormat(
186 HDC hdc,
187 int iPixelFormat,
188 const PIXELFORMATDESCRIPTOR *ppfd )
189 {
190 /* SetPixelFormat (hence wglSetPixelFormat) must not touch ppfd, per
191 * http://msdn.microsoft.com/en-us/library/dd369049(v=vs.85).aspx
192 */
193 (void) ppfd;
194
195 return DrvSetPixelFormat( hdc, iPixelFormat );
196 }
197
198
199 WINGDIAPI BOOL APIENTRY
wglUseFontBitmapsA(HDC hdc,DWORD first,DWORD count,DWORD listBase)200 wglUseFontBitmapsA(
201 HDC hdc,
202 DWORD first,
203 DWORD count,
204 DWORD listBase )
205 {
206 return wglUseFontBitmapsW(hdc, first, count, listBase);
207 }
208
209 WINGDIAPI BOOL APIENTRY
wglShareLists(HGLRC hglrc1,HGLRC hglrc2)210 wglShareLists(
211 HGLRC hglrc1,
212 HGLRC hglrc2 )
213 {
214 return DrvShareLists((DHGLRC)(UINT_PTR)hglrc1,
215 (DHGLRC)(UINT_PTR)hglrc2);
216 }
217
218 WINGDIAPI BOOL APIENTRY
wglUseFontBitmapsW(HDC hdc,DWORD first,DWORD count,DWORD listBase)219 wglUseFontBitmapsW(
220 HDC hdc,
221 DWORD first,
222 DWORD count,
223 DWORD listBase )
224 {
225 GLYPHMETRICS gm;
226 MAT2 tra;
227 FIXED one, minus_one, zero;
228 void *buffer = NULL;
229 BOOL result = TRUE;
230
231 one.value = 1;
232 one.fract = 0;
233 minus_one.value = -1;
234 minus_one.fract = 0;
235 zero.value = 0;
236 zero.fract = 0;
237
238 tra.eM11 = one;
239 tra.eM22 = minus_one;
240 tra.eM12 = tra.eM21 = zero;
241
242 for (int i = 0; i < count; i++) {
243 DWORD size = GetGlyphOutline(hdc, first + i, GGO_BITMAP, &gm, 0,
244 NULL, &tra);
245
246 glNewList(listBase + i, GL_COMPILE);
247
248 if (size != GDI_ERROR) {
249 if (size == 0) {
250 glBitmap(0, 0, (GLfloat)-gm.gmptGlyphOrigin.x,
251 (GLfloat)gm.gmptGlyphOrigin.y,
252 (GLfloat)gm.gmCellIncX,
253 (GLfloat)gm.gmCellIncY, NULL);
254 }
255 else {
256 buffer = realloc(buffer, size);
257 size = GetGlyphOutline(hdc, first + i, GGO_BITMAP, &gm,
258 size, buffer, &tra);
259
260 glBitmap(gm.gmBlackBoxX, gm.gmBlackBoxY,
261 -gm.gmptGlyphOrigin.x, gm.gmptGlyphOrigin.y,
262 gm.gmCellIncX, gm.gmCellIncY, buffer);
263 }
264 }
265 else {
266 result = FALSE;
267 }
268
269 glEndList();
270 }
271
272 free(buffer);
273
274 return result;
275 }
276
277 WINGDIAPI BOOL APIENTRY
wglUseFontOutlinesA(HDC hdc,DWORD first,DWORD count,DWORD listBase,FLOAT deviation,FLOAT extrusion,int format,LPGLYPHMETRICSFLOAT lpgmf)278 wglUseFontOutlinesA(
279 HDC hdc,
280 DWORD first,
281 DWORD count,
282 DWORD listBase,
283 FLOAT deviation,
284 FLOAT extrusion,
285 int format,
286 LPGLYPHMETRICSFLOAT lpgmf )
287 {
288 (void) hdc;
289 (void) first;
290 (void) count;
291 (void) listBase;
292 (void) deviation;
293 (void) extrusion;
294 (void) format;
295 (void) lpgmf;
296
297 assert( 0 );
298
299 return FALSE;
300 }
301
302 WINGDIAPI BOOL APIENTRY
wglUseFontOutlinesW(HDC hdc,DWORD first,DWORD count,DWORD listBase,FLOAT deviation,FLOAT extrusion,int format,LPGLYPHMETRICSFLOAT lpgmf)303 wglUseFontOutlinesW(
304 HDC hdc,
305 DWORD first,
306 DWORD count,
307 DWORD listBase,
308 FLOAT deviation,
309 FLOAT extrusion,
310 int format,
311 LPGLYPHMETRICSFLOAT lpgmf )
312 {
313 (void) hdc;
314 (void) first;
315 (void) count;
316 (void) listBase;
317 (void) deviation;
318 (void) extrusion;
319 (void) format;
320 (void) lpgmf;
321
322 assert( 0 );
323
324 return FALSE;
325 }
326
327 WINGDIAPI BOOL APIENTRY
wglDescribeLayerPlane(HDC hdc,int iPixelFormat,int iLayerPlane,UINT nBytes,LPLAYERPLANEDESCRIPTOR plpd)328 wglDescribeLayerPlane(
329 HDC hdc,
330 int iPixelFormat,
331 int iLayerPlane,
332 UINT nBytes,
333 LPLAYERPLANEDESCRIPTOR plpd )
334 {
335 return DrvDescribeLayerPlane(hdc, iPixelFormat, iLayerPlane, nBytes, plpd);
336 }
337
338 WINGDIAPI int APIENTRY
wglSetLayerPaletteEntries(HDC hdc,int iLayerPlane,int iStart,int cEntries,CONST COLORREF * pcr)339 wglSetLayerPaletteEntries(
340 HDC hdc,
341 int iLayerPlane,
342 int iStart,
343 int cEntries,
344 CONST COLORREF *pcr )
345 {
346 return DrvSetLayerPaletteEntries(hdc, iLayerPlane, iStart, cEntries, pcr);
347 }
348
349 WINGDIAPI int APIENTRY
wglGetLayerPaletteEntries(HDC hdc,int iLayerPlane,int iStart,int cEntries,COLORREF * pcr)350 wglGetLayerPaletteEntries(
351 HDC hdc,
352 int iLayerPlane,
353 int iStart,
354 int cEntries,
355 COLORREF *pcr )
356 {
357 return DrvGetLayerPaletteEntries(hdc, iLayerPlane, iStart, cEntries, pcr);
358 }
359
360 WINGDIAPI BOOL APIENTRY
wglRealizeLayerPalette(HDC hdc,int iLayerPlane,BOOL bRealize)361 wglRealizeLayerPalette(
362 HDC hdc,
363 int iLayerPlane,
364 BOOL bRealize )
365 {
366 (void) hdc;
367 (void) iLayerPlane;
368 (void) bRealize;
369
370 assert( 0 );
371
372 return FALSE;
373 }
374
375
376