use compression_core::Level;
use mbrotli::{
BlockBits, BlockSize, CompressionMode, EncoderConfig, InputSize, Quality, StreamConfig, Window,
};
use std::convert::TryFrom;
#[derive(Debug, Clone, Copy, Default)]
pub struct EncoderParams {
config: EncoderConfig,
input_size: InputSize,
}
impl EncoderParams {
pub(crate) fn config(&self) -> EncoderConfig {
self.config
}
pub(crate) fn stream(&self) -> StreamConfig {
StreamConfig::from(self.input_size)
}
pub fn quality(mut self, level: Level) -> Self {
let quality = match level {
Level::Fastest => Quality::MIN,
Level::Best => Quality::MAX,
Level::Precise(quality) => {
let quality = quality.clamp(Quality::MIN.get().into(), Quality::MAX.get().into());
Quality::try_from(quality as u8).unwrap()
}
_ => Quality::default(),
};
self.config = self.config.with_quality(quality);
self
}
pub fn window_size(mut self, window_size: i32) -> Self {
let window = if window_size == 0 {
Window::DEFAULT
} else {
let bits = window_size.clamp(Window::MIN_BITS.into(), Window::MAX_STANDARD_BITS.into());
Window::standard(bits as u8).unwrap()
};
self.config = self.config.with_window(window);
self
}
pub fn block_size(mut self, block_size: i32) -> Self {
let bits = block_size.clamp(BlockBits::MIN.get().into(), BlockBits::MAX.get().into());
let bits = BlockBits::try_from(bits as u8).unwrap();
self.config = self.config.with_block_size(BlockSize::Bits(bits));
self
}
pub fn size_hint(mut self, size_hint: usize) -> Self {
self.input_size = InputSize::Exact(size_hint as u64);
self
}
pub fn text_mode(mut self) -> Self {
self.config = self.config.with_mode(CompressionMode::Text);
self
}
pub fn font_mode(mut self) -> Self {
self.config = self.config.with_mode(CompressionMode::Font);
self
}
}