diff options
| -rw-r--r-- | engine/src/image.rs | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/engine/src/image.rs b/engine/src/image.rs index 1dc129e..68eac65 100644 --- a/engine/src/image.rs +++ b/engine/src/image.rs @@ -115,6 +115,19 @@ impl Image } } + /// Returns a immutable view of a subsection of this image. + /// The `offset` argument sets the position of the top left corner of the view. + /// + /// # Panics + /// Panics if the view would be out of bounds + pub fn sub_view(&self, offset: Vec2<u32>, size: Dimens<u32>) -> SubView<'_> + { + assert!(offset.x + size.width <= self.dimensions().width); + assert!(offset.y + size.height <= self.dimensions().height); + + SubView { image: &self.inner, offset, size } + } + pub fn to_rgba8(&self) -> Self { Self { inner: self.inner.to_rgba8().into() } @@ -286,6 +299,65 @@ impl Format } } +pub struct SubView<'image> +{ + image: &'image image_rs::DynamicImage, + offset: Vec2<u32>, + size: Dimens<u32>, +} + +impl SubView<'_> +{ + pub fn to_image(&self) -> Image + { + fn create_sub_image<Image>( + image: Image, + sub_view: &SubView<'_>, + ) -> image_rs::SubImage<Image> + { + let SubView { image: _, offset, size } = sub_view; + + image_rs::SubImage::new(image, offset.x, offset.y, size.width, size.height) + } + + Image { + inner: match self.image { + image_rs::DynamicImage::ImageLuma8(image) => { + create_sub_image(image, self).to_image().into() + } + image_rs::DynamicImage::ImageLumaA8(image) => { + create_sub_image(image, self).to_image().into() + } + image_rs::DynamicImage::ImageRgb8(image) => { + create_sub_image(image, self).to_image().into() + } + image_rs::DynamicImage::ImageRgba8(image) => { + create_sub_image(image, self).to_image().into() + } + image_rs::DynamicImage::ImageLuma16(image) => { + create_sub_image(image, self).to_image().into() + } + image_rs::DynamicImage::ImageLumaA16(image) => { + create_sub_image(image, self).to_image().into() + } + image_rs::DynamicImage::ImageRgb16(image) => { + create_sub_image(image, self).to_image().into() + } + image_rs::DynamicImage::ImageRgba16(image) => { + create_sub_image(image, self).to_image().into() + } + image_rs::DynamicImage::ImageRgb32F(image) => { + create_sub_image(image, self).to_image().into() + } + image_rs::DynamicImage::ImageRgba32F(image) => { + create_sub_image(image, self).to_image().into() + } + _ => unimplemented!(), + }, + } + } +} + #[derive(Debug, thiserror::Error)] pub enum Error { |
