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

@ -94,6 +94,7 @@ impl<T: Parse + PartialEq + Copy> ShapeSource<T> {
impl<T: ToComputedValue> ToComputedValue for ShapeSource<T> {
type ComputedValue = computed_basic_shape::ShapeSource<T::ComputedValue>;
#[inline]
fn to_computed_value(&self, cx: &Context) -> Self::ComputedValue {
match *self {
@ -111,6 +112,24 @@ impl<T: ToComputedValue> ToComputedValue for ShapeSource<T> {
ShapeSource::None => computed_basic_shape::ShapeSource::None,
}
}
#[inline]
fn from_computed_value(computed: &Self::ComputedValue) -> Self {
match *computed {
computed_basic_shape::ShapeSource::Url(ref url, ref data) => {
ShapeSource::Url(url.clone(), data.clone())
}
computed_basic_shape::ShapeSource::Shape(ref shape, ref reference) => {
ShapeSource::Shape(
ToComputedValue::from_computed_value(shape),
reference.as_ref().map(|r| ToComputedValue::from_computed_value(r)))
}
computed_basic_shape::ShapeSource::Box(ref reference) => {
ShapeSource::Box(ToComputedValue::from_computed_value(reference))
}
computed_basic_shape::ShapeSource::None => ShapeSource::None,
}
}
}
#[derive(Clone, PartialEq, Debug)]
@ -169,6 +188,23 @@ impl ToComputedValue for BasicShape {
BasicShape::Polygon(ref poly) => computed_basic_shape::BasicShape::Polygon(poly.to_computed_value(cx)),
}
}
#[inline]
fn from_computed_value(computed: &Self::ComputedValue) -> Self {
match *computed {
computed_basic_shape::BasicShape::Inset(ref rect) => {
BasicShape::Inset(ToComputedValue::from_computed_value(rect))
}
computed_basic_shape::BasicShape::Circle(ref circle) => {
BasicShape::Circle(ToComputedValue::from_computed_value(circle))
}
computed_basic_shape::BasicShape::Ellipse(ref e) => {
BasicShape::Ellipse(ToComputedValue::from_computed_value(e))
}
computed_basic_shape::BasicShape::Polygon(ref poly) => {
BasicShape::Polygon(ToComputedValue::from_computed_value(poly))
}
}
}
}
#[derive(Clone, PartialEq, Copy, Debug)]
@ -239,6 +275,17 @@ impl ToComputedValue for InsetRect {
round: self.round.map(|r| r.to_computed_value(cx)),
}
}
#[inline]
fn from_computed_value(computed: &Self::ComputedValue) -> Self {
InsetRect {
top: ToComputedValue::from_computed_value(&computed.top),
right: ToComputedValue::from_computed_value(&computed.right),
bottom: ToComputedValue::from_computed_value(&computed.bottom),
left: ToComputedValue::from_computed_value(&computed.left),
round: computed.round.map(|ref r| ToComputedValue::from_computed_value(r)),
}
}
}
/// https://drafts.csswg.org/css-shapes/#basic-shape-serialization
@ -384,6 +431,14 @@ impl ToComputedValue for Circle {
position: self.position.to_computed_value(cx),
}
}
#[inline]
fn from_computed_value(computed: &Self::ComputedValue) -> Self {
Circle {
radius: ToComputedValue::from_computed_value(&computed.radius),
position: ToComputedValue::from_computed_value(&computed.position),
}
}
}
#[derive(Clone, PartialEq, Copy, Debug)]
@ -454,6 +509,15 @@ impl ToComputedValue for Ellipse {
position: self.position.to_computed_value(cx),
}
}
#[inline]
fn from_computed_value(computed: &Self::ComputedValue) -> Self {
Ellipse {
semiaxis_x: ToComputedValue::from_computed_value(&computed.semiaxis_x),
semiaxis_y: ToComputedValue::from_computed_value(&computed.semiaxis_y),
position: ToComputedValue::from_computed_value(&computed.position),
}
}
}
@ -528,6 +592,19 @@ impl ToComputedValue for Polygon {
.collect(),
}
}
#[inline]
fn from_computed_value(computed: &Self::ComputedValue) -> Self {
Polygon {
fill: ToComputedValue::from_computed_value(&computed.fill),
coordinates: computed.coordinates.iter()
.map(|c| {
(ToComputedValue::from_computed_value(&c.0),
ToComputedValue::from_computed_value(&c.1))
})
.collect(),
}
}
}
/// https://drafts.csswg.org/css-shapes/#typedef-shape-radius
@ -582,6 +659,17 @@ impl ToComputedValue for ShapeRadius {
ShapeRadius::FarthestSide => computed_basic_shape::ShapeRadius::FarthestSide,
}
}
#[inline]
fn from_computed_value(computed: &Self::ComputedValue) -> Self {
match *computed {
computed_basic_shape::ShapeRadius::Length(ref lop) => {
ShapeRadius::Length(ToComputedValue::from_computed_value(lop))
}
computed_basic_shape::ShapeRadius::ClosestSide => ShapeRadius::ClosestSide,
computed_basic_shape::ShapeRadius::FarthestSide => ShapeRadius::FarthestSide,
}
}
}
/// https://drafts.csswg.org/css-backgrounds-3/#border-radius
@ -674,6 +762,16 @@ impl ToComputedValue for BorderRadius {
bottom_left: self.bottom_left.to_computed_value(cx),
}
}
#[inline]
fn from_computed_value(computed: &Self::ComputedValue) -> Self {
BorderRadius {
top_left: ToComputedValue::from_computed_value(&computed.top_left),
top_right: ToComputedValue::from_computed_value(&computed.top_right),
bottom_right: ToComputedValue::from_computed_value(&computed.bottom_right),
bottom_left: ToComputedValue::from_computed_value(&computed.bottom_left),
}
}
}
/// https://drafts.csswg.org/css-shapes/#typedef-fill-rule

View file

@ -456,7 +456,7 @@ enum CalcUnit {
Time,
}
#[derive(Clone, PartialEq, Copy, Debug)]
#[derive(Clone, PartialEq, Copy, Debug, Default)]
#[cfg_attr(feature = "servo", derive(HeapSizeOf))]
pub struct CalcLengthOrPercentage {
pub absolute: Option<Au>,
@ -1565,6 +1565,11 @@ impl ToComputedValue for Number {
#[inline]
fn to_computed_value(&self, _: &Context) -> CSSFloat { self.0 }
#[inline]
fn from_computed_value(computed: &CSSFloat) -> Self {
Number(*computed)
}
}
impl ToCss for Number {
@ -1598,6 +1603,11 @@ impl ToComputedValue for Opacity {
self.0
}
}
#[inline]
fn from_computed_value(computed: &CSSFloat) -> Self {
Opacity(*computed)
}
}
impl ToCss for Opacity {

View file

@ -329,6 +329,16 @@ impl ToComputedValue for Position {
vertical: vertical,
}
}
#[inline]
fn from_computed_value(computed: &computed_position::Position) -> Position {
Position {
horiz_keyword: None,
horiz_position: Some(ToComputedValue::from_computed_value(&computed.horizontal)),
vert_keyword: None,
vert_position: Some(ToComputedValue::from_computed_value(&computed.vertical)),
}
}
}
impl HasViewportPercentage for PositionComponent {