Skip to main content

gamut_webp/
config.rs

1//! Encoder configuration: lossless vs. lossy selection and the quality knob.
2
3/// Which WebP bitstream the encoder produces.
4#[derive(Debug, Clone, Copy, PartialEq, Eq, Default)]
5pub enum WebpMode {
6    /// VP8L lossless coding — the input is reproduced bit-exactly (the default; gamut's M0 path).
7    #[default]
8    Lossless,
9    /// VP8 lossy coding — smaller output at a quality/size tradeoff set by [`WebpConfig::quality`].
10    Lossy,
11}
12
13/// Configuration for a [`WebpEncoder`](crate::WebpEncoder).
14///
15/// `quality` ranges `0..=100`. For [`WebpMode::Lossy`] it is the usual quality factor (higher =
16/// larger, closer to the source); for [`WebpMode::Lossless`] it is interpreted as an effort level
17/// (higher = smaller output, more work). It is ignored where a mode does not use it.
18#[derive(Debug, Clone, Copy, PartialEq, Eq)]
19pub struct WebpConfig {
20    /// The bitstream mode to encode.
21    pub mode: WebpMode,
22    /// Quality / effort, `0..=100`.
23    pub quality: u8,
24}
25
26impl Default for WebpConfig {
27    fn default() -> Self {
28        Self {
29            mode: WebpMode::Lossless,
30            quality: 75,
31        }
32    }
33}
34
35#[cfg(test)]
36mod tests {
37    use super::*;
38
39    #[test]
40    fn default_is_lossless_quality_75() {
41        let c = WebpConfig::default();
42        assert_eq!(c.mode, WebpMode::Lossless);
43        assert_eq!(c.quality, 75);
44        assert_eq!(WebpMode::default(), WebpMode::Lossless);
45    }
46}