@@ -516,3 +516,130 @@ impl Fsm for GradientToolFsmState {
516516 responses. add ( FrontendMessage :: UpdateMouseCursor { cursor : MouseCursorIcon :: Default } ) ;
517517 }
518518}
519+
520+ #[ cfg( test) ]
521+ mod test_gradient {
522+ use crate :: messages:: portfolio:: document:: { graph_operation:: utility_types:: TransformIn , utility_types:: misc:: GroupFolderType } ;
523+ pub use crate :: test_utils:: test_prelude:: * ;
524+ use glam:: DAffine2 ;
525+ use graphene_core:: vector:: fill;
526+ use graphene_std:: vector:: style:: Fill ;
527+
528+ use super :: gradient_space_transform;
529+
530+ async fn get_fills ( editor : & mut EditorTestUtils ) -> Vec < ( Fill , DAffine2 ) > {
531+ let instrumented = editor. eval_graph ( ) . await ;
532+
533+ let document = editor. active_document ( ) ;
534+ let layers = document. metadata ( ) . all_layers ( ) ;
535+ layers
536+ . filter_map ( |layer| {
537+ let fill = instrumented. grab_input_from_layer :: < fill:: FillInput < Fill > > ( layer, & document. network_interface , & editor. runtime ) ?;
538+ let transform = gradient_space_transform ( layer, document) ;
539+ Some ( ( fill, transform) )
540+ } )
541+ . collect ( )
542+ }
543+
544+ #[ tokio:: test]
545+ async fn ignore_artboard ( ) {
546+ let mut editor = EditorTestUtils :: create ( ) ;
547+ editor. new_document ( ) . await ;
548+ editor. drag_tool ( ToolType :: Artboard , 0. , 0. , 100. , 100. , ModifierKeys :: empty ( ) ) . await ;
549+ editor. drag_tool ( ToolType :: Gradient , 2. , 2. , 4. , 4. , ModifierKeys :: empty ( ) ) . await ;
550+ assert ! ( get_fills( & mut editor) . await . is_empty( ) ) ;
551+ }
552+
553+ #[ tokio:: test]
554+ // TODO: remove once https://github.com/GraphiteEditor/Graphite/issues/2444 is fixed
555+ #[ should_panic]
556+ async fn ignore_raster ( ) {
557+ let mut editor = EditorTestUtils :: create ( ) ;
558+ editor. new_document ( ) . await ;
559+ editor. create_raster_image ( Image :: new ( 100 , 100 , Color :: WHITE ) , Some ( ( 0. , 0. ) ) ) . await ;
560+ editor. drag_tool ( ToolType :: Gradient , 2. , 2. , 4. , 4. , ModifierKeys :: empty ( ) ) . await ;
561+ assert ! ( get_fills( & mut editor) . await . is_empty( ) ) ;
562+ }
563+
564+ #[ tokio:: test]
565+ async fn simple_draw ( ) {
566+ let mut editor = EditorTestUtils :: create ( ) ;
567+ editor. new_document ( ) . await ;
568+ editor. drag_tool ( ToolType :: Rectangle , -5. , -3. , 100. , 100. , ModifierKeys :: empty ( ) ) . await ;
569+ editor. select_primary_color ( Color :: GREEN ) . await ;
570+ editor. select_secondary_color ( Color :: BLUE ) . await ;
571+ editor. drag_tool ( ToolType :: Gradient , 2. , 3. , 24. , 4. , ModifierKeys :: empty ( ) ) . await ;
572+ let fills = get_fills ( & mut editor) . await ;
573+ assert_eq ! ( fills. len( ) , 1 ) ;
574+ let ( fill, transform) = fills. first ( ) . unwrap ( ) ;
575+ let gradient = fill. as_gradient ( ) . unwrap ( ) ;
576+ // Gradient goes from secondary colour to primary colour
577+ let stops = gradient. stops . iter ( ) . map ( |stop| ( stop. 0 , stop. 1 . to_rgba8_srgb ( ) ) ) . collect :: < Vec < _ > > ( ) ;
578+ assert_eq ! ( stops, vec![ ( 0. , Color :: BLUE . to_rgba8_srgb( ) ) , ( 1. , Color :: GREEN . to_rgba8_srgb( ) ) ] ) ;
579+ assert ! ( transform. transform_point2( gradient. start) . abs_diff_eq( DVec2 :: new( 2. , 3. ) , 1e-10 ) ) ;
580+ assert ! ( transform. transform_point2( gradient. end) . abs_diff_eq( DVec2 :: new( 24. , 4. ) , 1e-10 ) ) ;
581+ }
582+
583+ #[ tokio:: test]
584+ async fn snap_simple_draw ( ) {
585+ let mut editor = EditorTestUtils :: create ( ) ;
586+ editor. new_document ( ) . await ;
587+ editor
588+ . handle_message ( NavigationMessage :: CanvasTiltSet {
589+ angle_radians : f64:: consts:: FRAC_PI_8 ,
590+ } )
591+ . await ;
592+ let start = DVec2 :: new ( 0. , 0. ) ;
593+ let end = DVec2 :: new ( 24. , 4. ) ;
594+ editor. drag_tool ( ToolType :: Rectangle , -5. , -3. , 100. , 100. , ModifierKeys :: empty ( ) ) . await ;
595+ editor. drag_tool ( ToolType :: Gradient , start. x , start. y , end. x , end. y , ModifierKeys :: SHIFT ) . await ;
596+ let fills = get_fills ( & mut editor) . await ;
597+ let ( fill, transform) = fills. first ( ) . unwrap ( ) ;
598+ let gradient = fill. as_gradient ( ) . unwrap ( ) ;
599+ assert ! ( transform. transform_point2( gradient. start) . abs_diff_eq( start, 1e-10 ) ) ;
600+
601+ // 15 degrees from horizontal
602+ let angle = f64:: to_radians ( 15. ) ;
603+ let direction = DVec2 :: new ( angle. cos ( ) , angle. sin ( ) ) ;
604+ let expected = start + direction * ( end - start) . length ( ) ;
605+ assert ! ( transform. transform_point2( gradient. end) . abs_diff_eq( expected, 1e-10 ) ) ;
606+ }
607+
608+ #[ tokio:: test]
609+ async fn transformed_draw ( ) {
610+ let mut editor = EditorTestUtils :: create ( ) ;
611+ editor. new_document ( ) . await ;
612+ editor
613+ . handle_message ( NavigationMessage :: CanvasTiltSet {
614+ angle_radians : f64:: consts:: FRAC_PI_8 ,
615+ } )
616+ . await ;
617+ editor. drag_tool ( ToolType :: Rectangle , -5. , -3. , 100. , 100. , ModifierKeys :: empty ( ) ) . await ;
618+
619+ // Group rectangle
620+ let group_folder_type = GroupFolderType :: Layer ;
621+ editor. handle_message ( DocumentMessage :: GroupSelectedLayers { group_folder_type } ) . await ;
622+ let metadata = editor. active_document ( ) . metadata ( ) ;
623+ let mut layers = metadata. all_layers ( ) ;
624+ let folder = layers. next ( ) . unwrap ( ) ;
625+ let rectangle = layers. next ( ) . unwrap ( ) ;
626+ assert_eq ! ( rectangle. parent( metadata) , Some ( folder) ) ;
627+ // Transform the group
628+ editor
629+ . handle_message ( GraphOperationMessage :: TransformSet {
630+ layer : folder,
631+ transform : DAffine2 :: from_scale_angle_translation ( DVec2 :: new ( 1. , 2. ) , 0. , -DVec2 :: X * 10. ) ,
632+ transform_in : TransformIn :: Local ,
633+ skip_rerender : false ,
634+ } )
635+ . await ;
636+
637+ editor. drag_tool ( ToolType :: Gradient , 2. , 3. , 24. , 4. , ModifierKeys :: empty ( ) ) . await ;
638+ let fills = get_fills ( & mut editor) . await ;
639+ assert_eq ! ( fills. len( ) , 1 ) ;
640+ let ( fill, transform) = fills. first ( ) . unwrap ( ) ;
641+ let gradient = fill. as_gradient ( ) . unwrap ( ) ;
642+ assert ! ( transform. transform_point2( gradient. start) . abs_diff_eq( DVec2 :: new( 2. , 3. ) , 1e-10 ) ) ;
643+ assert ! ( transform. transform_point2( gradient. end) . abs_diff_eq( DVec2 :: new( 24. , 4. ) , 1e-10 ) ) ;
644+ }
645+ }
0 commit comments