@@ -388,7 +388,7 @@ fn import_usvg_node(modify_inputs: &mut ModifyInputsContext, node: &usvg::Node,
388388
389389 if let Some ( fill) = path. fill ( ) {
390390 let bounds_transform = DAffine2 :: from_scale_angle_translation ( bounds[ 1 ] - bounds[ 0 ] , 0. , bounds[ 0 ] ) ;
391- apply_usvg_fill ( fill, modify_inputs, transform * usvg_transform ( node . abs_transform ( ) ) , bounds_transform) ;
391+ apply_usvg_fill ( fill, modify_inputs, bounds_transform) ;
392392 }
393393 if let Some ( stroke) = path. stroke ( ) {
394394 apply_usvg_stroke ( stroke, modify_inputs, transform * usvg_transform ( node. abs_transform ( ) ) ) ;
@@ -432,63 +432,38 @@ fn apply_usvg_stroke(stroke: &usvg::Stroke, modify_inputs: &mut ModifyInputsCont
432432 }
433433}
434434
435- fn apply_usvg_fill ( fill : & usvg:: Fill , modify_inputs : & mut ModifyInputsContext , transform : DAffine2 , bounds_transform : DAffine2 ) {
435+ fn apply_usvg_fill ( fill : & usvg:: Fill , modify_inputs : & mut ModifyInputsContext , bounds_transform : DAffine2 ) {
436436 modify_inputs. fill_set ( match & fill. paint ( ) {
437437 usvg:: Paint :: Color ( color) => Fill :: solid ( usvg_color ( * color, fill. opacity ( ) . get ( ) ) ) ,
438438 usvg:: Paint :: LinearGradient ( linear) => {
439- let local = [ DVec2 :: new ( linear. x1 ( ) as f64 , linear. y1 ( ) as f64 ) , DVec2 :: new ( linear. x2 ( ) as f64 , linear. y2 ( ) as f64 ) ] ;
439+ let gradient_transform = usvg_transform ( linear. transform ( ) ) ;
440+ let ( start, end) = ( DVec2 :: new ( linear. x1 ( ) as f64 , linear. y1 ( ) as f64 ) , DVec2 :: new ( linear. x2 ( ) as f64 , linear. y2 ( ) as f64 ) ) ;
441+ let ( start, end) = ( gradient_transform. transform_point2 ( start) , gradient_transform. transform_point2 ( end) ) ;
442+ let ( start, end) = ( bounds_transform. inverse ( ) . transform_point2 ( start) , bounds_transform. inverse ( ) . transform_point2 ( end) ) ;
440443
441- // TODO: fix this
442- // let to_doc_transform = if linear.base.units() == usvg::Units::UserSpaceOnUse {
443- // transform
444- // } else {
445- // transformed_bound_transform
446- // };
447- let to_doc_transform = transform;
448- let to_doc = to_doc_transform * usvg_transform ( linear. transform ( ) ) ;
444+ let gradient_type = GradientType :: Linear ;
449445
450- let document = [ to_doc. transform_point2 ( local[ 0 ] ) , to_doc. transform_point2 ( local[ 1 ] ) ] ;
451- let layer = [ transform. inverse ( ) . transform_point2 ( document[ 0 ] ) , transform. inverse ( ) . transform_point2 ( document[ 1 ] ) ] ;
452-
453- let [ start, end] = [ bounds_transform. inverse ( ) . transform_point2 ( layer[ 0 ] ) , bounds_transform. inverse ( ) . transform_point2 ( layer[ 1 ] ) ] ;
454446 let stops = linear. stops ( ) . iter ( ) . map ( |stop| ( stop. offset ( ) . get ( ) as f64 , usvg_color ( stop. color ( ) , stop. opacity ( ) . get ( ) ) ) ) . collect ( ) ;
455447 let stops = GradientStops :: new ( stops) ;
456448
457- Fill :: Gradient ( Gradient {
458- start,
459- end,
460- gradient_type : GradientType :: Linear ,
461- stops,
462- } )
449+ Fill :: Gradient ( Gradient { start, end, gradient_type, stops } )
463450 }
464451 usvg:: Paint :: RadialGradient ( radial) => {
465- let local = [ DVec2 :: new ( radial. cx ( ) as f64 , radial. cy ( ) as f64 ) , DVec2 :: new ( radial. fx ( ) as f64 , radial. fy ( ) as f64 ) ] ;
466-
467- // TODO: fix this
468- // let to_doc_transform = if radial.base.units == usvg::Units::UserSpaceOnUse {
469- // transform
470- // } else {
471- // transformed_bound_transform
472- // };
473- let to_doc_transform = transform;
474- let to_doc = to_doc_transform * usvg_transform ( radial. transform ( ) ) ;
452+ let gradient_transform = usvg_transform ( radial. transform ( ) ) ;
453+ let center = DVec2 :: new ( radial. cx ( ) as f64 , radial. cy ( ) as f64 ) ;
454+ let edge = center + DVec2 :: X * radial. r ( ) . get ( ) as f64 ;
455+ let ( start, end) = ( gradient_transform. transform_point2 ( center) , gradient_transform. transform_point2 ( edge) ) ;
456+ let ( start, end) = ( bounds_transform. inverse ( ) . transform_point2 ( start) , bounds_transform. inverse ( ) . transform_point2 ( end) ) ;
475457
476- let document = [ to_doc. transform_point2 ( local[ 0 ] ) , to_doc. transform_point2 ( local[ 1 ] ) ] ;
477- let layer = [ transform. inverse ( ) . transform_point2 ( document[ 0 ] ) , transform. inverse ( ) . transform_point2 ( document[ 1 ] ) ] ;
458+ let gradient_type = GradientType :: Radial ;
478459
479- let [ start, end] = [ bounds_transform. inverse ( ) . transform_point2 ( layer[ 0 ] ) , bounds_transform. inverse ( ) . transform_point2 ( layer[ 1 ] ) ] ;
480460 let stops = radial. stops ( ) . iter ( ) . map ( |stop| ( stop. offset ( ) . get ( ) as f64 , usvg_color ( stop. color ( ) , stop. opacity ( ) . get ( ) ) ) ) . collect ( ) ;
481461 let stops = GradientStops :: new ( stops) ;
482462
483- Fill :: Gradient ( Gradient {
484- start,
485- end,
486- gradient_type : GradientType :: Radial ,
487- stops,
488- } )
463+ Fill :: Gradient ( Gradient { start, end, gradient_type, stops } )
489464 }
490465 usvg:: Paint :: Pattern ( _) => {
491- warn ! ( "Skip pattern " ) ;
466+ warn ! ( "SVG patterns are not currently supported " ) ;
492467 return ;
493468 }
494469 } ) ;
0 commit comments