2
2
* License, v. 2.0. If a copy of the MPL was not distributed with this
3
3
* file, You can obtain one at http://mozilla.org/MPL/2.0/. */
4
4
5
- use std:: cmp;
6
5
use std:: fmt;
7
6
use std:: f32:: consts:: PI ;
8
7
@@ -31,7 +30,12 @@ impl RGBA {
31
30
/// clamped to the 0.0 ... 1.0 range.
32
31
#[ inline]
33
32
pub fn from_floats ( red : f32 , green : f32 , blue : f32 , alpha : f32 ) -> Self {
34
- Self :: new ( clamp_f32 ( red) , clamp_f32 ( green) , clamp_f32 ( blue) , clamp_f32 ( alpha) )
33
+ Self :: new (
34
+ clamp_unit_f32 ( red) ,
35
+ clamp_unit_f32 ( green) ,
36
+ clamp_unit_f32 ( blue) ,
37
+ clamp_unit_f32 ( alpha) ,
38
+ )
35
39
}
36
40
37
41
/// Returns a transparent color.
@@ -99,7 +103,7 @@ impl ToCss for RGBA {
99
103
{
100
104
// Try first with two decimal places, then with three.
101
105
let mut rounded_alpha = ( self . alpha_f32 ( ) * 100. ) . round ( ) / 100. ;
102
- if clamp_f32 ( rounded_alpha) != self . alpha {
106
+ if clamp_unit_f32 ( rounded_alpha) != self . alpha {
103
107
rounded_alpha = ( self . alpha_f32 ( ) * 1000. ) . round ( ) / 1000. ;
104
108
}
105
109
@@ -381,20 +385,19 @@ fn parse_color_hash(value: &str) -> Result<Color, ()> {
381
385
}
382
386
}
383
387
384
-
385
- fn clamp_i32 ( val : i32 ) -> u8 {
386
- cmp:: min ( cmp:: max ( 0 , val) , 255 ) as u8
387
- }
388
-
389
- fn clamp_f32 ( val : f32 ) -> u8 {
388
+ fn clamp_unit_f32 ( val : f32 ) -> u8 {
390
389
// Scale by 256, not 255, so that each of the 256 u8 values has an equal range
391
390
// of f32 values mapping to it. Floor before clamping.
392
391
//
393
392
// Clamping to 256 and flooring after would let 1.0 map to 256, and
394
393
// `256.0_f32 as u8` is undefined behavior:
395
394
//
396
395
// https://github.com/rust-lang/rust/issues/10184
397
- ( val * 256. ) . floor ( ) . max ( 0. ) . min ( 255. ) as u8
396
+ clamp_256_f32 ( val * 256. )
397
+ }
398
+
399
+ fn clamp_256_f32 ( val : f32 ) -> u8 {
400
+ val. floor ( ) . max ( 0. ) . min ( 255. ) as u8
398
401
}
399
402
400
403
#[ inline]
@@ -417,10 +420,10 @@ fn parse_color_function(name: &str, arguments: &mut Parser) -> Result<Color, ()>
417
420
let token = try!( arguments. next ( ) ) ;
418
421
match token {
419
422
Token :: Number ( NumericValue { value : v, .. } ) => {
420
- clamp_f32 ( v)
423
+ clamp_unit_f32 ( v)
421
424
}
422
425
Token :: Percentage ( ref v) => {
423
- clamp_f32 ( v. unit_value )
426
+ clamp_unit_f32 ( v. unit_value )
424
427
}
425
428
_ => {
426
429
return Err ( ( ) )
@@ -446,23 +449,23 @@ fn parse_rgb_components_rgb(arguments: &mut Parser) -> Result<(u8, u8, u8, bool)
446
449
// https://drafts.csswg.org/css-color/#rgb-functions
447
450
match try!( arguments. next ( ) ) {
448
451
Token :: Number ( NumericValue { value : v, .. } ) => {
449
- red = clamp_i32 ( v as i32 ) ;
450
- green = clamp_i32 ( match try!( arguments. next ( ) ) {
452
+ red = clamp_256_f32 ( v ) ;
453
+ green = clamp_256_f32 ( match try!( arguments. next ( ) ) {
451
454
Token :: Number ( NumericValue { value : v, .. } ) => v,
452
455
Token :: Comma => {
453
456
uses_commas = true ;
454
457
try!( arguments. expect_number ( ) )
455
458
}
456
459
_ => return Err ( ( ) )
457
- } as i32 ) ;
460
+ } ) ;
458
461
if uses_commas {
459
462
try!( arguments. expect_comma ( ) ) ;
460
463
}
461
- blue = clamp_i32 ( try!( arguments. expect_number ( ) ) as i32 ) ;
464
+ blue = clamp_256_f32 ( try!( arguments. expect_number ( ) ) ) ;
462
465
}
463
466
Token :: Percentage ( ref v) => {
464
- red = clamp_f32 ( v. unit_value ) ;
465
- green = clamp_f32 ( match try!( arguments. next ( ) ) {
467
+ red = clamp_unit_f32 ( v. unit_value ) ;
468
+ green = clamp_unit_f32 ( match try!( arguments. next ( ) ) {
466
469
Token :: Percentage ( ref v) => v. unit_value ,
467
470
Token :: Comma => {
468
471
uses_commas = true ;
@@ -473,7 +476,7 @@ fn parse_rgb_components_rgb(arguments: &mut Parser) -> Result<(u8, u8, u8, bool)
473
476
if uses_commas {
474
477
try!( arguments. expect_comma ( ) ) ;
475
478
}
476
- blue = clamp_f32 ( try!( arguments. expect_percentage ( ) ) ) ;
479
+ blue = clamp_unit_f32 ( try!( arguments. expect_percentage ( ) ) ) ;
477
480
}
478
481
_ => return Err ( ( ) )
479
482
} ;
@@ -536,8 +539,8 @@ fn parse_rgb_components_hsl(arguments: &mut Parser) -> Result<(u8, u8, u8, bool)
536
539
else { lightness + saturation - lightness * saturation } ;
537
540
let m1 = lightness * 2. - m2;
538
541
let hue_times_3 = hue * 3. ;
539
- let red = clamp_f32 ( hue_to_rgb ( m1, m2, hue_times_3 + 1. ) ) ;
540
- let green = clamp_f32 ( hue_to_rgb ( m1, m2, hue_times_3) ) ;
541
- let blue = clamp_f32 ( hue_to_rgb ( m1, m2, hue_times_3 - 1. ) ) ;
542
+ let red = clamp_unit_f32 ( hue_to_rgb ( m1, m2, hue_times_3 + 1. ) ) ;
543
+ let green = clamp_unit_f32 ( hue_to_rgb ( m1, m2, hue_times_3) ) ;
544
+ let blue = clamp_unit_f32 ( hue_to_rgb ( m1, m2, hue_times_3 - 1. ) ) ;
542
545
return Ok ( ( red, green, blue, uses_commas) ) ;
543
546
}
0 commit comments