use crate::ConfigAction;
use crate::text::fonts::FontSelector;
use crate::theme::TextClass;
use std::collections::BTreeMap;
#[derive(Clone, Debug)]
#[non_exhaustive]
pub enum FontConfigMsg {
Size(f32),
}
#[derive(Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct FontConfig {
#[cfg_attr(feature = "serde", serde(default = "defaults::size"))]
size: f32,
#[cfg_attr(feature = "serde", serde(default = "defaults::fonts"))]
fonts: BTreeMap<TextClass, FontSelector>,
#[cfg_attr(feature = "serde", serde(default))]
raster: RasterConfig,
}
impl Default for FontConfig {
fn default() -> Self {
FontConfig {
size: defaults::size(),
fonts: defaults::fonts(),
raster: Default::default(),
}
}
}
#[derive(Clone, Copy, Debug, Default, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum SubpixelMode {
#[default]
None,
HorizontalRGB,
}
impl SubpixelMode {
pub fn any_subpixel(self) -> bool {
self != SubpixelMode::None
}
}
#[derive(Clone, Debug, PartialEq, Eq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct RasterConfig {
#[cfg_attr(feature = "serde", serde(default = "defaults::mode"))]
pub mode: u8,
#[cfg_attr(feature = "serde", serde(default = "defaults::subpixel_threshold"))]
pub subpixel_threshold: u8,
#[cfg_attr(feature = "serde", serde(default = "defaults::subpixel_x_steps"))]
pub subpixel_x_steps: u8,
pub subpixel_mode: SubpixelMode,
}
impl Default for RasterConfig {
fn default() -> Self {
RasterConfig {
mode: defaults::mode(),
subpixel_threshold: defaults::subpixel_threshold(),
subpixel_x_steps: defaults::subpixel_x_steps(),
subpixel_mode: Default::default(),
}
}
}
impl FontConfig {
#[inline]
pub fn get_dpem(&self, class: TextClass) -> f32 {
if class != TextClass::Small {
self.size
} else {
self.size * 0.8
}
}
#[inline]
pub fn get_font_selector(&self, class: TextClass) -> FontSelector {
self.fonts.get(&class).cloned().unwrap_or_default()
}
}
impl FontConfig {
pub fn set_size(&mut self, pt_size: f32) -> ConfigAction {
if self.size != pt_size {
self.size = pt_size;
ConfigAction::THEME
} else {
ConfigAction::empty()
}
}
}
impl FontConfig {
pub(super) fn init(&self) {}
#[inline]
pub fn raster(&self) -> &RasterConfig {
&self.raster
}
}
mod defaults {
use kas_text::fonts::FamilySelector;
use super::*;
pub fn size() -> f32 {
16.0
}
pub fn fonts() -> BTreeMap<TextClass, FontSelector> {
let list = [
(TextClass::Serif, FamilySelector::SERIF.into()),
(TextClass::SansSerif, FamilySelector::SANS_SERIF.into()),
(TextClass::Monospace, FamilySelector::MONOSPACE.into()),
];
list.into_iter().collect()
}
pub fn mode() -> u8 {
4
}
pub fn subpixel_threshold() -> u8 {
18
}
pub fn subpixel_x_steps() -> u8 {
3
}
}