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.
- pyglet/__init__.py +67 -61
- pyglet/__init__.pyi +15 -8
- pyglet/app/__init__.py +22 -13
- pyglet/app/async_app.py +212 -0
- pyglet/app/base.py +2 -1
- pyglet/app/{xlib.py → linux.py} +3 -3
- pyglet/config/__init__.py +101 -0
- pyglet/config/gl/__init__.py +30 -0
- pyglet/config/gl/egl.py +120 -0
- pyglet/config/gl/macos.py +262 -0
- pyglet/config/gl/windows.py +267 -0
- pyglet/config/gl/x11.py +142 -0
- pyglet/customtypes.py +43 -2
- pyglet/display/__init__.py +8 -6
- pyglet/display/base.py +3 -63
- pyglet/display/cocoa.py +12 -17
- pyglet/display/emscripten.py +39 -0
- pyglet/display/headless.py +23 -30
- pyglet/display/wayland.py +157 -0
- pyglet/display/win32.py +4 -17
- pyglet/display/xlib.py +19 -27
- pyglet/display/xlib_vidmoderestore.py +2 -2
- pyglet/enums.py +183 -0
- pyglet/event.py +0 -1
- pyglet/experimental/geoshader_sprite.py +15 -13
- pyglet/experimental/hidraw.py +6 -15
- pyglet/experimental/multitexture_sprite.py +31 -19
- pyglet/experimental/particles.py +13 -35
- pyglet/font/__init__.py +251 -85
- pyglet/font/base.py +116 -61
- pyglet/font/dwrite/__init__.py +349 -204
- pyglet/font/dwrite/dwrite_lib.py +27 -5
- pyglet/font/fontconfig.py +14 -6
- pyglet/font/freetype.py +138 -87
- pyglet/font/freetype_lib.py +19 -0
- pyglet/font/group.py +179 -0
- pyglet/font/harfbuzz/__init__.py +3 -3
- pyglet/font/pyodide_js.py +310 -0
- pyglet/font/quartz.py +319 -126
- pyglet/font/ttf.py +45 -3
- pyglet/font/user.py +14 -19
- pyglet/font/win32.py +45 -21
- pyglet/graphics/__init__.py +8 -787
- pyglet/graphics/allocation.py +115 -1
- pyglet/graphics/api/__init__.py +77 -0
- pyglet/graphics/api/base.py +299 -0
- pyglet/graphics/api/gl/__init__.py +58 -0
- pyglet/graphics/api/gl/base.py +24 -0
- pyglet/graphics/{vertexbuffer.py → api/gl/buffer.py} +104 -159
- pyglet/graphics/api/gl/cocoa/context.py +76 -0
- pyglet/graphics/api/gl/context.py +391 -0
- pyglet/graphics/api/gl/default_shaders.py +0 -0
- pyglet/graphics/api/gl/draw.py +627 -0
- pyglet/graphics/api/gl/egl/__init__.py +0 -0
- pyglet/graphics/api/gl/egl/context.py +92 -0
- pyglet/graphics/api/gl/enums.py +76 -0
- pyglet/graphics/api/gl/framebuffer.py +315 -0
- pyglet/graphics/api/gl/gl.py +5463 -0
- pyglet/graphics/api/gl/gl_info.py +188 -0
- pyglet/graphics/api/gl/global_opengl.py +226 -0
- pyglet/{gl → graphics/api/gl}/lib.py +34 -18
- pyglet/graphics/api/gl/shader.py +1476 -0
- pyglet/graphics/api/gl/shapes.py +55 -0
- pyglet/graphics/api/gl/sprite.py +102 -0
- pyglet/graphics/api/gl/state.py +219 -0
- pyglet/graphics/api/gl/text.py +190 -0
- pyglet/graphics/api/gl/texture.py +1526 -0
- pyglet/graphics/{vertexarray.py → api/gl/vertexarray.py} +11 -13
- pyglet/graphics/api/gl/vertexdomain.py +751 -0
- pyglet/graphics/api/gl/win32/__init__.py +0 -0
- pyglet/graphics/api/gl/win32/context.py +108 -0
- pyglet/graphics/api/gl/win32/wgl_info.py +24 -0
- pyglet/graphics/api/gl/xlib/__init__.py +0 -0
- pyglet/graphics/api/gl/xlib/context.py +174 -0
- pyglet/{gl → graphics/api/gl/xlib}/glx_info.py +26 -31
- pyglet/graphics/api/gl1/__init__.py +0 -0
- pyglet/{gl → graphics/api/gl1}/gl_compat.py +3 -2
- pyglet/graphics/api/gl2/__init__.py +0 -0
- pyglet/graphics/api/gl2/buffer.py +320 -0
- pyglet/graphics/api/gl2/draw.py +600 -0
- pyglet/graphics/api/gl2/global_opengl.py +122 -0
- pyglet/graphics/api/gl2/shader.py +200 -0
- pyglet/graphics/api/gl2/shapes.py +51 -0
- pyglet/graphics/api/gl2/sprite.py +79 -0
- pyglet/graphics/api/gl2/text.py +175 -0
- pyglet/graphics/api/gl2/vertexdomain.py +364 -0
- pyglet/graphics/api/webgl/__init__.py +233 -0
- pyglet/graphics/api/webgl/buffer.py +302 -0
- pyglet/graphics/api/webgl/context.py +234 -0
- pyglet/graphics/api/webgl/draw.py +590 -0
- pyglet/graphics/api/webgl/enums.py +76 -0
- pyglet/graphics/api/webgl/framebuffer.py +360 -0
- pyglet/graphics/api/webgl/gl.py +1537 -0
- pyglet/graphics/api/webgl/gl_info.py +130 -0
- pyglet/graphics/api/webgl/shader.py +1346 -0
- pyglet/graphics/api/webgl/shapes.py +92 -0
- pyglet/graphics/api/webgl/sprite.py +102 -0
- pyglet/graphics/api/webgl/state.py +227 -0
- pyglet/graphics/api/webgl/text.py +187 -0
- pyglet/graphics/api/webgl/texture.py +1227 -0
- pyglet/graphics/api/webgl/vertexarray.py +54 -0
- pyglet/graphics/api/webgl/vertexdomain.py +616 -0
- pyglet/graphics/api/webgl/webgl_js.pyi +307 -0
- pyglet/{image → graphics}/atlas.py +33 -32
- pyglet/graphics/base.py +10 -0
- pyglet/graphics/buffer.py +245 -0
- pyglet/graphics/draw.py +578 -0
- pyglet/graphics/framebuffer.py +26 -0
- pyglet/graphics/instance.py +178 -69
- pyglet/graphics/shader.py +267 -1553
- pyglet/graphics/state.py +83 -0
- pyglet/graphics/texture.py +703 -0
- pyglet/graphics/vertexdomain.py +695 -538
- pyglet/gui/ninepatch.py +10 -10
- pyglet/gui/widgets.py +120 -10
- pyglet/image/__init__.py +20 -1973
- pyglet/image/animation.py +12 -12
- pyglet/image/base.py +730 -0
- pyglet/image/codecs/__init__.py +9 -0
- pyglet/image/codecs/bmp.py +53 -30
- pyglet/image/codecs/dds.py +53 -31
- pyglet/image/codecs/gdiplus.py +38 -14
- pyglet/image/codecs/gdkpixbuf2.py +0 -2
- pyglet/image/codecs/js_image.py +99 -0
- pyglet/image/codecs/ktx2.py +161 -0
- pyglet/image/codecs/pil.py +1 -1
- pyglet/image/codecs/png.py +1 -1
- pyglet/image/codecs/wic.py +11 -2
- pyglet/info.py +26 -24
- pyglet/input/__init__.py +8 -0
- pyglet/input/base.py +163 -105
- pyglet/input/controller.py +13 -19
- pyglet/input/controller_db.py +39 -24
- pyglet/input/emscripten/__init__.py +18 -0
- pyglet/input/emscripten/gamepad_js.py +397 -0
- pyglet/input/linux/__init__.py +11 -5
- pyglet/input/linux/evdev.py +10 -11
- pyglet/input/linux/x11_xinput.py +2 -2
- pyglet/input/linux/x11_xinput_tablet.py +1 -1
- pyglet/input/macos/__init__.py +7 -2
- pyglet/input/macos/darwin_gc.py +559 -0
- pyglet/input/win32/__init__.py +1 -1
- pyglet/input/win32/directinput.py +34 -29
- pyglet/input/win32/xinput.py +11 -61
- pyglet/lib.py +3 -3
- pyglet/libs/__init__.py +1 -1
- pyglet/{gl → libs/darwin}/agl.py +1 -1
- pyglet/libs/darwin/cocoapy/__init__.py +2 -2
- pyglet/libs/darwin/cocoapy/cocoahelpers.py +181 -0
- pyglet/libs/darwin/cocoapy/cocoalibs.py +31 -0
- pyglet/libs/darwin/cocoapy/cocoatypes.py +27 -0
- pyglet/libs/darwin/cocoapy/runtime.py +81 -45
- pyglet/libs/darwin/coreaudio.py +4 -4
- pyglet/{gl → libs/darwin}/lib_agl.py +9 -8
- pyglet/libs/darwin/quartzkey.py +1 -3
- pyglet/libs/egl/__init__.py +2 -0
- pyglet/libs/egl/egl_lib.py +576 -0
- pyglet/libs/egl/eglext.py +51 -5
- pyglet/libs/linux/__init__.py +0 -0
- pyglet/libs/linux/egl/__init__.py +0 -0
- pyglet/libs/linux/egl/eglext.py +22 -0
- pyglet/libs/linux/glx/__init__.py +0 -0
- pyglet/{gl → libs/linux/glx}/glx.py +13 -14
- pyglet/{gl → libs/linux/glx}/glxext_arb.py +408 -192
- pyglet/{gl → libs/linux/glx}/glxext_mesa.py +1 -1
- pyglet/{gl → libs/linux/glx}/glxext_nv.py +345 -164
- pyglet/{gl → libs/linux/glx}/lib_glx.py +3 -2
- pyglet/libs/linux/wayland/__init__.py +0 -0
- pyglet/libs/linux/wayland/client.py +1068 -0
- pyglet/libs/linux/wayland/lib_wayland.py +207 -0
- pyglet/libs/linux/wayland/wayland_egl.py +38 -0
- pyglet/libs/{wayland → linux/wayland}/xkbcommon.py +26 -0
- pyglet/libs/{x11 → linux/x11}/xf86vmode.py +4 -4
- pyglet/libs/{x11 → linux/x11}/xinerama.py +2 -2
- pyglet/libs/{x11 → linux/x11}/xinput.py +10 -10
- pyglet/libs/linux/x11/xrandr.py +0 -0
- pyglet/libs/{x11 → linux/x11}/xrender.py +1 -1
- pyglet/libs/shared/__init__.py +0 -0
- pyglet/libs/shared/spirv/__init__.py +0 -0
- pyglet/libs/shared/spirv/lib_shaderc.py +85 -0
- pyglet/libs/shared/spirv/lib_spirv_cross.py +126 -0
- pyglet/libs/win32/__init__.py +27 -5
- pyglet/libs/win32/constants.py +59 -48
- pyglet/libs/win32/context_managers.py +20 -3
- pyglet/libs/win32/dinput.py +105 -88
- pyglet/{gl → libs/win32}/lib_wgl.py +52 -26
- pyglet/libs/win32/types.py +58 -23
- pyglet/{gl → libs/win32}/wgl.py +32 -25
- pyglet/{gl → libs/win32}/wglext_arb.py +364 -2
- pyglet/media/__init__.py +9 -10
- pyglet/media/codecs/__init__.py +12 -1
- pyglet/media/codecs/base.py +99 -96
- pyglet/media/codecs/ffmpeg.py +2 -2
- pyglet/media/codecs/ffmpeg_lib/libavformat.py +3 -8
- pyglet/media/codecs/webaudio_pyodide.py +111 -0
- pyglet/media/drivers/__init__.py +9 -4
- pyglet/media/drivers/base.py +4 -4
- pyglet/media/drivers/openal/__init__.py +1 -1
- pyglet/media/drivers/openal/adaptation.py +3 -3
- pyglet/media/drivers/pulse/__init__.py +1 -1
- pyglet/media/drivers/pulse/adaptation.py +3 -3
- pyglet/media/drivers/pyodide_js/__init__.py +8 -0
- pyglet/media/drivers/pyodide_js/adaptation.py +288 -0
- pyglet/media/drivers/xaudio2/adaptation.py +3 -3
- pyglet/media/player.py +276 -193
- pyglet/media/player_worker_thread.py +1 -1
- pyglet/model/__init__.py +39 -29
- pyglet/model/codecs/base.py +4 -4
- pyglet/model/codecs/gltf.py +3 -3
- pyglet/model/codecs/obj.py +71 -43
- pyglet/resource.py +129 -78
- pyglet/shapes.py +147 -177
- pyglet/sprite.py +47 -164
- pyglet/text/__init__.py +44 -54
- pyglet/text/caret.py +12 -7
- pyglet/text/document.py +19 -17
- pyglet/text/formats/html.py +2 -2
- pyglet/text/formats/structured.py +10 -40
- pyglet/text/layout/__init__.py +20 -13
- pyglet/text/layout/base.py +176 -287
- pyglet/text/layout/incremental.py +9 -10
- pyglet/text/layout/scrolling.py +7 -95
- pyglet/window/__init__.py +183 -172
- pyglet/window/cocoa/__init__.py +62 -51
- pyglet/window/cocoa/pyglet_delegate.py +2 -25
- pyglet/window/cocoa/pyglet_view.py +9 -8
- pyglet/window/dialog/__init__.py +184 -0
- pyglet/window/dialog/base.py +99 -0
- pyglet/window/dialog/darwin.py +121 -0
- pyglet/window/dialog/linux.py +72 -0
- pyglet/window/dialog/windows.py +194 -0
- pyglet/window/emscripten/__init__.py +779 -0
- pyglet/window/headless/__init__.py +44 -28
- pyglet/window/key.py +2 -0
- pyglet/window/mouse.py +2 -2
- pyglet/window/wayland/__init__.py +377 -0
- pyglet/window/win32/__init__.py +101 -46
- pyglet/window/xlib/__init__.py +104 -66
- {pyglet-2.1.12.dist-info → pyglet-3.0.dev1.dist-info}/METADATA +2 -3
- pyglet-3.0.dev1.dist-info/RECORD +322 -0
- {pyglet-2.1.12.dist-info → pyglet-3.0.dev1.dist-info}/WHEEL +1 -1
- pyglet/gl/__init__.py +0 -208
- pyglet/gl/base.py +0 -499
- pyglet/gl/cocoa.py +0 -309
- pyglet/gl/gl.py +0 -4625
- pyglet/gl/gl.pyi +0 -2320
- pyglet/gl/gl_compat.pyi +0 -3097
- pyglet/gl/gl_info.py +0 -190
- pyglet/gl/headless.py +0 -166
- pyglet/gl/wgl_info.py +0 -36
- pyglet/gl/wglext_nv.py +0 -1096
- pyglet/gl/win32.py +0 -268
- pyglet/gl/xlib.py +0 -295
- pyglet/image/buffer.py +0 -274
- pyglet/image/codecs/s3tc.py +0 -354
- pyglet/libs/x11/xrandr.py +0 -166
- pyglet-2.1.12.dist-info/RECORD +0 -234
- /pyglet/{libs/wayland → graphics/api/gl/cocoa}/__init__.py +0 -0
- /pyglet/libs/{egl → linux/egl}/egl.py +0 -0
- /pyglet/libs/{egl → linux/egl}/lib.py +0 -0
- /pyglet/libs/{ioctl.py → linux/ioctl.py} +0 -0
- /pyglet/libs/{wayland → linux/wayland}/gbm.py +0 -0
- /pyglet/libs/{x11 → linux/x11}/__init__.py +0 -0
- /pyglet/libs/{x11 → linux/x11}/cursorfont.py +0 -0
- /pyglet/libs/{x11 → linux/x11}/xlib.py +0 -0
- /pyglet/libs/{x11 → linux/x11}/xsync.py +0 -0
- {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 []
|
pyglet/image/codecs/pil.py
CHANGED
|
@@ -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.
|
|
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)
|
pyglet/image/codecs/png.py
CHANGED
|
@@ -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.
|
|
68
|
+
data.frombytes(image.get_bytes(image.format, image.pitch))
|
|
69
69
|
|
|
70
70
|
writer.write_array(file, data)
|
|
71
71
|
|
pyglet/image/codecs/wic.py
CHANGED
|
@@ -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.
|
|
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
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
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
|
|
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
|
-
|
|
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.
|
|
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
|
|
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: {
|
|
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',
|