增加颜色对比中的相对值对比方法。
This commit is contained in:
		@@ -35,4 +35,38 @@ impl ColorDifference for Cam16Jch<f32> {
 | 
			
		||||
            },
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn difference_relative(&self, other: &Self) -> Self::Difference {
 | 
			
		||||
        let hue = if self.hue.into_positive_degrees() == 0.0 {
 | 
			
		||||
            0.0
 | 
			
		||||
        } else {
 | 
			
		||||
            (other.hue.into_positive_degrees() - self.hue.into_positive_degrees())
 | 
			
		||||
                / (1.0 - self.hue.into_positive_degrees())
 | 
			
		||||
        };
 | 
			
		||||
        let chroma = if self.chroma == 0.0 {
 | 
			
		||||
            0.0
 | 
			
		||||
        } else {
 | 
			
		||||
            (other.chroma - self.chroma) / self.chroma
 | 
			
		||||
        };
 | 
			
		||||
        let lightness = if self.lightness == 0.0 {
 | 
			
		||||
            0.0
 | 
			
		||||
        } else {
 | 
			
		||||
            (other.lightness - self.lightness) / self.lightness
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        HctDiffference {
 | 
			
		||||
            hue: Differ {
 | 
			
		||||
                delta: other.hue.into_positive_degrees() - self.hue.into_positive_degrees(),
 | 
			
		||||
                percent: hue,
 | 
			
		||||
            },
 | 
			
		||||
            chroma: Differ {
 | 
			
		||||
                delta: other.chroma - self.chroma,
 | 
			
		||||
                percent: chroma,
 | 
			
		||||
            },
 | 
			
		||||
            lightness: Differ {
 | 
			
		||||
                delta: other.lightness - self.lightness,
 | 
			
		||||
                percent: lightness,
 | 
			
		||||
            },
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -35,4 +35,38 @@ impl ColorDifference for Hsl {
 | 
			
		||||
            },
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn difference_relative(&self, other: &Self) -> Self::Difference {
 | 
			
		||||
        let hue = if self.hue.into_positive_degrees() == 0.0 {
 | 
			
		||||
            0.0
 | 
			
		||||
        } else {
 | 
			
		||||
            (other.hue.into_positive_degrees() - self.hue.into_positive_degrees())
 | 
			
		||||
                / (1.0 - self.hue.into_positive_degrees())
 | 
			
		||||
        };
 | 
			
		||||
        let saturation = if self.saturation == 0.0 {
 | 
			
		||||
            0.0
 | 
			
		||||
        } else {
 | 
			
		||||
            (other.saturation - self.saturation) / (1.0 - self.saturation)
 | 
			
		||||
        };
 | 
			
		||||
        let lightness = if self.lightness == 0.0 {
 | 
			
		||||
            0.0
 | 
			
		||||
        } else {
 | 
			
		||||
            (other.lightness - self.lightness) / (1.0 - self.lightness)
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        HSLDifference {
 | 
			
		||||
            hue: Differ {
 | 
			
		||||
                delta: other.hue.into_positive_degrees() - self.hue.into_positive_degrees(),
 | 
			
		||||
                percent: hue,
 | 
			
		||||
            },
 | 
			
		||||
            saturation: Differ {
 | 
			
		||||
                delta: other.saturation - self.saturation,
 | 
			
		||||
                percent: saturation,
 | 
			
		||||
            },
 | 
			
		||||
            lightness: Differ {
 | 
			
		||||
                delta: other.lightness - self.lightness,
 | 
			
		||||
                percent: lightness,
 | 
			
		||||
            },
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -17,4 +17,5 @@ pub trait ColorDifference {
 | 
			
		||||
    type Difference;
 | 
			
		||||
 | 
			
		||||
    fn difference(&self, other: &Self) -> Self::Difference;
 | 
			
		||||
    fn difference_relative(&self, other: &Self) -> Self::Difference;
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -35,4 +35,38 @@ impl ColorDifference for Oklch {
 | 
			
		||||
            },
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn difference_relative(&self, other: &Self) -> Self::Difference {
 | 
			
		||||
        let hue = if self.hue.into_positive_degrees() == 0.0 {
 | 
			
		||||
            0.0
 | 
			
		||||
        } else {
 | 
			
		||||
            (other.hue.into_positive_degrees() - self.hue.into_positive_degrees())
 | 
			
		||||
                / (1.0 - self.hue.into_positive_degrees())
 | 
			
		||||
        };
 | 
			
		||||
        let chroma = if self.chroma == 0.0 {
 | 
			
		||||
            0.0
 | 
			
		||||
        } else {
 | 
			
		||||
            (other.chroma - self.chroma) / self.chroma
 | 
			
		||||
        };
 | 
			
		||||
        let lightness = if self.l == 0.0 {
 | 
			
		||||
            0.0
 | 
			
		||||
        } else {
 | 
			
		||||
            (other.l - self.l) / (1.0 - self.l)
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        OklchDifference {
 | 
			
		||||
            hue: Differ {
 | 
			
		||||
                delta: other.hue.into_positive_degrees() - self.hue.into_positive_degrees(),
 | 
			
		||||
                percent: hue,
 | 
			
		||||
            },
 | 
			
		||||
            chroma: Differ {
 | 
			
		||||
                delta: other.chroma - self.chroma,
 | 
			
		||||
                percent: chroma,
 | 
			
		||||
            },
 | 
			
		||||
            lightness: Differ {
 | 
			
		||||
                delta: other.l - self.l,
 | 
			
		||||
                percent: lightness,
 | 
			
		||||
            },
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -35,4 +35,37 @@ impl ColorDifference for Srgb {
 | 
			
		||||
            },
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    fn difference_relative(&self, other: &Self) -> Self::Difference {
 | 
			
		||||
        let r = if self.red == 0.0 {
 | 
			
		||||
            0.0
 | 
			
		||||
        } else {
 | 
			
		||||
            (other.red - self.red) / (1.0 - self.red)
 | 
			
		||||
        };
 | 
			
		||||
        let g = if self.green == 0.0 {
 | 
			
		||||
            0.0
 | 
			
		||||
        } else {
 | 
			
		||||
            (other.green - self.green) / (1.0 - self.green)
 | 
			
		||||
        };
 | 
			
		||||
        let b = if self.blue == 0.0 {
 | 
			
		||||
            0.0
 | 
			
		||||
        } else {
 | 
			
		||||
            (other.blue - self.blue) / (1.0 - self.blue)
 | 
			
		||||
        };
 | 
			
		||||
 | 
			
		||||
        RGBDifference {
 | 
			
		||||
            r: Differ {
 | 
			
		||||
                delta: other.red - self.red,
 | 
			
		||||
                percent: r,
 | 
			
		||||
            },
 | 
			
		||||
            g: Differ {
 | 
			
		||||
                delta: other.green - self.green,
 | 
			
		||||
                percent: g,
 | 
			
		||||
            },
 | 
			
		||||
            b: Differ {
 | 
			
		||||
                delta: other.blue - self.blue,
 | 
			
		||||
                percent: b,
 | 
			
		||||
            },
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
 
 | 
			
		||||
@@ -440,6 +440,20 @@ pub fn differ_in_rgb(
 | 
			
		||||
    Ok(srgb.difference(&other_srgb))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
pub fn relative_differ_in_rgb(
 | 
			
		||||
    color: &str,
 | 
			
		||||
    other: &str,
 | 
			
		||||
) -> Result<color_differ::rgb::RGBDifference, errors::ColorError> {
 | 
			
		||||
    let srgb = Srgb::from_str(color)
 | 
			
		||||
        .map_err(|_| errors::ColorError::UnrecogniazedRGB(color.to_string()))?
 | 
			
		||||
        .into_format::<f32>();
 | 
			
		||||
    let other_srgb = Srgb::from_str(other)
 | 
			
		||||
        .map_err(|_| errors::ColorError::UnrecogniazedRGB(other.to_string()))?
 | 
			
		||||
        .into_format::<f32>();
 | 
			
		||||
    Ok(srgb.difference_relative(&other_srgb))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
pub fn differ_in_hsl(
 | 
			
		||||
    color: &str,
 | 
			
		||||
@@ -458,6 +472,24 @@ pub fn differ_in_hsl(
 | 
			
		||||
    Ok(hsl.difference(&other_hsl))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
pub fn relative_differ_in_hsl(
 | 
			
		||||
    color: &str,
 | 
			
		||||
    other: &str,
 | 
			
		||||
) -> Result<color_differ::hsl::HSLDifference, errors::ColorError> {
 | 
			
		||||
    let hsl = Hsl::from_color(
 | 
			
		||||
        Srgb::from_str(color)
 | 
			
		||||
            .map_err(|_| errors::ColorError::UnrecogniazedRGB(color.to_string()))?
 | 
			
		||||
            .into_format::<f32>(),
 | 
			
		||||
    );
 | 
			
		||||
    let other_hsl = Hsl::from_color(
 | 
			
		||||
        Srgb::from_str(other)
 | 
			
		||||
            .map_err(|_| errors::ColorError::UnrecogniazedRGB(other.to_string()))?
 | 
			
		||||
            .into_format::<f32>(),
 | 
			
		||||
    );
 | 
			
		||||
    Ok(hsl.difference_relative(&other_hsl))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
pub fn differ_in_hct(
 | 
			
		||||
    color: &str,
 | 
			
		||||
@@ -480,6 +512,28 @@ pub fn differ_in_hct(
 | 
			
		||||
    Ok(hct.difference(&other_hct))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
pub fn relative_differ_in_hct(
 | 
			
		||||
    color: &str,
 | 
			
		||||
    other: &str,
 | 
			
		||||
) -> Result<color_differ::cam16jch::HctDiffference, errors::ColorError> {
 | 
			
		||||
    let hct = Cam16Jch::from_xyz(
 | 
			
		||||
        Srgb::from_str(color)
 | 
			
		||||
            .map_err(|_| errors::ColorError::UnrecogniazedRGB(color.to_string()))?
 | 
			
		||||
            .into_format::<f32>()
 | 
			
		||||
            .into_color(),
 | 
			
		||||
        Parameters::default_static_wp(40.0),
 | 
			
		||||
    );
 | 
			
		||||
    let other_hct = Cam16Jch::from_xyz(
 | 
			
		||||
        Srgb::from_str(other)
 | 
			
		||||
            .map_err(|_| errors::ColorError::UnrecogniazedRGB(other.to_string()))?
 | 
			
		||||
            .into_format::<f32>()
 | 
			
		||||
            .into_color(),
 | 
			
		||||
        Parameters::default_static_wp(40.0),
 | 
			
		||||
    );
 | 
			
		||||
    Ok(hct.difference_relative(&other_hct))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
pub fn differ_in_oklch(
 | 
			
		||||
    color: &str,
 | 
			
		||||
@@ -498,6 +552,24 @@ pub fn differ_in_oklch(
 | 
			
		||||
    Ok(oklch.difference(&other_oklch))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
pub fn relative_differ_in_oklch(
 | 
			
		||||
    color: &str,
 | 
			
		||||
    other: &str,
 | 
			
		||||
) -> Result<color_differ::oklch::OklchDifference, errors::ColorError> {
 | 
			
		||||
    let oklch = Oklch::from_color(
 | 
			
		||||
        Srgb::from_str(color)
 | 
			
		||||
            .map_err(|_| errors::ColorError::UnrecogniazedRGB(color.to_string()))?
 | 
			
		||||
            .into_format::<f32>(),
 | 
			
		||||
    );
 | 
			
		||||
    let other_oklch = Oklch::from_color(
 | 
			
		||||
        Srgb::from_str(other)
 | 
			
		||||
            .map_err(|_| errors::ColorError::UnrecogniazedRGB(other.to_string()))?
 | 
			
		||||
            .into_format::<f32>(),
 | 
			
		||||
    );
 | 
			
		||||
    Ok(oklch.difference_relative(&other_oklch))
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
#[wasm_bindgen]
 | 
			
		||||
pub fn tint_scale(
 | 
			
		||||
    basic_color: &str,
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user