@@ -82,44 +82,34 @@ fn normalize_hue(hue: f32) -> f32 {
82
82
83
83
/// A color with red, green, blue, and alpha components, in a byte each.
84
84
#[ derive( Clone , Copy , PartialEq , Debug ) ]
85
- pub struct RGBA {
85
+ pub struct Rgba {
86
86
/// The red component.
87
- pub red : Option < u8 > ,
87
+ pub red : u8 ,
88
88
/// The green component.
89
- pub green : Option < u8 > ,
89
+ pub green : u8 ,
90
90
/// The blue component.
91
- pub blue : Option < u8 > ,
91
+ pub blue : u8 ,
92
92
/// The alpha component.
93
- pub alpha : Option < f32 > ,
93
+ pub alpha : f32 ,
94
94
}
95
95
96
- impl RGBA {
96
+ impl Rgba {
97
97
/// Constructs a new RGBA value from float components. It expects the red,
98
98
/// green, blue and alpha channels in that order, and all values will be
99
99
/// clamped to the 0.0 ... 1.0 range.
100
100
#[ inline]
101
- pub fn from_floats (
102
- red : Option < f32 > ,
103
- green : Option < f32 > ,
104
- blue : Option < f32 > ,
105
- alpha : Option < f32 > ,
106
- ) -> Self {
101
+ pub fn from_floats ( red : f32 , green : f32 , blue : f32 , alpha : f32 ) -> Self {
107
102
Self :: new (
108
- red . map ( clamp_unit_f32) ,
109
- green . map ( clamp_unit_f32) ,
110
- blue . map ( clamp_unit_f32) ,
111
- alpha. map ( |a| a . clamp ( 0.0 , OPAQUE ) ) ,
103
+ clamp_unit_f32 ( red ) ,
104
+ clamp_unit_f32 ( green ) ,
105
+ clamp_unit_f32 ( blue ) ,
106
+ alpha. clamp ( 0.0 , OPAQUE ) ,
112
107
)
113
108
}
114
109
115
110
/// Same thing, but with `u8` values instead of floats in the 0 to 1 range.
116
111
#[ inline]
117
- pub const fn new (
118
- red : Option < u8 > ,
119
- green : Option < u8 > ,
120
- blue : Option < u8 > ,
121
- alpha : Option < f32 > ,
122
- ) -> Self {
112
+ pub const fn new ( red : u8 , green : u8 , blue : u8 , alpha : f32 ) -> Self {
123
113
Self {
124
114
red,
125
115
green,
@@ -130,7 +120,7 @@ impl RGBA {
130
120
}
131
121
132
122
#[ cfg( feature = "serde" ) ]
133
- impl Serialize for RGBA {
123
+ impl Serialize for Rgba {
134
124
fn serialize < S > ( & self , serializer : S ) -> Result < S :: Ok , S :: Error >
135
125
where
136
126
S : Serializer ,
@@ -140,32 +130,32 @@ impl Serialize for RGBA {
140
130
}
141
131
142
132
#[ cfg( feature = "serde" ) ]
143
- impl < ' de > Deserialize < ' de > for RGBA {
133
+ impl < ' de > Deserialize < ' de > for Rgba {
144
134
fn deserialize < D > ( deserializer : D ) -> Result < Self , D :: Error >
145
135
where
146
136
D : Deserializer < ' de > ,
147
137
{
148
138
let ( r, g, b, a) = Deserialize :: deserialize ( deserializer) ?;
149
- Ok ( RGBA :: new ( r, g, b, a) )
139
+ Ok ( Rgba :: new ( r, g, b, a) )
150
140
}
151
141
}
152
142
153
- impl ToCss for RGBA {
143
+ impl ToCss for Rgba {
154
144
fn to_css < W > ( & self , dest : & mut W ) -> fmt:: Result
155
145
where
156
146
W : fmt:: Write ,
157
147
{
158
- let has_alpha = self . alpha . unwrap_or ( 0.0 ) != OPAQUE ;
148
+ let has_alpha = self . alpha != OPAQUE ;
159
149
160
150
dest. write_str ( if has_alpha { "rgba(" } else { "rgb(" } ) ?;
161
- self . red . unwrap_or ( 0 ) . to_css ( dest) ?;
151
+ self . red . to_css ( dest) ?;
162
152
dest. write_str ( ", " ) ?;
163
- self . green . unwrap_or ( 0 ) . to_css ( dest) ?;
153
+ self . green . to_css ( dest) ?;
164
154
dest. write_str ( ", " ) ?;
165
- self . blue . unwrap_or ( 0 ) . to_css ( dest) ?;
155
+ self . blue . to_css ( dest) ?;
166
156
167
157
// Legacy syntax does not allow none components.
168
- serialize_color_alpha ( dest, Some ( self . alpha . unwrap_or ( 0.0 ) ) , true ) ?;
158
+ serialize_color_alpha ( dest, Some ( self . alpha ) , true ) ?;
169
159
170
160
dest. write_char ( ')' )
171
161
}
@@ -213,7 +203,7 @@ impl ToCss for Hsl {
213
203
self . lightness . unwrap_or ( 0.0 ) ,
214
204
) ;
215
205
216
- RGBA :: from_floats ( Some ( red) , Some ( green) , Some ( blue) , self . alpha ) . to_css ( dest)
206
+ Rgba :: from_floats ( red, green, blue, self . alpha . unwrap_or ( OPAQUE ) ) . to_css ( dest)
217
207
}
218
208
}
219
209
@@ -280,7 +270,7 @@ impl ToCss for Hwb {
280
270
self . blackness . unwrap_or ( 0.0 ) ,
281
271
) ;
282
272
283
- RGBA :: from_floats ( Some ( red) , Some ( green) , Some ( blue) , self . alpha ) . to_css ( dest)
273
+ Rgba :: from_floats ( red, green, blue, self . alpha . unwrap_or ( OPAQUE ) ) . to_css ( dest)
284
274
}
285
275
}
286
276
@@ -621,7 +611,7 @@ pub enum Color {
621
611
/// The 'currentcolor' keyword.
622
612
CurrentColor ,
623
613
/// Specify sRGB colors directly by their red/green/blue/alpha chanels.
624
- Rgba ( RGBA ) ,
614
+ Rgba ( Rgba ) ,
625
615
/// Specifies a color in sRGB using hue, saturation and lightness components.
626
616
Hsl ( Hsl ) ,
627
617
/// Specifies a color in sRGB using hue, whiteness and blackness components.
@@ -812,7 +802,7 @@ pub trait FromParsedColor {
812
802
fn from_current_color ( ) -> Self ;
813
803
814
804
/// Construct a new color from red, green, blue and alpha components.
815
- fn from_rgba ( red : Option < u8 > , green : Option < u8 > , blue : Option < u8 > , alpha : Option < f32 > ) -> Self ;
805
+ fn from_rgba ( red : u8 , green : u8 , blue : u8 , alpha : f32 ) -> Self ;
816
806
817
807
/// Construct a new color from hue, saturation, lightness and alpha components.
818
808
fn from_hsl (
@@ -876,28 +866,28 @@ where
876
866
{
877
867
Ok ( match value. len ( ) {
878
868
8 => O :: from_rgba (
879
- Some ( from_hex ( value[ 0 ] ) ? * 16 + from_hex ( value[ 1 ] ) ?) ,
880
- Some ( from_hex ( value[ 2 ] ) ? * 16 + from_hex ( value[ 3 ] ) ?) ,
881
- Some ( from_hex ( value[ 4 ] ) ? * 16 + from_hex ( value[ 5 ] ) ?) ,
882
- Some ( ( from_hex ( value[ 6 ] ) ? * 16 + from_hex ( value[ 7 ] ) ?) as f32 / 255.0 ) ,
869
+ from_hex ( value[ 0 ] ) ? * 16 + from_hex ( value[ 1 ] ) ?,
870
+ from_hex ( value[ 2 ] ) ? * 16 + from_hex ( value[ 3 ] ) ?,
871
+ from_hex ( value[ 4 ] ) ? * 16 + from_hex ( value[ 5 ] ) ?,
872
+ ( from_hex ( value[ 6 ] ) ? * 16 + from_hex ( value[ 7 ] ) ?) as f32 / 255.0 ,
883
873
) ,
884
874
6 => O :: from_rgba (
885
- Some ( from_hex ( value[ 0 ] ) ? * 16 + from_hex ( value[ 1 ] ) ?) ,
886
- Some ( from_hex ( value[ 2 ] ) ? * 16 + from_hex ( value[ 3 ] ) ?) ,
887
- Some ( from_hex ( value[ 4 ] ) ? * 16 + from_hex ( value[ 5 ] ) ?) ,
888
- Some ( OPAQUE ) ,
875
+ from_hex ( value[ 0 ] ) ? * 16 + from_hex ( value[ 1 ] ) ?,
876
+ from_hex ( value[ 2 ] ) ? * 16 + from_hex ( value[ 3 ] ) ?,
877
+ from_hex ( value[ 4 ] ) ? * 16 + from_hex ( value[ 5 ] ) ?,
878
+ OPAQUE ,
889
879
) ,
890
880
4 => O :: from_rgba (
891
- Some ( from_hex ( value[ 0 ] ) ? * 17 ) ,
892
- Some ( from_hex ( value[ 1 ] ) ? * 17 ) ,
893
- Some ( from_hex ( value[ 2 ] ) ? * 17 ) ,
894
- Some ( ( from_hex ( value[ 3 ] ) ? * 17 ) as f32 / 255.0 ) ,
881
+ from_hex ( value[ 0 ] ) ? * 17 ,
882
+ from_hex ( value[ 1 ] ) ? * 17 ,
883
+ from_hex ( value[ 2 ] ) ? * 17 ,
884
+ ( from_hex ( value[ 3 ] ) ? * 17 ) as f32 / 255.0 ,
895
885
) ,
896
886
3 => O :: from_rgba (
897
- Some ( from_hex ( value[ 0 ] ) ? * 17 ) ,
898
- Some ( from_hex ( value[ 1 ] ) ? * 17 ) ,
899
- Some ( from_hex ( value[ 2 ] ) ? * 17 ) ,
900
- Some ( OPAQUE ) ,
887
+ from_hex ( value[ 0 ] ) ? * 17 ,
888
+ from_hex ( value[ 1 ] ) ? * 17 ,
889
+ from_hex ( value[ 2 ] ) ? * 17 ,
890
+ OPAQUE ,
901
891
) ,
902
892
_ => return Err ( ( ) ) ,
903
893
} )
@@ -935,8 +925,8 @@ impl FromParsedColor for Color {
935
925
}
936
926
937
927
#[ inline]
938
- fn from_rgba ( red : Option < u8 > , green : Option < u8 > , blue : Option < u8 > , alpha : Option < f32 > ) -> Self {
939
- Color :: Rgba ( RGBA :: new ( red, green, blue, alpha) )
928
+ fn from_rgba ( red : u8 , green : u8 , blue : u8 , alpha : f32 ) -> Self {
929
+ Color :: Rgba ( Rgba :: new ( red, green, blue, alpha) )
940
930
}
941
931
942
932
fn from_hsl (
@@ -1174,10 +1164,10 @@ where
1174
1164
}
1175
1165
1176
1166
match_ignore_ascii_case ! { ident ,
1177
- "transparent" => Ok ( Output :: from_rgba( Some ( 0 ) , Some ( 0 ) , Some ( 0 ) , Some ( 0.0 ) ) ) ,
1167
+ "transparent" => Ok ( Output :: from_rgba( 0 , 0 , 0 , 0.0 ) ) ,
1178
1168
"currentcolor" => Ok ( Output :: from_current_color( ) ) ,
1179
1169
_ => keyword( ident)
1180
- . map( |( r, g, b) | Output :: from_rgba( Some ( * r ) , Some ( * g ) , Some ( * b ) , Some ( 1.0 ) ) )
1170
+ . map( |( r, g, b) | Output :: from_rgba( * r , * g , * b , 1.0 ) )
1181
1171
. ok_or( ( ) ) ,
1182
1172
}
1183
1173
}
@@ -1327,47 +1317,50 @@ where
1327
1317
// are parsing the legacy syntax.
1328
1318
let is_legacy_syntax = maybe_red. is_some ( ) && arguments. try_parse ( |p| p. expect_comma ( ) ) . is_ok ( ) ;
1329
1319
1330
- let red: Option < u8 > ;
1331
- let green: Option < u8 > ;
1332
- let blue: Option < u8 > ;
1333
-
1334
- let alpha = if is_legacy_syntax {
1335
- match maybe_red. unwrap ( ) {
1320
+ let ( red, green, blue, alpha) = if is_legacy_syntax {
1321
+ let ( red, green, blue) = match maybe_red. unwrap ( ) {
1336
1322
NumberOrPercentage :: Number { value } => {
1337
- red = Some ( clamp_floor_256_f32 ( value) ) ;
1338
- green = Some ( clamp_floor_256_f32 ( color_parser. parse_number ( arguments) ?) ) ;
1323
+ let red = clamp_floor_256_f32 ( value) ;
1324
+ let green = clamp_floor_256_f32 ( color_parser. parse_number ( arguments) ?) ;
1339
1325
arguments. expect_comma ( ) ?;
1340
- blue = Some ( clamp_floor_256_f32 ( color_parser. parse_number ( arguments) ?) ) ;
1326
+ let blue = clamp_floor_256_f32 ( color_parser. parse_number ( arguments) ?) ;
1327
+ ( red, green, blue)
1341
1328
}
1342
1329
NumberOrPercentage :: Percentage { unit_value } => {
1343
- red = Some ( clamp_unit_f32 ( unit_value) ) ;
1344
- green = Some ( clamp_unit_f32 ( color_parser. parse_percentage ( arguments) ?) ) ;
1330
+ let red = clamp_unit_f32 ( unit_value) ;
1331
+ let green = clamp_unit_f32 ( color_parser. parse_percentage ( arguments) ?) ;
1345
1332
arguments. expect_comma ( ) ?;
1346
- blue = Some ( clamp_unit_f32 ( color_parser. parse_percentage ( arguments) ?) ) ;
1333
+ let blue = clamp_unit_f32 ( color_parser. parse_percentage ( arguments) ?) ;
1334
+ ( red, green, blue)
1347
1335
}
1348
- }
1336
+ } ;
1349
1337
1350
- Some ( parse_legacy_alpha ( color_parser, arguments) ?)
1338
+ let alpha = parse_legacy_alpha ( color_parser, arguments) ?;
1339
+
1340
+ ( red, green, blue, alpha)
1351
1341
} else {
1352
1342
#[ inline]
1353
- fn get_component_value ( c : Option < NumberOrPercentage > ) -> Option < u8 > {
1343
+ fn get_component_value ( c : Option < NumberOrPercentage > ) -> u8 {
1354
1344
c. map ( |c| match c {
1355
1345
NumberOrPercentage :: Number { value } => clamp_floor_256_f32 ( value) ,
1356
1346
NumberOrPercentage :: Percentage { unit_value } => clamp_unit_f32 ( unit_value) ,
1357
1347
} )
1348
+ . unwrap_or ( 0 )
1358
1349
}
1359
1350
1360
- red = get_component_value ( maybe_red) ;
1351
+ let red = get_component_value ( maybe_red) ;
1361
1352
1362
- green = get_component_value ( parse_none_or ( arguments, |p| {
1353
+ let green = get_component_value ( parse_none_or ( arguments, |p| {
1363
1354
color_parser. parse_number_or_percentage ( p)
1364
1355
} ) ?) ;
1365
1356
1366
- blue = get_component_value ( parse_none_or ( arguments, |p| {
1357
+ let blue = get_component_value ( parse_none_or ( arguments, |p| {
1367
1358
color_parser. parse_number_or_percentage ( p)
1368
1359
} ) ?) ;
1369
1360
1370
- parse_modern_alpha ( color_parser, arguments) ?
1361
+ let alpha = parse_modern_alpha ( color_parser, arguments) ?. unwrap_or ( 0.0 ) ;
1362
+
1363
+ ( red, green, blue, alpha)
1371
1364
} ;
1372
1365
1373
1366
Ok ( P :: Output :: from_rgba ( red, green, blue, alpha) )
0 commit comments