summaryrefslogtreecommitdiff
path: root/engine/src/image.rs
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/image.rs')
-rw-r--r--engine/src/image.rs72
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
{