diff options
author | Jordan Petridis <jordanpetridis@protonmail.com> | 2018-03-16 23:23:45 +0200 |
---|---|---|
committer | Jordan Petridis <jordanpetridis@protonmail.com> | 2018-03-16 23:30:26 +0200 |
commit | bc7519ac3a7ccffedd7370bdbe5dcee948698892 (patch) | |
tree | 0d3b6eea7cc83c94bba8b10f1b467c58508e009a | |
parent | 1cbd29e1e5830c31c14552337cc82c30e19bbb63 (diff) | |
download | librsvg-bc7519ac3a7ccffedd7370bdbe5dcee948698892.tar.gz |
aspect_ratio: Use seperate types for Aling X and Align Y.
This declares 2 tuple structs that wrap Align1D.
The main reason for that is to avoid accidently using Y in
place of X which was previously possible.
-rw-r--r-- | rsvg_internals/src/aspect_ratio.rs | 74 |
1 files changed, 48 insertions, 26 deletions
diff --git a/rsvg_internals/src/aspect_ratio.rs b/rsvg_internals/src/aspect_ratio.rs index 1f64c4ef..ec601f8e 100644 --- a/rsvg_internals/src/aspect_ratio.rs +++ b/rsvg_internals/src/aspect_ratio.rs @@ -9,8 +9,8 @@ //! Ok(AspectRatio { //! defer: false, //! align: Some(Align { -//! x: Align1D::Mid, -//! y: Align1D::Mid, +//! x: X(Align1D::Mid), +//! y: Y(Align1D::Mid), //! fit: FitMode::Meet, //! }), //! }) @@ -24,6 +24,7 @@ use cssparser::{Parser, ParserInput}; use error::*; use parsers::Parse; use parsers::ParseError; +use std::ops::Deref; #[derive(Debug, Copy, Clone, PartialEq, Eq)] pub struct AspectRatio { @@ -54,16 +55,16 @@ impl Default for FitMode { #[derive(Debug, Copy, Clone, PartialEq, Eq)] struct Align { - x: Align1D, - y: Align1D, + x: X, + y: Y, fit: FitMode, } impl Default for Align { fn default() -> Align { Align { - x: Align1D::Mid, - y: Align1D::Mid, + x: X(Align1D::Mid), + y: Y(Align1D::Mid), fit: FitMode::default(), } } @@ -76,6 +77,27 @@ enum Align1D { Max, } +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +struct X(Align1D); +#[derive(Debug, Copy, Clone, PartialEq, Eq)] +struct Y(Align1D); + +impl Deref for X { + type Target = Align1D; + + fn deref(&self) -> &Align1D { + &self.0 + } +} + +impl Deref for Y { + type Target = Align1D; + + fn deref(&self) -> &Align1D { + &self.0 + } +} + impl Align1D { fn compute(self, dest_pos: f64, dest_size: f64, obj_size: f64) -> f64 { match self { @@ -153,23 +175,23 @@ impl AspectRatio { } impl Align { - fn parse_xy(s: &str) -> Result<Option<(Align1D, Align1D)>, ()> { + fn parse_xy(s: &str) -> Result<Option<(X, Y)>, ()> { use self::Align1D::*; match s { "none" => Ok(None), - "xMinYMin" => Ok(Some((Min, Min))), - "xMidYMin" => Ok(Some((Mid, Min))), - "xMaxYMin" => Ok(Some((Max, Min))), + "xMinYMin" => Ok(Some((X(Min), Y(Min)))), + "xMidYMin" => Ok(Some((X(Mid), Y(Min)))), + "xMaxYMin" => Ok(Some((X(Max), Y(Min)))), - "xMinYMid" => Ok(Some((Min, Mid))), - "xMidYMid" => Ok(Some((Mid, Mid))), - "xMaxYMid" => Ok(Some((Max, Mid))), + "xMinYMid" => Ok(Some((X(Min), Y(Mid)))), + "xMidYMid" => Ok(Some((X(Mid), Y(Mid)))), + "xMaxYMid" => Ok(Some((X(Max), Y(Mid)))), - "xMinYMax" => Ok(Some((Min, Max))), - "xMidYMax" => Ok(Some((Mid, Max))), - "xMaxYMax" => Ok(Some((Max, Max))), + "xMinYMax" => Ok(Some((X(Min), Y(Max)))), + "xMidYMax" => Ok(Some((X(Mid), Y(Max)))), + "xMaxYMax" => Ok(Some((X(Max), Y(Max)))), _ => Err(()), } @@ -231,8 +253,8 @@ mod tests { Ok(AspectRatio { defer: false, align: Some(Align { - x: Align1D::Mid, - y: Align1D::Mid, + x: X(Align1D::Mid), + y: Y(Align1D::Mid), fit: FitMode::Meet, },), },) @@ -243,8 +265,8 @@ mod tests { Ok(AspectRatio { defer: true, align: Some(Align { - x: Align1D::Mid, - y: Align1D::Mid, + x: X(Align1D::Mid), + y: Y(Align1D::Mid), fit: FitMode::Meet, },), },) @@ -255,8 +277,8 @@ mod tests { Ok(AspectRatio { defer: true, align: Some(Align { - x: Align1D::Min, - y: Align1D::Max, + x: X(Align1D::Min), + y: Y(Align1D::Max), fit: FitMode::Meet, },), },) @@ -267,8 +289,8 @@ mod tests { Ok(AspectRatio { defer: true, align: Some(Align { - x: Align1D::Max, - y: Align1D::Mid, + x: X(Align1D::Max), + y: Y(Align1D::Mid), fit: FitMode::Meet, },), },) @@ -279,8 +301,8 @@ mod tests { Ok(AspectRatio { defer: true, align: Some(Align { - x: Align1D::Min, - y: Align1D::Max, + x: X(Align1D::Min), + y: Y(Align1D::Max), fit: FitMode::Slice, },), },) |