x-graphics 0.2.1

Graphics framework for X
Documentation
use windows::Win32::Graphics::{
    Direct2D::{
        Common::D2D1_COLOR_F, ID2D1SolidColorBrush, D2D1_CAP_STYLE, D2D1_CAP_STYLE_FLAT, D2D1_CAP_STYLE_ROUND, D2D1_CAP_STYLE_SQUARE, D2D1_LINE_JOIN,
        D2D1_LINE_JOIN_BEVEL, D2D1_LINE_JOIN_MITER, D2D1_LINE_JOIN_ROUND,
    },
    DirectWrite::IDWriteTextFormat,
};

use crate::{
    brush::BrushBackend,
    paint::{Cap, Color, Join, Paint},
};

#[derive(Clone, Debug, Default)]
pub(crate) struct PaintCache {
    text_format: Option<IDWriteTextFormat>,
    text_brush: Option<ID2D1SolidColorBrush>,
}

impl PaintCache {
    pub(crate) fn clear_font(&mut self) {
        self.text_format = None;
    }
}

impl<TBrush: BrushBackend> Paint<TBrush> {
    pub(super) fn get_text_format(&mut self) -> Option<&IDWriteTextFormat> {
        self.cache().text_format.as_ref()
    }

    pub(super) fn set_text_format(&mut self, text_format: IDWriteTextFormat) {
        self.cache_mut().text_format = Some(text_format);
    }

    pub(super) fn get_text_brush(&self) -> Option<&ID2D1SolidColorBrush> {
        self.cache().text_brush.as_ref()
    }

    pub(super) fn set_text_brush(&mut self, brush: ID2D1SolidColorBrush) {
        self.cache_mut().text_brush = Some(brush);
    }

    pub(super) fn clear_text_brush(&mut self) {
        self.cache_mut().text_brush = None;
    }
}

impl From<Cap> for D2D1_CAP_STYLE {
    fn from(cap: Cap) -> Self {
        match cap {
            Cap::Butt => D2D1_CAP_STYLE_FLAT,
            Cap::Round => D2D1_CAP_STYLE_ROUND,
            Cap::Square => D2D1_CAP_STYLE_SQUARE,
        }
    }
}

impl From<Join> for D2D1_LINE_JOIN {
    fn from(join: Join) -> Self {
        match join {
            Join::Miter => D2D1_LINE_JOIN_MITER,
            Join::Round => D2D1_LINE_JOIN_ROUND,
            Join::Bevel => D2D1_LINE_JOIN_BEVEL,
        }
    }
}

impl From<Color> for D2D1_COLOR_F {
    fn from(color: Color) -> Self {
        let (r, g, b, a) = color.get_float_value();
        D2D1_COLOR_F {
            r,
            g,
            b,
            a,
        }
    }
}