Skip to content

Commit 7799426

Browse files
committed
Fix half-pixel offset on imported images
1 parent a10092c commit 7799426

1 file changed

Lines changed: 12 additions & 8 deletions

File tree

editor/src/messages/portfolio/document/document_message_handler.rs

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)