diff options
| author | HampusM <hampus@hampusmat.com> | 2026-07-16 17:04:08 +0200 |
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2026-07-16 17:04:08 +0200 |
| commit | 36ac75583923692e3a12f9d2e7e8f2d7b9dc603a (patch) | |
| tree | 9ec7b420613de1efd25896463cd35e303c2f6295 /engine/src | |
| parent | 2ee2f0dfde751d9680748871644cdd21e2d95f22 (diff) | |
feat(engine): add fn for getting subview into image
Diffstat (limited to 'engine/src')
| -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 { |
