@@ -61,19 +61,25 @@ impl Gradient {
61
61
}
62
62
63
63
/// Adds the gradient def with the uuid specified
64
- fn render_defs ( & self , svg_defs : & mut String ) {
64
+ fn render_defs ( & self , svg_defs : & mut String , multiplied_transform : DAffine2 , bounds : [ DVec2 ; 2 ] , transformed_bounds : [ DVec2 ; 2 ] ) {
65
+ let bound_transform = DAffine2 :: from_scale_angle_translation ( bounds[ 1 ] - bounds[ 0 ] , 0. , bounds[ 0 ] ) ;
66
+ let transformed_bound_transform = DAffine2 :: from_scale_angle_translation ( transformed_bounds[ 1 ] - transformed_bounds[ 0 ] , 0. , transformed_bounds[ 0 ] ) ;
67
+ let updated_transform = multiplied_transform * bound_transform;
68
+
65
69
let positions = self
66
70
. positions
67
71
. iter ( )
68
72
. filter_map ( |( pos, color) | color. map ( |color| ( pos, color) ) )
69
73
. map ( |( position, color) | format ! ( r##"<stop offset="{}" stop-color="#{}" />"## , position, color. rgba_hex( ) ) )
70
74
. collect :: < String > ( ) ;
71
75
72
- let start = self . transform . inverse ( ) . transform_point2 ( self . start ) ;
73
- let end = self . transform . inverse ( ) . transform_point2 ( self . end ) ;
76
+ let mod_gradient = transformed_bound_transform. inverse ( ) ;
77
+ let mod_points = mod_gradient. inverse ( ) * transformed_bound_transform. inverse ( ) * updated_transform;
78
+
79
+ let start = mod_points. transform_point2 ( self . start ) ;
80
+ let end = mod_points. transform_point2 ( self . end ) ;
74
81
75
- let transform = self
76
- . transform
82
+ let transform = mod_gradient
77
83
. to_cols_array ( )
78
84
. iter ( )
79
85
. enumerate ( )
@@ -122,12 +128,12 @@ impl Fill {
122
128
}
123
129
124
130
/// Renders the fill, adding necessary defs.
125
- pub fn render ( & self , svg_defs : & mut String ) -> String {
131
+ pub fn render ( & self , svg_defs : & mut String , multiplied_transform : DAffine2 , bounds : [ DVec2 ; 2 ] , transformed_bounds : [ DVec2 ; 2 ] ) -> String {
126
132
match self {
127
133
Self :: None => r#" fill="none""# . to_string ( ) ,
128
134
Self :: Solid ( color) => format ! ( r##" fill="#{}"{}"## , color. rgb_hex( ) , format_opacity( "fill" , color. a( ) ) ) ,
129
135
Self :: LinearGradient ( gradient) => {
130
- gradient. render_defs ( svg_defs) ;
136
+ gradient. render_defs ( svg_defs, multiplied_transform , bounds , transformed_bounds ) ;
131
137
format ! ( r##" fill="url('#{}')""## , gradient. uuid)
132
138
}
133
139
}
@@ -430,10 +436,10 @@ impl PathStyle {
430
436
self . stroke = None ;
431
437
}
432
438
433
- pub fn render ( & self , view_mode : ViewMode , svg_defs : & mut String ) -> String {
439
+ pub fn render ( & self , view_mode : ViewMode , svg_defs : & mut String , multiplied_transform : DAffine2 , bounds : [ DVec2 ; 2 ] , transformed_bounds : [ DVec2 ; 2 ] ) -> String {
434
440
let fill_attribute = match ( view_mode, & self . fill ) {
435
- ( ViewMode :: Outline , _) => Fill :: None . render ( svg_defs) ,
436
- ( _, fill) => fill. render ( svg_defs) ,
441
+ ( ViewMode :: Outline , _) => Fill :: None . render ( svg_defs, multiplied_transform , bounds , transformed_bounds ) ,
442
+ ( _, fill) => fill. render ( svg_defs, multiplied_transform , bounds , transformed_bounds ) ,
437
443
} ;
438
444
let stroke_attribute = match ( view_mode, & self . stroke ) {
439
445
( ViewMode :: Outline , _) => Stroke :: new ( LAYER_OUTLINE_STROKE_COLOR , LAYER_OUTLINE_STROKE_WIDTH ) . render ( ) ,
0 commit comments