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,
}
}
}