Add from_computed_value() function for converting computed values to specified

This commit is contained in:
Manish Goregaokar 2016-09-11 22:24:28 +05:30
parent 153ec64c15
commit d81c6af59c
17 changed files with 555 additions and 1 deletions

View file

@ -41,6 +41,13 @@ pub trait ToComputedValue {
#[inline]
fn to_computed_value(&self, _context: &Context) -> Self::ComputedValue;
#[inline]
/// Convert a computed value to specified value form.
///
/// This will be used for recascading during animation.
/// Such from_computed_valued values should recompute to the same value.
fn from_computed_value(computed: &Self::ComputedValue) -> Self;
}
pub trait ComputedValueAsSpecified {}
@ -52,6 +59,11 @@ impl<T> ToComputedValue for T where T: ComputedValueAsSpecified + Clone {
fn to_computed_value(&self, _context: &Context) -> T {
self.clone()
}
#[inline]
fn from_computed_value(computed: &T) -> Self {
computed.clone()
}
}
impl ToComputedValue for specified::CSSColor {
@ -61,6 +73,14 @@ impl ToComputedValue for specified::CSSColor {
fn to_computed_value(&self, _context: &Context) -> CSSColor {
self.parsed
}
#[inline]
fn from_computed_value(computed: &CSSColor) -> Self {
specified::CSSColor {
parsed: *computed,
authored: None,
}
}
}
impl ComputedValueAsSpecified for specified::BorderStyle {}
@ -82,6 +102,11 @@ impl ToComputedValue for specified::Length {
length.to_computed_value(context.style().get_font().clone_font_size())
}
}
#[inline]
fn from_computed_value(computed: &Au) -> Self {
specified::Length::Absolute(*computed)
}
}
#[derive(Clone, PartialEq, Copy, Debug)]
@ -170,6 +195,15 @@ impl ToComputedValue for specified::CalcLengthOrPercentage {
context.style().root_font_size())
}
#[inline]
fn from_computed_value(computed: &CalcLengthOrPercentage) -> Self {
specified::CalcLengthOrPercentage {
absolute: computed.length,
percentage: computed.percentage.map(specified::Percentage),
..Default::default()
}
}
}
@ -192,6 +226,13 @@ impl ToComputedValue for specified::BorderRadiusSize {
let h = self.0.height.to_computed_value(context);
BorderRadiusSize(Size2D::new(w, h))
}
#[inline]
fn from_computed_value(computed: &BorderRadiusSize) -> Self {
let w = ToComputedValue::from_computed_value(&computed.0.width);
let h = ToComputedValue::from_computed_value(&computed.0.height);
specified::BorderRadiusSize(Size2D::new(w, h))
}
}
impl ::cssparser::ToCss for BorderRadiusSize {
@ -264,6 +305,24 @@ impl ToComputedValue for specified::LengthOrPercentage {
}
}
}
fn from_computed_value(computed: &LengthOrPercentage) -> Self {
match *computed {
LengthOrPercentage::Length(value) => {
specified::LengthOrPercentage::Length(
ToComputedValue::from_computed_value(&value)
)
}
LengthOrPercentage::Percentage(value) => {
specified::LengthOrPercentage::Percentage(specified::Percentage(value))
}
LengthOrPercentage::Calc(calc) => {
specified::LengthOrPercentage::Calc(
ToComputedValue::from_computed_value(&calc)
)
}
}
}
}
impl ::cssparser::ToCss for LengthOrPercentage {
@ -331,6 +390,26 @@ impl ToComputedValue for specified::LengthOrPercentageOrAuto {
}
}
}
#[inline]
fn from_computed_value(computed: &LengthOrPercentageOrAuto) -> Self {
match *computed {
LengthOrPercentageOrAuto::Auto => specified::LengthOrPercentageOrAuto::Auto,
LengthOrPercentageOrAuto::Length(value) => {
specified::LengthOrPercentageOrAuto::Length(
ToComputedValue::from_computed_value(&value)
)
}
LengthOrPercentageOrAuto::Percentage(value) => {
specified::LengthOrPercentageOrAuto::Percentage(specified::Percentage(value))
}
LengthOrPercentageOrAuto::Calc(calc) => {
specified::LengthOrPercentageOrAuto::Calc(
ToComputedValue::from_computed_value(&calc)
)
}
}
}
}
impl ::cssparser::ToCss for LengthOrPercentageOrAuto {
@ -390,6 +469,32 @@ impl ToComputedValue for specified::LengthOrPercentageOrAutoOrContent {
}
}
}
#[inline]
fn from_computed_value(computed: &LengthOrPercentageOrAutoOrContent) -> Self {
match *computed {
LengthOrPercentageOrAutoOrContent::Auto => {
specified::LengthOrPercentageOrAutoOrContent::Auto
}
LengthOrPercentageOrAutoOrContent::Content => {
specified::LengthOrPercentageOrAutoOrContent::Content
}
LengthOrPercentageOrAutoOrContent::Length(value) => {
specified::LengthOrPercentageOrAutoOrContent::Length(
ToComputedValue::from_computed_value(&value)
)
}
LengthOrPercentageOrAutoOrContent::Percentage(value) => {
specified::LengthOrPercentageOrAutoOrContent::Percentage(specified::Percentage(value))
}
LengthOrPercentageOrAutoOrContent::Calc(calc) => {
specified::LengthOrPercentageOrAutoOrContent::Calc(
ToComputedValue::from_computed_value(&calc)
)
}
}
}
}
impl ::cssparser::ToCss for LengthOrPercentageOrAutoOrContent {
@ -445,6 +550,26 @@ impl ToComputedValue for specified::LengthOrPercentageOrNone {
}
}
}
#[inline]
fn from_computed_value(computed: &LengthOrPercentageOrNone) -> Self {
match *computed {
LengthOrPercentageOrNone::None => specified::LengthOrPercentageOrNone::None,
LengthOrPercentageOrNone::Length(value) => {
specified::LengthOrPercentageOrNone::Length(
ToComputedValue::from_computed_value(&value)
)
}
LengthOrPercentageOrNone::Percentage(value) => {
specified::LengthOrPercentageOrNone::Percentage(specified::Percentage(value))
}
LengthOrPercentageOrNone::Calc(calc) => {
specified::LengthOrPercentageOrNone::Calc(
ToComputedValue::from_computed_value(&calc)
)
}
}
}
}
impl ::cssparser::ToCss for LengthOrPercentageOrNone {
@ -492,6 +617,18 @@ impl ToComputedValue for specified::LengthOrNone {
}
}
}
#[inline]
fn from_computed_value(computed: &LengthOrNone) -> Self {
match *computed {
LengthOrNone::Length(au) => {
specified::LengthOrNone::Length(ToComputedValue::from_computed_value(&au))
}
LengthOrNone::None => {
specified::LengthOrNone::None
}
}
}
}
impl ::cssparser::ToCss for LengthOrNone {
@ -517,6 +654,20 @@ impl ToComputedValue for specified::Image {
}
}
}
#[inline]
fn from_computed_value(computed: &Image) -> Self {
match *computed {
Image::Url(ref url, ref extra_data) => {
specified::Image::Url(url.clone(), extra_data.clone())
},
Image::LinearGradient(ref linear_gradient) => {
specified::Image::LinearGradient(
ToComputedValue::from_computed_value(linear_gradient)
)
}
}
}
}
@ -638,6 +789,25 @@ impl ToComputedValue for specified::LinearGradient {
}).collect()
}
}
#[inline]
fn from_computed_value(computed: &LinearGradient) -> Self {
let LinearGradient {
angle_or_corner,
ref stops
} = *computed;
specified::LinearGradient {
angle_or_corner: angle_or_corner,
stops: stops.iter().map(|stop| {
specified::ColorStop {
color: ToComputedValue::from_computed_value(&stop.color),
position: match stop.position {
None => None,
Some(value) => Some(ToComputedValue::from_computed_value(&value)),
},
}
}).collect()
}
}
}
pub type Length = Au;
pub type Number = CSSFloat;