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}