1 ! Copyright (C) 2005, 2006 Doug Coleman.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: alien alien.c-types alien.syntax parser namespaces kernel
4 math math.bitwise windows.types init assocs
5 sequences libc opengl.gl opengl.gl.extensions opengl.gl.windows ;
8 ! PIXELFORMATDESCRIPTOR flags
9 CONSTANT: PFD_DOUBLEBUFFER HEX: 00000001
10 CONSTANT: PFD_STEREO HEX: 00000002
11 CONSTANT: PFD_DRAW_TO_WINDOW HEX: 00000004
12 CONSTANT: PFD_DRAW_TO_BITMAP HEX: 00000008
13 CONSTANT: PFD_SUPPORT_GDI HEX: 00000010
14 CONSTANT: PFD_SUPPORT_OPENGL HEX: 00000020
15 CONSTANT: PFD_GENERIC_FORMAT HEX: 00000040
16 CONSTANT: PFD_NEED_PALETTE HEX: 00000080
17 CONSTANT: PFD_NEED_SYSTEM_PALETTE HEX: 00000100
18 CONSTANT: PFD_SWAP_EXCHANGE HEX: 00000200
19 CONSTANT: PFD_SWAP_COPY HEX: 00000400
20 CONSTANT: PFD_SWAP_LAYER_BUFFERS HEX: 00000800
21 CONSTANT: PFD_GENERIC_ACCELERATED HEX: 00001000
22 CONSTANT: PFD_SUPPORT_DIRECTDRAW HEX: 00002000
24 ! PIXELFORMATDESCRIPTOR flags for use in ChoosePixelFormat only
25 CONSTANT: PFD_DEPTH_DONTCARE HEX: 20000000
26 CONSTANT: PFD_DOUBLEBUFFER_DONTCARE HEX: 40000000
27 CONSTANT: PFD_STEREO_DONTCARE HEX: 80000000
30 CONSTANT: PFD_TYPE_RGBA 0
31 CONSTANT: PFD_TYPE_COLORINDEX 1
34 CONSTANT: PFD_MAIN_PLANE 0
35 CONSTANT: PFD_OVERLAY_PLANE 1
36 CONSTANT: PFD_UNDERLAY_PLANE -1
38 CONSTANT: LPD_TYPE_RGBA 0
39 CONSTANT: LPD_TYPE_COLORINDEX 1
41 ! wglSwapLayerBuffers flags
42 CONSTANT: WGL_SWAP_MAIN_PLANE HEX: 00000001
43 CONSTANT: WGL_SWAP_OVERLAY1 HEX: 00000002
44 CONSTANT: WGL_SWAP_OVERLAY2 HEX: 00000004
45 CONSTANT: WGL_SWAP_OVERLAY3 HEX: 00000008
46 CONSTANT: WGL_SWAP_OVERLAY4 HEX: 00000010
47 CONSTANT: WGL_SWAP_OVERLAY5 HEX: 00000020
48 CONSTANT: WGL_SWAP_OVERLAY6 HEX: 00000040
49 CONSTANT: WGL_SWAP_OVERLAY7 HEX: 00000080
50 CONSTANT: WGL_SWAP_OVERLAY8 HEX: 00000100
51 CONSTANT: WGL_SWAP_OVERLAY9 HEX: 00000200
52 CONSTANT: WGL_SWAP_OVERLAY10 HEX: 00000400
53 CONSTANT: WGL_SWAP_OVERLAY11 HEX: 00000800
54 CONSTANT: WGL_SWAP_OVERLAY12 HEX: 00001000
55 CONSTANT: WGL_SWAP_OVERLAY13 HEX: 00002000
56 CONSTANT: WGL_SWAP_OVERLAY14 HEX: 00004000
57 CONSTANT: WGL_SWAP_OVERLAY15 HEX: 00008000
58 CONSTANT: WGL_SWAP_UNDERLAY1 HEX: 00010000
59 CONSTANT: WGL_SWAP_UNDERLAY2 HEX: 00020000
60 CONSTANT: WGL_SWAP_UNDERLAY3 HEX: 00040000
61 CONSTANT: WGL_SWAP_UNDERLAY4 HEX: 00080000
62 CONSTANT: WGL_SWAP_UNDERLAY5 HEX: 00100000
63 CONSTANT: WGL_SWAP_UNDERLAY6 HEX: 00200000
64 CONSTANT: WGL_SWAP_UNDERLAY7 HEX: 00400000
65 CONSTANT: WGL_SWAP_UNDERLAY8 HEX: 00800000
66 CONSTANT: WGL_SWAP_UNDERLAY9 HEX: 01000000
67 CONSTANT: WGL_SWAP_UNDERLAY10 HEX: 02000000
68 CONSTANT: WGL_SWAP_UNDERLAY11 HEX: 04000000
69 CONSTANT: WGL_SWAP_UNDERLAY12 HEX: 08000000
70 CONSTANT: WGL_SWAP_UNDERLAY13 HEX: 10000000
71 CONSTANT: WGL_SWAP_UNDERLAY14 HEX: 20000000
72 CONSTANT: WGL_SWAP_UNDERLAY15 HEX: 40000000
74 : windowed-pfd-dwFlags ( -- n )
75 { PFD_DRAW_TO_WINDOW PFD_SUPPORT_OPENGL PFD_DOUBLEBUFFER } flags ;
76 : offscreen-pfd-dwFlags ( -- n )
77 { PFD_DRAW_TO_BITMAP PFD_SUPPORT_OPENGL } flags ;
79 ! TODO: compare to http://www.nullterminator.net/opengl32.html
80 : make-pfd ( flags bits -- pfd )
81 "PIXELFORMATDESCRIPTOR" <c-object>
82 "PIXELFORMATDESCRIPTOR" heap-size over set-PIXELFORMATDESCRIPTOR-nSize
83 1 over set-PIXELFORMATDESCRIPTOR-nVersion
84 rot over set-PIXELFORMATDESCRIPTOR-dwFlags
85 PFD_TYPE_RGBA over set-PIXELFORMATDESCRIPTOR-iPixelType
86 [ set-PIXELFORMATDESCRIPTOR-cColorBits ] keep
87 16 over set-PIXELFORMATDESCRIPTOR-cDepthBits
88 PFD_MAIN_PLANE over set-PIXELFORMATDESCRIPTOR-dwLayerMask ;
94 ! FUNCTION: int ReleaseDC ( HWND hWnd, HDC hDC ) ;
95 ! FUNCTION: HDC ResetDC ( HDC hdc, DEVMODE* lpInitData ) ;
96 ! FUNCTION: BOOL RestoreDC ( HDC hdc, int nSavedDC ) ;
97 ! FUNCTION: int SaveDC( HDC hDC ) ;
98 ! FUNCTION: HGDIOBJ SelectObject ( HDC hDC, HGDIOBJ hgdiobj ) ;
100 FUNCTION: HGLRC wglCreateContext ( HDC hDC ) ;
101 FUNCTION: BOOL wglDeleteContext ( HGLRC hRC ) ;
102 FUNCTION: BOOL wglMakeCurrent ( HDC hDC, HGLRC hglrc ) ;
104 ! WGL_ARB_extensions_string extension
106 GL-FUNCTION: char* wglGetExtensionsStringARB ( HDC hDC ) ;
108 ! WGL_ARB_pixel_format extension
110 CONSTANT: WGL_NUMBER_PIXEL_FORMATS_ARB HEX: 2000
111 CONSTANT: WGL_DRAW_TO_WINDOW_ARB HEX: 2001
112 CONSTANT: WGL_DRAW_TO_BITMAP_ARB HEX: 2002
113 CONSTANT: WGL_ACCELERATION_ARB HEX: 2003
114 CONSTANT: WGL_NEED_PALETTE_ARB HEX: 2004
115 CONSTANT: WGL_NEED_SYSTEM_PALETTE_ARB HEX: 2005
116 CONSTANT: WGL_SWAP_LAYER_BUFFERS_ARB HEX: 2006
117 CONSTANT: WGL_SWAP_METHOD_ARB HEX: 2007
118 CONSTANT: WGL_NUMBER_OVERLAYS_ARB HEX: 2008
119 CONSTANT: WGL_NUMBER_UNDERLAYS_ARB HEX: 2009
120 CONSTANT: WGL_TRANSPARENT_ARB HEX: 200A
121 CONSTANT: WGL_TRANSPARENT_RED_VALUE_ARB HEX: 2037
122 CONSTANT: WGL_TRANSPARENT_GREEN_VALUE_ARB HEX: 2038
123 CONSTANT: WGL_TRANSPARENT_BLUE_VALUE_ARB HEX: 2039
124 CONSTANT: WGL_TRANSPARENT_ALPHA_VALUE_ARB HEX: 203A
125 CONSTANT: WGL_TRANSPARENT_INDEX_VALUE_ARB HEX: 203B
126 CONSTANT: WGL_SHARE_DEPTH_ARB HEX: 200C
127 CONSTANT: WGL_SHARE_STENCIL_ARB HEX: 200D
128 CONSTANT: WGL_SHARE_ACCUM_ARB HEX: 200E
129 CONSTANT: WGL_SUPPORT_GDI_ARB HEX: 200F
130 CONSTANT: WGL_SUPPORT_OPENGL_ARB HEX: 2010
131 CONSTANT: WGL_DOUBLE_BUFFER_ARB HEX: 2011
132 CONSTANT: WGL_STEREO_ARB HEX: 2012
133 CONSTANT: WGL_PIXEL_TYPE_ARB HEX: 2013
134 CONSTANT: WGL_COLOR_BITS_ARB HEX: 2014
135 CONSTANT: WGL_RED_BITS_ARB HEX: 2015
136 CONSTANT: WGL_RED_SHIFT_ARB HEX: 2016
137 CONSTANT: WGL_GREEN_BITS_ARB HEX: 2017
138 CONSTANT: WGL_GREEN_SHIFT_ARB HEX: 2018
139 CONSTANT: WGL_BLUE_BITS_ARB HEX: 2019
140 CONSTANT: WGL_BLUE_SHIFT_ARB HEX: 201A
141 CONSTANT: WGL_ALPHA_BITS_ARB HEX: 201B
142 CONSTANT: WGL_ALPHA_SHIFT_ARB HEX: 201C
143 CONSTANT: WGL_ACCUM_BITS_ARB HEX: 201D
144 CONSTANT: WGL_ACCUM_RED_BITS_ARB HEX: 201E
145 CONSTANT: WGL_ACCUM_GREEN_BITS_ARB HEX: 201F
146 CONSTANT: WGL_ACCUM_BLUE_BITS_ARB HEX: 2020
147 CONSTANT: WGL_ACCUM_ALPHA_BITS_ARB HEX: 2021
148 CONSTANT: WGL_DEPTH_BITS_ARB HEX: 2022
149 CONSTANT: WGL_STENCIL_BITS_ARB HEX: 2023
150 CONSTANT: WGL_AUX_BUFFERS_ARB HEX: 2024
152 CONSTANT: WGL_NO_ACCELERATION_ARB HEX: 2025
153 CONSTANT: WGL_GENERIC_ACCELERATION_ARB HEX: 2026
154 CONSTANT: WGL_FULL_ACCELERATION_ARB HEX: 2027
156 CONSTANT: WGL_SWAP_EXCHANGE_ARB HEX: 2028
157 CONSTANT: WGL_SWAP_COPY_ARB HEX: 2029
158 CONSTANT: WGL_SWAP_UNDEFINED_ARB HEX: 202A
160 CONSTANT: WGL_TYPE_RGBA_ARB HEX: 202B
161 CONSTANT: WGL_TYPE_COLORINDEX_ARB HEX: 202C
163 GL-FUNCTION: BOOL wglGetPixelFormatAttribivARB (
172 GL-FUNCTION: BOOL wglGetPixelFormatAttribfvARB (
181 GL-FUNCTION: BOOL wglChoosePixelFormatARB (
184 FLOAT* pfAttribFList,
190 ! WGL_ARB_multisample extension
192 CONSTANT: WGL_SAMPLE_BUFFERS_ARB HEX: 2041
193 CONSTANT: WGL_SAMPLES_ARB HEX: 2042
195 ! WGL_ARB_pixel_format_float extension
197 CONSTANT: WGL_TYPE_RGBA_FLOAT_ARB HEX: 21A0
199 ! wgl extensions querying
201 : has-wglGetExtensionsStringARB? ( -- ? )
202 "wglGetExtensionsStringARB" wglGetProcAddress >boolean ;
204 : wgl-extensions ( hdc -- extensions )
205 has-wglGetExtensionsStringARB? [ wglGetExtensionsStringARB " " split ] [ drop { } ] if ;
207 : has-wgl-extensions? ( hdc extensions -- ? )
208 swap wgl-extensions [ member? ] curry all? ;
210 : has-wgl-pixel-format-extension? ( hdc -- ? )
211 { "WGL_ARB_pixel_format" } has-wgl-extensions? ;