style: Fix clamping on animations for fort-style.

Bug: 1455358
Reviewed-by: xidorn
MozReview-Commit-ID: Awyub0dMOmq
This commit is contained in:
Emilio Cobos Álvarez 2018-04-19 21:40:25 +02:00
parent 737501153b
commit 0a8518b452
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C
5 changed files with 37 additions and 10 deletions

View file

@ -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",

View file

@ -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)
}
/// <https://drafts.csswg.org/css-transitions/#animtype-number>
#[inline]
fn animate_fallback(&self, other: &Self, procedure: Procedure) -> Result<Self, ()> {

View file

@ -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<Angle>;
pub type FontStyle = generics::FontStyle<FontStyleAngle>;
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))
}

View file

@ -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`.

View file

@ -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))
}
}
}