@@ -516,3 +516,130 @@ impl Fsm for GradientToolFsmState {
516
516
responses. add ( FrontendMessage :: UpdateMouseCursor { cursor : MouseCursorIcon :: Default } ) ;
517
517
}
518
518
}
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