diff --git a/src/lib.rs b/src/lib.rs index 5a3a790..5bd64e1 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -285,16 +285,16 @@ where } } -#[cfg(feature = "graphics")] -use embedded_graphics::drawable; #[cfg(feature = "graphics")] use embedded_graphics::{ drawable::Pixel, - geometry::Size, + geometry::{Point, Size}, pixelcolor::{ raw::{RawData, RawU16}, Rgb565, }, + primitives::Rectangle, + style::{PrimitiveStyle, Styled}, DrawTarget, }; @@ -314,7 +314,7 @@ where fn draw_pixel(&mut self, pixel: Pixel) -> Result<(), Self::Error> { let Pixel(pos, color) = pixel; - if pos.x < 0 || pos.y < 0 || pos.x > self.width as i32 || pos.y > self.height as i32 { + if pos.x < 0 || pos.y < 0 || pos.x >= self.width as i32 || pos.y >= self.height as i32 { return Ok(()); } @@ -326,6 +326,43 @@ where &[RawU16::from(color).into_inner()], ) } + fn draw_rectangle( + &mut self, + item: &Styled>, + ) -> Result<(), Self::Error> { + let Point { x: x0, y: y0 } = item.primitive.top_left; + let Point { x: x1, y: y1 } = item.primitive.bottom_right; + let w = self.width as i32; + let h = self.height as i32; + if x0 >= w || y0 >= h { + return Ok(()); + } + fn clamp(v: i32, max: i32) -> u16 { + if v < 0 { + 0 + } else if v > max { + max as u16 + } else { + v as u16 + } + } + let x0 = clamp(x0, w - 1); + let y0 = clamp(y0, h - 1); + let x1 = clamp(x1, w - 1); + let y1 = clamp(y1, h - 1); + self.draw_iter( + x0, + y0, + x1, + y1, + item.into_iter() + .filter(|p| { + let Point { x, y } = p.0; + x >= 0 && y >= 0 && x < w && y < h + }) + .map(|p| RawU16::from(p.1).into_inner()), + ) + } } #[derive(Clone, Copy)]