@@ -664,11 +664,11 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
664664 let image_size = DVec2 :: new ( image. width as f64 , image. height as f64 ) ;
665665
666666 // Align the layer with the mouse or center of viewport
667- let viewport_location = mouse. map_or ( viewport . center_in_viewport_space ( ) . into_dvec2 ( ) + viewport . offset ( ) . into_dvec2 ( ) , |pos| pos . into ( ) ) ;
668-
669- let document_to_viewport = self . navigation_handler . calculate_offset_transform ( viewport. center_in_viewport_space ( ) . into ( ) , & self . document_ptz ) ;
670- let center_in_viewport = DAffine2 :: from_translation ( document_to_viewport. inverse ( ) . transform_point2 ( viewport_location - viewport. offset ( ) . into_dvec2 ( ) ) ) ;
671- let center_in_viewport_layerspace = center_in_viewport ;
667+ let center_in_viewport_layerspace = mouse. map_or ( DAffine2 :: IDENTITY , |viewport_location| {
668+ let viewport_location : DVec2 = viewport_location . into ( ) ;
669+ let document_to_viewport = self . navigation_handler . calculate_offset_transform ( viewport. center_in_viewport_space ( ) . into ( ) , & self . document_ptz ) ;
670+ DAffine2 :: from_translation ( document_to_viewport. inverse ( ) . transform_point2 ( viewport_location - viewport. offset ( ) . into_dvec2 ( ) ) )
671+ } ) ;
672672
673673 // Make layer the size of the image
674674 let fit_image_size = DAffine2 :: from_scale_angle_translation ( image_size, 0. , image_size / -2. ) ;
@@ -716,9 +716,13 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
716716 mouse,
717717 parent_and_insert_index,
718718 } => {
719- let document_to_viewport = self . navigation_handler . calculate_offset_transform ( viewport. center_in_viewport_space ( ) . into ( ) , & self . document_ptz ) ;
720- let viewport_location = mouse. map_or ( viewport. center_in_viewport_space ( ) . into_dvec2 ( ) + viewport. offset ( ) . into_dvec2 ( ) , |pos| pos. into ( ) ) ;
721- let center_in_viewport = DAffine2 :: from_translation ( document_to_viewport. inverse ( ) . transform_point2 ( viewport_location - viewport. offset ( ) . into_dvec2 ( ) ) ) ;
719+ // When mouse is None (file-open flow), use the document origin directly to avoid a ±0.5px offset
720+ // that `calculate_offset_transform`'s anti-aliasing rounding introduces for odd-sized viewports.
721+ let center_in_viewport = mouse. map_or ( DAffine2 :: IDENTITY , |pos| {
722+ let viewport_location: DVec2 = pos. into ( ) ;
723+ let document_to_viewport = self . navigation_handler . calculate_offset_transform ( viewport. center_in_viewport_space ( ) . into ( ) , & self . document_ptz ) ;
724+ DAffine2 :: from_translation ( document_to_viewport. inverse ( ) . transform_point2 ( viewport_location - viewport. offset ( ) . into_dvec2 ( ) ) )
725+ } ) ;
722726
723727 let layer_node_id = NodeId :: new ( ) ;
724728 let layer_id = LayerNodeIdentifier :: new_unchecked ( layer_node_id) ;
0 commit comments