Fix image export bounds calculation for selected layers (#807)
* Fix Export Bounds * Fix the scale of the transform
This commit is contained in:
parent
05169935ad
commit
1219e26d17
|
|
@ -315,6 +315,8 @@ impl MessageHandler<DocumentMessage, (u64, &InputPreprocessorMessageHandler, &Pe
|
||||||
scale_factor,
|
scale_factor,
|
||||||
bounds,
|
bounds,
|
||||||
} => {
|
} => {
|
||||||
|
let old_transforms = self.remove_document_transform();
|
||||||
|
|
||||||
// Calculate the bounding box of the region to be exported
|
// Calculate the bounding box of the region to be exported
|
||||||
let bounds = match bounds {
|
let bounds = match bounds {
|
||||||
ExportBounds::AllArtwork => self.all_layer_bounds(&persistent_data.font_cache),
|
ExportBounds::AllArtwork => self.all_layer_bounds(&persistent_data.font_cache),
|
||||||
|
|
@ -328,9 +330,10 @@ impl MessageHandler<DocumentMessage, (u64, &InputPreprocessorMessageHandler, &Pe
|
||||||
}
|
}
|
||||||
.unwrap_or_default();
|
.unwrap_or_default();
|
||||||
let size = bounds[1] - bounds[0];
|
let size = bounds[1] - bounds[0];
|
||||||
let transform = DAffine2::from_scale_angle_translation(1. / size, 0., -bounds[0]);
|
let transform = (DAffine2::from_translation(bounds[0]) * DAffine2::from_scale(size)).inverse();
|
||||||
|
|
||||||
let document = self.render_document(size, transform, persistent_data, DocumentRenderMode::Root);
|
let document = self.render_document(size, transform, persistent_data, DocumentRenderMode::Root);
|
||||||
|
self.restore_document_transform(old_transforms);
|
||||||
|
|
||||||
let file_suffix = &format!(".{file_type:?}").to_lowercase();
|
let file_suffix = &format!(".{file_type:?}").to_lowercase();
|
||||||
let name = match file_name.ends_with(FILE_SAVE_SUFFIX) {
|
let name = match file_name.ends_with(FILE_SAVE_SUFFIX) {
|
||||||
|
|
@ -933,7 +936,9 @@ impl DocumentMessageHandler {
|
||||||
// Calculate the size of the region to be exported
|
// Calculate the size of the region to be exported
|
||||||
let size = transform.transform_point2(DVec2::ONE) - transform.transform_point2(DVec2::ZERO);
|
let size = transform.transform_point2(DVec2::ONE) - transform.transform_point2(DVec2::ZERO);
|
||||||
|
|
||||||
|
let old_transforms = self.remove_document_transform();
|
||||||
let svg = self.render_document(size, transform.inverse(), persistent_data, DocumentRenderMode::OnlyBelowLayerInFolder(&layer_path));
|
let svg = self.render_document(size, transform.inverse(), persistent_data, DocumentRenderMode::OnlyBelowLayerInFolder(&layer_path));
|
||||||
|
self.restore_document_transform(old_transforms);
|
||||||
|
|
||||||
Some(ImaginateBaseImage { svg, size })
|
Some(ImaginateBaseImage { svg, size })
|
||||||
} else {
|
} else {
|
||||||
|
|
@ -953,10 +958,8 @@ impl DocumentMessageHandler {
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
||||||
// 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
|
fn remove_document_transform(&mut self) -> [DAffine2; 2] {
|
||||||
info!("Transform {transform}");
|
|
||||||
|
|
||||||
let old_artwork_transform = self.graphene_document.root.transform;
|
let old_artwork_transform = self.graphene_document.root.transform;
|
||||||
self.graphene_document.root.transform = DAffine2::IDENTITY;
|
self.graphene_document.root.transform = DAffine2::IDENTITY;
|
||||||
GrapheneDocument::mark_children_as_dirty(&mut self.graphene_document.root);
|
GrapheneDocument::mark_children_as_dirty(&mut self.graphene_document.root);
|
||||||
|
|
@ -965,6 +968,19 @@ impl DocumentMessageHandler {
|
||||||
self.artboard_message_handler.artboards_graphene_document.root.transform = DAffine2::IDENTITY;
|
self.artboard_message_handler.artboards_graphene_document.root.transform = DAffine2::IDENTITY;
|
||||||
GrapheneDocument::mark_children_as_dirty(&mut self.artboard_message_handler.artboards_graphene_document.root);
|
GrapheneDocument::mark_children_as_dirty(&mut self.artboard_message_handler.artboards_graphene_document.root);
|
||||||
|
|
||||||
|
[old_artwork_transform, old_artboard_transform]
|
||||||
|
}
|
||||||
|
|
||||||
|
/// Transform the artwork and artboard back to their original scales
|
||||||
|
fn restore_document_transform(&mut self, [old_artwork_transform, old_artboard_transform]: [DAffine2; 2]) {
|
||||||
|
self.graphene_document.root.transform = old_artwork_transform;
|
||||||
|
GrapheneDocument::mark_children_as_dirty(&mut self.graphene_document.root);
|
||||||
|
|
||||||
|
self.artboard_message_handler.artboards_graphene_document.root.transform = old_artboard_transform;
|
||||||
|
GrapheneDocument::mark_children_as_dirty(&mut self.artboard_message_handler.artboards_graphene_document.root);
|
||||||
|
}
|
||||||
|
|
||||||
|
pub fn render_document(&mut self, size: DVec2, transform: DAffine2, persistent_data: &PersistentData, render_mode: DocumentRenderMode) -> String {
|
||||||
// Render the document SVG code
|
// Render the document SVG code
|
||||||
|
|
||||||
let render_data = RenderData::new(ViewMode::Normal, &persistent_data.font_cache, None);
|
let render_data = RenderData::new(ViewMode::Normal, &persistent_data.font_cache, None);
|
||||||
|
|
@ -986,14 +1002,6 @@ impl DocumentMessageHandler {
|
||||||
size.x, size.y, "\n", outside_artboards, matrix, artboards, artwork
|
size.x, size.y, "\n", outside_artboards, matrix, artboards, artwork
|
||||||
);
|
);
|
||||||
|
|
||||||
// Transform the artwork and artboard back to their original scales
|
|
||||||
|
|
||||||
self.graphene_document.root.transform = old_artwork_transform;
|
|
||||||
GrapheneDocument::mark_children_as_dirty(&mut self.graphene_document.root);
|
|
||||||
|
|
||||||
self.artboard_message_handler.artboards_graphene_document.root.transform = old_artboard_transform;
|
|
||||||
GrapheneDocument::mark_children_as_dirty(&mut self.artboard_message_handler.artboards_graphene_document.root);
|
|
||||||
|
|
||||||
svg
|
svg
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue