[librsvg: 5/22] Make FontSize not a newtype
- From: Federico Mena Quintero <federico src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [librsvg: 5/22] Make FontSize not a newtype
- Date: Wed, 1 Jul 2020 00:03:28 +0000 (UTC)
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, ¶ms),
+ values.font_size().normalize(values, ¶ms),
));
let layout = pango::Layout::new(&pango_context);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]