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