pyglet 2.1.12__py3-none-any.whl → 3.0.dev1__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (267) hide show
  1. pyglet/__init__.py +67 -61
  2. pyglet/__init__.pyi +15 -8
  3. pyglet/app/__init__.py +22 -13
  4. pyglet/app/async_app.py +212 -0
  5. pyglet/app/base.py +2 -1
  6. pyglet/app/{xlib.py → linux.py} +3 -3
  7. pyglet/config/__init__.py +101 -0
  8. pyglet/config/gl/__init__.py +30 -0
  9. pyglet/config/gl/egl.py +120 -0
  10. pyglet/config/gl/macos.py +262 -0
  11. pyglet/config/gl/windows.py +267 -0
  12. pyglet/config/gl/x11.py +142 -0
  13. pyglet/customtypes.py +43 -2
  14. pyglet/display/__init__.py +8 -6
  15. pyglet/display/base.py +3 -63
  16. pyglet/display/cocoa.py +12 -17
  17. pyglet/display/emscripten.py +39 -0
  18. pyglet/display/headless.py +23 -30
  19. pyglet/display/wayland.py +157 -0
  20. pyglet/display/win32.py +4 -17
  21. pyglet/display/xlib.py +19 -27
  22. pyglet/display/xlib_vidmoderestore.py +2 -2
  23. pyglet/enums.py +183 -0
  24. pyglet/event.py +0 -1
  25. pyglet/experimental/geoshader_sprite.py +15 -13
  26. pyglet/experimental/hidraw.py +6 -15
  27. pyglet/experimental/multitexture_sprite.py +31 -19
  28. pyglet/experimental/particles.py +13 -35
  29. pyglet/font/__init__.py +251 -85
  30. pyglet/font/base.py +116 -61
  31. pyglet/font/dwrite/__init__.py +349 -204
  32. pyglet/font/dwrite/dwrite_lib.py +27 -5
  33. pyglet/font/fontconfig.py +14 -6
  34. pyglet/font/freetype.py +138 -87
  35. pyglet/font/freetype_lib.py +19 -0
  36. pyglet/font/group.py +179 -0
  37. pyglet/font/harfbuzz/__init__.py +3 -3
  38. pyglet/font/pyodide_js.py +310 -0
  39. pyglet/font/quartz.py +319 -126
  40. pyglet/font/ttf.py +45 -3
  41. pyglet/font/user.py +14 -19
  42. pyglet/font/win32.py +45 -21
  43. pyglet/graphics/__init__.py +8 -787
  44. pyglet/graphics/allocation.py +115 -1
  45. pyglet/graphics/api/__init__.py +77 -0
  46. pyglet/graphics/api/base.py +299 -0
  47. pyglet/graphics/api/gl/__init__.py +58 -0
  48. pyglet/graphics/api/gl/base.py +24 -0
  49. pyglet/graphics/{vertexbuffer.py → api/gl/buffer.py} +104 -159
  50. pyglet/graphics/api/gl/cocoa/context.py +76 -0
  51. pyglet/graphics/api/gl/context.py +391 -0
  52. pyglet/graphics/api/gl/default_shaders.py +0 -0
  53. pyglet/graphics/api/gl/draw.py +627 -0
  54. pyglet/graphics/api/gl/egl/__init__.py +0 -0
  55. pyglet/graphics/api/gl/egl/context.py +92 -0
  56. pyglet/graphics/api/gl/enums.py +76 -0
  57. pyglet/graphics/api/gl/framebuffer.py +315 -0
  58. pyglet/graphics/api/gl/gl.py +5463 -0
  59. pyglet/graphics/api/gl/gl_info.py +188 -0
  60. pyglet/graphics/api/gl/global_opengl.py +226 -0
  61. pyglet/{gl → graphics/api/gl}/lib.py +34 -18
  62. pyglet/graphics/api/gl/shader.py +1476 -0
  63. pyglet/graphics/api/gl/shapes.py +55 -0
  64. pyglet/graphics/api/gl/sprite.py +102 -0
  65. pyglet/graphics/api/gl/state.py +219 -0
  66. pyglet/graphics/api/gl/text.py +190 -0
  67. pyglet/graphics/api/gl/texture.py +1526 -0
  68. pyglet/graphics/{vertexarray.py → api/gl/vertexarray.py} +11 -13
  69. pyglet/graphics/api/gl/vertexdomain.py +751 -0
  70. pyglet/graphics/api/gl/win32/__init__.py +0 -0
  71. pyglet/graphics/api/gl/win32/context.py +108 -0
  72. pyglet/graphics/api/gl/win32/wgl_info.py +24 -0
  73. pyglet/graphics/api/gl/xlib/__init__.py +0 -0
  74. pyglet/graphics/api/gl/xlib/context.py +174 -0
  75. pyglet/{gl → graphics/api/gl/xlib}/glx_info.py +26 -31
  76. pyglet/graphics/api/gl1/__init__.py +0 -0
  77. pyglet/{gl → graphics/api/gl1}/gl_compat.py +3 -2
  78. pyglet/graphics/api/gl2/__init__.py +0 -0
  79. pyglet/graphics/api/gl2/buffer.py +320 -0
  80. pyglet/graphics/api/gl2/draw.py +600 -0
  81. pyglet/graphics/api/gl2/global_opengl.py +122 -0
  82. pyglet/graphics/api/gl2/shader.py +200 -0
  83. pyglet/graphics/api/gl2/shapes.py +51 -0
  84. pyglet/graphics/api/gl2/sprite.py +79 -0
  85. pyglet/graphics/api/gl2/text.py +175 -0
  86. pyglet/graphics/api/gl2/vertexdomain.py +364 -0
  87. pyglet/graphics/api/webgl/__init__.py +233 -0
  88. pyglet/graphics/api/webgl/buffer.py +302 -0
  89. pyglet/graphics/api/webgl/context.py +234 -0
  90. pyglet/graphics/api/webgl/draw.py +590 -0
  91. pyglet/graphics/api/webgl/enums.py +76 -0
  92. pyglet/graphics/api/webgl/framebuffer.py +360 -0
  93. pyglet/graphics/api/webgl/gl.py +1537 -0
  94. pyglet/graphics/api/webgl/gl_info.py +130 -0
  95. pyglet/graphics/api/webgl/shader.py +1346 -0
  96. pyglet/graphics/api/webgl/shapes.py +92 -0
  97. pyglet/graphics/api/webgl/sprite.py +102 -0
  98. pyglet/graphics/api/webgl/state.py +227 -0
  99. pyglet/graphics/api/webgl/text.py +187 -0
  100. pyglet/graphics/api/webgl/texture.py +1227 -0
  101. pyglet/graphics/api/webgl/vertexarray.py +54 -0
  102. pyglet/graphics/api/webgl/vertexdomain.py +616 -0
  103. pyglet/graphics/api/webgl/webgl_js.pyi +307 -0
  104. pyglet/{image → graphics}/atlas.py +33 -32
  105. pyglet/graphics/base.py +10 -0
  106. pyglet/graphics/buffer.py +245 -0
  107. pyglet/graphics/draw.py +578 -0
  108. pyglet/graphics/framebuffer.py +26 -0
  109. pyglet/graphics/instance.py +178 -69
  110. pyglet/graphics/shader.py +267 -1553
  111. pyglet/graphics/state.py +83 -0
  112. pyglet/graphics/texture.py +703 -0
  113. pyglet/graphics/vertexdomain.py +695 -538
  114. pyglet/gui/ninepatch.py +10 -10
  115. pyglet/gui/widgets.py +120 -10
  116. pyglet/image/__init__.py +20 -1973
  117. pyglet/image/animation.py +12 -12
  118. pyglet/image/base.py +730 -0
  119. pyglet/image/codecs/__init__.py +9 -0
  120. pyglet/image/codecs/bmp.py +53 -30
  121. pyglet/image/codecs/dds.py +53 -31
  122. pyglet/image/codecs/gdiplus.py +38 -14
  123. pyglet/image/codecs/gdkpixbuf2.py +0 -2
  124. pyglet/image/codecs/js_image.py +99 -0
  125. pyglet/image/codecs/ktx2.py +161 -0
  126. pyglet/image/codecs/pil.py +1 -1
  127. pyglet/image/codecs/png.py +1 -1
  128. pyglet/image/codecs/wic.py +11 -2
  129. pyglet/info.py +26 -24
  130. pyglet/input/__init__.py +8 -0
  131. pyglet/input/base.py +163 -105
  132. pyglet/input/controller.py +13 -19
  133. pyglet/input/controller_db.py +39 -24
  134. pyglet/input/emscripten/__init__.py +18 -0
  135. pyglet/input/emscripten/gamepad_js.py +397 -0
  136. pyglet/input/linux/__init__.py +11 -5
  137. pyglet/input/linux/evdev.py +10 -11
  138. pyglet/input/linux/x11_xinput.py +2 -2
  139. pyglet/input/linux/x11_xinput_tablet.py +1 -1
  140. pyglet/input/macos/__init__.py +7 -2
  141. pyglet/input/macos/darwin_gc.py +559 -0
  142. pyglet/input/win32/__init__.py +1 -1
  143. pyglet/input/win32/directinput.py +34 -29
  144. pyglet/input/win32/xinput.py +11 -61
  145. pyglet/lib.py +3 -3
  146. pyglet/libs/__init__.py +1 -1
  147. pyglet/{gl → libs/darwin}/agl.py +1 -1
  148. pyglet/libs/darwin/cocoapy/__init__.py +2 -2
  149. pyglet/libs/darwin/cocoapy/cocoahelpers.py +181 -0
  150. pyglet/libs/darwin/cocoapy/cocoalibs.py +31 -0
  151. pyglet/libs/darwin/cocoapy/cocoatypes.py +27 -0
  152. pyglet/libs/darwin/cocoapy/runtime.py +81 -45
  153. pyglet/libs/darwin/coreaudio.py +4 -4
  154. pyglet/{gl → libs/darwin}/lib_agl.py +9 -8
  155. pyglet/libs/darwin/quartzkey.py +1 -3
  156. pyglet/libs/egl/__init__.py +2 -0
  157. pyglet/libs/egl/egl_lib.py +576 -0
  158. pyglet/libs/egl/eglext.py +51 -5
  159. pyglet/libs/linux/__init__.py +0 -0
  160. pyglet/libs/linux/egl/__init__.py +0 -0
  161. pyglet/libs/linux/egl/eglext.py +22 -0
  162. pyglet/libs/linux/glx/__init__.py +0 -0
  163. pyglet/{gl → libs/linux/glx}/glx.py +13 -14
  164. pyglet/{gl → libs/linux/glx}/glxext_arb.py +408 -192
  165. pyglet/{gl → libs/linux/glx}/glxext_mesa.py +1 -1
  166. pyglet/{gl → libs/linux/glx}/glxext_nv.py +345 -164
  167. pyglet/{gl → libs/linux/glx}/lib_glx.py +3 -2
  168. pyglet/libs/linux/wayland/__init__.py +0 -0
  169. pyglet/libs/linux/wayland/client.py +1068 -0
  170. pyglet/libs/linux/wayland/lib_wayland.py +207 -0
  171. pyglet/libs/linux/wayland/wayland_egl.py +38 -0
  172. pyglet/libs/{wayland → linux/wayland}/xkbcommon.py +26 -0
  173. pyglet/libs/{x11 → linux/x11}/xf86vmode.py +4 -4
  174. pyglet/libs/{x11 → linux/x11}/xinerama.py +2 -2
  175. pyglet/libs/{x11 → linux/x11}/xinput.py +10 -10
  176. pyglet/libs/linux/x11/xrandr.py +0 -0
  177. pyglet/libs/{x11 → linux/x11}/xrender.py +1 -1
  178. pyglet/libs/shared/__init__.py +0 -0
  179. pyglet/libs/shared/spirv/__init__.py +0 -0
  180. pyglet/libs/shared/spirv/lib_shaderc.py +85 -0
  181. pyglet/libs/shared/spirv/lib_spirv_cross.py +126 -0
  182. pyglet/libs/win32/__init__.py +27 -5
  183. pyglet/libs/win32/constants.py +59 -48
  184. pyglet/libs/win32/context_managers.py +20 -3
  185. pyglet/libs/win32/dinput.py +105 -88
  186. pyglet/{gl → libs/win32}/lib_wgl.py +52 -26
  187. pyglet/libs/win32/types.py +58 -23
  188. pyglet/{gl → libs/win32}/wgl.py +32 -25
  189. pyglet/{gl → libs/win32}/wglext_arb.py +364 -2
  190. pyglet/media/__init__.py +9 -10
  191. pyglet/media/codecs/__init__.py +12 -1
  192. pyglet/media/codecs/base.py +99 -96
  193. pyglet/media/codecs/ffmpeg.py +2 -2
  194. pyglet/media/codecs/ffmpeg_lib/libavformat.py +3 -8
  195. pyglet/media/codecs/webaudio_pyodide.py +111 -0
  196. pyglet/media/drivers/__init__.py +9 -4
  197. pyglet/media/drivers/base.py +4 -4
  198. pyglet/media/drivers/openal/__init__.py +1 -1
  199. pyglet/media/drivers/openal/adaptation.py +3 -3
  200. pyglet/media/drivers/pulse/__init__.py +1 -1
  201. pyglet/media/drivers/pulse/adaptation.py +3 -3
  202. pyglet/media/drivers/pyodide_js/__init__.py +8 -0
  203. pyglet/media/drivers/pyodide_js/adaptation.py +288 -0
  204. pyglet/media/drivers/xaudio2/adaptation.py +3 -3
  205. pyglet/media/player.py +276 -193
  206. pyglet/media/player_worker_thread.py +1 -1
  207. pyglet/model/__init__.py +39 -29
  208. pyglet/model/codecs/base.py +4 -4
  209. pyglet/model/codecs/gltf.py +3 -3
  210. pyglet/model/codecs/obj.py +71 -43
  211. pyglet/resource.py +129 -78
  212. pyglet/shapes.py +147 -177
  213. pyglet/sprite.py +47 -164
  214. pyglet/text/__init__.py +44 -54
  215. pyglet/text/caret.py +12 -7
  216. pyglet/text/document.py +19 -17
  217. pyglet/text/formats/html.py +2 -2
  218. pyglet/text/formats/structured.py +10 -40
  219. pyglet/text/layout/__init__.py +20 -13
  220. pyglet/text/layout/base.py +176 -287
  221. pyglet/text/layout/incremental.py +9 -10
  222. pyglet/text/layout/scrolling.py +7 -95
  223. pyglet/window/__init__.py +183 -172
  224. pyglet/window/cocoa/__init__.py +62 -51
  225. pyglet/window/cocoa/pyglet_delegate.py +2 -25
  226. pyglet/window/cocoa/pyglet_view.py +9 -8
  227. pyglet/window/dialog/__init__.py +184 -0
  228. pyglet/window/dialog/base.py +99 -0
  229. pyglet/window/dialog/darwin.py +121 -0
  230. pyglet/window/dialog/linux.py +72 -0
  231. pyglet/window/dialog/windows.py +194 -0
  232. pyglet/window/emscripten/__init__.py +779 -0
  233. pyglet/window/headless/__init__.py +44 -28
  234. pyglet/window/key.py +2 -0
  235. pyglet/window/mouse.py +2 -2
  236. pyglet/window/wayland/__init__.py +377 -0
  237. pyglet/window/win32/__init__.py +101 -46
  238. pyglet/window/xlib/__init__.py +104 -66
  239. {pyglet-2.1.12.dist-info → pyglet-3.0.dev1.dist-info}/METADATA +2 -3
  240. pyglet-3.0.dev1.dist-info/RECORD +322 -0
  241. {pyglet-2.1.12.dist-info → pyglet-3.0.dev1.dist-info}/WHEEL +1 -1
  242. pyglet/gl/__init__.py +0 -208
  243. pyglet/gl/base.py +0 -499
  244. pyglet/gl/cocoa.py +0 -309
  245. pyglet/gl/gl.py +0 -4625
  246. pyglet/gl/gl.pyi +0 -2320
  247. pyglet/gl/gl_compat.pyi +0 -3097
  248. pyglet/gl/gl_info.py +0 -190
  249. pyglet/gl/headless.py +0 -166
  250. pyglet/gl/wgl_info.py +0 -36
  251. pyglet/gl/wglext_nv.py +0 -1096
  252. pyglet/gl/win32.py +0 -268
  253. pyglet/gl/xlib.py +0 -295
  254. pyglet/image/buffer.py +0 -274
  255. pyglet/image/codecs/s3tc.py +0 -354
  256. pyglet/libs/x11/xrandr.py +0 -166
  257. pyglet-2.1.12.dist-info/RECORD +0 -234
  258. /pyglet/{libs/wayland → graphics/api/gl/cocoa}/__init__.py +0 -0
  259. /pyglet/libs/{egl → linux/egl}/egl.py +0 -0
  260. /pyglet/libs/{egl → linux/egl}/lib.py +0 -0
  261. /pyglet/libs/{ioctl.py → linux/ioctl.py} +0 -0
  262. /pyglet/libs/{wayland → linux/wayland}/gbm.py +0 -0
  263. /pyglet/libs/{x11 → linux/x11}/__init__.py +0 -0
  264. /pyglet/libs/{x11 → linux/x11}/cursorfont.py +0 -0
  265. /pyglet/libs/{x11 → linux/x11}/xlib.py +0 -0
  266. /pyglet/libs/{x11 → linux/x11}/xsync.py +0 -0
  267. {pyglet-2.1.12.dist-info/licenses → pyglet-3.0.dev1.dist-info}/LICENSE +0 -0
pyglet/gl/gl_info.py DELETED
@@ -1,190 +0,0 @@
1
- """Information about version and extensions of current GL implementation.
2
-
3
- Usage::
4
-
5
- from pyglet.gl import gl_info
6
-
7
- if gl_info.have_extension('GL_NV_register_combiners'):
8
- # ...
9
-
10
- If you are using more than one context, you can set up a separate GLInfo
11
- object for each context. Call `set_active_context` after switching to the
12
- context::
13
-
14
- from pyglet.gl.gl_info import GLInfo
15
-
16
- info = GLInfo()
17
- info.set_active_context()
18
-
19
- if info.have_version(4, 5):
20
- # ...
21
-
22
- """
23
- from __future__ import annotations
24
-
25
- import warnings
26
- from ctypes import c_char_p, cast
27
-
28
- from pyglet.gl.gl import GL_EXTENSIONS, GL_MAJOR_VERSION, GL_MINOR_VERSION, GL_RENDERER, GL_VENDOR, GL_VERSION, GLint
29
- from pyglet.gl.lib import GLException
30
- from pyglet.util import asstr
31
-
32
-
33
- def _get_number(parameter: int) -> int:
34
- from pyglet.gl.gl import glGetIntegerv
35
- number = GLint()
36
- glGetIntegerv(parameter, number)
37
- return number.value
38
-
39
-
40
- class GLInfo:
41
- """Information interface for a single GL context.
42
-
43
- A default instance is created automatically when the first OpenGL context
44
- is created. You can use the module functions as a convenience for
45
- this default instance's methods.
46
-
47
- If you are using more than one context, you must call `set_active_context`
48
- when the context is active for this `GLInfo` instance.
49
- """
50
- extensions: set[str]
51
- vendor: str = ''
52
- renderer: str = ''
53
- version: str = '0.0'
54
- major_version: int = 0
55
- minor_version: int = 0
56
- opengl_api: str = 'gl'
57
-
58
- _have_context: bool = False
59
- _have_info = False
60
-
61
- def __init__(self) -> None: # noqa: D107
62
- super().__init__()
63
- self.extensions = set()
64
-
65
- def set_active_context(self) -> None:
66
- """Store information for the currently active context.
67
-
68
- This method is called automatically for the default context.
69
- """
70
- self._have_context = True
71
-
72
- if not self._have_info:
73
-
74
- from pyglet.gl.gl import GL_NUM_EXTENSIONS, glGetString, glGetStringi
75
-
76
- self.vendor = asstr(cast(glGetString(GL_VENDOR), c_char_p).value)
77
- self.renderer = asstr(cast(glGetString(GL_RENDERER), c_char_p).value)
78
- self.version = asstr(cast(glGetString(GL_VERSION), c_char_p).value)
79
- # NOTE: The version string requirements for gles is a lot stricter
80
- # so using this to rely on detecting the API is not too unreasonable
81
- self.opengl_api = "gles" if "opengl es" in self.version.lower() else "gl"
82
-
83
- try:
84
- self.major_version = _get_number(GL_MAJOR_VERSION)
85
- self.minor_version = _get_number(GL_MINOR_VERSION)
86
- num_ext = _get_number(GL_NUM_EXTENSIONS)
87
- self.extensions = (asstr(cast(glGetStringi(GL_EXTENSIONS, i), c_char_p).value) for i in range(num_ext))
88
- self.extensions = set(self.extensions)
89
- except GLException:
90
- pass # GL3 is likely not available
91
-
92
- self._have_info = True
93
-
94
- def remove_active_context(self) -> None:
95
- self._have_context = False
96
- self._have_info = False
97
-
98
- def have_context(self) -> bool:
99
- return self._have_context
100
-
101
- def have_extension(self, extension: str) -> bool:
102
- """Determine if an OpenGL extension is available.
103
-
104
- Args:
105
- extension:
106
- The name of the extension to test for, including its ``GL_`` prefix.
107
-
108
- Returns:
109
- True if the extension is provided by the driver.
110
- """
111
- if not self._have_context:
112
- warnings.warn('No GL context created yet.')
113
- return extension in self.extensions
114
-
115
- def get_extensions(self) -> set[str]:
116
- """Get a set of available OpenGL extensions."""
117
- if not self._have_context:
118
- warnings.warn('No GL context created yet.')
119
- return self.extensions
120
-
121
- def get_version(self) -> tuple[int, int]:
122
- """Get the current major and minor version of OpenGL."""
123
- if not self._have_context:
124
- warnings.warn('No GL context created yet.')
125
- return self.major_version, self.minor_version
126
-
127
- def get_version_string(self) -> str:
128
- """Get the current OpenGL version string."""
129
- if not self._have_context:
130
- warnings.warn('No GL context created yet.')
131
- return self.version
132
-
133
- def have_version(self, major: int, minor: int = 0) -> bool:
134
- """Determine if a version of OpenGL is supported.
135
-
136
- Args:
137
- major:
138
- The major revision number (typically 1 or 2).
139
- minor:
140
- The minor revision number.
141
-
142
- Returns:
143
- ``True`` if the requested or a later version is supported.
144
- """
145
- if not self._have_context:
146
- warnings.warn('No GL context created yet.')
147
- if not self.major_version and not self.minor_version:
148
- return False
149
-
150
- return (self.major_version > major or
151
- (self.major_version == major and self.minor_version >= minor) or
152
- (self.major_version == major and self.minor_version == minor))
153
-
154
- def get_renderer(self) -> str:
155
- """Determine the renderer string of the OpenGL context."""
156
- if not self._have_context:
157
- warnings.warn('No GL context created yet.')
158
- return self.renderer
159
-
160
- def get_vendor(self) -> str:
161
- """Determine the vendor string of the OpenGL context."""
162
- if not self._have_context:
163
- warnings.warn('No GL context created yet.')
164
- return self.vendor
165
-
166
- def get_opengl_api(self) -> str:
167
- """Determine the OpenGL API version.
168
-
169
- Usually ``gl`` or ``gles``.
170
- """
171
- if not self._have_context:
172
- warnings.warn('No GL context created yet.')
173
- return self.opengl_api
174
-
175
-
176
- # Single instance useful for apps with only a single context
177
- # (or all contexts have the same GL driver, a common case).
178
- _gl_info = GLInfo()
179
-
180
- get_extensions = _gl_info.get_extensions
181
- get_version = _gl_info.get_version
182
- get_version_string = _gl_info.get_version_string
183
- have_version = _gl_info.have_version
184
- get_renderer = _gl_info.get_renderer
185
- get_vendor = _gl_info.get_vendor
186
- get_opengl_api = _gl_info.get_opengl_api
187
- have_extension = _gl_info.have_extension
188
- have_context = _gl_info.have_context
189
- remove_active_context = _gl_info.remove_active_context
190
- set_active_context = _gl_info.set_active_context
pyglet/gl/headless.py DELETED
@@ -1,166 +0,0 @@
1
- from __future__ import annotations
2
-
3
- from ctypes import byref
4
-
5
- from pyglet import gl
6
- from pyglet.display.headless import HeadlessCanvas
7
- from pyglet.libs.egl import egl
8
-
9
-
10
- from .base import DisplayConfig, Config, Context
11
-
12
- _fake_gl_attributes = {
13
- 'double_buffer': 0,
14
- 'stereo': 0,
15
- 'aux_buffers': 0,
16
- 'accum_red_size': 0,
17
- 'accum_green_size': 0,
18
- 'accum_blue_size': 0,
19
- 'accum_alpha_size': 0,
20
- }
21
-
22
-
23
- class HeadlessConfig(Config): # noqa: D101
24
- def match(self, canvas: HeadlessCanvas) -> list[HeadlessDisplayConfig]:
25
- if not isinstance(canvas, HeadlessCanvas):
26
- msg = 'Canvas must be an instance of HeadlessCanvas'
27
- raise RuntimeError(msg)
28
-
29
- display_connection = canvas.display._display_connection # noqa: SLF001
30
-
31
- # Construct array of attributes
32
- attrs = []
33
- for name, value in self.get_gl_attributes():
34
- if name == 'double_buffer':
35
- continue
36
- attr = HeadlessDisplayConfig.attribute_ids.get(name, None)
37
- if attr and value is not None:
38
- attrs.extend([attr, int(value)])
39
- attrs.extend([egl.EGL_SURFACE_TYPE, egl.EGL_PBUFFER_BIT])
40
- if self.opengl_api == "gl":
41
- attrs.extend([egl.EGL_RENDERABLE_TYPE, egl.EGL_OPENGL_BIT])
42
- elif self.opengl_api == "gles":
43
- attrs.extend([egl.EGL_RENDERABLE_TYPE, egl.EGL_OPENGL_ES3_BIT])
44
- else:
45
- msg = f"Unknown OpenGL API: {self.opengl_api}"
46
- raise ValueError(msg)
47
- attrs.extend([egl.EGL_NONE])
48
- attrs_list = (egl.EGLint * len(attrs))(*attrs)
49
-
50
- num_config = egl.EGLint()
51
- egl.eglChooseConfig(display_connection, attrs_list, None, 0, byref(num_config))
52
- configs = (egl.EGLConfig * num_config.value)()
53
- egl.eglChooseConfig(display_connection, attrs_list, configs,
54
- num_config.value, byref(num_config))
55
-
56
- return [HeadlessDisplayConfig(canvas, c, self) for c in configs]
57
-
58
-
59
- class HeadlessDisplayConfig(DisplayConfig): # noqa: D101
60
- canvas: HeadlessCanvas
61
- config: HeadlessConfig
62
-
63
- attribute_ids = { # noqa: RUF012
64
- 'buffer_size': egl.EGL_BUFFER_SIZE,
65
- 'level': egl.EGL_LEVEL, # Not supported
66
- 'red_size': egl.EGL_RED_SIZE,
67
- 'green_size': egl.EGL_GREEN_SIZE,
68
- 'blue_size': egl.EGL_BLUE_SIZE,
69
- 'alpha_size': egl.EGL_ALPHA_SIZE,
70
- 'depth_size': egl.EGL_DEPTH_SIZE,
71
- 'stencil_size': egl.EGL_STENCIL_SIZE,
72
- 'sample_buffers': egl.EGL_SAMPLE_BUFFERS,
73
- 'samples': egl.EGL_SAMPLES,
74
- }
75
-
76
- def __init__(self, canvas: HeadlessCanvas, egl_config: egl.EGLConfig, config: HeadlessConfig) -> None: # noqa: D107
77
- super().__init__(canvas, config)
78
- self._egl_config = egl_config
79
- context_attribs = (egl.EGL_CONTEXT_MAJOR_VERSION, config.major_version or 2,
80
- egl.EGL_CONTEXT_MINOR_VERSION, config.minor_version or 0,
81
- egl.EGL_CONTEXT_OPENGL_FORWARD_COMPATIBLE, config.forward_compatible or 0,
82
- egl.EGL_CONTEXT_OPENGL_DEBUG, config.debug or 0,
83
- egl.EGL_NONE)
84
- self._context_attrib_array = (egl.EGLint * len(context_attribs))(*context_attribs)
85
-
86
- for name, attr in self.attribute_ids.items():
87
- value = egl.EGLint()
88
- egl.eglGetConfigAttrib(canvas.display._display_connection, egl_config, attr, byref(value)) # noqa: SLF001
89
- setattr(self, name, value.value)
90
-
91
- for name, value in _fake_gl_attributes.items():
92
- setattr(self, name, value)
93
-
94
- def compatible(self, canvas: HeadlessCanvas) -> bool:
95
- return isinstance(canvas, HeadlessCanvas)
96
-
97
- def create_context(self, share: HeadlessContext | None) -> HeadlessContext:
98
- return HeadlessContext(self, share)
99
-
100
-
101
- class HeadlessContext(Context): # noqa: D101
102
- display_connection: egl.EGLDisplay
103
- config: HeadlessDisplayConfig
104
-
105
- def __init__(self, config: HeadlessDisplayConfig, share: HeadlessContext | None) -> None: # noqa: D107
106
- super().__init__(config, share)
107
-
108
- self.display_connection = config.canvas.display._display_connection # noqa: SLF001
109
-
110
- self.egl_context = self._create_egl_context(share)
111
- if not self.egl_context:
112
- msg = 'Could not create GL context'
113
- raise gl.ContextException(msg)
114
-
115
- def _create_egl_context(self, share: HeadlessContext | None) -> egl.EGLContext:
116
- if share:
117
- share_context = share.egl_context
118
- else:
119
- share_context = None
120
-
121
- if self.config.opengl_api == "gl":
122
- egl.eglBindAPI(egl.EGL_OPENGL_API)
123
- elif self.config.opengl_api == "gles":
124
- egl.eglBindAPI(egl.EGL_OPENGL_ES_API)
125
- return egl.eglCreateContext(self.config.canvas.display._display_connection, # noqa: SLF001
126
- self.config._egl_config, share_context, # noqa: SLF001
127
- self.config._context_attrib_array) # noqa: SLF001
128
-
129
- def attach(self, canvas: HeadlessCanvas) -> None:
130
- if canvas is self.canvas:
131
- return
132
-
133
- super().attach(canvas)
134
-
135
- self.egl_surface = canvas.egl_surface
136
- self.set_current()
137
-
138
- def set_current(self) -> None:
139
- egl.eglMakeCurrent(
140
- self.display_connection, self.egl_surface, self.egl_surface, self.egl_context)
141
- super().set_current()
142
-
143
- def detach(self) -> None:
144
- if not self.canvas:
145
- return
146
-
147
- self.set_current()
148
- gl.glFlush() # needs to be in try/except?
149
-
150
- super().detach()
151
-
152
- egl.eglMakeCurrent(
153
- self.display_connection, 0, 0, None)
154
- self.egl_surface = None
155
-
156
- def destroy(self) -> None:
157
- super().destroy()
158
- if self.egl_context:
159
- egl.eglDestroyContext(self.display_connection, self.egl_context)
160
- self.egl_context = None
161
-
162
- def flip(self) -> None:
163
- if not self.egl_surface:
164
- return
165
-
166
- egl.eglSwapBuffers(self.display_connection, self.egl_surface)
pyglet/gl/wgl_info.py DELETED
@@ -1,36 +0,0 @@
1
- """Cached information about version and extensions of current WGL implementation."""
2
- from __future__ import annotations
3
-
4
- import warnings
5
- from ctypes import c_char_p, cast
6
-
7
- from pyglet.gl import gl_info
8
- from pyglet.gl.gl import GL_EXTENSIONS, glGetString
9
- from pyglet.gl.lib import MissingFunctionException
10
- from pyglet.gl.wglext_arb import wglGetExtensionsStringEXT
11
- from pyglet.util import asstr
12
-
13
-
14
- class WGLInfoException(Exception): # noqa: D101, N818
15
- pass
16
-
17
-
18
- class WGLInfo: # noqa: D101
19
- def get_extensions(self) -> list[str]:
20
- if not gl_info.have_context():
21
- warnings.warn("Can't query WGL until a context is created.")
22
- return []
23
-
24
- try:
25
- return asstr(wglGetExtensionsStringEXT()).split()
26
- except MissingFunctionException:
27
- return asstr(cast(glGetString(GL_EXTENSIONS), c_char_p).value).split()
28
-
29
- def have_extension(self, extension: str) -> bool:
30
- return extension in self.get_extensions()
31
-
32
-
33
- _wgl_info = WGLInfo()
34
-
35
- get_extensions = _wgl_info.get_extensions
36
- have_extension = _wgl_info.have_extension