diff --git a/components/style/properties/longhand/font.mako.rs b/components/style/properties/longhand/font.mako.rs index 01485dd7102..e6f6ea34a79 100644 --- a/components/style/properties/longhand/font.mako.rs +++ b/components/style/properties/longhand/font.mako.rs @@ -20,8 +20,7 @@ ${helpers.predefined_type( "FontStyle", initial_value="computed::FontStyle::normal()", initial_specified_value="specified::FontStyle::normal()", - # FIXME(emilio): This won't handle clamping correctly. - animation_value_type="ComputedValue", + animation_value_type="FontStyle", flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER", spec="https://drafts.csswg.org/css-fonts/#propdef-font-style", servo_restyle_damage="rebuild_and_reflow", diff --git a/components/style/values/computed/angle.rs b/components/style/values/computed/angle.rs index ec269df9796..67ea5d1231b 100644 --- a/components/style/values/computed/angle.rs +++ b/components/style/values/computed/angle.rs @@ -64,6 +64,12 @@ impl Angle { radians.min(f64::MAX).max(f64::MIN) } + /// Return the value in degrees. + pub fn degrees(&self) -> f32 { + use std::f32::consts::PI; + self.radians() * 360. / (2. * PI) + } + /// #[inline] fn animate_fallback(&self, other: &Self, procedure: Procedure) -> Result { diff --git a/components/style/values/computed/font.rs b/components/style/values/computed/font.rs index f23b2fada53..3abcb2723b6 100644 --- a/components/style/values/computed/font.rs +++ b/components/style/values/computed/font.rs @@ -838,11 +838,34 @@ impl ToComputedValue for specified::MozScriptLevel { } } +/// A wrapper over an `Angle`, that handles clamping to the appropriate range +/// for `font-style` animation. +#[derive(Clone, Copy, Debug, MallocSizeOf, PartialEq, ToCss)] +pub struct FontStyleAngle(pub Angle); + +impl ToAnimatedValue for FontStyleAngle { + type AnimatedValue = Angle; + + #[inline] + fn to_animated_value(self) -> Self::AnimatedValue { + self.0 + } + + #[inline] + fn from_animated_value(animated: Self::AnimatedValue) -> Self { + FontStyleAngle(Angle::Deg( + animated.degrees() + .min(specified::FONT_STYLE_OBLIQUE_MAX_ANGLE_DEGREES) + .max(specified::FONT_STYLE_OBLIQUE_MIN_ANGLE_DEGREES) + )) + } +} + /// The computed value of `font-style`. /// /// FIXME(emilio): Angle should be a custom type to handle clamping during /// animation. -pub type FontStyle = generics::FontStyle; +pub type FontStyle = generics::FontStyle; impl FontStyle { /// The `normal` value. @@ -855,8 +878,8 @@ impl FontStyle { /// /// https://drafts.csswg.org/css-fonts-4/#valdef-font-style-oblique-angle #[inline] - pub fn default_angle() -> Angle { - Angle::Deg(specified::DEFAULT_FONT_STYLE_OBLIQUE_ANGLE_DEGREES) + fn default_angle() -> FontStyleAngle { + FontStyleAngle(Angle::Deg(specified::DEFAULT_FONT_STYLE_OBLIQUE_ANGLE_DEGREES)) } diff --git a/components/style/values/specified/angle.rs b/components/style/values/specified/angle.rs index 2f059701271..3f49862e406 100644 --- a/components/style/values/specified/angle.rs +++ b/components/style/values/specified/angle.rs @@ -110,8 +110,7 @@ impl Angle { /// Returns the amount of degrees this angle represents. #[inline] pub fn degrees(self) -> f32 { - use std::f32::consts::PI; - self.radians() * 360. / (2. * PI) + self.value.degrees() } /// Returns `0deg`. diff --git a/components/style/values/specified/font.rs b/components/style/values/specified/font.rs index f1f1e2f0bd4..cebb9ae281f 100644 --- a/components/style/values/specified/font.rs +++ b/components/style/values/specified/font.rs @@ -19,7 +19,7 @@ use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss}; use values::CustomIdent; use values::computed::{Angle as ComputedAngle, Percentage as ComputedPercentage}; use values::computed::{font as computed, Context, Length, NonNegativeLength, ToComputedValue}; -use values::computed::font::{FamilyName, FontFamilyList, SingleFontFamily}; +use values::computed::font::{FamilyName, FontFamilyList, FontStyleAngle, SingleFontFamily}; use values::generics::NonNegative; use values::generics::font::{self as generics, FeatureTagValue, FontSettings, FontTag}; use values::generics::font::{KeywordInfo as GenericKeywordInfo, KeywordSize, VariationValue}; @@ -241,7 +241,7 @@ impl ToComputedValue for SpecifiedFontStyle { generics::FontStyle::Normal => generics::FontStyle::Normal, generics::FontStyle::Italic => generics::FontStyle::Italic, generics::FontStyle::Oblique(ref angle) => { - generics::FontStyle::Oblique(Self::compute_angle(angle)) + generics::FontStyle::Oblique(FontStyleAngle(Self::compute_angle(angle))) } } } @@ -251,7 +251,7 @@ impl ToComputedValue for SpecifiedFontStyle { generics::FontStyle::Normal => generics::FontStyle::Normal, generics::FontStyle::Italic => generics::FontStyle::Italic, generics::FontStyle::Oblique(ref angle) => { - generics::FontStyle::Oblique(Angle::from_computed_value(angle)) + generics::FontStyle::Oblique(Angle::from_computed_value(&angle.0)) } } }