mirror of
https://github.com/GoogleChromeLabs/squoosh.git
synced 2025-11-14 01:37:26 +00:00
* Add sRGB -> RGB conversion before resize * Add clamping for color space conversions * Clip for demultiplication as well * Fixing linear <-> srgb conversion * Update benchmark * Decouple srgb calculations * Generate lookup tables * Update src/codecs/resize/options.tsx * Defaulting on, renaming, removing redundant state
30 lines
585 B
Rust
30 lines
585 B
Rust
pub trait Clamp: std::cmp::PartialOrd + Sized {
|
|
fn clamp(self, min: Self, max: Self) -> Self {
|
|
if self.lt(&min) {
|
|
min
|
|
} else if self.gt(&max) {
|
|
max
|
|
} else {
|
|
self
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Clamp for f32 {}
|
|
|
|
pub fn srgb_to_linear(v: f32) -> f32 {
|
|
if v < 0.04045 {
|
|
v / 12.92
|
|
} else {
|
|
((v + 0.055) / 1.055).powf(2.4).clamp(0.0, 1.0)
|
|
}
|
|
}
|
|
|
|
pub fn linear_to_srgb(v: f32) -> f32 {
|
|
if v < 0.0031308 {
|
|
v * 12.92
|
|
} else {
|
|
(1.055 * v.powf(1.0 / 2.4) - 0.055).clamp(0.0, 1.0)
|
|
}
|
|
}
|