[librsvg: 5/22] Make FontSize not a newtype



commit 24c169150671f4489a776c1031234e3f0b70a7e2
Author: Federico Mena Quintero <federico gnome org>
Date:   Thu Jun 25 16:27:36 2020 -0500

    Make FontSize not a newtype
    
    This adds a new pattern to the make_property! macro, intended for
    bespoke types which don't need a newtype wrapper (i.e. unlike
    general-purpose types that are shared by multiple properties).

 rsvg_internals/src/font_props.rs      | 51 +++++++++++++++++------------------
 rsvg_internals/src/length.rs          |  2 +-
 rsvg_internals/src/properties.rs      |  1 +
 rsvg_internals/src/property_defs.rs   |  9 +++----
 rsvg_internals/src/property_macros.rs | 11 ++++++++
 rsvg_internals/src/text.rs            |  2 +-
 6 files changed, 43 insertions(+), 33 deletions(-)
---
diff --git a/rsvg_internals/src/font_props.rs b/rsvg_internals/src/font_props.rs
index 434a44f4..abfeea74 100644
--- a/rsvg_internals/src/font_props.rs
+++ b/rsvg_internals/src/font_props.rs
@@ -11,7 +11,7 @@ use crate::properties::ComputedValues;
 
 // https://www.w3.org/TR/2008/REC-CSS2-20080411/fonts.html#propdef-font-size
 #[derive(Debug, Copy, Clone, PartialEq)]
-pub enum FontSizeSpec {
+pub enum FontSize {
     Smaller,
     Larger,
     XXSmall,
@@ -24,10 +24,10 @@ pub enum FontSizeSpec {
     Value(Length<Both>),
 }
 
-impl FontSizeSpec {
+impl FontSize {
     pub fn value(&self) -> Length<Both> {
         match self {
-            FontSizeSpec::Value(s) => *s,
+            FontSize::Value(s) => *s,
             _ => unreachable!(),
         }
     }
@@ -35,7 +35,7 @@ impl FontSizeSpec {
     pub fn compute(&self, v: &ComputedValues) -> Self {
         let compute_points = |p| 12.0 * 1.2f64.powf(p) / POINTS_PER_INCH;
 
-        let parent = v.font_size().0.value();
+        let parent = v.font_size().value();
 
         // The parent must already have resolved to an absolute unit
         assert!(
@@ -44,7 +44,7 @@ impl FontSizeSpec {
                 && parent.unit != LengthUnit::Ex
         );
 
-        use FontSizeSpec::*;
+        use FontSize::*;
 
         #[rustfmt::skip]
         let new_size = match self {
@@ -75,7 +75,7 @@ impl FontSizeSpec {
             Value(s) => *s,
         };
 
-        FontSizeSpec::Value(new_size)
+        FontSize::Value(new_size)
     }
 
     pub fn normalize(&self, values: &ComputedValues, params: &ViewParams) -> f64 {
@@ -83,23 +83,24 @@ impl FontSizeSpec {
     }
 }
 
-impl Parse for FontSizeSpec {
-    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<FontSizeSpec, ParseError<'i>> {
+impl Parse for FontSize {
+    #[rustfmt::skip]
+    fn parse<'i>(parser: &mut Parser<'i, '_>) -> Result<FontSize, ParseError<'i>> {
         parser
             .try_parse(|p| Length::<Both>::parse(p))
-            .and_then(|l| Ok(FontSizeSpec::Value(l)))
+            .and_then(|l| Ok(FontSize::Value(l)))
             .or_else(|_| {
                 Ok(parse_identifiers!(
                     parser,
-                    "smaller" => FontSizeSpec::Smaller,
-                    "larger" => FontSizeSpec::Larger,
-                    "xx-small" => FontSizeSpec::XXSmall,
-                    "x-small" => FontSizeSpec::XSmall,
-                    "small" => FontSizeSpec::Small,
-                    "medium" => FontSizeSpec::Medium,
-                    "large" => FontSizeSpec::Large,
-                    "x-large" => FontSizeSpec::XLarge,
-                    "xx-large" => FontSizeSpec::XXLarge,
+                    "smaller"  => FontSize::Smaller,
+                    "larger"   => FontSize::Larger,
+                    "xx-small" => FontSize::XXSmall,
+                    "x-small"  => FontSize::XSmall,
+                    "small"    => FontSize::Small,
+                    "medium"   => FontSize::Medium,
+                    "large"    => FontSize::Large,
+                    "x-large"  => FontSize::XLarge,
+                    "xx-large" => FontSize::XXLarge,
                 )?)
             })
     }
@@ -254,7 +255,7 @@ impl LineHeightSpec {
     }
 
     pub fn compute(&self, values: &ComputedValues) -> Self {
-        let font_size = values.font_size().0.value();
+        let font_size = values.font_size().value();
 
         match *self {
             LineHeightSpec::Normal => LineHeightSpec::Length(font_size),
@@ -341,12 +342,10 @@ mod tests {
     use super::*;
 
     use crate::properties::{ParsedProperty, SpecifiedValue, SpecifiedValues};
-    use crate::property_defs::FontSize;
-    use crate::property_macros::Property;
 
     #[test]
     fn detects_invalid_invalid_font_size() {
-        assert!(FontSizeSpec::parse_str("furlong").is_err());
+        assert!(FontSize::parse_str("furlong").is_err());
     }
 
     #[test]
@@ -374,16 +373,16 @@ mod tests {
             FontSize::parse_str("5px").unwrap()
         );
 
-        let smaller = FontSize::parse_str("smaller").unwrap().compute(&values).0;
-        if let FontSizeSpec::Value(v) = smaller {
+        let smaller = FontSize::parse_str("smaller").unwrap().compute(&values);
+        if let FontSize::Value(v) = smaller {
             assert!(v.length < 10.0);
             assert_eq!(v.unit, LengthUnit::Px);
         } else {
             unreachable!();
         }
 
-        let larger = FontSize::parse_str("larger").unwrap().compute(&values).0;
-        if let FontSizeSpec::Value(v) = larger {
+        let larger = FontSize::parse_str("larger").unwrap().compute(&values);
+        if let FontSize::Value(v) = larger {
             assert!(v.length > 10.0);
             assert_eq!(v.unit, LengthUnit::Px);
         } else {
diff --git a/rsvg_internals/src/length.rs b/rsvg_internals/src/length.rs
index aff6f58e..aadc5c64 100644
--- a/rsvg_internals/src/length.rs
+++ b/rsvg_internals/src/length.rs
@@ -353,7 +353,7 @@ impl<N: Normalize> Length<N> {
 }
 
 fn font_size_from_values(values: &ComputedValues, params: &ViewParams) -> f64 {
-    let v = &values.font_size().0.value();
+    let v = &values.font_size().value();
 
     match v.unit {
         LengthUnit::Percent => unreachable!("ComputedValues can't have a relative font size"),
diff --git a/rsvg_internals/src/properties.rs b/rsvg_internals/src/properties.rs
index 61aee616..46891a2d 100644
--- a/rsvg_internals/src/properties.rs
+++ b/rsvg_internals/src/properties.rs
@@ -8,6 +8,7 @@ use std::collections::HashSet;
 
 use crate::css::{DeclParser, Declaration, Origin};
 use crate::error::*;
+use crate::font_props::*;
 use crate::parsers::{Parse, ParseValue};
 use crate::property_bag::PropertyBag;
 use crate::property_defs::*;
diff --git a/rsvg_internals/src/property_defs.rs b/rsvg_internals/src/property_defs.rs
index d0fe05a9..a607d45d 100644
--- a/rsvg_internals/src/property_defs.rs
+++ b/rsvg_internals/src/property_defs.rs
@@ -4,7 +4,7 @@ use cssparser::{Parser, Token};
 
 use crate::dasharray::Dasharray;
 use crate::error::*;
-use crate::font_props::{FontSizeSpec, FontWeightSpec, LetterSpacingSpec, LineHeightSpec, MultiFontFamily};
+use crate::font_props::{FontSize, FontWeightSpec, LetterSpacingSpec, LineHeightSpec, MultiFontFamily};
 use crate::iri::IRI;
 use crate::length::*;
 use crate::paint_server::PaintServer;
@@ -26,7 +26,7 @@ make_property!(
             }
 
             fn compute(&self, v: &ComputedValues) -> Self {
-                let font_size = v.font_size().0.value();
+                let font_size = v.font_size().value();
                 let parent = v.baseline_shift();
 
                 match (self.0.unit, parent.0.unit) {
@@ -243,8 +243,7 @@ make_property!(
 make_property!(
     ComputedValues,
     FontSize,
-    default: FontSizeSpec::Value(Length::<Both>::parse_str("12.0").unwrap()),
-    newtype_parse: FontSizeSpec,
+    default: FontSize::Value(Length::<Both>::parse_str("12.0").unwrap()),
     property_impl: {
         impl Property<ComputedValues> for FontSize {
             fn inherits_automatically() -> bool {
@@ -252,7 +251,7 @@ make_property!(
             }
 
             fn compute(&self, v: &ComputedValues) -> Self {
-                FontSize(self.0.compute(v))
+                self.compute(v)
             }
         }
     }
diff --git a/rsvg_internals/src/property_macros.rs b/rsvg_internals/src/property_macros.rs
index b8e09372..6fbebc88 100644
--- a/rsvg_internals/src/property_macros.rs
+++ b/rsvg_internals/src/property_macros.rs
@@ -95,6 +95,17 @@ macro_rules! make_property {
         }
     };
 
+    ($computed_values_type: ty,
+     $name: ident,
+     default: $default: expr,
+     property_impl: { $prop: item }
+    ) => {
+        impl_default!($name, $default);
+
+        $prop
+    };
+
+    // pending - only BaselineShift
     ($computed_values_type: ty,
      $name: ident,
      default: $default: expr,
diff --git a/rsvg_internals/src/text.rs b/rsvg_internals/src/text.rs
index be037a26..e019d8c8 100644
--- a/rsvg_internals/src/text.rs
+++ b/rsvg_internals/src/text.rs
@@ -967,7 +967,7 @@ fn create_pango_layout(
     let params = draw_ctx.get_view_params();
 
     font_desc.set_size(to_pango_units(
-        values.font_size().0.normalize(values, &params),
+        values.font_size().normalize(values, &params),
     ));
 
     let layout = pango::Layout::new(&pango_context);


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]