summaryrefslogtreecommitdiffstats
path: root/graphics/src/image.rs
diff options
context:
space:
mode:
Diffstat (limited to 'graphics/src/image.rs')
-rw-r--r--graphics/src/image.rs75
1 files changed, 50 insertions, 25 deletions
diff --git a/graphics/src/image.rs b/graphics/src/image.rs
index c6135e9e..318592be 100644
--- a/graphics/src/image.rs
+++ b/graphics/src/image.rs
@@ -2,9 +2,7 @@
#[cfg(feature = "image")]
pub use ::image as image_rs;
-use crate::core::image;
-use crate::core::svg;
-use crate::core::{Color, Rectangle};
+use crate::core::{image, svg, Color, Radians, Rectangle};
/// A raster or vector image.
#[derive(Debug, Clone, PartialEq)]
@@ -19,6 +17,12 @@ pub enum Image {
/// The bounds of the image.
bounds: Rectangle,
+
+ /// The rotation of the image.
+ rotation: Radians,
+
+ /// The opacity of the image.
+ opacity: f32,
},
/// A vector image.
Vector {
@@ -30,6 +34,12 @@ pub enum Image {
/// The bounds of the image.
bounds: Rectangle,
+
+ /// The rotation of the image.
+ rotation: Radians,
+
+ /// The opacity of the image.
+ opacity: f32,
},
}
@@ -37,9 +47,12 @@ impl Image {
/// Returns the bounds of the [`Image`].
pub fn bounds(&self) -> Rectangle {
match self {
- Image::Raster { bounds, .. } | Image::Vector { bounds, .. } => {
- *bounds
+ Image::Raster {
+ bounds, rotation, ..
}
+ | Image::Vector {
+ bounds, rotation, ..
+ } => bounds.rotate(*rotation),
}
}
}
@@ -50,7 +63,8 @@ impl Image {
/// [`Handle`]: image::Handle
pub fn load(
handle: &image::Handle,
-) -> ::image::ImageResult<::image::DynamicImage> {
+) -> ::image::ImageResult<::image::ImageBuffer<::image::Rgba<u8>, image::Bytes>>
+{
use bitflags::bitflags;
bitflags! {
@@ -100,8 +114,8 @@ pub fn load(
}
}
- match handle.data() {
- image::Data::Path(path) => {
+ let (width, height, pixels) = match handle {
+ image::Handle::Path(_, path) => {
let image = ::image::open(path)?;
let operation = std::fs::File::open(path)
@@ -110,33 +124,44 @@ pub fn load(
.and_then(|mut reader| Operation::from_exif(&mut reader).ok())
.unwrap_or_else(Operation::empty);
- Ok(operation.perform(image))
+ let rgba = operation.perform(image).into_rgba8();
+
+ (
+ rgba.width(),
+ rgba.height(),
+ image::Bytes::from(rgba.into_raw()),
+ )
}
- image::Data::Bytes(bytes) => {
+ image::Handle::Bytes(_, bytes) => {
let image = ::image::load_from_memory(bytes)?;
let operation =
Operation::from_exif(&mut std::io::Cursor::new(bytes))
.ok()
.unwrap_or_else(Operation::empty);
- Ok(operation.perform(image))
+ let rgba = operation.perform(image).into_rgba8();
+
+ (
+ rgba.width(),
+ rgba.height(),
+ image::Bytes::from(rgba.into_raw()),
+ )
}
- image::Data::Rgba {
+ image::Handle::Rgba {
width,
height,
pixels,
- } => {
- if let Some(image) =
- ::image::ImageBuffer::from_vec(*width, *height, pixels.to_vec())
- {
- Ok(::image::DynamicImage::ImageRgba8(image))
- } else {
- Err(::image::error::ImageError::Limits(
- ::image::error::LimitError::from_kind(
- ::image::error::LimitErrorKind::DimensionError,
- ),
- ))
- }
- }
+ ..
+ } => (*width, *height, pixels.clone()),
+ };
+
+ if let Some(image) = ::image::ImageBuffer::from_raw(width, height, pixels) {
+ Ok(image)
+ } else {
+ Err(::image::error::ImageError::Limits(
+ ::image::error::LimitError::from_kind(
+ ::image::error::LimitErrorKind::DimensionError,
+ ),
+ ))
}
}