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)
}
}