use fast_image_resize::FilterType as ResizeFilter;
use image::Rgb;
pub type ColorPalette<C> = Vec<C>;
#[derive(Debug, Clone)]
pub struct Settings {
pub size: Size,
pub characters: Characters,
pub colors: Colors,
pub advanced: Advanced,
}
impl Default for Settings {
fn default() -> Self {
Self {
size: Size::default(),
characters: Characters::default(),
colors: Colors::default(),
advanced: Advanced::default(),
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Size {
pub width: usize,
pub height: usize,
pub mode: SizeMode,
}
impl Default for Size {
fn default() -> Self {
Self {
width: 80,
height: 40,
mode: SizeMode::Fit,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum SizeMode {
Fit,
Exact,
}
#[derive(Debug, Clone)]
pub struct Characters {
pub mode: CharacterMode,
pub color_mode: ColorMode,
pub aspect_ratio: f32,
}
impl Default for Characters {
fn default() -> Self {
Self {
mode: CharacterMode::Ascii(AsciiCharSet::All),
color_mode: ColorMode::TwoColor,
aspect_ratio: 0.5,
}
}
}
#[derive(Debug, Clone)]
pub enum CharacterMode {
Ascii(AsciiCharSet),
Unicode(UnicodeCharSet),
Custom(Vec<char>),
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AsciiCharSet {
All,
NoSpace,
Az,
Nums,
Spec,
}
impl AsciiCharSet {
#[must_use]
pub const fn as_slice(&self) -> &'static [char] {
match self {
Self::All => crate::sets::ASCII_CHARS_ALL,
Self::NoSpace => crate::sets::ASCII_CHARS_NO_SPACE,
Self::Az => crate::sets::ASCII_CHARS_AZ,
Self::Nums => crate::sets::ASCII_CHARS_NUM,
Self::Spec => crate::sets::ASCII_CHARS_SPEC,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum UnicodeCharSet {
Full,
Half,
Quarter,
Shade,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum ColorMode {
OneColor,
TwoColor,
}
#[derive(Debug, Clone)]
pub struct Colors {
pub is_truecolor: bool,
pub palette: ColorPalette<Rgb<u8>>,
}
impl Default for Colors {
fn default() -> Self {
Self {
is_truecolor: true,
palette: vec![],
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct Advanced {
pub resize_filter: ResizeFilter,
pub dithering: Dithering,
pub compression: bool,
}
impl Default for Advanced {
fn default() -> Self {
Self {
resize_filter: ResizeFilter::Lanczos3,
dithering: Dithering::default(),
compression: true,
}
}
}
#[derive(Debug, Clone, Copy)]
pub struct Dithering {
pub is_enabled: bool,
pub matrix: DitherMatrix,
}
impl Default for Dithering {
fn default() -> Self {
Self {
is_enabled: true,
matrix: DitherMatrix::FloydSteinberg,
}
}
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum DitherMatrix {
FloydSteinberg,
JarvisJudiceNinke,
Stucki,
Burkes,
}