mirror of
https://github.com/servo/servo.git
synced 2025-08-08 23:15:33 +01:00
Maintain Corner type, add None type to AngleOrCorner
This commit is contained in:
parent
0530e648af
commit
5d56946bc2
6 changed files with 113 additions and 49 deletions
|
@ -8,11 +8,12 @@
|
|||
//! [image]: https://drafts.csswg.org/css-images/#image-values
|
||||
|
||||
use cssparser::Color as CSSColor;
|
||||
use std::f32::consts::PI;
|
||||
use std::fmt;
|
||||
use style_traits::ToCss;
|
||||
use values::computed::{Context, Length, LengthOrPercentage, ToComputedValue};
|
||||
use values::computed::{Angle, Context, Length, LengthOrPercentage, ToComputedValue};
|
||||
use values::computed::position::Position;
|
||||
use values::specified::{self, AngleOrCorner, SizeKeyword};
|
||||
use values::specified::{self, HorizontalDirection, SizeKeyword, VerticalDirection};
|
||||
use values::specified::url::SpecifiedUrl;
|
||||
|
||||
|
||||
|
@ -185,7 +186,7 @@ impl ToComputedValue for specified::GradientKind {
|
|||
fn to_computed_value(&self, context: &Context) -> GradientKind {
|
||||
match *self {
|
||||
specified::GradientKind::Linear(angle_or_corner) => {
|
||||
GradientKind::Linear(angle_or_corner)
|
||||
GradientKind::Linear(angle_or_corner.to_computed_value(context))
|
||||
},
|
||||
specified::GradientKind::Radial(ref shape, position) => {
|
||||
GradientKind::Radial(shape.to_computed_value(context),
|
||||
|
@ -454,3 +455,75 @@ impl ToComputedValue for specified::LengthOrPercentageOrKeyword {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[derive(Clone, Copy, Debug, PartialEq)]
|
||||
#[cfg_attr(feature = "servo", derive(HeapSizeOf))]
|
||||
pub enum AngleOrCorner {
|
||||
Angle(Angle),
|
||||
Corner(HorizontalDirection, VerticalDirection)
|
||||
}
|
||||
|
||||
impl ToComputedValue for specified::AngleOrCorner {
|
||||
type ComputedValue = AngleOrCorner;
|
||||
|
||||
#[inline]
|
||||
fn to_computed_value(&self, _: &Context) -> AngleOrCorner {
|
||||
match *self {
|
||||
specified::AngleOrCorner::None => {
|
||||
AngleOrCorner::Angle(Angle(0.0))
|
||||
},
|
||||
specified::AngleOrCorner::Angle(angle) => {
|
||||
AngleOrCorner::Angle(angle)
|
||||
},
|
||||
specified::AngleOrCorner::Corner(horizontal, vertical) => {
|
||||
match (horizontal, vertical) {
|
||||
(None, Some(VerticalDirection::Top)) => {
|
||||
AngleOrCorner::Angle(Angle(0.0))
|
||||
},
|
||||
(Some(HorizontalDirection::Right), None) => {
|
||||
AngleOrCorner::Angle(Angle(PI * 0.5))
|
||||
},
|
||||
(None, Some(VerticalDirection::Bottom)) => {
|
||||
AngleOrCorner::Angle(Angle(PI))
|
||||
},
|
||||
(Some(HorizontalDirection::Left), None) => {
|
||||
AngleOrCorner::Angle(Angle(PI * 1.5))
|
||||
},
|
||||
(Some(horizontal), Some(vertical)) => {
|
||||
AngleOrCorner::Corner(horizontal, vertical)
|
||||
},
|
||||
(None, None) => {
|
||||
unreachable!()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[inline]
|
||||
fn from_computed_value(computed: &AngleOrCorner) -> Self {
|
||||
match *computed {
|
||||
AngleOrCorner::Angle(angle) => {
|
||||
specified::AngleOrCorner::Angle(angle)
|
||||
},
|
||||
AngleOrCorner::Corner(horizontal, vertical) => {
|
||||
specified::AngleOrCorner::Corner(Some(horizontal), Some(vertical))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl ToCss for AngleOrCorner {
|
||||
fn to_css<W>(&self, dest: &mut W) -> fmt::Result where W: fmt::Write {
|
||||
match *self {
|
||||
AngleOrCorner::Angle(angle) => angle.to_css(dest),
|
||||
AngleOrCorner::Corner(horizontal, vertical) => {
|
||||
try!(dest.write_str("to "));
|
||||
try!(horizontal.to_css(dest));
|
||||
try!(dest.write_str(" "));
|
||||
try!(vertical.to_css(dest));
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue