Skip to main content

freya_core/style/
fill.rs

1use std::fmt::{
2    self,
3    Pointer,
4};
5
6use freya_engine::prelude::Paint;
7use torin::prelude::Area;
8
9use crate::{
10    prelude::Color,
11    style::{
12        gradient::{
13            ConicGradient,
14            LinearGradient,
15            RadialGradient,
16        },
17        shader::ShaderFill,
18    },
19};
20
21#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
22#[derive(Clone, Debug, PartialEq)]
23pub enum Fill {
24    Color(Color),
25    Shader(Box<ShaderFill>),
26    LinearGradient(Box<LinearGradient>),
27    RadialGradient(Box<RadialGradient>),
28    ConicGradient(Box<ConicGradient>),
29}
30
31impl Fill {
32    pub fn set_a(&mut self, a: u8) {
33        if let Fill::Color(color) = self {
34            // Only actually change the alpha if its non-transparent
35            if *color != Color::TRANSPARENT {
36                *color = color.with_a(a);
37            }
38        }
39    }
40
41    pub fn apply_to_paint(&self, paint: &mut Paint, area: Area) {
42        match &self {
43            Fill::Color(color) => {
44                paint.set_color(*color);
45            }
46            Fill::LinearGradient(gradient) => {
47                paint.set_shader(gradient.prepare_shader(area));
48            }
49            Fill::RadialGradient(gradient) => {
50                paint.set_shader(gradient.prepare_shader(area));
51            }
52            Fill::ConicGradient(gradient) => {
53                paint.set_shader(gradient.prepare_shader(area));
54            }
55            Fill::Shader(shader) => {
56                paint.set_shader(shader.prepare_shader(area));
57            }
58        }
59    }
60}
61
62impl Default for Fill {
63    fn default() -> Self {
64        Self::Color(Color::default())
65    }
66}
67
68impl From<Color> for Fill {
69    fn from(color: Color) -> Self {
70        Fill::Color(color)
71    }
72}
73
74impl fmt::Display for Fill {
75    fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result {
76        match self {
77            Self::Color(color) => color.fmt(f),
78            Self::Shader(shader) => shader.as_ref().fmt(f),
79            Self::LinearGradient(gradient) => gradient.as_ref().fmt(f),
80            Self::RadialGradient(gradient) => gradient.as_ref().fmt(f),
81            Self::ConicGradient(gradient) => gradient.as_ref().fmt(f),
82        }
83    }
84}