@@ -8,13 +8,15 @@ mod gradient;
88mod linear_gradient;
99mod pattern;
1010mod radial_gradient;
11+ mod sweep_gradient;
1112
1213use tiny_skia_path:: { NormalizedF32 , Scalar } ;
1314
1415pub use gradient:: GradientStop ;
1516pub use linear_gradient:: LinearGradient ;
1617pub use pattern:: { FilterQuality , Pattern , PixmapPaint } ;
1718pub use radial_gradient:: RadialGradient ;
19+ pub use sweep_gradient:: SweepGradient ;
1820
1921use crate :: { Color , ColorSpace , Transform } ;
2022
@@ -52,6 +54,8 @@ pub enum Shader<'a> {
5254 LinearGradient ( LinearGradient ) ,
5355 /// A radial gradient shader.
5456 RadialGradient ( RadialGradient ) ,
57+ /// A sweep gradient shader.
58+ SweepGradient ( SweepGradient ) ,
5559 /// A pattern shader.
5660 Pattern ( Pattern < ' a > ) ,
5761}
@@ -60,9 +64,12 @@ impl Shader<'_> {
6064 /// Checks if the shader is guaranteed to produce only opaque colors.
6165 pub fn is_opaque ( & self ) -> bool {
6266 match self {
63- Shader :: SolidColor ( ref c) => c. is_opaque ( ) ,
64- Shader :: LinearGradient ( ref g) => g. is_opaque ( ) ,
67+ Shader :: SolidColor ( c) => c. is_opaque ( ) ,
68+ Shader :: LinearGradient ( g) => g. is_opaque ( ) ,
69+ // A radial gradient may have points that are "undefined" so we just assume that it is
70+ // not opaque.
6571 Shader :: RadialGradient ( _) => false ,
72+ Shader :: SweepGradient ( g) => g. is_opaque ( ) ,
6673 Shader :: Pattern ( _) => false ,
6774 }
6875 }
@@ -78,9 +85,10 @@ impl Shader<'_> {
7885 p. push_uniform_color ( color) ;
7986 true
8087 }
81- Shader :: LinearGradient ( ref g) => g. push_stages ( cs, p) ,
82- Shader :: RadialGradient ( ref g) => g. push_stages ( cs, p) ,
83- Shader :: Pattern ( ref patt) => patt. push_stages ( cs, p) ,
88+ Shader :: LinearGradient ( g) => g. push_stages ( cs, p) ,
89+ Shader :: RadialGradient ( g) => g. push_stages ( cs, p) ,
90+ Shader :: SweepGradient ( g) => g. push_stages ( cs, p) ,
91+ Shader :: Pattern ( patt) => patt. push_stages ( cs, p) ,
8492 }
8593 }
8694
@@ -94,6 +102,9 @@ impl Shader<'_> {
94102 Shader :: RadialGradient ( g) => {
95103 g. base . transform = g. base . transform . post_concat ( ts) ;
96104 }
105+ Shader :: SweepGradient ( g) => {
106+ g. base . transform = g. base . transform . post_concat ( ts) ;
107+ }
97108 Shader :: Pattern ( p) => {
98109 p. transform = p. transform . post_concat ( ts) ;
99110 }
@@ -124,6 +135,9 @@ impl Shader<'_> {
124135 Shader :: RadialGradient ( g) => {
125136 g. base . apply_opacity ( opacity) ;
126137 }
138+ Shader :: SweepGradient ( g) => {
139+ g. base . apply_opacity ( opacity) ;
140+ }
127141 Shader :: Pattern ( ref mut p) => {
128142 p. opacity = NormalizedF32 :: new ( p. opacity . get ( ) * opacity. bound ( 0.0 , 1.0 ) ) . unwrap ( ) ;
129143 }
0 commit comments