Skip to content

Commit 8dbb794

Browse files
authored
Tweak internal resize logic (#128)
1 parent 8868e1e commit 8dbb794

File tree

1 file changed

+33
-16
lines changed

1 file changed

+33
-16
lines changed

rendercanvas/base.py

Lines changed: 33 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -151,8 +151,14 @@ def __init__(
151151
if (self._rc_canvas_group and self._rc_canvas_group.get_loop())
152152
else "no-loop",
153153
}
154-
self._set_size_info((0, 0), 1.0) # Init self.__size_info
155-
self.__size_info["need_event"] = False
154+
self.__size_info = {
155+
"physical_size": (0, 0),
156+
"native_pixel_ratio": 1.0,
157+
"canvas_pixel_ratio": 1.0,
158+
"total_pixel_ratio": 1.0,
159+
"logical_size": (0.0, 0.0),
160+
}
161+
self.__need_size_event = False
156162

157163
# Events and scheduler
158164
self._events = EventEmitter()
@@ -298,18 +304,29 @@ def _set_size_info(self, physical_size: Tuple[int, int], pixel_ratio: float):
298304
299305
The subclass must call this when the actual viewport has changed. So not in ``_rc_set_logical_size()``,
300306
but e.g. when the underlying GUI layer fires a resize event, and maybe on init.
307+
308+
The given pixel-ratio represents the 'native' pixel ratio. The canvas'
309+
zoom factor is multiplied with it to obtain the final pixel-ratio for
310+
this canvas.
301311
"""
302-
w, h = physical_size
312+
self.__size_info["physical_size"] = int(physical_size[0]), int(physical_size[1])
313+
self.__size_info["native_pixel_ratio"] = float(pixel_ratio)
314+
self.__resolve_total_pixel_ratio_and_logical_size()
315+
316+
def __resolve_total_pixel_ratio_and_logical_size(self):
317+
physical_size = self.__size_info["physical_size"]
318+
native_pixel_ratio = self.__size_info["native_pixel_ratio"]
319+
canvas_pixel_ratio = self.__size_info["canvas_pixel_ratio"]
320+
321+
total_pixel_ratio = native_pixel_ratio * canvas_pixel_ratio
322+
logical_size = (
323+
physical_size[0] / total_pixel_ratio,
324+
physical_size[1] / total_pixel_ratio,
325+
)
303326

304-
psize = int(w), int(h)
305-
pixel_ratio = float(pixel_ratio)
306-
lsize = psize[0] / pixel_ratio, psize[1] / pixel_ratio
307-
self.__size_info = {
308-
"physical_size": psize,
309-
"logical_size": lsize,
310-
"pixel_ratio": pixel_ratio,
311-
"need_event": True,
312-
}
327+
self.__size_info["total_pixel_ratio"] = total_pixel_ratio
328+
self.__size_info["logical_size"] = logical_size
329+
self.__need_size_event = True
313330

314331
def add_event_handler(
315332
self, *args: EventTypeEnum | EventHandlerFunction, order: float = 0
@@ -332,15 +349,15 @@ def submit_event(self, event: dict) -> None:
332349
# %% Scheduling and drawing
333350

334351
def __maybe_emit_resize_event(self):
335-
if self.__size_info["need_event"]:
336-
self.__size_info["need_event"] = False
352+
if self.__need_size_event:
353+
self.__need_size_event = False
337354
lsize = self.__size_info["logical_size"]
338355
self._events.emit(
339356
{
340357
"event_type": "resize",
341358
"width": lsize[0],
342359
"height": lsize[1],
343-
"pixel_ratio": self.__size_info["pixel_ratio"],
360+
"pixel_ratio": self.__size_info["total_pixel_ratio"],
344361
# Would be nice to have more details. But as it is now, PyGfx errors if we add fields it does not know, so let's do later.
345362
# "logical_size": self.__size_info["logical_size"],
346363
# "physical_size": self.__size_info["physical_size"],
@@ -531,7 +548,7 @@ def get_pixel_ratio(self) -> float:
531548
pixel ratio >= 2.0. On MacOS (with a Retina screen) the pixel ratio is
532549
always 2.0.
533550
"""
534-
return self.__size_info["pixel_ratio"]
551+
return self.__size_info["total_pixel_ratio"]
535552

536553
def close(self) -> None:
537554
"""Close the canvas."""

0 commit comments

Comments
 (0)