diff --git a/color-module/src/lib.rs b/color-module/src/lib.rs index b2f407c..afbde93 100644 --- a/color-module/src/lib.rs +++ b/color-module/src/lib.rs @@ -15,6 +15,7 @@ use wasm_bindgen::prelude::*; mod color_card; mod color_differ; mod errors; +mod reversing; #[wasm_bindgen] pub fn represent_rgb(color: &str) -> Result, errors::ColorError> { @@ -496,3 +497,37 @@ pub fn differ_in_oklch( ); Ok(oklch.difference(&other_oklch)) } + +#[wasm_bindgen] +pub fn tint_scale( + basic_color: &str, + mixed_color: &str, +) -> Result { + let basic_color = Srgb::from_str(basic_color) + .map_err(|_| errors::ColorError::UnrecogniazedRGB(basic_color.to_string()))? + .into_format::(); + let mixed_color = Srgb::from_str(mixed_color) + .map_err(|_| errors::ColorError::UnrecogniazedRGB(mixed_color.to_string()))? + .into_format::(); + Ok(reversing::MixReversing::from_tint_rgb( + basic_color, + mixed_color, + )) +} + +#[wasm_bindgen] +pub fn shade_scale( + basic_color: &str, + mixed_color: &str, +) -> Result { + let basic_color = Srgb::from_str(basic_color) + .map_err(|_| errors::ColorError::UnrecogniazedRGB(basic_color.to_string()))? + .into_format::(); + let mixed_color = Srgb::from_str(mixed_color) + .map_err(|_| errors::ColorError::UnrecogniazedRGB(mixed_color.to_string()))? + .into_format::(); + Ok(reversing::MixReversing::from_shade_rgb( + basic_color, + mixed_color, + )) +} diff --git a/color-module/src/reversing.rs b/color-module/src/reversing.rs new file mode 100644 index 0000000..c9e364f --- /dev/null +++ b/color-module/src/reversing.rs @@ -0,0 +1,42 @@ +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 = (mixed_result.red - basic_color.red) / (1.0 - basic_color.red); + let g_factor = (mixed_result.green - basic_color.green) / (1.0 - basic_color.green); + let b_factor = (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 = (basic_color.red - mixed_result.red) / (0.0 - basic_color.red); + let g_factor = (basic_color.green - mixed_result.green) / (0.0 - basic_color.green); + let b_factor = (basic_color.blue - mixed_result.blue) / (0.0 - basic_color.blue); + let average = (r_factor + g_factor + b_factor) / 3.0; + + MixReversing { + r_factor, + g_factor, + b_factor, + average, + } + } +}