From e84070acef84f883ca42d965c577e54ce60c3f2a Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sat, 3 Aug 2024 16:20:12 +0200 Subject: Implement `From<&Handle>` for `image::Handle` --- examples/screenshot/src/main.rs | 48 +++++++++++++++++++++++++---------------- 1 file changed, 29 insertions(+), 19 deletions(-) (limited to 'examples') diff --git a/examples/screenshot/src/main.rs b/examples/screenshot/src/main.rs index 2d980dd9..5c105f6c 100644 --- a/examples/screenshot/src/main.rs +++ b/examples/screenshot/src/main.rs @@ -20,7 +20,7 @@ fn main() -> iced::Result { #[derive(Default)] struct Example { - screenshot: Option, + screenshot: Option<(Screenshot, image::Handle)>, saved_png_path: Option>, png_saving: bool, crop_error: Option, @@ -52,10 +52,17 @@ impl Example { .map(Message::Screenshotted); } Message::Screenshotted(screenshot) => { - self.screenshot = Some(screenshot); + self.screenshot = Some(( + screenshot.clone(), + image::Handle::from_rgba( + screenshot.size.width, + screenshot.size.height, + screenshot.bytes, + ), + )); } Message::Png => { - if let Some(screenshot) = &self.screenshot { + if let Some((screenshot, _handle)) = &self.screenshot { self.png_saving = true; return Task::perform( @@ -81,7 +88,7 @@ impl Example { self.height_input_value = new_value; } Message::Crop => { - if let Some(screenshot) = &self.screenshot { + if let Some((screenshot, _handle)) = &self.screenshot { let cropped = screenshot.crop(Rectangle:: { x: self.x_input_value.unwrap_or(0), y: self.y_input_value.unwrap_or(0), @@ -91,7 +98,14 @@ impl Example { match cropped { Ok(screenshot) => { - self.screenshot = Some(screenshot); + self.screenshot = Some(( + screenshot.clone(), + image::Handle::from_rgba( + screenshot.size.width, + screenshot.size.height, + screenshot.bytes, + ), + )); self.crop_error = None; } Err(crop_error) => { @@ -106,20 +120,16 @@ impl Example { } fn view(&self) -> Element<'_, Message> { - let image: Element = if let Some(screenshot) = &self.screenshot - { - image(image::Handle::from_rgba( - screenshot.size.width, - screenshot.size.height, - screenshot.clone(), - )) - .content_fit(ContentFit::Contain) - .width(Fill) - .height(Fill) - .into() - } else { - text("Press the button to take a screenshot!").into() - }; + let image: Element = + if let Some((_screenshot, handle)) = &self.screenshot { + image(handle) + .content_fit(ContentFit::Contain) + .width(Fill) + .height(Fill) + .into() + } else { + text("Press the button to take a screenshot!").into() + }; let image = container(image) .center_y(FillPortion(2)) -- cgit From 4f5de3bbe910a36163daa52af85d21461eff2f96 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 4 Aug 2024 03:29:06 +0200 Subject: Showcase `canvas` image support in `solar_system` example --- examples/solar_system/Cargo.toml | 2 +- examples/solar_system/assets/earth.png | Bin 0 -> 91888 bytes examples/solar_system/assets/moon.png | Bin 0 -> 105100 bytes examples/solar_system/assets/sun.png | Bin 0 -> 114689 bytes examples/solar_system/src/main.rs | 62 +++++++++++++++++++++------------ 5 files changed, 41 insertions(+), 23 deletions(-) create mode 100644 examples/solar_system/assets/earth.png create mode 100644 examples/solar_system/assets/moon.png create mode 100644 examples/solar_system/assets/sun.png (limited to 'examples') diff --git a/examples/solar_system/Cargo.toml b/examples/solar_system/Cargo.toml index ca64da14..e2c18c50 100644 --- a/examples/solar_system/Cargo.toml +++ b/examples/solar_system/Cargo.toml @@ -7,7 +7,7 @@ publish = false [dependencies] iced.workspace = true -iced.features = ["debug", "canvas", "tokio"] +iced.features = ["debug", "canvas", "image", "tokio"] rand = "0.8.3" tracing-subscriber = "0.3" diff --git a/examples/solar_system/assets/earth.png b/examples/solar_system/assets/earth.png new file mode 100644 index 00000000..e81321d9 Binary files /dev/null and b/examples/solar_system/assets/earth.png differ diff --git a/examples/solar_system/assets/moon.png b/examples/solar_system/assets/moon.png new file mode 100644 index 00000000..03f10cb7 Binary files /dev/null and b/examples/solar_system/assets/moon.png differ diff --git a/examples/solar_system/assets/sun.png b/examples/solar_system/assets/sun.png new file mode 100644 index 00000000..29a928a7 Binary files /dev/null and b/examples/solar_system/assets/sun.png differ diff --git a/examples/solar_system/src/main.rs b/examples/solar_system/src/main.rs index a6f1ba6f..1d420959 100644 --- a/examples/solar_system/src/main.rs +++ b/examples/solar_system/src/main.rs @@ -7,10 +7,9 @@ //! //! [1]: https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Basic_animations#An_animated_solar_system use iced::mouse; -use iced::widget::canvas; -use iced::widget::canvas::gradient; use iced::widget::canvas::stroke::{self, Stroke}; use iced::widget::canvas::{Geometry, Path}; +use iced::widget::{canvas, image}; use iced::window; use iced::{ Color, Element, Fill, Point, Rectangle, Renderer, Size, Subscription, @@ -66,6 +65,9 @@ impl SolarSystem { #[derive(Debug)] struct State { + sun: image::Handle, + earth: image::Handle, + moon: image::Handle, space_cache: canvas::Cache, system_cache: canvas::Cache, start: Instant, @@ -85,6 +87,15 @@ impl State { let size = window::Settings::default().size; State { + sun: image::Handle::from_bytes( + include_bytes!("../assets/sun.png").as_slice(), + ), + earth: image::Handle::from_bytes( + include_bytes!("../assets/earth.png").as_slice(), + ), + moon: image::Handle::from_bytes( + include_bytes!("../assets/moon.png").as_slice(), + ), space_cache: canvas::Cache::default(), system_cache: canvas::Cache::default(), start: now, @@ -132,6 +143,8 @@ impl canvas::Program for State { let background = self.space_cache.draw(renderer, bounds.size(), |frame| { + frame.fill_rectangle(Point::ORIGIN, frame.size(), Color::BLACK); + let stars = Path::new(|path| { for (p, size) in &self.stars { path.rectangle(*p, Size::new(*size, *size)); @@ -144,17 +157,21 @@ impl canvas::Program for State { let system = self.system_cache.draw(renderer, bounds.size(), |frame| { let center = frame.center(); + frame.translate(Vector::new(center.x, center.y)); + + frame.draw_image( + &self.sun, + Rectangle::with_radius(Self::SUN_RADIUS), + image::FilterMethod::Linear, + 0, + 1.0, + ); - let sun = Path::circle(center, Self::SUN_RADIUS); - let orbit = Path::circle(center, Self::ORBIT_RADIUS); - - frame.fill(&sun, Color::from_rgb8(0xF9, 0xD7, 0x1C)); + let orbit = Path::circle(Point::ORIGIN, Self::ORBIT_RADIUS); frame.stroke( &orbit, Stroke { - style: stroke::Style::Solid(Color::from_rgba8( - 0, 153, 255, 0.1, - )), + style: stroke::Style::Solid(Color::WHITE.scale_alpha(0.1)), width: 1.0, line_dash: canvas::LineDash { offset: 0, @@ -169,27 +186,28 @@ impl canvas::Program for State { + (2.0 * PI / 60_000.0) * elapsed.subsec_millis() as f32; frame.with_save(|frame| { - frame.translate(Vector::new(center.x, center.y)); frame.rotate(rotation); frame.translate(Vector::new(Self::ORBIT_RADIUS, 0.0)); - let earth = Path::circle(Point::ORIGIN, Self::EARTH_RADIUS); - - let earth_fill = gradient::Linear::new( - Point::new(-Self::EARTH_RADIUS, 0.0), - Point::new(Self::EARTH_RADIUS, 0.0), - ) - .add_stop(0.2, Color::from_rgb(0.15, 0.50, 1.0)) - .add_stop(0.8, Color::from_rgb(0.0, 0.20, 0.47)); - - frame.fill(&earth, earth_fill); + frame.draw_image( + &self.earth, + Rectangle::with_radius(Self::EARTH_RADIUS), + image::FilterMethod::Linear, + rotation * 10.0, + 1.0, + ); frame.with_save(|frame| { frame.rotate(rotation * 10.0); frame.translate(Vector::new(0.0, Self::MOON_DISTANCE)); - let moon = Path::circle(Point::ORIGIN, Self::MOON_RADIUS); - frame.fill(&moon, Color::WHITE); + frame.draw_image( + &self.moon, + Rectangle::with_radius(Self::MOON_RADIUS), + image::FilterMethod::Linear, + 0, + 1.0, + ); }); }); }); -- cgit From ed959023e96f9e5fca66b0bc6b3b3b2e13bdc359 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 4 Aug 2024 03:36:05 +0200 Subject: Remove unnecessary `with_save` calls in `solar_system` example --- examples/solar_system/src/main.rs | 46 ++++++++++++++++++--------------------- 1 file changed, 21 insertions(+), 25 deletions(-) (limited to 'examples') diff --git a/examples/solar_system/src/main.rs b/examples/solar_system/src/main.rs index 1d420959..1f4e642b 100644 --- a/examples/solar_system/src/main.rs +++ b/examples/solar_system/src/main.rs @@ -185,31 +185,27 @@ impl canvas::Program for State { let rotation = (2.0 * PI / 60.0) * elapsed.as_secs() as f32 + (2.0 * PI / 60_000.0) * elapsed.subsec_millis() as f32; - frame.with_save(|frame| { - frame.rotate(rotation); - frame.translate(Vector::new(Self::ORBIT_RADIUS, 0.0)); - - frame.draw_image( - &self.earth, - Rectangle::with_radius(Self::EARTH_RADIUS), - image::FilterMethod::Linear, - rotation * 10.0, - 1.0, - ); - - frame.with_save(|frame| { - frame.rotate(rotation * 10.0); - frame.translate(Vector::new(0.0, Self::MOON_DISTANCE)); - - frame.draw_image( - &self.moon, - Rectangle::with_radius(Self::MOON_RADIUS), - image::FilterMethod::Linear, - 0, - 1.0, - ); - }); - }); + frame.rotate(rotation); + frame.translate(Vector::new(Self::ORBIT_RADIUS, 0.0)); + + frame.draw_image( + &self.earth, + Rectangle::with_radius(Self::EARTH_RADIUS), + image::FilterMethod::Linear, + rotation * 10.0, + 1.0, + ); + + frame.rotate(rotation * 10.0); + frame.translate(Vector::new(0.0, Self::MOON_DISTANCE)); + + frame.draw_image( + &self.moon, + Rectangle::with_radius(Self::MOON_RADIUS), + image::FilterMethod::Linear, + 0, + 1.0, + ); }); vec![background, system] -- cgit From 2ad3cff72223de7291d9c42149765c458944aacc Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 4 Aug 2024 03:37:29 +0200 Subject: Increase Earth's spin a bit in `solar_system` example --- examples/solar_system/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'examples') diff --git a/examples/solar_system/src/main.rs b/examples/solar_system/src/main.rs index 1f4e642b..a4931465 100644 --- a/examples/solar_system/src/main.rs +++ b/examples/solar_system/src/main.rs @@ -192,7 +192,7 @@ impl canvas::Program for State { &self.earth, Rectangle::with_radius(Self::EARTH_RADIUS), image::FilterMethod::Linear, - rotation * 10.0, + rotation * 20.0, 1.0, ); -- cgit From 92bd3ecd6b4a6618f0fc725dea3694c3b40e5314 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 4 Aug 2024 04:30:12 +0200 Subject: Introduce `Image` struct in `core::image` --- examples/solar_system/src/main.rs | 15 +++------------ 1 file changed, 3 insertions(+), 12 deletions(-) (limited to 'examples') diff --git a/examples/solar_system/src/main.rs b/examples/solar_system/src/main.rs index a4931465..9da9fd34 100644 --- a/examples/solar_system/src/main.rs +++ b/examples/solar_system/src/main.rs @@ -160,11 +160,8 @@ impl canvas::Program for State { frame.translate(Vector::new(center.x, center.y)); frame.draw_image( - &self.sun, Rectangle::with_radius(Self::SUN_RADIUS), - image::FilterMethod::Linear, - 0, - 1.0, + &self.sun, ); let orbit = Path::circle(Point::ORIGIN, Self::ORBIT_RADIUS); @@ -189,22 +186,16 @@ impl canvas::Program for State { frame.translate(Vector::new(Self::ORBIT_RADIUS, 0.0)); frame.draw_image( - &self.earth, Rectangle::with_radius(Self::EARTH_RADIUS), - image::FilterMethod::Linear, - rotation * 20.0, - 1.0, + canvas::Image::new(&self.earth).rotation(rotation * 20.0), ); frame.rotate(rotation * 10.0); frame.translate(Vector::new(0.0, Self::MOON_DISTANCE)); frame.draw_image( - &self.moon, Rectangle::with_radius(Self::MOON_RADIUS), - image::FilterMethod::Linear, - 0, - 1.0, + &self.moon, ); }); -- cgit From cc076903dda18f79dbd82238f7a8216bab8c679d Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Sun, 4 Aug 2024 14:38:42 +0200 Subject: Invert Earth's rotation in `solar_system` example --- examples/solar_system/src/main.rs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'examples') diff --git a/examples/solar_system/src/main.rs b/examples/solar_system/src/main.rs index 9da9fd34..1e74f2bd 100644 --- a/examples/solar_system/src/main.rs +++ b/examples/solar_system/src/main.rs @@ -187,7 +187,7 @@ impl canvas::Program for State { frame.draw_image( Rectangle::with_radius(Self::EARTH_RADIUS), - canvas::Image::new(&self.earth).rotation(rotation * 20.0), + canvas::Image::new(&self.earth).rotation(-rotation * 20.0), ); frame.rotate(rotation * 10.0); -- cgit