x-graphics 0.2.1

Graphics framework for X
Documentation
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,
        }
    }
}