rendercanvas 2.1.2__tar.gz → 2.2.0__tar.gz
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.
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/PKG-INFO +1 -1
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/_scheduler.py +5 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/_version.py +1 -1
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/glfw.py +4 -2
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/offscreen.py +21 -2
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/qt.py +4 -2
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/wx.py +9 -2
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/LICENSE +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/README.md +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/pyproject.toml +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/__init__.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/__pyinstaller/__init__.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/__pyinstaller/conftest.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/__pyinstaller/hook-rendercanvas.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/__pyinstaller/test_rendercanvas.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/_context.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/_coreutils.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/_events.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/_loop.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/asyncio.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/auto.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/base.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/jupyter.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/pyqt5.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/pyqt6.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/pyside2.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/pyside6.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/raw.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/stub.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/trio.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/utils/__init__.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/utils/asyncadapter.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/utils/asyncs.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/utils/bitmappresentadapter.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/utils/bitmaprenderingcontext.py +0 -0
- {rendercanvas-2.1.2 → rendercanvas-2.2.0}/rendercanvas/utils/cube.py +0 -0
|
@@ -94,6 +94,11 @@ class Scheduler:
|
|
|
94
94
|
self._min_fps = max(0.0, float(min_fps))
|
|
95
95
|
|
|
96
96
|
if max_fps is not None:
|
|
97
|
+
# For users setting max_fps=-1 to try to disable the fps cap, as was the way to go in wgpu.gui
|
|
98
|
+
if max_fps < 1:
|
|
99
|
+
raise ValueError(
|
|
100
|
+
"max_fps should be a >= 1. Use update_mode='fastest' to disable the fps cap. Also see ``vsync=False`` to unlock higher frame rates."
|
|
101
|
+
)
|
|
97
102
|
self._max_fps = max(1, float(max_fps))
|
|
98
103
|
|
|
99
104
|
def request_draw(self):
|
|
@@ -10,7 +10,7 @@ from pathlib import Path
|
|
|
10
10
|
|
|
11
11
|
# This is the reference version number, to be bumped before each release.
|
|
12
12
|
# The build system detects this definition when building a distribution.
|
|
13
|
-
__version__ = "2.
|
|
13
|
+
__version__ = "2.2.0"
|
|
14
14
|
|
|
15
15
|
# Allow using nearly the same code in different projects
|
|
16
16
|
project_name = "rendercanvas"
|
|
@@ -81,7 +81,7 @@ KEY_MAP = {
|
|
|
81
81
|
glfw.KEY_LEFT_SUPER: "Meta", # in glfw super means Windows or MacOS-command
|
|
82
82
|
glfw.KEY_NUM_LOCK: "NumLock",
|
|
83
83
|
glfw.KEY_PAGE_DOWN: "PageDown",
|
|
84
|
-
glfw.KEY_PAGE_UP: "
|
|
84
|
+
glfw.KEY_PAGE_UP: "PageUp",
|
|
85
85
|
glfw.KEY_PAUSE: "Pause",
|
|
86
86
|
glfw.KEY_PRINT_SCREEN: "PrintScreen",
|
|
87
87
|
glfw.KEY_RIGHT_ALT: "Alt",
|
|
@@ -625,7 +625,9 @@ class GlfwRenderCanvas(BaseRenderCanvas):
|
|
|
625
625
|
"key": keyname,
|
|
626
626
|
"modifiers": tuple(self._key_modifiers),
|
|
627
627
|
}
|
|
628
|
-
|
|
628
|
+
|
|
629
|
+
if not action == glfw.REPEAT:
|
|
630
|
+
self.submit_event(ev)
|
|
629
631
|
|
|
630
632
|
def _on_char(self, window, char):
|
|
631
633
|
# Undocumented char event to make imgui work, see https://github.com/pygfx/wgpu-py/issues/530
|
|
@@ -17,15 +17,34 @@ class OffscreenRenderCanvas(BaseRenderCanvas):
|
|
|
17
17
|
"""An offscreen canvas intended for manual use.
|
|
18
18
|
|
|
19
19
|
Call the ``.draw()`` method to perform a draw and get the result.
|
|
20
|
+
|
|
21
|
+
Arguments:
|
|
22
|
+
pixel_ratio (float): the ratio of logical to physical pixels.
|
|
23
|
+
format (str): the preferred format. Multiple formats are supported, but by
|
|
24
|
+
setting the preferred format here, other systems (e.g. Pygfx) will
|
|
25
|
+
automatically use that format.
|
|
20
26
|
"""
|
|
21
27
|
|
|
22
28
|
_rc_canvas_group = OffscreenCanvasGroup(None) # no loop, no scheduling
|
|
23
29
|
|
|
24
|
-
def __init__(self, *args, pixel_ratio=1.0, **kwargs):
|
|
30
|
+
def __init__(self, *args, pixel_ratio=1.0, format="rgba-u8", **kwargs):
|
|
25
31
|
super().__init__(*args, **kwargs)
|
|
26
32
|
self._pixel_ratio = pixel_ratio
|
|
27
33
|
self._closed = False
|
|
28
34
|
self._last_image = None
|
|
35
|
+
|
|
36
|
+
self._present_formats = ["rgba-u8", "rgba-f16", "rgba-f32", "rgba-u16"]
|
|
37
|
+
if format != self._present_formats[0]:
|
|
38
|
+
colors, _, dtype = format.partition("-")
|
|
39
|
+
if not (
|
|
40
|
+
colors in ("i", "rgb", "rgba", "bgra")
|
|
41
|
+
and dtype in ("u8", "u16", "u32", "f16", "f32")
|
|
42
|
+
):
|
|
43
|
+
raise ValueError(f"Unexpected format: {format!r}")
|
|
44
|
+
if format in self._present_formats:
|
|
45
|
+
self._present_formats.remove(format)
|
|
46
|
+
self._present_formats.insert(0, format)
|
|
47
|
+
|
|
29
48
|
self._final_canvas_init()
|
|
30
49
|
|
|
31
50
|
# %% Methods to implement RenderCanvas
|
|
@@ -36,7 +55,7 @@ class OffscreenRenderCanvas(BaseRenderCanvas):
|
|
|
36
55
|
def _rc_get_present_methods(self):
|
|
37
56
|
return {
|
|
38
57
|
"bitmap": {
|
|
39
|
-
"formats":
|
|
58
|
+
"formats": self._present_formats,
|
|
40
59
|
}
|
|
41
60
|
}
|
|
42
61
|
|
|
@@ -121,7 +121,7 @@ KEY_MAP = {
|
|
|
121
121
|
int(Keys.Key_Meta): "Meta", # meta maps to control in QT on macOS, and vice-versa
|
|
122
122
|
int(Keys.Key_NumLock): "NumLock",
|
|
123
123
|
int(Keys.Key_PageDown): "PageDown",
|
|
124
|
-
int(Keys.Key_PageUp): "
|
|
124
|
+
int(Keys.Key_PageUp): "PageUp",
|
|
125
125
|
int(Keys.Key_Pause): "Pause",
|
|
126
126
|
int(Keys.Key_ScrollLock): "ScrollLock",
|
|
127
127
|
int(Keys.Key_Tab): "Tab",
|
|
@@ -478,7 +478,9 @@ class QRenderWidget(BaseRenderCanvas, QtWidgets.QWidget):
|
|
|
478
478
|
"key": KEY_MAP.get(event.key(), event.text()),
|
|
479
479
|
"modifiers": modifiers,
|
|
480
480
|
}
|
|
481
|
-
|
|
481
|
+
|
|
482
|
+
if not event.isAutoRepeat():
|
|
483
|
+
self.submit_event(ev)
|
|
482
484
|
|
|
483
485
|
def _char_input_event(self, char_str):
|
|
484
486
|
ev = {
|
|
@@ -355,8 +355,13 @@ class WxRenderWidget(BaseRenderCanvas, wx.Window):
|
|
|
355
355
|
parent = self.Parent
|
|
356
356
|
if isinstance(parent, WxRenderCanvas):
|
|
357
357
|
parent.SetSize(width, height)
|
|
358
|
-
|
|
358
|
+
elif parent is not None:
|
|
359
359
|
self.SetSize(width, height)
|
|
360
|
+
else:
|
|
361
|
+
# The widget has no parent, likely because its going to inserted in a GUI later.
|
|
362
|
+
# This method is likely called from _final_canvas_init and if we call self.SetSize() it will likely error/segfault.
|
|
363
|
+
# See https://github.com/pygfx/rendercanvas/issues/91
|
|
364
|
+
pass
|
|
360
365
|
|
|
361
366
|
def _rc_close(self):
|
|
362
367
|
self._is_closed = True
|
|
@@ -422,7 +427,9 @@ class WxRenderWidget(BaseRenderCanvas, wx.Window):
|
|
|
422
427
|
"key": KEY_MAP.get(event.GetKeyCode(), char_str),
|
|
423
428
|
"modifiers": modifiers,
|
|
424
429
|
}
|
|
425
|
-
|
|
430
|
+
|
|
431
|
+
if not event.IsAutoRepeat():
|
|
432
|
+
self.submit_event(ev)
|
|
426
433
|
|
|
427
434
|
def _char_input_event(self, char_str: Optional[str]):
|
|
428
435
|
if char_str is None:
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|