embedded_menu/adapters/
color_map.rs1use embedded_graphics::{
2 pixelcolor::BinaryColor,
3 prelude::{Dimensions, DrawTarget, PixelColor},
4 primitives::{ContainsPoint, Rectangle},
5 Pixel,
6};
7
8pub struct ColorMappingOverlay<'a, T, S, C> {
9 parent: &'a mut T,
10 area: S,
11 on_color: C,
12 off_color: C,
13}
14
15impl<T, S, C> Dimensions for ColorMappingOverlay<'_, T, S, C>
16where
17 T: Dimensions,
18{
19 fn bounding_box(&self) -> Rectangle {
20 self.parent.bounding_box()
21 }
22}
23
24impl<T, S, C> DrawTarget for ColorMappingOverlay<'_, T, S, C>
25where
26 T: DrawTarget<Color = C>,
27 S: ContainsPoint,
28 C: PixelColor,
29{
30 type Color = BinaryColor;
31 type Error = T::Error;
32
33 fn draw_iter<I>(&mut self, pixels: I) -> Result<(), Self::Error>
34 where
35 I: IntoIterator<Item = Pixel<BinaryColor>>,
36 {
37 self.parent
38 .draw_iter(pixels.into_iter().map(|Pixel(pos, color)| {
39 let color = if self.area.contains(pos) ^ (color == BinaryColor::On) {
40 self.on_color
41 } else {
42 self.off_color
43 };
44
45 Pixel(pos, color)
46 }))
47 }
48}
49
50pub trait BinaryColorDrawTargetExt: Sized {
51 fn map_colors<S, C>(&mut self, area: &S, on: C, off: C) -> ColorMappingOverlay<'_, Self, S, C>
52 where
53 S: Clone + ContainsPoint,
54 C: PixelColor;
55}
56
57impl<T> BinaryColorDrawTargetExt for T
58where
59 T: DrawTarget,
60{
61 fn map_colors<S, C>(&mut self, area: &S, on: C, off: C) -> ColorMappingOverlay<'_, Self, S, C>
62 where
63 S: Clone + ContainsPoint,
64 C: PixelColor,
65 {
66 ColorMappingOverlay {
67 parent: self,
68 area: area.clone(),
69 on_color: on,
70 off_color: off,
71 }
72 }
73}