From 36ac75583923692e3a12f9d2e7e8f2d7b9dc603a Mon Sep 17 00:00:00 2001 From: HampusM Date: Thu, 16 Jul 2026 17:04:08 +0200 Subject: feat(engine): add fn for getting subview into image --- engine/src/image.rs | 72 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 72 insertions(+) (limited to 'engine') 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, size: Dimens) -> 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, + size: Dimens, +} + +impl SubView<'_> +{ + pub fn to_image(&self) -> Image + { + fn create_sub_image( + image: Image, + sub_view: &SubView<'_>, + ) -> image_rs::SubImage + { + 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 { -- cgit v1.2.3-18-g5258