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.rs58
1 files changed, 53 insertions, 5 deletions
diff --git a/engine/src/image.rs b/engine/src/image.rs
index dbcad9d..51ba459 100644
--- a/engine/src/image.rs
+++ b/engine/src/image.rs
@@ -1,6 +1,6 @@
use std::any::type_name;
use std::fs::File;
-use std::io::BufReader;
+use std::io::{BufRead, BufReader, Seek};
use std::path::Path;
use image_rs::GenericImageView as _;
@@ -19,8 +19,7 @@ impl Image
{
pub fn open(path: impl AsRef<Path>) -> Result<Self, Error>
{
- let buffered_reader =
- BufReader::new(File::open(&path).map_err(Error::ReadFailed)?);
+ let buffered_reader = BufReader::new(File::open(&path).map_err(Error::Io)?);
let image_reader = image_rs::ImageReader::with_format(
buffered_reader,
@@ -35,6 +34,20 @@ impl Image
})
}
+ pub fn from_reader(reader: impl BufRead + Seek, format: Format)
+ -> Result<Self, Error>
+ {
+ let image_reader =
+ image_rs::ImageReader::with_format(reader, format.into_image_rs());
+
+ Ok(Self {
+ inner: image_reader
+ .decode()
+ // TODO: err might be other errors than decode errors here
+ .map_err(|err| Error::DecodeFailed(DecodeError(err)))?,
+ })
+ }
+
pub fn try_from_bytes(
bytes: &[u8],
dimens: Dimens<u32>,
@@ -121,10 +134,24 @@ impl Image
Self { inner: self.inner.to_rgba8().into() }
}
+ /// Consumes the image and returns a RGBA8 image. If it already is RGBA8, the image is
+ /// returned as is. If not, the image is converted to RGBA8.
+ pub fn into_rgba8(self) -> Self
+ {
+ Self {
+ inner: self.inner.into_rgba8().into(),
+ }
+ }
+
pub fn as_bytes(&self) -> &[u8]
{
self.inner.as_bytes()
}
+
+ pub fn into_bytes(self) -> Vec<u8>
+ {
+ self.inner.into_bytes()
+ }
}
/// An enumeration over supported color types and bit depths
@@ -185,11 +212,32 @@ impl From<image_rs::ColorType> for ColorType
}
}
+#[derive(Clone, Copy, PartialEq, Eq, Debug, Hash)]
+#[non_exhaustive]
+pub enum Format
+{
+ Png,
+ Jpeg,
+ Ico,
+}
+
+impl Format
+{
+ fn into_image_rs(self) -> image_rs::ImageFormat
+ {
+ match self {
+ Self::Png => image_rs::ImageFormat::Png,
+ Self::Jpeg => image_rs::ImageFormat::Jpeg,
+ Self::Ico => image_rs::ImageFormat::Ico,
+ }
+ }
+}
+
#[derive(Debug, thiserror::Error)]
pub enum Error
{
- #[error("Failed to read file")]
- ReadFailed(#[source] std::io::Error),
+ #[error("I/O error")]
+ Io(#[source] std::io::Error),
#[error("Failed to decode image")]
DecodeFailed(DecodeError),