color-q/color-module/src/reversing.rs
2025-01-14 09:08:11 +08:00

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,
}
}
}