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
@@ -0,0 +1,161 @@
1
+ # KTX2 decoder, based on the spec here: https://github.khronos.org/KTX-Specification/ktxspec.v2.html
2
+
3
+ from __future__ import annotations
4
+
5
+ import struct
6
+ import itertools
7
+ import zlib
8
+ from typing import BinaryIO
9
+
10
+ try:
11
+ import zstandard
12
+ _zstandard_available = True
13
+ except ImportError:
14
+ _zstandard_available = False
15
+
16
+ from pyglet.image.base import CompressedImageData, CompressionFormat
17
+ from pyglet.image import codecs
18
+ from pyglet.image.codecs import ImageDecodeException
19
+
20
+
21
+ class _FileStruct:
22
+ _fields = []
23
+
24
+ def __init__(self, data):
25
+ if len(data) < self.get_size():
26
+ raise ImageDecodeException('Not a KTX2 file')
27
+ items = struct.unpack(self.get_format(), data)
28
+ for field, value in itertools.zip_longest(self._fields, items, fillvalue=None):
29
+ setattr(self, field[0], value)
30
+
31
+ def __repr__(self):
32
+ name = self.__class__.__name__
33
+ return '{}({})'.format(name, (', \n%s' % (' ' * (len(name) + 1))).join(
34
+ [f'{field[0]} = {getattr(self, field[0])!r}' for field in self._fields]))
35
+
36
+ @classmethod
37
+ def get_format(cls):
38
+ return '<' + ''.join([f[1] for f in cls._fields])
39
+
40
+ @classmethod
41
+ def get_size(cls):
42
+ return struct.calcsize(cls.get_format())
43
+
44
+
45
+ class KTX2Header(_FileStruct):
46
+ _fields = [
47
+ ('vkFormat', 'I'),
48
+ ('typeSize', 'I'),
49
+ ('pixelWidth', 'I'),
50
+ ('pixelHeight', 'I'),
51
+ ('pixelDepth', 'I'),
52
+ ('layerCount', 'I'),
53
+ ('faceCount', 'I'),
54
+ ('levelCount', 'I'),
55
+ ('supercompressionScheme', 'I'),
56
+
57
+ ('dfdByteOffset', 'I'),
58
+ ('dfdByteLength', 'I'),
59
+ ('kvdByteOffset', 'I'),
60
+ ('kvdByteLength', 'I'),
61
+ ('sgdByteOffset', 'Q'),
62
+ ('sgdByteLength', 'Q'),
63
+ ]
64
+
65
+ class KTX2LevelIndex(_FileStruct):
66
+ _fields = [
67
+ ('byteOffset', 'Q'),
68
+ ('byteLength', 'Q'),
69
+ ('uncompressedByteLength', 'Q'),
70
+ ]
71
+
72
+ class KTX2ImageDecoder(codecs.ImageDecoder):
73
+ def get_file_extensions(self) -> list[str]:
74
+ return ['.ktx2']
75
+
76
+ def decode(self, filename: str, file: BinaryIO | None = None) -> CompressedImageData:
77
+ file_opened = False
78
+ if not file:
79
+ file = open(filename, 'rb')
80
+ file_opened = True
81
+
82
+ # Magic header, if supported
83
+ magic = file.read(12)
84
+ if magic != b'\xABKTX 20\xBB\r\n\x1A\n':
85
+ raise ImageDecodeException('Invalid KTX2 file (bad magic)')
86
+
87
+ header_data = file.read(KTX2Header.get_size())
88
+ header = KTX2Header(header_data)
89
+
90
+ width = header.pixelWidth
91
+ height = header.pixelHeight
92
+ mipmaps = header.levelCount or 1
93
+
94
+ fmt = CompressionFormat(
95
+ fmt=b'KTX2',
96
+ alpha=header.vkFormat in (131, 147, 148),
97
+ dxgi_format=0,
98
+ vk_format=header.vkFormat,
99
+ )
100
+
101
+ # Mip map level indexes
102
+ level_indices = []
103
+ for _ in range(mipmaps):
104
+ index_data = file.read(KTX2LevelIndex.get_size())
105
+ level_indices.append(KTX2LevelIndex(index_data))
106
+
107
+ # 2 = ZStandard compression
108
+ # 1 = Zlib compression.
109
+ # 0 = Not compressed.
110
+ if header.supercompressionScheme != 0:
111
+ if header.sgdByteOffset == 0:
112
+ datas = self.decompress_ktx2_per_level(file, header, level_indices)
113
+ else:
114
+ datas = []
115
+ for idx in level_indices:
116
+ file.seek(idx.byteOffset)
117
+ data = file.read(idx.byteLength)
118
+ datas.append(data)
119
+
120
+ image = CompressedImageData(width, height, fmt, datas[0])
121
+ for level, data in enumerate(datas[1:], 1):
122
+ image.set_mipmap_data(level, data)
123
+
124
+ if file_opened:
125
+ file.close()
126
+
127
+ return image
128
+
129
+ def decompress_ktx2_per_level(self, file: BinaryIO, header: KTX2Header, level_indices: list):
130
+ datas = []
131
+ for idx in level_indices:
132
+ file.seek(idx.byteOffset)
133
+ compressed_data = file.read(idx.byteLength)
134
+
135
+ if header.supercompressionScheme == 3:
136
+ decompressed = zlib.decompress(compressed_data)
137
+ elif header.supercompressionScheme == 2:
138
+ if _zstandard_available:
139
+ dctx = zstandard.ZstdDecompressor()
140
+ with dctx.stream_reader(compressed_data) as reader:
141
+ decompressed = reader.read(idx.uncompressedByteLength)
142
+ else:
143
+ msg = "File was supercompressed with Zstandard, but zstandard package is not installed."
144
+ raise ImageDecodeException(msg)
145
+ else:
146
+ msg = f"Unsupported supercompression scheme: {header.supercompressionScheme}"
147
+ raise ImageDecodeException(msg)
148
+
149
+ if len(decompressed) != idx.uncompressedByteLength:
150
+ msg = f"Size mismatch at level: expected {idx.uncompressedByteLength}, got {len(decompressed)}"
151
+ raise ImageDecodeException(msg)
152
+
153
+ datas.append(decompressed)
154
+ return datas
155
+
156
+ def get_decoders():
157
+ return [KTX2ImageDecoder()]
158
+
159
+
160
+ def get_encoders():
161
+ return []
@@ -66,7 +66,7 @@ class PILImageEncoder(ImageEncoder):
66
66
  image_from_fn = getattr(Image, "frombytes")
67
67
  except AttributeError:
68
68
  image_from_fn = getattr(Image, "fromstring")
69
- pil_image = image_from_fn(fmt, (image.width, image.height), image.get_data(fmt, pitch))
69
+ pil_image = image_from_fn(fmt, (image.width, image.height), image.get_bytes(fmt, pitch))
70
70
 
71
71
  try:
72
72
  pil_image.save(file, pil_format)
@@ -65,7 +65,7 @@ class PNGImageEncoder(ImageEncoder):
65
65
  writer = pypng.Writer(image.width, image.height, greyscale=greyscale, alpha=has_alpha)
66
66
 
67
67
  data = array.array('B')
68
- data.frombytes(image.get_data(image.format, image.pitch))
68
+ data.frombytes(image.get_bytes(image.format, image.pitch))
69
69
 
70
70
  writer.write_array(file, data)
71
71
 
@@ -4,6 +4,7 @@ import os
4
4
  from ctypes import byref, memmove
5
5
  from typing import BinaryIO, Sequence
6
6
 
7
+ import pyglet
7
8
  from pyglet.image import ImageData
8
9
  from pyglet.image.codecs import ImageDecodeException, ImageDecoder, ImageEncoder
9
10
  from pyglet.image.codecs.wincodec_lib import (
@@ -16,6 +17,7 @@ from pyglet.image.codecs.wincodec_lib import (
16
17
  GUID_ContainerFormatWmp,
17
18
  GUID_WICPixelFormat24bppBGR,
18
19
  GUID_WICPixelFormat32bppBGRA,
20
+ GUID_WICPixelFormat32bppRGBA,
19
21
  IID_IWICImagingFactory1,
20
22
  IID_IWICImagingFactory2,
21
23
  IPropertyBag2,
@@ -112,6 +114,12 @@ def extract_image_data(bitmap: IWICBitmap, target_fmt: com.GUID = GUID_WICPixelF
112
114
 
113
115
  .. note:: ``bitmap`` is released before this function returns.
114
116
  """
117
+ if "es" in pyglet.options.backend:
118
+ target_fmt = GUID_WICPixelFormat32bppRGBA
119
+ fmt = "RGBA"
120
+ else:
121
+ fmt = "BGRA"
122
+
115
123
  width = UINT()
116
124
  height = UINT()
117
125
 
@@ -124,7 +132,6 @@ def extract_image_data(bitmap: IWICBitmap, target_fmt: com.GUID = GUID_WICPixelF
124
132
  pf = com.GUID(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)
125
133
  bitmap.GetPixelFormat(byref(pf))
126
134
 
127
- fmt = 'BGRA'
128
135
  # If target format is not what we want (32bit BGRA) convert it.
129
136
  if pf != target_fmt:
130
137
  converter = IWICFormatConverter()
@@ -136,6 +143,8 @@ def extract_image_data(bitmap: IWICBitmap, target_fmt: com.GUID = GUID_WICPixelF
136
143
  # 99% of the time conversion will be possible to default.
137
144
  # However, we check to be safe and fallback to 24 bit BGR if not possible.
138
145
  if not conversion_possible:
146
+ if "es" in pyglet.options.backend:
147
+ raise Exception("Could not convert image to proper format.")
139
148
  target_fmt = GUID_WICPixelFormat24bppBGR
140
149
  fmt = 'BGR'
141
150
 
@@ -286,7 +295,7 @@ class WICEncoder(ImageEncoder): # noqa: D101
286
295
 
287
296
  pitch = image.width * len(fmt)
288
297
 
289
- image_data = image.get_data(fmt, -pitch)
298
+ image_data = image.get_bytes(fmt, -pitch)
290
299
 
291
300
  size = pitch * image.height
292
301
 
pyglet/info.py CHANGED
@@ -5,6 +5,7 @@ Intended usage is to create a file for bug reports, e.g.::
5
5
  python -m pyglet.info > info.txt
6
6
 
7
7
  """
8
+ from __future__ import annotations
8
9
 
9
10
  _first_heading = True
10
11
 
@@ -20,7 +21,7 @@ def _heading(heading):
20
21
 
21
22
 
22
23
  def dump_platform():
23
- """Dump OS specific """
24
+ """Dump OS specific"""
24
25
  import platform
25
26
  print('platform: ', platform.platform())
26
27
  print('release: ', platform.release())
@@ -30,17 +31,17 @@ def dump_platform():
30
31
  def dump_python():
31
32
  """Dump Python version and environment to stdout."""
32
33
  import os
33
- import sys
34
34
  import platform
35
+ import sys
35
36
  print('implementation:', platform.python_implementation())
36
37
  print('sys.version:', sys.version)
37
38
  print('sys.maxint:', sys.maxsize)
38
- if sys.platform == 'darwin':
39
- try:
40
- from objc import __version__ as pyobjc_version
41
- print('objc.__version__:', pyobjc_version)
42
- except:
43
- print('PyObjC not available')
39
+ # if sys.platform == 'darwin':
40
+ # try:
41
+ # from objc import __version__ as pyobjc_version
42
+ # print('objc.__version__:', pyobjc_version)
43
+ # except:
44
+ # print('PyObjC not available')
44
45
  print('os.getcwd():', os.getcwd())
45
46
  for key, value in os.environ.items():
46
47
  if key.startswith('PYGLET_'):
@@ -54,27 +55,27 @@ def dump_pyglet():
54
55
  print('pyglet.compat_platform:', pyglet.compat_platform)
55
56
  print('pyglet.__file__:', pyglet.__file__)
56
57
  for key, value in pyglet.options.items():
57
- print(f"pyglet.options['{key}'] = {value!r}")
58
+ print(f"pyglet.options.{key} = {value!r}")
58
59
 
59
60
 
60
61
  def dump_window():
61
62
  """Dump display, window, screen and default config info."""
62
- from pyglet.gl import gl_info
63
- if not gl_info.have_version(3):
64
- print(f"Insufficient OpenGL version: {gl_info.get_version_string()}")
65
- return
66
63
  import pyglet.window
64
+ window = pyglet.window.Window(visible=False)
65
+ from pyglet.graphics.api import core
66
+ if not core.have_version(3) or not core.have_version(2):
67
+ print(f"Insufficient OpenGL version: {core.get_info().get_version_string()}")
68
+ return
67
69
  display = pyglet.display.get_display()
68
70
  print('display:', repr(display))
69
71
  screens = display.get_screens()
70
72
  for i, screen in enumerate(screens):
71
73
  print(f'screens[{i}]: {screen!r}')
72
- window = pyglet.window.Window(visible=False)
73
- for key, value in window.config.get_gl_attributes():
74
+ for key, value in window.config.attributes.items():
74
75
  print(f"config['{key}'] = {value!r}")
75
76
  print('context:', repr(window.context))
76
77
 
77
- _heading('window.context._info')
78
+ _heading('window.context.info')
78
79
  dump_gl(window.context)
79
80
  window.close()
80
81
 
@@ -84,21 +85,24 @@ def dump_gl(context=None):
84
85
  if context is not None:
85
86
  info = context.get_info()
86
87
  else:
87
- from pyglet.gl import gl_info as info
88
+ from pyglet.graphics.api.gl import gl_info as info
89
+ print('gl_info.get_version_string():', info.get_version_string())
88
90
  print('gl_info.get_version():', info.get_version())
89
91
  print('gl_info.get_vendor():', info.get_vendor())
90
92
  print('gl_info.get_renderer():', info.get_renderer())
91
93
 
92
94
 
95
+
93
96
  def dump_glx():
94
97
  """Dump GLX info."""
95
98
  try:
96
- from pyglet.gl import glx_info
99
+ from pyglet.graphics.api.gl.xlib import glx_info
97
100
  except:
98
101
  print('GLX not available.')
99
102
  return
100
103
  import pyglet
101
104
  window = pyglet.window.Window(visible=False)
105
+ glx_info = window.context._info.platform_info
102
106
  print('context.is_direct():', window.context.is_direct())
103
107
  window.close()
104
108
 
@@ -116,7 +120,7 @@ def dump_glx():
116
120
  for name in glx_info.get_client_extensions():
117
121
  print(' ', name)
118
122
  print('glx_info.get_extensions():')
119
- for name in glx_info.get_extensions():
123
+ for name in glx_info.get_extensions(window.context):
120
124
  print(' ', name)
121
125
 
122
126
 
@@ -129,7 +133,7 @@ def dump_media():
129
133
  def dump_ffmpeg():
130
134
  """Dump FFmpeg info."""
131
135
  import pyglet
132
- pyglet.options['search_local_libs'] = True
136
+ pyglet.options.search_local_libs = True
133
137
  import pyglet.media
134
138
 
135
139
  if pyglet.media.have_ffmpeg():
@@ -167,9 +171,7 @@ def dump_wintab():
167
171
  impl_version = wintab.get_implementation_version()
168
172
  spec_version = wintab.get_spec_version()
169
173
 
170
- print('WinTab: {0} {1}.{2} (Spec {3}.{4})'.format(interface_name,
171
- impl_version >> 8, impl_version & 0xff,
172
- spec_version >> 8, spec_version & 0xff))
174
+ print(f'WinTab: {interface_name} {impl_version >> 8}.{impl_version & 0xff} (Spec {spec_version >> 8}.{spec_version & 0xff})')
173
175
 
174
176
 
175
177
  def _try_dump(heading, func):
@@ -187,7 +189,7 @@ def dump():
187
189
  _try_dump('Python', dump_python)
188
190
  _try_dump('pyglet', dump_pyglet)
189
191
  _try_dump('pyglet.window', dump_window)
190
- _try_dump('pyglet.gl.glx_info', dump_glx)
192
+ _try_dump('pyglet.graphics.api.gl.glx_info', dump_glx)
191
193
  _try_dump('pyglet.media', dump_media)
192
194
  _try_dump('pyglet.media.ffmpeg', dump_ffmpeg)
193
195
  _try_dump('pyglet.media.drivers.openal', dump_al)
pyglet/input/__init__.py CHANGED
@@ -55,6 +55,7 @@ import sys
55
55
 
56
56
  from typing import TYPE_CHECKING
57
57
 
58
+ from . import controller
58
59
  from .base import Device, Control, RelativeAxis, AbsoluteAxis, ControllerManager
59
60
  from .base import Button, Joystick, AppleRemote, Tablet, Controller
60
61
  from .base import DeviceException, DeviceOpenException, DeviceExclusiveException
@@ -150,6 +151,13 @@ else:
150
151
  from .macos import get_tablets
151
152
  from .macos import ControllerManager
152
153
 
154
+ elif compat_platform == "emscripten":
155
+ from .emscripten import get_devices
156
+ from .emscripten import get_joysticks
157
+ from .emscripten import get_controllers
158
+ from .emscripten import get_tablets
159
+ from .emscripten import ControllerManager
160
+
153
161
  __all__ = [
154
162
  'get_devices',
155
163
  'get_joysticks',