From: Ian Jackson Date: Sat, 14 May 2022 22:14:24 +0000 (+0100) Subject: Move shapelib Outline structs into outline X-Git-Tag: otter-1.1.0~158 X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=commitdiff_plain;h=f785d67ffc54f8db5fd44d558203c52d2ce2e0b3;p=otter.git Move shapelib Outline structs into outline Signed-off-by: Ian Jackson --- diff --git a/src/clock.rs b/src/clock.rs index 30aebecb..7e3e42d4 100644 --- a/src/clock.rs +++ b/src/clock.rs @@ -3,7 +3,6 @@ // There is NO WARRANTY. use crate::prelude::*; -use shapelib::RectOutline; use nix::sys::time::TimeValLike as TVL; diff --git a/src/imports.rs b/src/imports.rs index cf03b444..a948fb83 100644 --- a/src/imports.rs +++ b/src/imports.rs @@ -101,7 +101,6 @@ pub use crate::pcaliases::*; pub use crate::pcrender::*; pub use crate::pieces::*; pub use crate::shapelib; -pub use crate::shapelib::{CircleOutline, RectOutline}; pub use crate::shapelib::{ItemEnquiryData, LibraryEnquiryData}; pub use crate::shapelib::{LibraryLoadError}; pub use crate::spec::*; diff --git a/src/outline.rs b/src/outline.rs index ebe25122..d5a06b44 100644 --- a/src/outline.rs +++ b/src/outline.rs @@ -15,8 +15,6 @@ macro_rules! shape_defns { { } => { paste!{ - $( use crate::shapelib::[< $Shape Outline >]; )* - #[dyn_upcast(OutlineTrait)] #[enum_dispatch(OutlineTrait)] #[derive(Clone,Debug,Serialize,Deserialize)] @@ -54,3 +52,78 @@ shape_defns! { Circle "Circle"; Rect "Rect" ; } + + +//---------- Circle ---------- + +#[derive(Clone,Copy,Debug,Serialize,Deserialize)] +pub struct CircleOutline { pub diam: f64 } + +#[dyn_upcast] +impl OutlineTrait for CircleOutline { + #[throws(IE)] + fn outline_path(&self, scale: f64) -> Html { + svg_circle_path(self.diam * scale)? + } + #[throws(IE)] + fn thresh_dragraise(&self) -> Option { + Some((self.diam * 0.5) as Coord) + } + #[throws(IE)] + fn bbox_approx(&self) -> Rect { + let d = (self.diam * 0.5).round() as Coord; + Rect{ corners: [PosC::new(-d,-d), PosC::new(d, d)]} + } +} + +//---------- RectOutline ---------- + +#[derive(Clone,Copy,Debug,Serialize,Deserialize)] +pub struct RectOutline { pub xy: PosC } + +impl RectOutline { + // Used by code elsewhere eg deck.rs for occultation boundaries etc. + #[throws(CoordinateOverflow)] + pub fn rect(&self, nominal: Pos) -> RectC { + let offset = (self.xy * 0.5)?; + let offset = offset.try_map( + |c| c.floor().to_i32().ok_or(CoordinateOverflow) + )?; + let rect = RectC{ corners: + [-1,1].iter().map(|&signum| Ok::<_,CoordinateOverflow>({ + (nominal + (offset * signum)?)? + })) + .collect::,_>>()? + .into_inner().unwrap() + }; + rect + } + + #[throws(CoordinateOverflow)] + pub fn region(&self, nominal: Pos) -> Region { + Region::Rect(self.rect(nominal)?) + } +} + +#[dyn_upcast] +impl OutlineTrait for RectOutline { + #[throws(IE)] + fn outline_path(&self, scale: f64) -> Html { + let xy = (self.xy * scale)?; + svg_rectangle_path(xy)? + } + #[throws(IE)] + fn thresh_dragraise(&self) -> Option { + let smallest: f64 = self.xy.coords.iter().cloned() + .map(OrderedFloat::from).min().unwrap().into(); + Some((smallest * 0.5) as Coord) + } + #[throws(IE)] + fn bbox_approx(&self) -> Rect { + let pos: Pos = self.xy.map( + |v| ((v * 0.5).round()) as Coord + ); + let neg = (-pos)?; + Rect{ corners: [ neg, pos ] } + } +} diff --git a/src/shapelib.rs b/src/shapelib.rs index 4e3277b7..1f794159 100644 --- a/src/shapelib.rs +++ b/src/shapelib.rs @@ -813,56 +813,6 @@ impl_via_ambassador!{ //---------- RectOutline ---------- -#[derive(Clone,Copy,Debug,Serialize,Deserialize)] -pub struct RectOutline { pub xy: PosC } - -impl RectOutline { - // Used by code elsewhere eg deck.rs for occultation boundaries etc. - #[throws(CoordinateOverflow)] - pub fn rect(&self, nominal: Pos) -> RectC { - let offset = (self.xy * 0.5)?; - let offset = offset.try_map( - |c| c.floor().to_i32().ok_or(CoordinateOverflow) - )?; - let rect = RectC{ corners: - [-1,1].iter().map(|&signum| Ok::<_,CoordinateOverflow>({ - (nominal + (offset * signum)?)? - })) - .collect::,_>>()? - .into_inner().unwrap() - }; - rect - } - - #[throws(CoordinateOverflow)] - pub fn region(&self, nominal: Pos) -> Region { - Region::Rect(self.rect(nominal)?) - } -} - -#[dyn_upcast] -impl OutlineTrait for RectOutline { - #[throws(IE)] - fn outline_path(&self, scale: f64) -> Html { - let xy = (self.xy * scale)?; - svg_rectangle_path(xy)? - } - #[throws(IE)] - fn thresh_dragraise(&self) -> Option { - let smallest: f64 = self.xy.coords.iter().cloned() - .map(OrderedFloat::from).min().unwrap().into(); - Some((smallest * 0.5) as Coord) - } - #[throws(IE)] - fn bbox_approx(&self) -> Rect { - let pos: Pos = self.xy.map( - |v| ((v * 0.5).round()) as Coord - ); - let neg = (-pos)?; - Rect{ corners: [ neg, pos ] } - } -} - impl ShapeLoadableTrait for RectShapeIndicator { fn load(&self, size: PosC) -> Outline { RectOutline { xy: size }.into() @@ -878,26 +828,6 @@ impl ShapeLoadableTrait for RectShapeIndicator { //---------- CircleOutline ---------- -#[derive(Clone,Copy,Debug,Serialize,Deserialize)] -pub struct CircleOutline { pub diam: f64 } - -#[dyn_upcast] -impl OutlineTrait for CircleOutline { - #[throws(IE)] - fn outline_path(&self, scale: f64) -> Html { - svg_circle_path(self.diam * scale)? - } - #[throws(IE)] - fn thresh_dragraise(&self) -> Option { - Some((self.diam * 0.5) as Coord) - } - #[throws(IE)] - fn bbox_approx(&self) -> Rect { - let d = (self.diam * 0.5).round() as Coord; - Rect{ corners: [PosC::new(-d,-d), PosC::new(d, d)]} - } -} - impl ShapeLoadableTrait for CircleShapeIndicator { fn load(&self, size: PosC) -> Outline { let diam = size