pyglet 2.1.3__py3-none-any.whl → 2.1.4__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 (61) hide show
  1. pyglet/__init__.py +21 -9
  2. pyglet/__init__.pyi +3 -1
  3. pyglet/app/cocoa.py +6 -3
  4. pyglet/display/win32.py +14 -15
  5. pyglet/display/xlib_vidmoderestore.py +1 -1
  6. pyglet/extlibs/earcut.py +2 -2
  7. pyglet/font/__init__.py +3 -3
  8. pyglet/font/base.py +118 -51
  9. pyglet/font/dwrite/__init__.py +1381 -0
  10. pyglet/font/dwrite/d2d1_lib.py +637 -0
  11. pyglet/font/dwrite/d2d1_types_lib.py +60 -0
  12. pyglet/font/dwrite/dwrite_lib.py +1577 -0
  13. pyglet/font/fontconfig.py +79 -16
  14. pyglet/font/freetype.py +252 -77
  15. pyglet/font/freetype_lib.py +234 -125
  16. pyglet/font/harfbuzz/__init__.py +275 -0
  17. pyglet/font/harfbuzz/harfbuzz_lib.py +212 -0
  18. pyglet/font/quartz.py +432 -112
  19. pyglet/font/user.py +18 -11
  20. pyglet/font/win32.py +9 -1
  21. pyglet/gl/wgl.py +94 -87
  22. pyglet/gl/wglext_arb.py +472 -218
  23. pyglet/gl/wglext_nv.py +410 -188
  24. pyglet/gui/widgets.py +6 -1
  25. pyglet/image/codecs/bmp.py +3 -5
  26. pyglet/image/codecs/gdiplus.py +28 -9
  27. pyglet/image/codecs/wic.py +198 -489
  28. pyglet/image/codecs/wincodec_lib.py +413 -0
  29. pyglet/input/base.py +3 -2
  30. pyglet/input/macos/darwin_hid.py +28 -2
  31. pyglet/input/win32/directinput.py +2 -1
  32. pyglet/input/win32/xinput.py +10 -9
  33. pyglet/lib.py +14 -2
  34. pyglet/libs/darwin/cocoapy/cocoalibs.py +74 -3
  35. pyglet/libs/darwin/coreaudio.py +0 -2
  36. pyglet/libs/win32/__init__.py +4 -2
  37. pyglet/libs/win32/com.py +65 -12
  38. pyglet/libs/win32/constants.py +1 -0
  39. pyglet/libs/win32/dinput.py +1 -9
  40. pyglet/libs/win32/types.py +72 -8
  41. pyglet/media/codecs/coreaudio.py +1 -0
  42. pyglet/media/codecs/wmf.py +93 -72
  43. pyglet/media/devices/win32.py +5 -4
  44. pyglet/media/drivers/directsound/lib_dsound.py +4 -4
  45. pyglet/media/drivers/xaudio2/interface.py +21 -17
  46. pyglet/media/drivers/xaudio2/lib_xaudio2.py +42 -25
  47. pyglet/shapes.py +1 -1
  48. pyglet/text/document.py +7 -53
  49. pyglet/text/formats/attributed.py +3 -1
  50. pyglet/text/formats/plaintext.py +1 -1
  51. pyglet/text/formats/structured.py +1 -1
  52. pyglet/text/layout/base.py +76 -68
  53. pyglet/text/layout/incremental.py +38 -8
  54. pyglet/text/layout/scrolling.py +1 -1
  55. pyglet/text/runlist.py +2 -114
  56. pyglet/window/win32/__init__.py +1 -3
  57. {pyglet-2.1.3.dist-info → pyglet-2.1.4.dist-info}/METADATA +1 -1
  58. {pyglet-2.1.3.dist-info → pyglet-2.1.4.dist-info}/RECORD +60 -54
  59. pyglet/font/directwrite.py +0 -2798
  60. {pyglet-2.1.3.dist-info → pyglet-2.1.4.dist-info}/LICENSE +0 -0
  61. {pyglet-2.1.3.dist-info → pyglet-2.1.4.dist-info}/WHEEL +0 -0
@@ -0,0 +1,413 @@
1
+ """Windows Imaging Component library definitions for Windows OS."""
2
+ from ctypes import byref, c_void_p, memmove
3
+
4
+ from pyglet.image import ImageData
5
+ from pyglet.image.codecs import ImageDecodeException, ImageDecoder, ImageEncoder, os
6
+ from pyglet.libs.win32 import _kernel32 as kernel32
7
+ from pyglet.libs.win32 import _ole32 as ole32
8
+ from pyglet.libs.win32 import com
9
+ from pyglet.libs.win32.constants import (
10
+ CLSCTX_INPROC_SERVER,
11
+ GENERIC_WRITE,
12
+ GMEM_MOVEABLE,
13
+ STREAM_SEEK_SET,
14
+ WINDOWS_8_OR_GREATER,
15
+ )
16
+ from pyglet.libs.win32.types import (
17
+ BOOL,
18
+ BYTE,
19
+ DOUBLE,
20
+ DWORD,
21
+ LPCWSTR,
22
+ POINTER,
23
+ PROPVARIANT,
24
+ STATSTG,
25
+ UINT,
26
+ ULONG,
27
+ IStream,
28
+ )
29
+
30
+ CLSID_WICImagingFactory1 = com.GUID(0xcacaf262, 0x9370, 0x4615, 0xa1, 0x3b, 0x9f, 0x55, 0x39, 0xda, 0x4c, 0xa)
31
+ CLSID_WICImagingFactory2 = com.GUID(0x317d06e8, 0x5f24, 0x433d, 0xbd, 0xf7, 0x79, 0xce, 0x68, 0xd8, 0xab, 0xc2)
32
+
33
+
34
+ WICBitmapCreateCacheOption = UINT
35
+ WICBitmapNoCache = 0
36
+ WICBitmapCacheOnDemand = 0x1
37
+ WICBitmapCacheOnLoad = 0x2
38
+ WICBITMAPCREATECACHEOPTION_FORCE_DWORD = 0x7fffffff
39
+
40
+ WICBitmapPaletteType = UINT
41
+ WICBitmapPaletteTypeCustom = 0
42
+
43
+ WICBitmapTransformOptions = UINT
44
+ WICBitmapTransformRotate0 = 0
45
+ WICBitmapTransformRotate90 = 0x1
46
+ WICBitmapTransformRotate180 = 0x2
47
+ WICBitmapTransformRotate270 = 0x3
48
+ WICBitmapTransformFlipHorizontal = 0x8
49
+ WICBitmapTransformFlipVertical = 0x10
50
+
51
+ WICBitmapDitherType = UINT
52
+ WICBitmapDitherTypeNone = 0
53
+ WICBitmapDitherTypeSolid = 0
54
+ WICBitmapDitherTypeOrdered4x4 = 0x1
55
+ WICBitmapDitherTypeOrdered8x8 = 0x2
56
+ WICBitmapDitherTypeOrdered16x16 = 0x3
57
+ WICBitmapDitherTypeSpiral4x4 = 0x4
58
+ WICBitmapDitherTypeSpiral8x8 = 0x5
59
+ WICBitmapDitherTypeDualSpiral4x4 = 0x6
60
+ WICBitmapDitherTypeDualSpiral8x8 = 0x7
61
+ WICBitmapDitherTypeErrorDiffusion = 0x8
62
+ WICBITMAPDITHERTYPE_FORCE_DWORD = 0x7fffffff
63
+ WICBITMAPTRANSFORMOPTIONS_FORCE_DWORD = 0x7fffffff
64
+
65
+ WICDecodeOptions = UINT
66
+ WICDecodeMetadataCacheOnDemand = 0
67
+ WICDecodeMetadataCacheOnLoad = 0x1
68
+ WICMETADATACACHEOPTION_FORCE_DWORD = 0x7fffffff
69
+
70
+ WICBitmapEncoderCacheOption = UINT
71
+ WICBitmapEncoderCacheInMemory = 0x0
72
+ WICBitmapEncoderCacheTempFile = 0x1
73
+ WICBitmapEncoderNoCache = 0x2
74
+ WICBITMAPENCODERCACHEOPTION_FORCE_DWORD = 0x7fffffff
75
+
76
+ # Different pixel formats.
77
+ REFWICPixelFormatGUID = POINTER(com.GUID)
78
+ GUID_WICPixelFormatDontCare = com.GUID(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x00)
79
+ GUID_WICPixelFormat1bppIndexed = com.GUID(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x01)
80
+ GUID_WICPixelFormat2bppIndexed = com.GUID(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x02)
81
+ GUID_WICPixelFormat4bppIndexed = com.GUID(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x03)
82
+ GUID_WICPixelFormat8bppIndexed = com.GUID(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x04)
83
+ GUID_WICPixelFormatBlackWhite = com.GUID(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x05)
84
+ GUID_WICPixelFormat2bppGray = com.GUID(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x06)
85
+ GUID_WICPixelFormat4bppGray = com.GUID(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x07)
86
+ GUID_WICPixelFormat8bppGray = com.GUID(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x08)
87
+ GUID_WICPixelFormat8bppAlpha = com.GUID(0xe6cd0116, 0xeeba, 0x4161, 0xaa, 0x85, 0x27, 0xdd, 0x9f, 0xb3, 0xa8, 0x95)
88
+ GUID_WICPixelFormat16bppBGR555 = com.GUID(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x09)
89
+ GUID_WICPixelFormat16bppBGR565 = com.GUID(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0a)
90
+ GUID_WICPixelFormat16bppBGRA5551 = com.GUID(0x05ec7c2b, 0xf1e6, 0x4961, 0xad, 0x46, 0xe1, 0xcc, 0x81, 0x0a, 0x87, 0xd2)
91
+ GUID_WICPixelFormat16bppGray = com.GUID(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0b)
92
+ GUID_WICPixelFormat24bppBGR = com.GUID(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0c)
93
+ GUID_WICPixelFormat24bppRGB = com.GUID(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0d)
94
+ GUID_WICPixelFormat32bppBGR = com.GUID(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0e)
95
+ GUID_WICPixelFormat32bppBGRA = com.GUID(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x0f)
96
+ GUID_WICPixelFormat32bppPBGRA = com.GUID(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x10)
97
+ GUID_WICPixelFormat32bppRGB = com.GUID(0xd98c6b95, 0x3efe, 0x47d6, 0xbb, 0x25, 0xeb, 0x17, 0x48, 0xab, 0x0c,
98
+ 0xf1) # 7 platform update?
99
+ GUID_WICPixelFormat32bppRGBA = com.GUID(0xf5c7ad2d, 0x6a8d, 0x43dd, 0xa7, 0xa8, 0xa2, 0x99, 0x35, 0x26, 0x1a, 0xe9)
100
+ GUID_WICPixelFormat32bppPRGBA = com.GUID(0x3cc4a650, 0xa527, 0x4d37, 0xa9, 0x16, 0x31, 0x42, 0xc7, 0xeb, 0xed, 0xba)
101
+ GUID_WICPixelFormat48bppRGB = com.GUID(0x6fddc324, 0x4e03, 0x4bfe, 0xb1, 0x85, 0x3d, 0x77, 0x76, 0x8d, 0xc9, 0x15)
102
+ GUID_WICPixelFormat48bppBGR = com.GUID(0xe605a384, 0xb468, 0x46ce, 0xbb, 0x2e, 0x36, 0xf1, 0x80, 0xe6, 0x43, 0x13)
103
+
104
+ GUID_ContainerFormatBmp = com.GUID(0x0af1d87e, 0xfcfe, 0x4188, 0xbd, 0xeb, 0xa7, 0x90, 0x64, 0x71, 0xcb, 0xe3)
105
+ GUID_ContainerFormatPng = com.GUID(0x1b7cfaf4, 0x713f, 0x473c, 0xbb, 0xcd, 0x61, 0x37, 0x42, 0x5f, 0xae, 0xaf)
106
+ GUID_ContainerFormatIco = com.GUID(0xa3a860c4, 0x338f, 0x4c17, 0x91, 0x9a, 0xfb, 0xa4, 0xb5, 0x62, 0x8f, 0x21)
107
+ GUID_ContainerFormatJpeg = com.GUID(0x19e4a5aa, 0x5662, 0x4fc5, 0xa0, 0xc0, 0x17, 0x58, 0x02, 0x8e, 0x10, 0x57)
108
+ GUID_ContainerFormatTiff = com.GUID(0x163bcc30, 0xe2e9, 0x4f0b, 0x96, 0x1d, 0xa3, 0xe9, 0xfd, 0xb7, 0x88, 0xa3)
109
+ GUID_ContainerFormatGif = com.GUID(0x1f8a5601, 0x7d4d, 0x4cbd, 0x9c, 0x82, 0x1b, 0xc8, 0xd4, 0xee, 0xb9, 0xa5)
110
+ GUID_ContainerFormatWmp = com.GUID(0x57a37caa, 0x367a, 0x4540, 0x91, 0x6b, 0xf1, 0x83, 0xc5, 0x09, 0x3a, 0x4b)
111
+
112
+
113
+ class IPropertyBag2(com.pIUnknown):
114
+ _methods_ = [
115
+ ('Read',
116
+ com.STDMETHOD()),
117
+ ('Write',
118
+ com.STDMETHOD()),
119
+ ('CountProperties',
120
+ com.STDMETHOD()),
121
+ ('GetPropertyInfo',
122
+ com.STDMETHOD()),
123
+ ('LoadObject',
124
+ com.STDMETHOD())
125
+ ]
126
+
127
+
128
+ class IWICPalette(com.pIUnknown):
129
+ _methods_ = [
130
+ ('InitializePredefined',
131
+ com.STDMETHOD()),
132
+ ('InitializeCustom',
133
+ com.STDMETHOD()),
134
+ ('InitializeFromBitmap',
135
+ com.STDMETHOD()),
136
+ ('InitializeFromPalette',
137
+ com.STDMETHOD()),
138
+ ('GetType',
139
+ com.STDMETHOD()),
140
+ ('GetColorCount',
141
+ com.STDMETHOD()),
142
+ ('GetColors',
143
+ com.STDMETHOD()),
144
+ ('IsBlackWhite',
145
+ com.STDMETHOD()),
146
+ ('IsGrayscale',
147
+ com.STDMETHOD()),
148
+ ('HasAlpha',
149
+ com.STDMETHOD()),
150
+ ]
151
+
152
+
153
+ class IWICStream(IStream, com.pIUnknown):
154
+ _methods_ = [
155
+ ('InitializeFromIStream',
156
+ com.STDMETHOD(IStream)),
157
+ ('InitializeFromFilename',
158
+ com.STDMETHOD(LPCWSTR, DWORD)),
159
+ ('InitializeFromMemory',
160
+ com.STDMETHOD(POINTER(BYTE), DWORD)),
161
+ ('InitializeFromIStreamRegion',
162
+ com.STDMETHOD()),
163
+ ]
164
+
165
+
166
+ class IWICBitmapFrameEncode(com.pIUnknown):
167
+ _methods_ = [
168
+ ('Initialize',
169
+ com.STDMETHOD(IPropertyBag2)),
170
+ ('SetSize',
171
+ com.STDMETHOD(UINT, UINT)),
172
+ ('SetResolution',
173
+ com.STDMETHOD()),
174
+ ('SetPixelFormat',
175
+ com.STDMETHOD(REFWICPixelFormatGUID)),
176
+ ('SetColorContexts',
177
+ com.STDMETHOD()),
178
+ ('SetPalette',
179
+ com.STDMETHOD(IWICPalette)),
180
+ ('SetThumbnail',
181
+ com.STDMETHOD()),
182
+ ('WritePixels',
183
+ com.STDMETHOD(UINT, UINT, UINT, POINTER(BYTE))),
184
+ ('WriteSource',
185
+ com.STDMETHOD()),
186
+ ('Commit',
187
+ com.STDMETHOD()),
188
+ ('GetMetadataQueryWriter',
189
+ com.STDMETHOD())
190
+ ]
191
+
192
+
193
+ class IWICBitmapEncoder(com.pIUnknown):
194
+ _methods_ = [
195
+ ('Initialize',
196
+ com.STDMETHOD(IWICStream, WICBitmapEncoderCacheOption)),
197
+ ('GetContainerFormat',
198
+ com.STDMETHOD()),
199
+ ('GetEncoderInfo',
200
+ com.STDMETHOD()),
201
+ ('SetColorContexts',
202
+ com.STDMETHOD()),
203
+ ('SetPalette',
204
+ com.STDMETHOD()),
205
+ ('SetThumbnail',
206
+ com.STDMETHOD()),
207
+ ('SetPreview',
208
+ com.STDMETHOD()),
209
+ ('CreateNewFrame',
210
+ com.STDMETHOD(POINTER(IWICBitmapFrameEncode), POINTER(IPropertyBag2))),
211
+ ('Commit',
212
+ com.STDMETHOD()),
213
+ ('GetMetadataQueryWriter',
214
+ com.STDMETHOD())
215
+ ]
216
+
217
+
218
+ class IWICComponentInfo(com.pIUnknown):
219
+ _methods_ = [
220
+ ('GetComponentType',
221
+ com.STDMETHOD()),
222
+ ('GetCLSID',
223
+ com.STDMETHOD()),
224
+ ('GetSigningStatus',
225
+ com.STDMETHOD()),
226
+ ('GetAuthor',
227
+ com.STDMETHOD()),
228
+ ('GetVendorGUID',
229
+ com.STDMETHOD()),
230
+ ('GetVersion',
231
+ com.STDMETHOD()),
232
+ ('GetSpecVersion',
233
+ com.STDMETHOD()),
234
+ ('GetFriendlyName',
235
+ com.STDMETHOD())
236
+ ]
237
+
238
+
239
+ class IWICPixelFormatInfo(IWICComponentInfo, com.pIUnknown):
240
+ _methods_ = [
241
+ ('GetFormatGUID',
242
+ com.STDMETHOD(POINTER(com.GUID))),
243
+ ('GetColorContext',
244
+ com.STDMETHOD()),
245
+ ('GetBitsPerPixel',
246
+ com.STDMETHOD(POINTER(UINT))),
247
+ ('GetChannelCount',
248
+ com.STDMETHOD(POINTER(UINT))),
249
+ ('GetChannelMask',
250
+ com.STDMETHOD())
251
+ ]
252
+
253
+
254
+ class IWICBitmapSource(com.pIUnknown):
255
+ _methods_ = [
256
+ ('GetSize',
257
+ com.STDMETHOD(POINTER(UINT), POINTER(UINT))),
258
+ ('GetPixelFormat',
259
+ com.STDMETHOD(REFWICPixelFormatGUID)),
260
+ ('GetResolution',
261
+ com.STDMETHOD(POINTER(DOUBLE), POINTER(DOUBLE))),
262
+ ('CopyPalette',
263
+ com.STDMETHOD()),
264
+ ('CopyPixels',
265
+ com.STDMETHOD(c_void_p, UINT, UINT, c_void_p)),
266
+ ]
267
+
268
+
269
+ class IWICFormatConverter(IWICBitmapSource, com.pIUnknown):
270
+ _methods_ = [
271
+ ('Initialize',
272
+ com.STDMETHOD(IWICBitmapSource, REFWICPixelFormatGUID, WICBitmapDitherType, c_void_p, DOUBLE,
273
+ WICBitmapPaletteType)),
274
+ ('CanConvert',
275
+ com.STDMETHOD(REFWICPixelFormatGUID, REFWICPixelFormatGUID, POINTER(BOOL))),
276
+ ]
277
+
278
+
279
+ class IWICMetadataQueryReader(com.pIUnknown):
280
+ _methods_ = [
281
+ ('GetContainerFormat',
282
+ com.STDMETHOD()),
283
+ ('GetLocation',
284
+ com.STDMETHOD()),
285
+ ('GetMetadataByName',
286
+ com.STDMETHOD(LPCWSTR, c_void_p)),
287
+ ('GetEnumerator',
288
+ com.STDMETHOD()),
289
+ ]
290
+
291
+
292
+ class IWICBitmapFrameDecode(IWICBitmapSource, com.pIUnknown):
293
+ _methods_ = [
294
+ ('GetMetadataQueryReader',
295
+ com.STDMETHOD(POINTER(IWICMetadataQueryReader))),
296
+ ('GetColorContexts',
297
+ com.STDMETHOD()),
298
+ ('GetThumbnail',
299
+ com.STDMETHOD(POINTER(IWICBitmapSource))),
300
+ ]
301
+
302
+
303
+ class IWICBitmapFlipRotator(IWICBitmapSource, com.pIUnknown):
304
+ _methods_ = [
305
+ ('Initialize',
306
+ com.STDMETHOD(IWICBitmapSource, WICBitmapTransformOptions)),
307
+ ]
308
+
309
+
310
+ class IWICBitmap(IWICBitmapSource, com.pIUnknown):
311
+ _methods_ = [
312
+ ('Lock',
313
+ com.STDMETHOD()),
314
+ ('SetPalette',
315
+ com.STDMETHOD()),
316
+ ('SetResolution',
317
+ com.STDMETHOD())
318
+ ]
319
+
320
+
321
+ class IWICBitmapDecoder(com.pIUnknown):
322
+ _methods_ = [
323
+ ('QueryCapability',
324
+ com.STDMETHOD()),
325
+ ('Initialize',
326
+ com.STDMETHOD()),
327
+ ('GetContainerFormat',
328
+ com.STDMETHOD()),
329
+ ('GetDecoderInfo',
330
+ com.STDMETHOD()),
331
+ ('CopyPalette',
332
+ com.STDMETHOD()),
333
+ ('GetMetadataQueryReader',
334
+ com.STDMETHOD(POINTER(IWICMetadataQueryReader))),
335
+ ('GetPreview',
336
+ com.STDMETHOD()),
337
+ ('GetColorContexts',
338
+ com.STDMETHOD()),
339
+ ('GetThumbnail',
340
+ com.STDMETHOD()),
341
+ ('GetFrameCount',
342
+ com.STDMETHOD(POINTER(UINT))),
343
+ ('GetFrame',
344
+ com.STDMETHOD(UINT, POINTER(IWICBitmapFrameDecode))),
345
+ ]
346
+
347
+
348
+ IID_IWICImagingFactory1 = com.GUID(0xec5ec8a9, 0xc395, 0x4314, 0x9c, 0x77, 0x54, 0xd7, 0xa9, 0x35, 0xff, 0x70)
349
+ IID_IWICImagingFactory2 = com.GUID(0x7B816B45, 0x1996, 0x4476, 0xB1, 0x32, 0xDE, 0x9E, 0x24, 0x7C, 0x8A, 0xF0)
350
+
351
+
352
+ IID_IWICPixelFormatInfo = com.GUID(0xE8EDA601, 0x3D48, 0x431a, 0xAB, 0x44, 0x69, 0x05, 0x9B, 0xE8, 0x8B, 0xBE)
353
+
354
+
355
+ class IWICImagingFactory(com.pIUnknown):
356
+ _methods_ = [
357
+ ('CreateDecoderFromFilename',
358
+ com.STDMETHOD(LPCWSTR, com.GUID, DWORD, WICDecodeOptions, POINTER(IWICBitmapDecoder))),
359
+ ('CreateDecoderFromStream',
360
+ com.STDMETHOD(com.pIUnknown, c_void_p, WICDecodeOptions, POINTER(IWICBitmapDecoder))),
361
+ ('CreateDecoderFromFileHandle',
362
+ com.STDMETHOD()),
363
+ ('CreateComponentInfo',
364
+ com.STDMETHOD(com.GUID, POINTER(IWICComponentInfo))),
365
+ ('CreateDecoder',
366
+ com.STDMETHOD()),
367
+ ('CreateEncoder',
368
+ com.STDMETHOD(POINTER(com.GUID), POINTER(com.GUID), POINTER(IWICBitmapEncoder))),
369
+ ('CreatePalette',
370
+ com.STDMETHOD(POINTER(IWICPalette))),
371
+ ('CreateFormatConverter',
372
+ com.STDMETHOD(POINTER(IWICFormatConverter))),
373
+ ('CreateBitmapScaler',
374
+ com.STDMETHOD()),
375
+ ('CreateBitmapClipper',
376
+ com.STDMETHOD()),
377
+ ('CreateBitmapFlipRotator',
378
+ com.STDMETHOD(POINTER(IWICBitmapFlipRotator))),
379
+ ('CreateStream',
380
+ com.STDMETHOD(POINTER(IWICStream))),
381
+ ('CreateColorContext',
382
+ com.STDMETHOD()),
383
+ ('CreateColorTransformer',
384
+ com.STDMETHOD()),
385
+ ('CreateBitmap',
386
+ com.STDMETHOD(UINT, UINT, REFWICPixelFormatGUID, WICBitmapCreateCacheOption, POINTER(IWICBitmap))),
387
+ ('CreateBitmapFromSource',
388
+ com.STDMETHOD()),
389
+ ('CreateBitmapFromSourceRect',
390
+ com.STDMETHOD()),
391
+ ('CreateBitmapFromMemory',
392
+ com.STDMETHOD(UINT, UINT, REFWICPixelFormatGUID, UINT, UINT, POINTER(BYTE), POINTER(IWICBitmap))),
393
+ ('CreateBitmapFromHBITMAP',
394
+ com.STDMETHOD()),
395
+ ('CreateBitmapFromHICON',
396
+ com.STDMETHOD()),
397
+ ('CreateComponentEnumerator',
398
+ com.STDMETHOD()),
399
+ ('CreateFastMetadataEncoderFromDecoder',
400
+ com.STDMETHOD()),
401
+ ('CreateFastMetadataEncoderFromFrameDecode',
402
+ com.STDMETHOD()),
403
+ ('CreateQueryWriter',
404
+ com.STDMETHOD()),
405
+ ('CreateQueryWriterFromReader',
406
+ com.STDMETHOD())
407
+ ]
408
+
409
+ class IWICImagingFactory2(IWICImagingFactory):
410
+ _methods_ = [
411
+ ('CreateImageEncoder',
412
+ com.STDMETHOD()),
413
+ ]
pyglet/input/base.py CHANGED
@@ -671,8 +671,9 @@ class Controller(EventDispatcher):
671
671
 
672
672
  def _bind_dedicated_hat(self, relation: Relation, control: AbsoluteAxis) -> None:
673
673
  # 8-directional hat encoded as a single control (Windows/Mac)
674
- _input_map = {0: Vec2(0.0, 1.0), 1: Vec2(1.0, 1.0), 2: Vec2(1.0, 0.0), 3: Vec2(1.0, -1.0), # n, ne, e, se
675
- 4: Vec2(0.0, -1.0), 5: Vec2(-1.0, -1.0), 6: Vec2(-1.0, 0.0), 7: Vec2(-1.0, 1.0)} # s, sw, w, nw
674
+ _vecs = (Vec2(0.0, 1.0), Vec2(1.0, 1.0), Vec2(1.0, 0.0), Vec2(1.0, -1.0), # n, ne, e, se
675
+ Vec2(0.0, -1.0), Vec2(-1.0, -1.0), Vec2(-1.0, 0.0), Vec2(-1.0, 1.0)) # s, sw, w, nw
676
+ _input_map = {key: val for key, val in zip(range(int(control.min), int(control.max + 1)), _vecs)}
676
677
 
677
678
  # For some Directinput devices:
678
679
  _scale = 0xfff if control.max > 8 else 1
@@ -512,10 +512,26 @@ _button_names = {
512
512
 
513
513
 
514
514
  class PygletDevice(Device):
515
- def __init__(self, display, device):
515
+ """
516
+ Represents a device in the Pyglet input system.
517
+
518
+ :param display: The display the device is attached to.
519
+ :param device: The HIDDevice object.
520
+ :param axis_filter: A list of usage_pages to include
521
+ (e.g. [0x1]).
522
+ :param button_filter: A list of usage_pages to include
523
+ (e.g. [0x1]).
524
+ """
525
+
526
+
527
+ def __init__(self, display, device, axis_filter=None, button_filter=None):
516
528
  super().__init__(display=display, name=device.product)
517
529
  self.device = device
518
530
  self.device.add_value_observer(self)
531
+
532
+ self._axis_filter = axis_filter
533
+ self._button_filter = button_filter
534
+
519
535
  self._create_controls()
520
536
 
521
537
  def open(self, window=None, exclusive=False):
@@ -544,12 +560,22 @@ class PygletDevice(Device):
544
560
  for element in self.device.elements:
545
561
  raw_name = element.name or '0x%x:%x' % (element.usagePage, element.usage)
546
562
  if element.type in (kIOHIDElementTypeInput_Misc, kIOHIDElementTypeInput_Axis):
563
+
564
+ # apply axis filter to allow filtering for usage pages
565
+ if self._axis_filter is not None and element.usagePage not in self._axis_filter:
566
+ continue
567
+
547
568
  name = _axis_names.get((element.usagePage, element.usage))
548
569
  if element.isRelative:
549
570
  control = RelativeAxis(name, raw_name)
550
571
  else:
551
572
  control = AbsoluteAxis(name, element.logicalMin, element.logicalMax, raw_name)
552
573
  elif element.type == kIOHIDElementTypeInput_Button:
574
+
575
+ # apply button filter to allow filtering for usage pages
576
+ if self._button_filter is not None and element.usagePage not in self._button_filter:
577
+ continue
578
+
553
579
  name = _button_names.get((element.usagePage, element.usage))
554
580
  control = Button(name, raw_name)
555
581
  else:
@@ -629,7 +655,7 @@ def _create_controller(device, display):
629
655
  if device.is_joystick() or device.is_gamepad() or device.is_multi_axis():
630
656
 
631
657
  if mapping := get_mapping(device.get_guid()):
632
- return Controller(PygletDevice(display, device), mapping)
658
+ return Controller(PygletDevice(display, device, axis_filter=[0x1, 0x2]), mapping)
633
659
  else:
634
660
  warnings.warn(f"Warning: {device} (GUID: {device.get_guid()}) "
635
661
  f"has no controller mappings. Update the mappings in the Controller DB.")
@@ -262,7 +262,8 @@ class DIDeviceManager(EventDispatcher):
262
262
  return False
263
263
 
264
264
  def _unregister_device_events(self):
265
- del self.window._event_handlers[WM_DEVICECHANGE]
265
+ if WM_DEVICECHANGE in self.window._event_handlers:
266
+ del self.window._event_handlers[WM_DEVICECHANGE]
266
267
  _user32.UnregisterDeviceNotification(self._devnotify)
267
268
  self.registered = False
268
269
  self._devnotify = None
@@ -1,21 +1,22 @@
1
+ import threading
1
2
  import time
2
3
  import weakref
3
- import threading
4
+ from ctypes import POINTER, Structure, byref, c_void_p, windll
5
+ from ctypes.wintypes import DWORD, LONG, LPCWSTR, SHORT, ULONG, WORD
4
6
 
5
7
  import pyglet
6
-
7
- from pyglet.math import Vec2
8
- from pyglet.libs.win32 import com
9
8
  from pyglet.event import EventDispatcher
10
- from pyglet.libs.win32.types import *
11
- from pyglet.libs.win32 import _ole32 as ole32, _oleaut32 as oleaut32
9
+ from pyglet.input.base import AbsoluteAxis, Button, Controller, ControllerManager, Device
10
+ from pyglet.libs.win32 import _ole32 as ole32
11
+ from pyglet.libs.win32 import _oleaut32 as oleaut32
12
+ from pyglet.libs.win32 import com
12
13
  from pyglet.libs.win32.constants import CLSCTX_INPROC_SERVER
13
- from pyglet.input.base import Device, Controller, Button, AbsoluteAxis, ControllerManager
14
-
14
+ from pyglet.libs.win32.types import BYTE, VARIANT
15
+ from pyglet.math import Vec2
15
16
 
16
17
  for library_name in ['xinput1_4', 'xinput9_1_0', 'xinput1_3']:
17
18
  try:
18
- lib = ctypes.windll.LoadLibrary(library_name)
19
+ lib = windll.LoadLibrary(library_name)
19
20
  break
20
21
  except OSError:
21
22
  continue
pyglet/lib.py CHANGED
@@ -146,7 +146,7 @@ class LibraryLoader: # noqa: D101
146
146
  raise RuntimeError(msg)
147
147
 
148
148
 
149
- class MachOLibraryLoader(LibraryLoader): # noqa: D101
149
+ class MacOSLibraryLoader(LibraryLoader): # noqa: D101
150
150
  def __init__(self) -> None: # noqa: D107
151
151
  if 'LD_LIBRARY_PATH' in os.environ:
152
152
  self.ld_library_path = os.environ['LD_LIBRARY_PATH'].split(':')
@@ -168,6 +168,18 @@ class MachOLibraryLoader(LibraryLoader): # noqa: D101
168
168
  else:
169
169
  self.dyld_fallback_library_path = [os.path.expanduser('~/lib'), '/usr/local/lib', '/usr/lib']
170
170
 
171
+ # Homebrew path on Apple Silicon is no longer in local.
172
+ if 'HOMEBREW_PREFIX' in os.environ:
173
+ # if HOMEBREW_PREFIX is defined, add its lib directory.
174
+ brew_lib_path = os.path.join(os.environ['HOMEBREW_PREFIX'], 'lib')
175
+ if os.path.exists(brew_lib_path):
176
+ self.dyld_fallback_library_path.append(brew_lib_path)
177
+ else:
178
+ # Check the typical path if the environmental variable is missing.
179
+ if os.path.exists('/opt/homebrew/lib'):
180
+ self.dyld_fallback_library_path.append('/opt/homebrew/lib')
181
+
182
+
171
183
  def find_library(self, path: str) -> str | None:
172
184
  """Implements the dylib search as specified in Apple documentation:
173
185
 
@@ -314,7 +326,7 @@ class LinuxLibraryLoader(LibraryLoader): # noqa: D101
314
326
 
315
327
 
316
328
  if pyglet.compat_platform == 'darwin':
317
- loader = MachOLibraryLoader()
329
+ loader = MacOSLibraryLoader()
318
330
  elif pyglet.compat_platform.startswith('linux'):
319
331
  loader = LinuxLibraryLoader()
320
332
  else: