67 lines
1.8 KiB
Rust
67 lines
1.8 KiB
Rust
use palette::rgb::Rgb;
|
|
use serde::Serialize;
|
|
use wasm_bindgen::prelude::wasm_bindgen;
|
|
|
|
#[derive(Debug, Clone, Copy, Serialize)]
|
|
#[wasm_bindgen]
|
|
pub struct MixReversing {
|
|
pub r_factor: f32,
|
|
pub g_factor: f32,
|
|
pub b_factor: f32,
|
|
pub average: f32,
|
|
}
|
|
|
|
impl MixReversing {
|
|
pub fn from_tint_rgb(basic_color: Rgb, mixed_result: Rgb) -> Self {
|
|
let r_factor = if basic_color.red == 1.0 {
|
|
0.0
|
|
} else {
|
|
(mixed_result.red - basic_color.red) / (1.0 - basic_color.red)
|
|
};
|
|
let g_factor = if basic_color.green == 1.0 {
|
|
0.0
|
|
} else {
|
|
(mixed_result.green - basic_color.green) / (1.0 - basic_color.green)
|
|
};
|
|
let b_factor = if basic_color.blue == 1.0 {
|
|
0.0
|
|
} else {
|
|
(mixed_result.blue - basic_color.blue) / (1.0 - basic_color.blue)
|
|
};
|
|
let average = (r_factor + g_factor + b_factor) / 3.0;
|
|
|
|
MixReversing {
|
|
r_factor,
|
|
g_factor,
|
|
b_factor,
|
|
average,
|
|
}
|
|
}
|
|
|
|
pub fn from_shade_rgb(basic_color: Rgb, mixed_result: Rgb) -> Self {
|
|
let r_factor = if basic_color.red == 0.0 {
|
|
0.0
|
|
} else {
|
|
(mixed_result.red - basic_color.red) / (0.0 - basic_color.red)
|
|
};
|
|
let g_factor = if basic_color.green == 0.0 {
|
|
0.0
|
|
} else {
|
|
(mixed_result.green - basic_color.green) / (0.0 - basic_color.green)
|
|
};
|
|
let b_factor = if basic_color.blue == 0.0 {
|
|
0.0
|
|
} else {
|
|
(mixed_result.blue - basic_color.blue) / (0.0 - basic_color.blue)
|
|
};
|
|
let average = (r_factor + g_factor + b_factor) / 3.0;
|
|
|
|
MixReversing {
|
|
r_factor,
|
|
g_factor,
|
|
b_factor,
|
|
average,
|
|
}
|
|
}
|
|
}
|