diff options
| author | HampusM <hampus@hampusmat.com> | 2026-07-05 18:49:06 +0200 |
|---|---|---|
| committer | HampusM <hampus@hampusmat.com> | 2026-07-05 18:49:06 +0200 |
| commit | cca13077329c2c42f456c573ba9e094f1195efe9 (patch) | |
| tree | bce3de83fdee039f1c25068984b2d1eb6d9e3bc7 /engine/src/image.rs | |
| parent | 237107c971707d297c1f2d3e536ca52289ae4206 (diff) | |
feat(engine): add icon to window creation attributes
Diffstat (limited to 'engine/src/image.rs')
| -rw-r--r-- | engine/src/image.rs | 58 |
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), |
