diff --git a/editor/src/messages/portfolio/document/document_message_handler.rs b/editor/src/messages/portfolio/document/document_message_handler.rs index c979e1ab..72d241e9 100644 --- a/editor/src/messages/portfolio/document/document_message_handler.rs +++ b/editor/src/messages/portfolio/document/document_message_handler.rs @@ -328,8 +328,9 @@ impl MessageHandler String { + pub fn render_document(&mut self, size: DVec2, transform: DAffine2, persistent_data: &PersistentData, render_mode: DocumentRenderMode) -> String { // Remove the artwork and artboard pan/tilt/zoom to render it without the user's viewport navigation, and save it to be restored at the end + info!("Transform {transform}"); let old_artwork_transform = self.graphene_document.root.transform; self.graphene_document.root.transform = DAffine2::IDENTITY; @@ -965,7 +967,6 @@ impl DocumentMessageHandler { // Render the document SVG code - let size = bounds[1] - bounds[0]; let render_data = RenderData::new(ViewMode::Normal, &persistent_data.font_cache, None); let artwork = match render_mode { @@ -974,10 +975,15 @@ impl DocumentMessageHandler { }; let artboards = self.artboard_message_handler.artboards_graphene_document.render_root(render_data); let outside_artboards_color = if self.artboard_message_handler.artboard_ids.is_empty() { "#ffffff" } else { "#000000" }; - let outside_artboards = format!(r#""#, bounds[0].x, bounds[0].y, outside_artboards_color); + let outside_artboards = format!(r#""#, outside_artboards_color); + let matrix = transform + .to_cols_array() + .iter() + .enumerate() + .fold(String::new(), |accum, (i, entry)| accum + &(entry.to_string() + if i == 5 { "" } else { "," })); let svg = format!( - r#"{}{}{}{}"#, - bounds[0].x, bounds[0].y, size.x, size.y, size.x, size.y, "\n", outside_artboards, artboards, artwork + r#"{}{}{}{}"#, + size.x, size.y, "\n", outside_artboards, matrix, artboards, artwork ); // Transform the artwork and artboard back to their original scales diff --git a/graphene/src/layers/imaginate_layer.rs b/graphene/src/layers/imaginate_layer.rs index 463616ab..e5e2440d 100644 --- a/graphene/src/layers/imaginate_layer.rs +++ b/graphene/src/layers/imaginate_layer.rs @@ -188,8 +188,7 @@ impl LayerData for ImaginateLayer { let transform = self.transform(transforms, render_data.view_mode); let inverse = transform.inverse(); - let matrix_values = transform.matrix2.to_cols_array(); - let (width, height) = (matrix_values[0], matrix_values[3]); + let (width, height) = (transform.transform_vector2(DVec2::new(1., 0.)).length(), transform.transform_vector2(DVec2::new(0., 1.)).length()); if !inverse.is_finite() { let _ = write!(svg, ""); @@ -205,25 +204,29 @@ impl LayerData for ImaginateLayer { if let Some(blob_url) = &self.blob_url { let _ = write!( svg, - r#""#, + r#"= 0. { transform.translation.x } else { transform.translation.x + width }, - if height >= 0. { transform.translation.y } else { transform.translation.y + height }, blob_url ); } else { let _ = write!( svg, - r#""#, + r#"= 0. { transform.translation.x } else { transform.translation.x + width }, - if height >= 0. { transform.translation.y } else { transform.translation.y + height }, ); } - let _ = svg.write_str(""); + (transform * DAffine2::from_scale((width, height).into()).inverse()) + .to_cols_array() + .iter() + .enumerate() + .for_each(|(i, entry)| { + let _ = svg.write_str(&(entry.to_string() + if i == 5 { "" } else { "," })); + }); + + let _ = svg.write_str(r#")" /> "#); } fn bounding_box(&self, transform: glam::DAffine2, _font_cache: &FontCache) -> Option<[DVec2; 2]> {