summaryrefslogtreecommitdiff
path: root/src/env/image.rs
diff options
context:
space:
mode:
authorLaurenz <laurmaedje@gmail.com>2021-04-23 17:46:14 +0200
committerLaurenz <laurmaedje@gmail.com>2021-04-23 17:46:14 +0200
commit6292d25afb3080f606844d7e03fec5c80f0140ff (patch)
tree8d2495edccaa6bdaaa4d012be18df15788c640d0 /src/env/image.rs
parent72478946c261f04754c11f8a6abf6eb0f43dea31 (diff)
Reengineer font and resource loading 🏞
Diffstat (limited to 'src/env/image.rs')
-rw-r--r--src/env/image.rs40
1 files changed, 40 insertions, 0 deletions
diff --git a/src/env/image.rs b/src/env/image.rs
new file mode 100644
index 00000000..4bdb5483
--- /dev/null
+++ b/src/env/image.rs
@@ -0,0 +1,40 @@
+use std::fmt::{self, Debug, Formatter};
+use std::io::Cursor;
+
+use image::io::Reader as ImageReader;
+use image::{DynamicImage, GenericImageView, ImageFormat};
+
+use super::Buffer;
+
+/// A loaded image resource.
+pub struct ImageResource {
+ /// The original format the image was encoded in.
+ pub format: ImageFormat,
+ /// The decoded image.
+ pub buf: DynamicImage,
+}
+
+impl ImageResource {
+ /// Parse an image resource from raw data in a supported format.
+ ///
+ /// The image format is determined automatically.
+ pub fn parse(data: Buffer) -> Option<Self> {
+ let cursor = Cursor::new(data.as_ref());
+ let reader = ImageReader::new(cursor).with_guessed_format().ok()?;
+ let format = reader.format()?;
+ let buf = reader.decode().ok()?;
+ Some(Self { format, buf })
+ }
+}
+
+impl Debug for ImageResource {
+ fn fmt(&self, f: &mut Formatter) -> fmt::Result {
+ let (width, height) = self.buf.dimensions();
+ f.debug_struct("ImageResource")
+ .field("format", &self.format)
+ .field("color", &self.buf.color())
+ .field("width", &width)
+ .field("height", &height)
+ .finish()
+ }
+}