1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
use embedded_graphics_core::prelude::{DrawTarget, Point, Size};
use embedded_graphics_core::primitives::Rectangle;
use embedded_graphics_core::{prelude::OriginDimensions, Pixel};
use embedded_hal::digital::v2::OutputPin;
use crate::models::Model;
use crate::{Display, Error};
use display_interface::WriteOnlyDataCommand;
impl<DI, M, RST> DrawTarget for Display<DI, M, RST>
where
DI: WriteOnlyDataCommand,
M: Model,
RST: OutputPin,
{
type Error = Error;
type Color = M::ColorFormat;
#[cfg(not(feature = "batch"))]
fn draw_iter<I>(&mut self, pixels: I) -> Result<(), Self::Error>
where
I: IntoIterator<Item = Pixel<Self::Color>>,
{
for pixel in pixels {
let x = pixel.0.x as u16;
let y = pixel.0.y as u16;
self.set_pixel(x, y, pixel.1)?;
}
Ok(())
}
#[cfg(feature = "batch")]
fn draw_iter<T>(&mut self, item: T) -> Result<(), Self::Error>
where
T: IntoIterator<Item = Pixel<Self::Color>>,
{
use crate::batch::DrawBatch;
self.draw_batch(item)
}
fn fill_contiguous<I>(&mut self, area: &Rectangle, colors: I) -> Result<(), Self::Error>
where
I: IntoIterator<Item = Self::Color>,
{
if let Some(bottom_right) = area.bottom_right() {
let mut count = 0u32;
let max = area.size.width * area.size.height;
let mut colors = colors.into_iter().take_while(|_| {
count += 1;
count <= max
});
let sx = area.top_left.x as u16;
let sy = area.top_left.y as u16;
let ex = bottom_right.x as u16;
let ey = bottom_right.y as u16;
self.set_pixels(sx, sy, ex, ey, &mut colors)
} else {
Ok(())
}
}
fn fill_solid(&mut self, area: &Rectangle, color: Self::Color) -> Result<(), Self::Error> {
let fb_size = self.options.framebuffer_size();
let fb_rect = Rectangle::with_corners(
Point::new(0, 0),
Point::new(fb_size.0 as i32 - 1, fb_size.1 as i32 - 1),
);
let area = area.intersection(&fb_rect);
if let Some(bottom_right) = area.bottom_right() {
let mut count = 0u32;
let max = area.size.width * area.size.height;
let mut colors = core::iter::repeat(color).take_while(|_| {
count += 1;
count <= max
});
let sx = area.top_left.x as u16;
let sy = area.top_left.y as u16;
let ex = bottom_right.x as u16;
let ey = bottom_right.y as u16;
self.set_pixels(sx, sy, ex, ey, &mut colors)
} else {
Ok(())
}
}
fn clear(&mut self, color: Self::Color) -> Result<(), Self::Error> {
let fb_size = self.options.framebuffer_size();
let pixel_count = usize::from(fb_size.0) * usize::from(fb_size.1);
let colors = core::iter::repeat(color).take(pixel_count); self.set_pixels(0, 0, fb_size.0 - 1, fb_size.1 - 1, colors)
}
}
impl<DI, MODEL, RST> OriginDimensions for Display<DI, MODEL, RST>
where
DI: WriteOnlyDataCommand,
MODEL: Model,
RST: OutputPin,
{
fn size(&self) -> Size {
let ds = self.options.display_size();
let (width, height) = (u32::from(ds.0), u32::from(ds.1));
Size::new(width, height)
}
}