diff --git a/Cargo.lock b/Cargo.lock index 830d8ac0..ebe98689 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -4423,9 +4423,9 @@ dependencies = [ [[package]] name = "openssl" -version = "0.10.71" +version = "0.10.72" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e14130c6a98cd258fdcb0fb6d744152343ff729cbfcb28c656a9d12b999fbcd" +checksum = "fedfea7d58a1f73118430a55da6a286e7b044961736ce96a16a17068ea25e5da" dependencies = [ "bitflags 2.9.0", "cfg-if", @@ -4455,9 +4455,9 @@ checksum = "d05e27ee213611ffe7d6348b942e8f942b37114c00cc03cec254295a4a17852e" [[package]] name = "openssl-sys" -version = "0.9.106" +version = "0.9.107" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8bb61ea9811cc39e3c2069f40b8b8e2e70d8569b361f879786cc7ed48b777cdd" +checksum = "8288979acd84749c744a9014b4382d42b8f7b2592847b5afb2ed29e5d16ede07" dependencies = [ "cc", "libc", diff --git a/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs b/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs index 3e8b8582..bbb3fa4b 100644 --- a/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs +++ b/editor/src/messages/tool/transform_layer/transform_layer_message_handler.rs @@ -703,7 +703,10 @@ impl MessageHandler> for TransformLayer #[cfg(test)] mod test_transform_layer { use crate::messages::{ - portfolio::document::graph_operation::{transform_utils, utility_types::ModifyInputsContext}, + portfolio::document::graph_operation::{ + transform_utils, + utility_types::{ModifyInputsContext, TransformIn}, + }, prelude::Message, tool::transform_layer::transform_layer_message_handler::VectorModificationType, }; @@ -1097,4 +1100,43 @@ mod test_transform_layer { let final_transform = get_layer_transform(&mut editor, layer).await; assert!(final_transform.is_some(), "Transform node should exist after grab operation"); } + #[tokio::test] + async fn test_scale_to_zero_then_rescale() { + let mut editor = EditorTestUtils::create(); + editor.new_document().await; + editor.drag_tool(ToolType::Rectangle, 0., 0., 100., 100., ModifierKeys::empty()).await; + let document = editor.active_document(); + let layer = document.metadata().all_layers().next().unwrap(); + + // First scale to near-zero + editor.handle_message(TransformLayerMessage::BeginScale).await; + editor.handle_message(TransformLayerMessage::TypeDigit { digit: 0 }).await; + editor.handle_message(TransformLayerMessage::TypeDecimalPoint).await; + editor.handle_message(TransformLayerMessage::TypeDigit { digit: 0 }).await; + editor.handle_message(TransformLayerMessage::TypeDigit { digit: 0 }).await; + editor.handle_message(TransformLayerMessage::TypeDigit { digit: 0 }).await; + editor.handle_message(TransformLayerMessage::TypeDigit { digit: 1 }).await; + editor.handle_message(TransformLayerMessage::ApplyTransformOperation { final_transform: true }).await; + + let near_zero_transform = get_layer_transform(&mut editor, layer).await.unwrap(); + // Verify scale is near zero. + let scale_x = near_zero_transform.matrix2.x_axis.length(); + let scale_y = near_zero_transform.matrix2.y_axis.length(); + assert!(scale_x < 0.001, "Scale factor X should be near zero, got: {}", scale_x); + assert!(scale_y < 0.001, "Scale factor Y should be near zero, got: {}", scale_y); + assert!(scale_x > 0.0, "Scale factor X should not be exactly zero"); + assert!(scale_y > 0.0, "Scale factor Y should not be exactly zero"); + + editor.handle_message(TransformLayerMessage::BeginScale).await; + editor.handle_message(TransformLayerMessage::TypeDigit { digit: 2 }).await; + editor.handle_message(TransformLayerMessage::ApplyTransformOperation { final_transform: true }).await; + + let final_transform = get_layer_transform(&mut editor, layer).await.unwrap(); + assert!(final_transform.is_finite(), "Transform should be finite after rescaling"); + + let new_scale_x = final_transform.matrix2.x_axis.length(); + let new_scale_y = final_transform.matrix2.y_axis.length(); + assert!(new_scale_x > 0.0, "After rescaling, scale factor X should be non-zero"); + assert!(new_scale_y > 0.0, "After rescaling, scale factor Y should be non-zero"); + } }