embedded_graphics/image/
image_drawable_ext.rs

1use crate::image::SubImage;
2use embedded_graphics_core::{image::ImageDrawable, primitives::Rectangle};
3
4/// Extension trait for image drawables.
5pub trait ImageDrawableExt: Sized {
6    /// Returns a sub image of this image drawable.
7    ///
8    /// If any of the given `area` lies outside the bounding box of the parent image, the
9    /// intersection of `area` and the bounding box will be used.
10    ///
11    /// # Examples
12    ///
13    /// This example loads a raw image containing multiple 16x16px sprites and draws two of them to
14    /// a display, with their top-left corners positioned at `(0, 0)` and `(32, 8)`.
15    ///
16    /// ```rust
17    /// use embedded_graphics::{
18    ///     image::{Image, ImageRaw, ImageRawBE},
19    ///     pixelcolor::Rgb565,
20    ///     prelude::*,
21    ///     primitives::Rectangle,
22    /// };
23    /// # use embedded_graphics::mock_display::MockDisplay as Display;
24    /// # let mut display: Display<Rgb565> = Display::default();
25    ///
26    /// let data = [ 0xF8, 0x00, 0x07, 0xE0, 0xFF, 0xE0, /* ... */ ];
27    /// // or: let data = include_bytes!("sprite_atlas.raw");
28    ///
29    /// # let data = [0u8; 32 * 16 * 2];
30    /// let sprite_atlas = ImageRawBE::<Rgb565>::new(&data, 32);
31    ///
32    /// let sprite_1 = sprite_atlas.sub_image(&Rectangle::new(Point::new(0, 0), Size::new(16, 16)));
33    /// let sprite_2 = sprite_atlas.sub_image(&Rectangle::new(Point::new(16, 0), Size::new(16, 16)));
34    ///
35    /// Image::new(&sprite_1, Point::new(0, 0)).draw(&mut display)?;
36    /// Image::new(&sprite_2, Point::new(32, 8)).draw(&mut display)?;
37    ///
38    /// # Ok::<(), core::convert::Infallible>(())
39    /// ```
40    fn sub_image(&self, area: &Rectangle) -> SubImage<Self>;
41}
42
43impl<T> ImageDrawableExt for T
44where
45    T: ImageDrawable,
46{
47    fn sub_image(&self, area: &Rectangle) -> SubImage<T> {
48        SubImage::new(self, area)
49    }
50}