Auto merge of #18609 - Manishearth:fs-anim, r=emilio

stylo: Animate font-size as NonNegativeLength

Otherwise it doesn't clamp correctly and fails layout/style/test/test_transitions_per_property.html

<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/18609)
<!-- Reviewable:end -->
This commit is contained in:
bors-servo 2017-09-24 02:48:12 -05:00 committed by GitHub
commit 216f64e4e1
3 changed files with 34 additions and 2 deletions

View file

@ -596,7 +596,7 @@ ${helpers.single_keyword_system("font-variant-caps",
} }
</%helpers:longhand> </%helpers:longhand>
<%helpers:longhand name="font-size" animation_value_type="ComputedValue" <%helpers:longhand name="font-size" animation_value_type="NonNegativeLength"
flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER" flags="APPLIES_TO_FIRST_LETTER APPLIES_TO_FIRST_LINE APPLIES_TO_PLACEHOLDER"
allow_quirks="True" spec="https://drafts.csswg.org/css-fonts/#propdef-font-size"> allow_quirks="True" spec="https://drafts.csswg.org/css-fonts/#propdef-font-size">
use app_units::Au; use app_units::Au;

View file

@ -7,10 +7,11 @@
use app_units::Au; use app_units::Au;
use std::fmt; use std::fmt;
use style_traits::ToCss; use style_traits::ToCss;
use values::animated::ToAnimatedValue;
use values::computed::NonNegativeLength; use values::computed::NonNegativeLength;
use values::specified::font as specified; use values::specified::font as specified;
#[derive(Animate, ComputeSquaredDistance, ToAnimatedValue, ToAnimatedZero)] #[derive(Animate, ComputeSquaredDistance, ToAnimatedZero)]
#[derive(Clone, Copy, Debug, PartialEq)] #[derive(Clone, Copy, Debug, PartialEq)]
#[cfg_attr(feature = "servo", derive(HeapSizeOf))] #[cfg_attr(feature = "servo", derive(HeapSizeOf))]
#[cfg_attr(feature = "gecko", derive(MallocSizeOf))] #[cfg_attr(feature = "gecko", derive(MallocSizeOf))]
@ -74,3 +75,24 @@ impl ToCss for FontSize {
self.size.to_css(dest) self.size.to_css(dest)
} }
} }
/// XXXManishearth it might be better to
/// animate this as computed, however this complicates
/// clamping and might not be the right thing to do.
/// We should figure it out.
impl ToAnimatedValue for FontSize {
type AnimatedValue = NonNegativeLength;
#[inline]
fn to_animated_value(self) -> Self::AnimatedValue {
self.size
}
#[inline]
fn from_animated_value(animated: Self::AnimatedValue) -> Self {
FontSize {
size: animated.clamp(),
keyword_info: None,
}
}
}

View file

@ -791,6 +791,16 @@ impl NonNegativeLength {
self.0.px() self.0.px()
} }
#[inline]
/// Ensures it is non negative
pub fn clamp(self) -> Self {
if (self.0).0 < 0. {
Self::zero()
} else {
self
}
}
/// Scale this NonNegativeLength. /// Scale this NonNegativeLength.
/// We scale NonNegativeLength by zero if the factor is negative because it doesn't /// We scale NonNegativeLength by zero if the factor is negative because it doesn't
/// make sense to scale a negative factor on a non-negative length. /// make sense to scale a negative factor on a non-negative length.