ferroui_base/media/
render_options.rs1use crate::media::imaging::{BitmapBlendingMode, BitmapInterpolationMode};
2use crate::media::{EdgeMode, TextRenderingMode};
3use crate::Visual;
4
5#[derive(Clone, Copy, Debug, Default, PartialEq, Eq, Hash)]
9pub struct RenderOptions {
10 pub text_rendering_mode: TextRenderingMode,
12 pub bitmap_interpolation_mode: BitmapInterpolationMode,
14 pub edge_mode: EdgeMode,
16 pub bitmap_blending_mode: BitmapBlendingMode,
18 pub requires_full_opacity_handling: Option<bool>,
20}
21
22impl RenderOptions {
23 pub fn get_bitmap_interpolation_mode(visual: &Visual) -> BitmapInterpolationMode {
26 visual.render_options().bitmap_interpolation_mode
27 }
28
29 pub fn set_bitmap_interpolation_mode(visual: &Visual, value: BitmapInterpolationMode) {
32 visual.set_render_options(RenderOptions { bitmap_interpolation_mode: value, ..visual.render_options() });
33 }
34
35 pub fn get_bitmap_blending_mode(visual: &Visual) -> BitmapBlendingMode {
38 visual.render_options().bitmap_blending_mode
39 }
40
41 pub fn set_bitmap_blending_mode(visual: &Visual, value: BitmapBlendingMode) {
44 visual.set_render_options(RenderOptions { bitmap_blending_mode: value, ..visual.render_options() });
45 }
46
47 pub fn get_edge_mode(visual: &Visual) -> EdgeMode {
49 visual.render_options().edge_mode
50 }
51
52 pub fn set_edge_mode(visual: &Visual, value: EdgeMode) {
54 visual.set_render_options(RenderOptions { edge_mode: value, ..visual.render_options() });
55 }
56
57 pub fn get_text_rendering_mode(visual: &Visual) -> TextRenderingMode {
60 visual.render_options().text_rendering_mode
61 }
62
63 pub fn set_text_rendering_mode(visual: &Visual, value: TextRenderingMode) {
66 visual.set_render_options(RenderOptions { text_rendering_mode: value, ..visual.render_options() });
67 }
68
69 pub fn get_requires_full_opacity_handling(visual: &Visual) -> Option<bool> {
72 visual.render_options().requires_full_opacity_handling
73 }
74
75 pub fn set_requires_full_opacity_handling(visual: &Visual, value: Option<bool>) {
78 visual.set_render_options(RenderOptions { requires_full_opacity_handling: value, ..visual.render_options() });
79 }
80
81 pub fn merge_with(&self, other: RenderOptions) -> RenderOptions {
84 let mut bitmap_interpolation_mode = self.bitmap_interpolation_mode;
85 if bitmap_interpolation_mode == BitmapInterpolationMode::Unspecified {
86 bitmap_interpolation_mode = other.bitmap_interpolation_mode;
87 }
88
89 let mut edge_mode = self.edge_mode;
90 if edge_mode == EdgeMode::Unspecified {
91 edge_mode = other.edge_mode;
92 }
93
94 let mut text_rendering_mode = self.text_rendering_mode;
95 if text_rendering_mode == TextRenderingMode::Unspecified {
96 text_rendering_mode = other.text_rendering_mode;
97 }
98
99 let mut bitmap_blending_mode = self.bitmap_blending_mode;
100 if bitmap_blending_mode == BitmapBlendingMode::Unspecified {
101 bitmap_blending_mode = other.bitmap_blending_mode;
102 }
103
104 let requires_full_opacity_handling =
105 self.requires_full_opacity_handling.or(other.requires_full_opacity_handling);
106
107 RenderOptions {
108 bitmap_interpolation_mode,
109 edge_mode,
110 text_rendering_mode,
111 bitmap_blending_mode,
112 requires_full_opacity_handling,
113 }
114 }
115}
116
117#[cfg(test)]
118mod tests {
119 use super::*;
120
121 #[test]
122 fn merge_with_takes_unspecified_values_from_other() {
123 let a = RenderOptions { edge_mode: EdgeMode::Aliased, ..Default::default() };
124 let b = RenderOptions {
125 edge_mode: EdgeMode::Antialias,
126 bitmap_interpolation_mode: BitmapInterpolationMode::HighQuality,
127 requires_full_opacity_handling: Some(true),
128 ..Default::default()
129 };
130 let merged = a.merge_with(b);
131 assert_eq!(EdgeMode::Aliased, merged.edge_mode);
132 assert_eq!(BitmapInterpolationMode::HighQuality, merged.bitmap_interpolation_mode);
133 assert_eq!(Some(true), merged.requires_full_opacity_handling);
134 assert_eq!(TextRenderingMode::Unspecified, merged.text_rendering_mode);
135 }
136
137 #[test]
138 fn visual_accessors_update_one_option_each() {
139 let visual = Visual::new();
140 assert_eq!(BitmapInterpolationMode::Unspecified, RenderOptions::get_bitmap_interpolation_mode(&visual));
141
142 RenderOptions::set_bitmap_interpolation_mode(&visual, BitmapInterpolationMode::LowQuality);
143 RenderOptions::set_edge_mode(&visual, EdgeMode::Aliased);
144 RenderOptions::set_bitmap_blending_mode(&visual, BitmapBlendingMode::Multiply);
145 RenderOptions::set_text_rendering_mode(&visual, TextRenderingMode::Antialias);
146 RenderOptions::set_requires_full_opacity_handling(&visual, Some(true));
147
148 assert_eq!(BitmapInterpolationMode::LowQuality, RenderOptions::get_bitmap_interpolation_mode(&visual));
149 assert_eq!(EdgeMode::Aliased, RenderOptions::get_edge_mode(&visual));
150 assert_eq!(BitmapBlendingMode::Multiply, RenderOptions::get_bitmap_blending_mode(&visual));
151 assert_eq!(TextRenderingMode::Antialias, RenderOptions::get_text_rendering_mode(&visual));
152 assert_eq!(Some(true), RenderOptions::get_requires_full_opacity_handling(&visual));
153 }
154}