mirror of
https://github.com/servo/servo.git
synced 2025-07-03 05:23:38 +01:00
Replace LengthOrNone by a specific type for the perspective property
This was its only use, and it was bugged: AFAIK this didn't properly clamp animated values below 0.
This commit is contained in:
parent
4a98fa70bf
commit
260e05320c
11 changed files with 88 additions and 32 deletions
|
@ -59,10 +59,9 @@ use style::properties::ComputedValues;
|
||||||
use style::selector_parser::RestyleDamage;
|
use style::selector_parser::RestyleDamage;
|
||||||
use style::servo::restyle_damage::ServoRestyleDamage;
|
use style::servo::restyle_damage::ServoRestyleDamage;
|
||||||
use style::str::char_is_whitespace;
|
use style::str::char_is_whitespace;
|
||||||
use style::values::{self, Either};
|
|
||||||
use style::values::computed::{Length, LengthOrPercentage, LengthOrPercentageOrAuto};
|
use style::values::computed::{Length, LengthOrPercentage, LengthOrPercentageOrAuto};
|
||||||
use style::values::computed::counters::ContentItem;
|
use style::values::computed::counters::ContentItem;
|
||||||
use style::values::generics::box_::VerticalAlign;
|
use style::values::generics::box_::{Perspective, VerticalAlign};
|
||||||
use style::values::generics::transform;
|
use style::values::generics::transform;
|
||||||
use text;
|
use text;
|
||||||
use text::TextRunScanner;
|
use text::TextRunScanner;
|
||||||
|
@ -2477,7 +2476,7 @@ impl Fragment {
|
||||||
pub fn has_filter_transform_or_perspective(&self) -> bool {
|
pub fn has_filter_transform_or_perspective(&self) -> bool {
|
||||||
!self.style().get_box().transform.0.is_empty() ||
|
!self.style().get_box().transform.0.is_empty() ||
|
||||||
!self.style().get_effects().filter.0.is_empty() ||
|
!self.style().get_effects().filter.0.is_empty() ||
|
||||||
self.style().get_box().perspective != Either::Second(values::None_)
|
self.style().get_box().perspective != Perspective::None
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Returns true if this fragment establishes a new stacking context and false otherwise.
|
/// Returns true if this fragment establishes a new stacking context and false otherwise.
|
||||||
|
@ -2899,7 +2898,7 @@ impl Fragment {
|
||||||
/// Returns the 4D matrix representing this fragment's perspective.
|
/// Returns the 4D matrix representing this fragment's perspective.
|
||||||
pub fn perspective_matrix(&self, stacking_relative_border_box: &Rect<Au>) -> Option<LayoutTransform> {
|
pub fn perspective_matrix(&self, stacking_relative_border_box: &Rect<Au>) -> Option<LayoutTransform> {
|
||||||
match self.style().get_box().perspective {
|
match self.style().get_box().perspective {
|
||||||
Either::First(length) => {
|
Perspective::Length(length) => {
|
||||||
let perspective_origin = self.style().get_box().perspective_origin;
|
let perspective_origin = self.style().get_box().perspective_origin;
|
||||||
let perspective_origin =
|
let perspective_origin =
|
||||||
Point2D::new(
|
Point2D::new(
|
||||||
|
@ -2923,7 +2922,7 @@ impl Fragment {
|
||||||
|
|
||||||
Some(pre_transform.pre_mul(&perspective_matrix).pre_mul(&post_transform))
|
Some(pre_transform.pre_mul(&perspective_matrix).pre_mul(&post_transform))
|
||||||
}
|
}
|
||||||
Either::Second(values::None_) => {
|
Perspective::None => {
|
||||||
None
|
None
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,6 +24,7 @@ use values::computed::{NonNegativeLength, NonNegativeLengthOrPercentage, NonNega
|
||||||
use values::computed::basic_shape::ShapeRadius as ComputedShapeRadius;
|
use values::computed::basic_shape::ShapeRadius as ComputedShapeRadius;
|
||||||
use values::generics::{CounterStyleOrNone, NonNegative};
|
use values::generics::{CounterStyleOrNone, NonNegative};
|
||||||
use values::generics::basic_shape::ShapeRadius;
|
use values::generics::basic_shape::ShapeRadius;
|
||||||
|
use values::generics::box_::Perspective;
|
||||||
use values::generics::gecko::ScrollSnapPoint;
|
use values::generics::gecko::ScrollSnapPoint;
|
||||||
use values::generics::grid::{TrackBreadth, TrackKeyword};
|
use values::generics::grid::{TrackBreadth, TrackKeyword};
|
||||||
|
|
||||||
|
@ -422,6 +423,27 @@ impl GeckoStyleCoordConvertible for ScrollSnapPoint<LengthOrPercentage> {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
impl<L> GeckoStyleCoordConvertible for Perspective<L>
|
||||||
|
where
|
||||||
|
L: GeckoStyleCoordConvertible,
|
||||||
|
{
|
||||||
|
fn to_gecko_style_coord<T: CoordDataMut>(&self, coord: &mut T) {
|
||||||
|
match *self {
|
||||||
|
Perspective::None => coord.set_value(CoordDataValue::None),
|
||||||
|
Perspective::Length(ref l) => l.to_gecko_style_coord(coord),
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
fn from_gecko_style_coord<T: CoordData>(coord: &T) -> Option<Self> {
|
||||||
|
use gecko_bindings::structs::root::nsStyleUnit;
|
||||||
|
|
||||||
|
if coord.unit() == nsStyleUnit::eStyleUnit_None {
|
||||||
|
return Some(Perspective::None);
|
||||||
|
}
|
||||||
|
Some(Perspective::Length(L::from_gecko_style_coord(coord)?))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/// Convert a given RGBA value to `nscolor`.
|
/// Convert a given RGBA value to `nscolor`.
|
||||||
pub fn convert_rgba_to_nscolor(rgba: &RGBA) -> u32 {
|
pub fn convert_rgba_to_nscolor(rgba: &RGBA) -> u32 {
|
||||||
((rgba.alpha as u32) << 24) |
|
((rgba.alpha as u32) << 24) |
|
||||||
|
|
|
@ -1455,7 +1455,6 @@ impl Clone for ${style_struct.gecko_struct_name} {
|
||||||
"length::NonNegativeLengthOrAuto": impl_style_coord,
|
"length::NonNegativeLengthOrAuto": impl_style_coord,
|
||||||
"length::NonNegativeLengthOrNormal": impl_style_coord,
|
"length::NonNegativeLengthOrNormal": impl_style_coord,
|
||||||
"Length": impl_absolute_length,
|
"Length": impl_absolute_length,
|
||||||
"LengthOrNone": impl_style_coord,
|
|
||||||
"LengthOrNormal": impl_style_coord,
|
"LengthOrNormal": impl_style_coord,
|
||||||
"LengthOrPercentage": impl_style_coord,
|
"LengthOrPercentage": impl_style_coord,
|
||||||
"LengthOrPercentageOrAuto": impl_style_coord,
|
"LengthOrPercentageOrAuto": impl_style_coord,
|
||||||
|
@ -1468,6 +1467,7 @@ impl Clone for ${style_struct.gecko_struct_name} {
|
||||||
"NonNegativeNumber": impl_simple,
|
"NonNegativeNumber": impl_simple,
|
||||||
"Number": impl_simple,
|
"Number": impl_simple,
|
||||||
"Opacity": impl_simple,
|
"Opacity": impl_simple,
|
||||||
|
"Perspective": impl_style_coord,
|
||||||
"Position": impl_position,
|
"Position": impl_position,
|
||||||
"RGBAColor": impl_rgba_color,
|
"RGBAColor": impl_rgba_color,
|
||||||
"SVGLength": impl_svg_length,
|
"SVGLength": impl_svg_length,
|
||||||
|
|
|
@ -507,16 +507,17 @@ ${helpers.single_keyword("resize",
|
||||||
flags="APPLIES_TO_PLACEHOLDER",
|
flags="APPLIES_TO_PLACEHOLDER",
|
||||||
animation_value_type="discrete")}
|
animation_value_type="discrete")}
|
||||||
|
|
||||||
|
${helpers.predefined_type(
|
||||||
${helpers.predefined_type("perspective",
|
"perspective",
|
||||||
"LengthOrNone",
|
"Perspective",
|
||||||
"Either::Second(None_)",
|
"computed::Perspective::none()",
|
||||||
gecko_ffi_name="mChildPerspective",
|
gecko_ffi_name="mChildPerspective",
|
||||||
spec="https://drafts.csswg.org/css-transforms/#perspective",
|
spec="https://drafts.csswg.org/css-transforms/#perspective",
|
||||||
extra_prefixes="moz webkit",
|
extra_prefixes="moz webkit",
|
||||||
flags="CREATES_STACKING_CONTEXT FIXPOS_CB",
|
flags="CREATES_STACKING_CONTEXT FIXPOS_CB",
|
||||||
animation_value_type="ComputedValue",
|
animation_value_type="AnimatedPerspective",
|
||||||
servo_restyle_damage = "reflow_out_of_flow")}
|
servo_restyle_damage = "reflow_out_of_flow",
|
||||||
|
)}
|
||||||
|
|
||||||
${helpers.predefined_type("perspective-origin",
|
${helpers.predefined_type("perspective-origin",
|
||||||
"position::Position",
|
"position::Position",
|
||||||
|
|
|
@ -5,8 +5,9 @@
|
||||||
//! Computed types for box properties.
|
//! Computed types for box properties.
|
||||||
|
|
||||||
use values::computed::Number;
|
use values::computed::Number;
|
||||||
use values::computed::length::LengthOrPercentage;
|
use values::computed::length::{LengthOrPercentage, NonNegativeLength};
|
||||||
use values::generics::box_::AnimationIterationCount as GenericAnimationIterationCount;
|
use values::generics::box_::AnimationIterationCount as GenericAnimationIterationCount;
|
||||||
|
use values::generics::box_::Perspective as GenericPerspective;
|
||||||
use values::generics::box_::VerticalAlign as GenericVerticalAlign;
|
use values::generics::box_::VerticalAlign as GenericVerticalAlign;
|
||||||
|
|
||||||
pub use values::specified::box_::{AnimationName, Display, OverflowClipBox, Contain};
|
pub use values::specified::box_::{AnimationName, Display, OverflowClipBox, Contain};
|
||||||
|
@ -25,3 +26,6 @@ impl AnimationIterationCount {
|
||||||
GenericAnimationIterationCount::Number(1.0)
|
GenericAnimationIterationCount::Number(1.0)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A computed value for the `perspective` property.
|
||||||
|
pub type Perspective = GenericPerspective<NonNegativeLength>;
|
||||||
|
|
|
@ -13,7 +13,7 @@ use std::ops::{Add, Neg};
|
||||||
use style_traits::{CssWriter, ToCss};
|
use style_traits::{CssWriter, ToCss};
|
||||||
use style_traits::values::specified::AllowedNumericType;
|
use style_traits::values::specified::AllowedNumericType;
|
||||||
use super::{Number, ToComputedValue, Context, Percentage};
|
use super::{Number, ToComputedValue, Context, Percentage};
|
||||||
use values::{Auto, CSSFloat, Either, None_, Normal, specified};
|
use values::{Auto, CSSFloat, Either, Normal, specified};
|
||||||
use values::animated::{Animate, Procedure, ToAnimatedValue, ToAnimatedZero};
|
use values::animated::{Animate, Procedure, ToAnimatedValue, ToAnimatedZero};
|
||||||
use values::computed::NonNegativeNumber;
|
use values::computed::NonNegativeNumber;
|
||||||
use values::distance::{ComputeSquaredDistance, SquaredDistance};
|
use values::distance::{ComputeSquaredDistance, SquaredDistance};
|
||||||
|
@ -792,9 +792,6 @@ impl From<Au> for CSSPixelLength {
|
||||||
/// An alias of computed `<length>` value.
|
/// An alias of computed `<length>` value.
|
||||||
pub type Length = CSSPixelLength;
|
pub type Length = CSSPixelLength;
|
||||||
|
|
||||||
/// Either a computed `<length>` or the `none` keyword.
|
|
||||||
pub type LengthOrNone = Either<Length, None_>;
|
|
||||||
|
|
||||||
/// Either a computed `<length>` or the `auto` keyword.
|
/// Either a computed `<length>` or the `auto` keyword.
|
||||||
pub type LengthOrAuto = Either<Length, Auto>;
|
pub type LengthOrAuto = Either<Length, Auto>;
|
||||||
|
|
||||||
|
|
|
@ -47,8 +47,9 @@ pub use self::font::{FontSize, FontSizeAdjust, FontSynthesis, FontWeight, FontVa
|
||||||
pub use self::font::{FontFamily, FontLanguageOverride, FontVariationSettings, FontVariantEastAsian};
|
pub use self::font::{FontFamily, FontLanguageOverride, FontVariationSettings, FontVariantEastAsian};
|
||||||
pub use self::font::{FontVariantLigatures, FontVariantNumeric, FontFeatureSettings};
|
pub use self::font::{FontVariantLigatures, FontVariantNumeric, FontFeatureSettings};
|
||||||
pub use self::font::{MozScriptLevel, MozScriptMinSize, MozScriptSizeMultiplier, XTextZoom, XLang};
|
pub use self::font::{MozScriptLevel, MozScriptMinSize, MozScriptSizeMultiplier, XTextZoom, XLang};
|
||||||
pub use self::box_::{AnimationIterationCount, AnimationName, Display, OverscrollBehavior, Contain};
|
pub use self::box_::{AnimationIterationCount, AnimationName, Contain, Display};
|
||||||
pub use self::box_::{OverflowClipBox, ScrollSnapType, TouchAction, VerticalAlign, WillChange};
|
pub use self::box_::{OverflowClipBox, OverscrollBehavior, Perspective};
|
||||||
|
pub use self::box_::{ScrollSnapType, TouchAction, VerticalAlign, WillChange};
|
||||||
pub use self::color::{Color, ColorPropertyValue, RGBAColor};
|
pub use self::color::{Color, ColorPropertyValue, RGBAColor};
|
||||||
pub use self::column::ColumnCount;
|
pub use self::column::ColumnCount;
|
||||||
pub use self::counters::{Content, ContentItem, CounterIncrement, CounterReset};
|
pub use self::counters::{Content, ContentItem, CounterIncrement, CounterReset};
|
||||||
|
@ -61,7 +62,7 @@ pub use self::gecko::ScrollSnapPoint;
|
||||||
pub use self::rect::LengthOrNumberRect;
|
pub use self::rect::LengthOrNumberRect;
|
||||||
pub use super::{Auto, Either, None_};
|
pub use super::{Auto, Either, None_};
|
||||||
pub use super::specified::{BorderStyle, TextDecorationLine};
|
pub use super::specified::{BorderStyle, TextDecorationLine};
|
||||||
pub use self::length::{CalcLengthOrPercentage, Length, LengthOrNone, LengthOrNumber, LengthOrPercentage};
|
pub use self::length::{CalcLengthOrPercentage, Length, LengthOrNumber, LengthOrPercentage};
|
||||||
pub use self::length::{LengthOrPercentageOrAuto, LengthOrPercentageOrNone, MaxLength, MozLength};
|
pub use self::length::{LengthOrPercentageOrAuto, LengthOrPercentageOrNone, MaxLength, MozLength};
|
||||||
pub use self::length::{CSSPixelLength, ExtremumLength, NonNegativeLength, NonNegativeLengthOrPercentage};
|
pub use self::length::{CSSPixelLength, ExtremumLength, NonNegativeLength, NonNegativeLengthOrPercentage};
|
||||||
pub use self::list::{ListStyleImage, Quotes};
|
pub use self::list::{ListStyleImage, Quotes};
|
||||||
|
|
|
@ -55,3 +55,21 @@ pub enum AnimationIterationCount<Number> {
|
||||||
/// The `infinite` keyword.
|
/// The `infinite` keyword.
|
||||||
Infinite,
|
Infinite,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A generic value for the `perspective` property.
|
||||||
|
#[derive(Animate, Clone, ComputeSquaredDistance, Copy, Debug, MallocSizeOf)]
|
||||||
|
#[derive(PartialEq, ToAnimatedValue, ToAnimatedZero, ToComputedValue, ToCss)]
|
||||||
|
pub enum Perspective<NonNegativeLength> {
|
||||||
|
/// A non-negative length.
|
||||||
|
Length(NonNegativeLength),
|
||||||
|
/// The keyword `none`.
|
||||||
|
None,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl<L> Perspective<L> {
|
||||||
|
/// Returns `none`.
|
||||||
|
#[inline]
|
||||||
|
pub fn none() -> Self {
|
||||||
|
Perspective::None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -13,9 +13,10 @@ use style_traits::{CssWriter, ParseError, StyleParseErrorKind, ToCss};
|
||||||
use values::CustomIdent;
|
use values::CustomIdent;
|
||||||
use values::KeyframesName;
|
use values::KeyframesName;
|
||||||
use values::generics::box_::AnimationIterationCount as GenericAnimationIterationCount;
|
use values::generics::box_::AnimationIterationCount as GenericAnimationIterationCount;
|
||||||
|
use values::generics::box_::Perspective as GenericPerspective;
|
||||||
use values::generics::box_::VerticalAlign as GenericVerticalAlign;
|
use values::generics::box_::VerticalAlign as GenericVerticalAlign;
|
||||||
use values::specified::{AllowQuirks, Number};
|
use values::specified::{AllowQuirks, Number};
|
||||||
use values::specified::length::LengthOrPercentage;
|
use values::specified::length::{LengthOrPercentage, NonNegativeLength};
|
||||||
|
|
||||||
#[allow(missing_docs)]
|
#[allow(missing_docs)]
|
||||||
#[derive(Clone, Copy, Debug, Eq, Hash, MallocSizeOf, Parse, PartialEq, ToComputedValue, ToCss)]
|
#[derive(Clone, Copy, Debug, Eq, Hash, MallocSizeOf, Parse, PartialEq, ToComputedValue, ToCss)]
|
||||||
|
@ -588,3 +589,18 @@ impl Parse for Contain {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// A specified value for the `perspective` property.
|
||||||
|
pub type Perspective = GenericPerspective<NonNegativeLength>;
|
||||||
|
|
||||||
|
impl Parse for Perspective {
|
||||||
|
fn parse<'i, 't>(
|
||||||
|
context: &ParserContext,
|
||||||
|
input: &mut Parser<'i, 't>
|
||||||
|
) -> Result<Self, ParseError<'i>> {
|
||||||
|
if input.try(|i| i.expect_ident_matching("none")).is_ok() {
|
||||||
|
return Ok(GenericPerspective::None);
|
||||||
|
}
|
||||||
|
Ok(GenericPerspective::Length(NonNegativeLength::parse(context, input)?))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
|
@ -17,7 +17,7 @@ use std::ops::{Add, Mul};
|
||||||
use style_traits::{ParseError, StyleParseErrorKind};
|
use style_traits::{ParseError, StyleParseErrorKind};
|
||||||
use style_traits::values::specified::AllowedNumericType;
|
use style_traits::values::specified::AllowedNumericType;
|
||||||
use super::{AllowQuirks, Number, ToComputedValue, Percentage};
|
use super::{AllowQuirks, Number, ToComputedValue, Percentage};
|
||||||
use values::{Auto, CSSFloat, Either, None_, Normal};
|
use values::{Auto, CSSFloat, Either, Normal};
|
||||||
use values::computed::{self, CSSPixelLength, Context, ExtremumLength};
|
use values::computed::{self, CSSPixelLength, Context, ExtremumLength};
|
||||||
use values::generics::NonNegative;
|
use values::generics::NonNegative;
|
||||||
use values::specified::NonNegativeNumber;
|
use values::specified::NonNegativeNumber;
|
||||||
|
@ -1062,9 +1062,6 @@ impl NonNegativeLengthOrPercentage {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// Either a `<length>` or the `none` keyword.
|
|
||||||
pub type LengthOrNone = Either<Length, None_>;
|
|
||||||
|
|
||||||
/// Either a `<length>` or the `normal` keyword.
|
/// Either a `<length>` or the `normal` keyword.
|
||||||
pub type LengthOrNormal = Either<Length, Normal>;
|
pub type LengthOrNormal = Either<Length, Normal>;
|
||||||
|
|
||||||
|
|
|
@ -39,8 +39,9 @@ pub use self::font::{FontSize, FontSizeAdjust, FontSynthesis, FontWeight, FontVa
|
||||||
pub use self::font::{FontFamily, FontLanguageOverride, FontVariationSettings, FontVariantEastAsian};
|
pub use self::font::{FontFamily, FontLanguageOverride, FontVariationSettings, FontVariantEastAsian};
|
||||||
pub use self::font::{FontVariantLigatures, FontVariantNumeric, FontFeatureSettings};
|
pub use self::font::{FontVariantLigatures, FontVariantNumeric, FontFeatureSettings};
|
||||||
pub use self::font::{MozScriptLevel, MozScriptMinSize, MozScriptSizeMultiplier, XTextZoom, XLang};
|
pub use self::font::{MozScriptLevel, MozScriptMinSize, MozScriptSizeMultiplier, XTextZoom, XLang};
|
||||||
pub use self::box_::{AnimationIterationCount, AnimationName, Display, OverscrollBehavior, Contain};
|
pub use self::box_::{AnimationIterationCount, AnimationName, Contain, Display};
|
||||||
pub use self::box_::{OverflowClipBox, ScrollSnapType, TouchAction, VerticalAlign, WillChange};
|
pub use self::box_::{OverflowClipBox, OverscrollBehavior, Perspective};
|
||||||
|
pub use self::box_::{ScrollSnapType, TouchAction, VerticalAlign, WillChange};
|
||||||
pub use self::color::{Color, ColorPropertyValue, RGBAColor};
|
pub use self::color::{Color, ColorPropertyValue, RGBAColor};
|
||||||
pub use self::counters::{Content, ContentItem, CounterIncrement, CounterReset};
|
pub use self::counters::{Content, ContentItem, CounterIncrement, CounterReset};
|
||||||
pub use self::effects::{BoxShadow, Filter, SimpleShadow};
|
pub use self::effects::{BoxShadow, Filter, SimpleShadow};
|
||||||
|
@ -51,7 +52,7 @@ pub use self::image::{ColorStop, EndingShape as GradientEndingShape, Gradient};
|
||||||
pub use self::image::{GradientItem, GradientKind, Image, ImageLayer, MozImageRect};
|
pub use self::image::{GradientItem, GradientKind, Image, ImageLayer, MozImageRect};
|
||||||
pub use self::inherited_box::ImageOrientation;
|
pub use self::inherited_box::ImageOrientation;
|
||||||
pub use self::length::{AbsoluteLength, CalcLengthOrPercentage, CharacterWidth};
|
pub use self::length::{AbsoluteLength, CalcLengthOrPercentage, CharacterWidth};
|
||||||
pub use self::length::{FontRelativeLength, Length, LengthOrNone, LengthOrNumber};
|
pub use self::length::{FontRelativeLength, Length, LengthOrNumber};
|
||||||
pub use self::length::{LengthOrPercentage, LengthOrPercentageOrAuto};
|
pub use self::length::{LengthOrPercentage, LengthOrPercentageOrAuto};
|
||||||
pub use self::length::{LengthOrPercentageOrNone, MaxLength, MozLength};
|
pub use self::length::{LengthOrPercentageOrNone, MaxLength, MozLength};
|
||||||
pub use self::length::{NoCalcLength, ViewportPercentageLength};
|
pub use self::length::{NoCalcLength, ViewportPercentageLength};
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue