use core_graphics::{
context::{CGBlendMode, CGPathDrawingMode},
path::{CGLineCap, CGLineJoin},
};
use super::font::Font;
use crate::{brush::BrushBackend, paint::*, path::FillType};
#[derive(Clone, Debug, Default)]
pub(crate) struct PaintCache {
font: Option<Font>,
}
impl PaintCache {
pub(crate) fn clear_font(&mut self) {
self.font = None;
}
}
impl<TBrush: BrushBackend> Paint<TBrush> {
pub(super) fn draw_mode(&mut self, fill_type: FillType) -> CGPathDrawingMode {
match (self.get_draw_mode(), fill_type) {
(DrawMode::Fill, FillType::Winding) => CGPathDrawingMode::Fill,
(DrawMode::Fill, FillType::EvenOdd) => CGPathDrawingMode::EOFill,
(DrawMode::Stroke, _) => CGPathDrawingMode::Stroke,
(DrawMode::FillStroke, FillType::Winding) => CGPathDrawingMode::FillStroke,
(DrawMode::FillStroke, FillType::EvenOdd) => CGPathDrawingMode::EOFillStroke,
}
}
pub(super) fn font(&mut self) -> &Font {
if self.cache().font.is_none() {
self.cache_mut().font = Some(Font::new(self.get_font_family(), self.get_font_style(), self.get_font_weight(), self.get_font_size()));
}
self.cache().font.as_ref().unwrap()
}
}
impl From<BlendMode> for CGBlendMode {
fn from(blend_mode: BlendMode) -> Self {
match blend_mode {
BlendMode::SourceOver => CGBlendMode::Normal,
BlendMode::DestinationOver => CGBlendMode::DestinationOver,
BlendMode::Source => CGBlendMode::Copy,
BlendMode::SourceIn => CGBlendMode::SourceIn,
BlendMode::DestinationIn => CGBlendMode::DestinationIn,
BlendMode::SourceOut => CGBlendMode::SourceOut,
BlendMode::DestinationOut => CGBlendMode::DestinationOut,
BlendMode::SourceAtop => CGBlendMode::SourceAtop,
BlendMode::DestinationAtop => CGBlendMode::DestinationAtop,
BlendMode::Clear => CGBlendMode::Clear,
BlendMode::Xor => CGBlendMode::XOR,
BlendMode::Multiply => CGBlendMode::Multiply,
BlendMode::Screen => CGBlendMode::Screen,
BlendMode::Overlay => CGBlendMode::Overlay,
BlendMode::Darken => CGBlendMode::Darken,
BlendMode::Lighten => CGBlendMode::Lighten,
BlendMode::ColorDodge => CGBlendMode::ColorDodge,
BlendMode::ColorBurn => CGBlendMode::ColorBurn,
BlendMode::SoftLight => CGBlendMode::SoftLight,
BlendMode::HardLight => CGBlendMode::HardLight,
BlendMode::Difference => CGBlendMode::Difference,
BlendMode::Exclusion => CGBlendMode::Exclusion,
BlendMode::Hue => CGBlendMode::Hue,
BlendMode::Saturation => CGBlendMode::Saturation,
BlendMode::Color => CGBlendMode::Color,
BlendMode::Luminosity => CGBlendMode::Luminosity,
}
}
}
impl From<Cap> for CGLineCap {
fn from(cap: Cap) -> Self {
match cap {
Cap::Butt => CGLineCap::Butt,
Cap::Round => CGLineCap::Round,
Cap::Square => CGLineCap::Square,
}
}
}
impl From<Join> for CGLineJoin {
fn from(join: Join) -> Self {
match join {
Join::Miter => CGLineJoin::Miter,
Join::Round => CGLineJoin::Round,
Join::Bevel => CGLineJoin::Bevel,
}
}
}