pub const DEFAULT_MAX_SOURCE_BYTES: u64 = 64 * 1024 * 1024;
pub const DEFAULT_MAX_PIXELS: u64 = 100_000_000;
pub const DEFAULT_MAX_DECODE_RATIO: u64 = 256;
#[derive(Debug, Clone)]
pub struct Config {
pub max_source_bytes: u64,
pub max_pixels: u64,
pub max_decode_ratio: u64,
}
impl Default for Config {
fn default() -> Self {
Self {
max_source_bytes: DEFAULT_MAX_SOURCE_BYTES,
max_pixels: DEFAULT_MAX_PIXELS,
max_decode_ratio: DEFAULT_MAX_DECODE_RATIO,
}
}
}
impl Config {
#[must_use]
pub fn with_max_source_bytes(mut self, max_source_bytes: u64) -> Self {
self.max_source_bytes = max_source_bytes;
self
}
#[must_use]
pub fn with_max_pixels(mut self, max_pixels: u64) -> Self {
self.max_pixels = max_pixels;
self
}
#[must_use]
pub fn with_max_decode_ratio(mut self, max_decode_ratio: u64) -> Self {
self.max_decode_ratio = max_decode_ratio;
self
}
pub(crate) fn image_limits(&self) -> image::Limits {
let mut limits = image::Limits::default();
limits.max_image_width = Some(self.max_dimension());
limits.max_image_height = Some(self.max_dimension());
limits.max_alloc = Some(self.max_pixels.saturating_mul(16));
limits
}
fn max_dimension(&self) -> u32 {
u32::try_from(self.max_pixels.min(u64::from(u32::MAX)))
.unwrap_or(u32::MAX)
.max(1)
}
}