embedded_menu/adapters/
color_map.rs

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