@@ -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