From 81096ef454a9aacacf3853f7dfe96b8b9228f200 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 14 Apr 2020 06:38:06 +0200 Subject: Implement `From` for `canvas::Fill` --- examples/clock/src/main.rs | 5 +---- examples/solar_system/src/main.rs | 16 ++++++++-------- 2 files changed, 9 insertions(+), 12 deletions(-) (limited to 'examples') diff --git a/examples/clock/src/main.rs b/examples/clock/src/main.rs index a85a964c..1379d3a6 100644 --- a/examples/clock/src/main.rs +++ b/examples/clock/src/main.rs @@ -101,10 +101,7 @@ impl canvas::Drawable for LocalTime { let clock = canvas::Path::new(|path| path.circle(center, radius)); - frame.fill( - &clock, - canvas::Fill::Color(Color::from_rgb8(0x12, 0x93, 0xD8)), - ); + frame.fill(&clock, Color::from_rgb8(0x12, 0x93, 0xD8)); fn draw_hand( n: u32, diff --git a/examples/solar_system/src/main.rs b/examples/solar_system/src/main.rs index 963f047b..d2c6e38f 100644 --- a/examples/solar_system/src/main.rs +++ b/examples/solar_system/src/main.rs @@ -128,7 +128,7 @@ impl State { impl canvas::Drawable for State { fn draw(&self, frame: &mut canvas::Frame) { - use canvas::{Fill, Path, Stroke}; + use canvas::{Path, Stroke}; use std::f32::consts::PI; let center = frame.center(); @@ -146,9 +146,9 @@ impl canvas::Drawable for State { let sun = Path::new(|path| path.circle(center, Self::SUN_RADIUS)); let orbit = Path::new(|path| path.circle(center, Self::ORBIT_RADIUS)); - frame.fill(&space, Fill::Color(Color::BLACK)); - frame.fill(&stars, Fill::Color(Color::WHITE)); - frame.fill(&sun, Fill::Color(Color::from_rgb8(0xF9, 0xD7, 0x1C))); + frame.fill(&space, Color::BLACK); + frame.fill(&stars, Color::WHITE); + frame.fill(&sun, Color::from_rgb8(0xF9, 0xD7, 0x1C)); frame.stroke( &orbit, Stroke { @@ -184,7 +184,7 @@ impl canvas::Drawable for State { ) }); - frame.fill(&earth, Fill::Color(Color::from_rgb8(0x6B, 0x93, 0xD6))); + frame.fill(&earth, Color::from_rgb8(0x6B, 0x93, 0xD6)); frame.with_save(|frame| { frame.rotate( @@ -197,15 +197,15 @@ impl canvas::Drawable for State { path.circle(Point::ORIGIN, Self::MOON_RADIUS) }); - frame.fill(&moon, Fill::Color(Color::WHITE)); + frame.fill(&moon, Color::WHITE); }); frame.fill( &shadow, - Fill::Color(Color { + Color { a: 0.7, ..Color::BLACK - }), + }, ); }); } -- cgit From c545af35773307d16eca7ec03ed4794f26491da2 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 14 Apr 2020 06:49:15 +0200 Subject: Implement `canvas::Path::rectangle` helper method --- examples/solar_system/src/main.rs | 17 +++++------------ 1 file changed, 5 insertions(+), 12 deletions(-) (limited to 'examples') diff --git a/examples/solar_system/src/main.rs b/examples/solar_system/src/main.rs index d2c6e38f..067f8ff2 100644 --- a/examples/solar_system/src/main.rs +++ b/examples/solar_system/src/main.rs @@ -133,9 +133,7 @@ impl canvas::Drawable for State { let center = frame.center(); - let space = Path::new(|path| { - path.rectangle(Point::new(0.0, 0.0), frame.size()) - }); + let space = Path::rectangle(Point::new(0.0, 0.0), frame.size()); let stars = Path::new(|path| { for (p, size) in &self.stars { @@ -174,15 +172,10 @@ impl canvas::Drawable for State { path.circle(Point::ORIGIN, Self::EARTH_RADIUS) }); - let shadow = Path::new(|path| { - path.rectangle( - Point::new(0.0, -Self::EARTH_RADIUS), - Size::new( - Self::EARTH_RADIUS * 4.0, - Self::EARTH_RADIUS * 2.0, - ), - ) - }); + let shadow = Path::rectangle( + Point::new(0.0, -Self::EARTH_RADIUS), + Size::new(Self::EARTH_RADIUS * 4.0, Self::EARTH_RADIUS * 2.0), + ); frame.fill(&earth, Color::from_rgb8(0x6B, 0x93, 0xD6)); -- cgit From 46cd0891d25c2dd48e182747d8c1f9579b066490 Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 14 Apr 2020 06:54:12 +0200 Subject: Implement `canvas::Path::circle` helper method --- examples/clock/src/main.rs | 4 +++- examples/solar_system/src/main.rs | 14 ++++---------- 2 files changed, 7 insertions(+), 11 deletions(-) (limited to 'examples') diff --git a/examples/clock/src/main.rs b/examples/clock/src/main.rs index 1379d3a6..dab91eab 100644 --- a/examples/clock/src/main.rs +++ b/examples/clock/src/main.rs @@ -95,11 +95,13 @@ impl From> for LocalTime { impl canvas::Drawable for LocalTime { fn draw(&self, frame: &mut canvas::Frame) { + use canvas::Path; + let center = frame.center(); let radius = frame.width().min(frame.height()) / 2.0; let offset = Vector::new(center.x, center.y); - let clock = canvas::Path::new(|path| path.circle(center, radius)); + let clock = Path::circle(center, radius); frame.fill(&clock, Color::from_rgb8(0x12, 0x93, 0xD8)); diff --git a/examples/solar_system/src/main.rs b/examples/solar_system/src/main.rs index 067f8ff2..bcd1dc71 100644 --- a/examples/solar_system/src/main.rs +++ b/examples/solar_system/src/main.rs @@ -141,8 +141,8 @@ impl canvas::Drawable for State { } }); - let sun = Path::new(|path| path.circle(center, Self::SUN_RADIUS)); - let orbit = Path::new(|path| path.circle(center, Self::ORBIT_RADIUS)); + let sun = Path::circle(center, Self::SUN_RADIUS); + let orbit = Path::circle(center, Self::ORBIT_RADIUS); frame.fill(&space, Color::BLACK); frame.fill(&stars, Color::WHITE); @@ -168,10 +168,7 @@ impl canvas::Drawable for State { ); frame.translate(Vector::new(Self::ORBIT_RADIUS, 0.0)); - let earth = Path::new(|path| { - path.circle(Point::ORIGIN, Self::EARTH_RADIUS) - }); - + let earth = Path::circle(Point::ORIGIN, Self::EARTH_RADIUS); let shadow = Path::rectangle( Point::new(0.0, -Self::EARTH_RADIUS), Size::new(Self::EARTH_RADIUS * 4.0, Self::EARTH_RADIUS * 2.0), @@ -186,10 +183,7 @@ impl canvas::Drawable for State { ); frame.translate(Vector::new(0.0, Self::MOON_DISTANCE)); - let moon = Path::new(|path| { - path.circle(Point::ORIGIN, Self::MOON_RADIUS) - }); - + let moon = Path::circle(Point::ORIGIN, Self::MOON_RADIUS); frame.fill(&moon, Color::WHITE); }); -- cgit From 6d7f2b30cc9fd4022681f766ee3b77cdb6c8de0a Mon Sep 17 00:00:00 2001 From: Héctor Ramón Jiménez Date: Tue, 14 Apr 2020 07:08:24 +0200 Subject: Simplify drawing logic in `clock` example --- examples/clock/src/main.rs | 74 ++++++++++++++++++++-------------------------- 1 file changed, 32 insertions(+), 42 deletions(-) (limited to 'examples') diff --git a/examples/clock/src/main.rs b/examples/clock/src/main.rs index dab91eab..827379fa 100644 --- a/examples/clock/src/main.rs +++ b/examples/clock/src/main.rs @@ -99,63 +99,53 @@ impl canvas::Drawable for LocalTime { let center = frame.center(); let radius = frame.width().min(frame.height()) / 2.0; - let offset = Vector::new(center.x, center.y); let clock = Path::circle(center, radius); - frame.fill(&clock, Color::from_rgb8(0x12, 0x93, 0xD8)); - fn draw_hand( - n: u32, - total: u32, - length: f32, - offset: Vector, - path: &mut canvas::path::Builder, - ) { - let turns = n as f32 / total as f32; - let t = 2.0 * std::f32::consts::PI * (turns - 0.25); + let short_hand = + Path::line(Point::ORIGIN, Point::new(0.0, -0.5 * radius)); - let x = length * t.cos(); - let y = length * t.sin(); + let long_hand = + Path::line(Point::ORIGIN, Point::new(0.0, -0.8 * radius)); - path.line_to(Point::new(x, y) + offset); - } + let thin_stroke = canvas::Stroke { + width: radius / 100.0, + color: Color::WHITE, + line_cap: canvas::LineCap::Round, + ..canvas::Stroke::default() + }; - let hour_and_minute_hands = canvas::Path::new(|path| { - path.move_to(center); - draw_hand(self.hour, 12, 0.5 * radius, offset, path); + let wide_stroke = canvas::Stroke { + width: thin_stroke.width * 3.0, + ..thin_stroke + }; - path.move_to(center); - draw_hand(self.minute, 60, 0.8 * radius, offset, path) - }); + frame.translate(Vector::new(center.x, center.y)); - frame.stroke( - &hour_and_minute_hands, - canvas::Stroke { - width: radius / 100.0 * 3.0, - color: Color::WHITE, - line_cap: canvas::LineCap::Round, - ..canvas::Stroke::default() - }, - ); + frame.with_save(|frame| { + frame.rotate(hand_rotation(self.hour, 12)); + frame.stroke(&short_hand, wide_stroke); + }); - let second_hand = canvas::Path::new(|path| { - path.move_to(center); - draw_hand(self.second, 60, 0.8 * radius, offset, path) + frame.with_save(|frame| { + frame.rotate(hand_rotation(self.minute, 60)); + frame.stroke(&long_hand, wide_stroke); }); - frame.stroke( - &second_hand, - canvas::Stroke { - width: radius / 100.0, - color: Color::WHITE, - line_cap: canvas::LineCap::Round, - ..canvas::Stroke::default() - }, - ); + frame.with_save(|frame| { + frame.rotate(hand_rotation(self.second, 60)); + frame.stroke(&long_hand, thin_stroke); + }); } } +fn hand_rotation(n: u32, total: u32) -> f32 { + let turns = n as f32 / total as f32; + + 2.0 * std::f32::consts::PI * turns +} + mod time { use iced::futures; -- cgit