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
use crate::image::SubImage;
use embedded_graphics_core::{image::ImageDrawable, primitives::Rectangle};

/// Extension trait for image drawables.
pub trait ImageDrawableExt: Sized {
    /// Returns a sub image of this image drawable.
    ///
    /// If any of the given `area` lies outside the bounding box of the parent image, the
    /// intersection of `area` and the bounding box will be used.
    ///
    /// # Examples
    ///
    /// This example loads a raw image containing multiple 16x16px sprites and draws two of them to
    /// a display, with their top-left corners positioned at `(0, 0)` and `(32, 8)`.
    ///
    /// ```rust
    /// use embedded_graphics::{
    ///     image::{Image, ImageRaw, ImageRawBE},
    ///     pixelcolor::Rgb565,
    ///     prelude::*,
    ///     primitives::Rectangle,
    /// };
    /// # use embedded_graphics::mock_display::MockDisplay as Display;
    /// # let mut display: Display<Rgb565> = Display::default();
    ///
    /// let data = [ 0xF8, 0x00, 0x07, 0xE0, 0xFF, 0xE0, /* ... */ ];
    /// // or: let data = include_bytes!("sprite_atlas.raw");
    ///
    /// # let data = [0u8; 32 * 16 * 2];
    /// let sprite_atlas = ImageRawBE::<Rgb565>::new(&data, 32);
    ///
    /// let sprite_1 = sprite_atlas.sub_image(&Rectangle::new(Point::new(0, 0), Size::new(16, 16)));
    /// let sprite_2 = sprite_atlas.sub_image(&Rectangle::new(Point::new(16, 0), Size::new(16, 16)));
    ///
    /// Image::new(&sprite_1, Point::new(0, 0)).draw(&mut display)?;
    /// Image::new(&sprite_2, Point::new(32, 8)).draw(&mut display)?;
    ///
    /// # Ok::<(), core::convert::Infallible>(())
    /// ```
    fn sub_image(&self, area: &Rectangle) -> SubImage<Self>;
}

impl<T> ImageDrawableExt for T
where
    T: ImageDrawable,
{
    fn sub_image(&self, area: &Rectangle) -> SubImage<T> {
        SubImage::new(self, area)
    }
}