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