@@ -662,22 +662,30 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
662662 } => {
663663 // All the image's pixels have been converted to 0..=1, linear, and premultiplied by `Color::from_rgba8_srgb`
664664
665+ let layer_parent = self . new_layer_parent ( true ) ;
665666 let image_size = DVec2 :: new ( image. width as f64 , image. height as f64 ) ;
666667
667668 let transform = if place_at_origin {
668669 // File-open flow: place at document origin without centering so `WrapContentInArtboard` can wrap it
669670 DAffine2 :: from_scale ( image_size)
670671 } else {
671- // Clipboard paste or drag-drop: center at cursor or viewport center
672- self . document_transform_from_mouse ( mouse, viewport) * DAffine2 :: from_scale_angle_translation ( image_size, 0. , image_size / -2. )
672+ // Clipboard paste or drag-drop: center at cursor or viewport center.
673+ // Convert the document-space cursor to the parent's local coordinate space so that
674+ // an artboard at a non-zero position does not offset the placement.
675+ let parent_to_document = {
676+ let metadata = self . metadata ( ) ;
677+ metadata. document_to_viewport . inverse ( ) * metadata. transform_to_viewport ( layer_parent)
678+ } ;
679+ let cursor_in_parent = parent_to_document. inverse ( ) * self . document_transform_from_mouse ( mouse, viewport) ;
680+ cursor_in_parent * DAffine2 :: from_scale_angle_translation ( image_size, 0. , image_size / -2. )
673681 } ;
674682
675683 let layer_node_id = NodeId :: new ( ) ;
676684 let layer_id = LayerNodeIdentifier :: new_unchecked ( layer_node_id) ;
677685
678686 responses. add ( DocumentMessage :: AddTransaction ) ;
679687
680- let layer = graph_modification_utils:: new_image_layer ( Table :: new_from_element ( Raster :: new_cpu ( image) ) , layer_node_id, self . new_layer_parent ( true ) , responses) ;
688+ let layer = graph_modification_utils:: new_image_layer ( Table :: new_from_element ( Raster :: new_cpu ( image) ) , layer_node_id, layer_parent , responses) ;
681689
682690 if let Some ( name) = name {
683691 responses. add ( NodeGraphMessage :: SetDisplayName {
@@ -714,20 +722,27 @@ impl MessageHandler<DocumentMessage, DocumentMessageContext<'_>> for DocumentMes
714722 parent_and_insert_index,
715723 place_at_origin,
716724 } => {
725+ let layer_parent = self . new_layer_parent ( true ) ;
717726 let transform = if place_at_origin {
718727 // File-open flow: place at document origin so `WrapContentInArtboard` can wrap it without extra Transform nodes
719728 DAffine2 :: IDENTITY
720729 } else {
721- // Clipboard paste or drag-drop: center at cursor or viewport center
722- self . document_transform_from_mouse ( mouse, viewport)
730+ // Clipboard paste or drag-drop: center at cursor or viewport center.
731+ // Convert the document-space cursor to the parent's local coordinate space so that
732+ // an artboard at a non-zero position does not offset the placement.
733+ let parent_to_document = {
734+ let metadata = self . metadata ( ) ;
735+ metadata. document_to_viewport . inverse ( ) * metadata. transform_to_viewport ( layer_parent)
736+ } ;
737+ parent_to_document. inverse ( ) * self . document_transform_from_mouse ( mouse, viewport)
723738 } ;
724739
725740 let layer_node_id = NodeId :: new ( ) ;
726741 let layer_id = LayerNodeIdentifier :: new_unchecked ( layer_node_id) ;
727742
728743 responses. add ( DocumentMessage :: AddTransaction ) ;
729744
730- let layer = graph_modification_utils:: new_svg_layer ( svg, transform, !place_at_origin, layer_node_id, self . new_layer_parent ( true ) , responses) ;
745+ let layer = graph_modification_utils:: new_svg_layer ( svg, transform, !place_at_origin, layer_node_id, layer_parent , responses) ;
731746
732747 if let Some ( name) = name {
733748 responses. add ( NodeGraphMessage :: SetDisplayName {
0 commit comments