mirror of
https://github.com/servo/servo.git
synced 2025-08-03 04:30:10 +01:00
style: Add a Zero trait that doesn't require Add, and use it in place of num_traits and IsZeroLength.
Use it to be consistent in InsetRect serialization and storage between Servo and Gecko. Differential Revision: https://phabricator.services.mozilla.com/D21493
This commit is contained in:
parent
4496411edc
commit
7d01114cbf
29 changed files with 179 additions and 186 deletions
|
@ -11,6 +11,7 @@ use crate::values::generics::border::BorderRadius;
|
|||
use crate::values::generics::position::Position;
|
||||
use crate::values::generics::rect::Rect;
|
||||
use crate::values::specified::SVGPathData;
|
||||
use crate::Zero;
|
||||
use std::fmt::{self, Write};
|
||||
use style_traits::{CssWriter, ToCss};
|
||||
|
||||
|
@ -127,7 +128,7 @@ pub enum BasicShape<H, V, LengthPercentage, NonNegativeLengthPercentage> {
|
|||
)]
|
||||
pub struct InsetRect<LengthPercentage, NonNegativeLengthPercentage> {
|
||||
pub rect: Rect<LengthPercentage>,
|
||||
pub round: Option<BorderRadius<NonNegativeLengthPercentage>>,
|
||||
pub round: BorderRadius<NonNegativeLengthPercentage>,
|
||||
}
|
||||
|
||||
/// <https://drafts.csswg.org/css-shapes/#funcdef-circle>
|
||||
|
@ -311,7 +312,7 @@ impl<B, T, U> ToAnimatedZero for ShapeSource<B, T, U> {
|
|||
impl<Length, NonNegativeLength> ToCss for InsetRect<Length, NonNegativeLength>
|
||||
where
|
||||
Length: ToCss + PartialEq,
|
||||
NonNegativeLength: ToCss + PartialEq,
|
||||
NonNegativeLength: ToCss + PartialEq + Zero,
|
||||
{
|
||||
fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
|
||||
where
|
||||
|
@ -319,9 +320,9 @@ where
|
|||
{
|
||||
dest.write_str("inset(")?;
|
||||
self.rect.to_css(dest)?;
|
||||
if let Some(ref radius) = self.round {
|
||||
if !self.round.is_zero() {
|
||||
dest.write_str(" round ")?;
|
||||
radius.to_css(dest)?;
|
||||
self.round.to_css(dest)?;
|
||||
}
|
||||
dest.write_str(")")
|
||||
}
|
||||
|
|
|
@ -6,6 +6,7 @@
|
|||
|
||||
use crate::values::generics::rect::Rect;
|
||||
use crate::values::generics::size::Size2D;
|
||||
use crate::Zero;
|
||||
use std::fmt::{self, Write};
|
||||
use style_traits::{CssWriter, ToCss};
|
||||
|
||||
|
@ -65,6 +66,16 @@ impl<L> BorderCornerRadius<L> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<L: Zero> Zero for BorderCornerRadius<L> {
|
||||
fn zero() -> Self {
|
||||
BorderCornerRadius(Size2D::zero())
|
||||
}
|
||||
|
||||
fn is_zero(&self) -> bool {
|
||||
self.0.is_zero()
|
||||
}
|
||||
}
|
||||
|
||||
/// A generic value for the `border-spacing` property.
|
||||
#[derive(
|
||||
Animate,
|
||||
|
@ -135,12 +146,7 @@ impl<L> BorderRadius<L> {
|
|||
bottom_left: bl,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<L> BorderRadius<L>
|
||||
where
|
||||
L: PartialEq + ToCss,
|
||||
{
|
||||
/// Serialises two given rects following the syntax of the `border-radius``
|
||||
/// property.
|
||||
pub fn serialize_rects<W>(
|
||||
|
@ -149,6 +155,7 @@ where
|
|||
dest: &mut CssWriter<W>,
|
||||
) -> fmt::Result
|
||||
where
|
||||
L: PartialEq + ToCss,
|
||||
W: Write,
|
||||
{
|
||||
widths.to_css(dest)?;
|
||||
|
@ -160,6 +167,24 @@ where
|
|||
}
|
||||
}
|
||||
|
||||
impl<L: Zero> Zero for BorderRadius<L> {
|
||||
fn zero() -> Self {
|
||||
Self::new(
|
||||
BorderCornerRadius::<L>::zero(),
|
||||
BorderCornerRadius::<L>::zero(),
|
||||
BorderCornerRadius::<L>::zero(),
|
||||
BorderCornerRadius::<L>::zero(),
|
||||
)
|
||||
}
|
||||
|
||||
fn is_zero(&self) -> bool {
|
||||
self.top_left.is_zero() &&
|
||||
self.top_right.is_zero() &&
|
||||
self.bottom_right.is_zero() &&
|
||||
self.bottom_left.is_zero()
|
||||
}
|
||||
}
|
||||
|
||||
impl<L> ToCss for BorderRadius<L>
|
||||
where
|
||||
L: PartialEq + ToCss,
|
||||
|
|
|
@ -7,8 +7,8 @@
|
|||
use crate::parser::{Parse, ParserContext};
|
||||
#[cfg(feature = "gecko")]
|
||||
use crate::values::computed::ExtremumLength;
|
||||
use crate::Zero;
|
||||
use cssparser::Parser;
|
||||
use num_traits::Zero;
|
||||
use style_traits::ParseError;
|
||||
|
||||
/// A `<length-percentage> | auto` value.
|
||||
|
@ -67,6 +67,19 @@ impl<LengthPercentage> LengthPercentageOrAuto<LengthPercentage> {
|
|||
}
|
||||
}
|
||||
|
||||
impl<LengthPercentage: Zero> Zero for LengthPercentageOrAuto<LengthPercentage> {
|
||||
fn zero() -> Self {
|
||||
LengthPercentageOrAuto::LengthPercentage(Zero::zero())
|
||||
}
|
||||
|
||||
fn is_zero(&self) -> bool {
|
||||
match *self {
|
||||
LengthPercentageOrAuto::LengthPercentage(ref l) => l.is_zero(),
|
||||
LengthPercentageOrAuto::Auto => false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
impl<LengthPercentage: Parse> Parse for LengthPercentageOrAuto<LengthPercentage> {
|
||||
fn parse<'i, 't>(
|
||||
context: &ParserContext,
|
||||
|
@ -186,12 +199,15 @@ pub enum GenericLengthOrNumber<L, N> {
|
|||
|
||||
pub use self::GenericLengthOrNumber as LengthOrNumber;
|
||||
|
||||
impl<L, N> LengthOrNumber<L, N> {
|
||||
/// Returns `0`.
|
||||
pub fn zero() -> Self
|
||||
where
|
||||
N: Zero,
|
||||
{
|
||||
LengthOrNumber::Number(num_traits::Zero::zero())
|
||||
impl<L, N: Zero> Zero for LengthOrNumber<L, N> {
|
||||
fn zero() -> Self {
|
||||
LengthOrNumber::Number(Zero::zero())
|
||||
}
|
||||
|
||||
fn is_zero(&self) -> bool {
|
||||
match *self {
|
||||
LengthOrNumber::Number(ref n) => n.is_zero(),
|
||||
LengthOrNumber::Length(..) => false,
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,8 +8,8 @@
|
|||
use super::CustomIdent;
|
||||
use crate::counter_style::{parse_counter_style_name, Symbols};
|
||||
use crate::parser::{Parse, ParserContext};
|
||||
use crate::Zero;
|
||||
use cssparser::Parser;
|
||||
use num_traits::Zero;
|
||||
use std::ops::Add;
|
||||
use style_traits::{KeywordsCollectFn, ParseError};
|
||||
use style_traits::{SpecifiedValueInfo, StyleParseErrorKind};
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
//! Generic type for CSS properties that are composed by two dimensions.
|
||||
|
||||
use crate::parser::ParserContext;
|
||||
use crate::Zero;
|
||||
use cssparser::Parser;
|
||||
use std::fmt::{self, Write};
|
||||
use style_traits::{CssWriter, ParseError, ToCss};
|
||||
|
@ -84,3 +85,13 @@ where
|
|||
Ok(())
|
||||
}
|
||||
}
|
||||
|
||||
impl<L: Zero> Zero for Size2D<L> {
|
||||
fn zero() -> Self {
|
||||
Self::new(L::zero(), L::zero())
|
||||
}
|
||||
|
||||
fn is_zero(&self) -> bool {
|
||||
self.width.is_zero() && self.height.is_zero()
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,9 +10,9 @@ use crate::values::specified::angle::Angle as SpecifiedAngle;
|
|||
use crate::values::specified::length::Length as SpecifiedLength;
|
||||
use crate::values::specified::length::LengthPercentage as SpecifiedLengthPercentage;
|
||||
use crate::values::{computed, CSSFloat};
|
||||
use crate::Zero;
|
||||
use app_units::Au;
|
||||
use euclid::{self, Rect, Transform3D};
|
||||
use num_traits::Zero;
|
||||
use std::fmt::{self, Write};
|
||||
use style_traits::{CssWriter, ToCss};
|
||||
|
||||
|
@ -643,16 +643,7 @@ pub enum Translate<LengthPercentage, Length> {
|
|||
Translate3D(LengthPercentage, LengthPercentage, Length),
|
||||
}
|
||||
|
||||
/// A trait to check if this is a zero length.
|
||||
/// An alternative way is use num_traits::Zero. However, in order to implement num_traits::Zero,
|
||||
/// we also have to implement Add, which may be complicated for LengthPercentage::Calc.
|
||||
/// We could do this if other types also need it. If so, we could drop this trait.
|
||||
pub trait IsZeroLength {
|
||||
/// Returns true if this is a zero length.
|
||||
fn is_zero_length(&self) -> bool;
|
||||
}
|
||||
|
||||
impl<LoP: ToCss + IsZeroLength, L: ToCss> ToCss for Translate<LoP, L> {
|
||||
impl<LoP: ToCss + Zero, L: ToCss> ToCss for Translate<LoP, L> {
|
||||
fn to_css<W>(&self, dest: &mut CssWriter<W>) -> fmt::Result
|
||||
where
|
||||
W: fmt::Write,
|
||||
|
@ -670,7 +661,7 @@ impl<LoP: ToCss + IsZeroLength, L: ToCss> ToCss for Translate<LoP, L> {
|
|||
Translate::None => dest.write_str("none"),
|
||||
Translate::Translate(ref x, ref y) => {
|
||||
x.to_css(dest)?;
|
||||
if !y.is_zero_length() {
|
||||
if !y.is_zero() {
|
||||
dest.write_char(' ')?;
|
||||
y.to_css(dest)?;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue