From 7345af613a187f05c7c46fb456dfbd135c37c843 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emilio=20Cobos=20=C3=81lvarez?= Date: Fri, 5 Oct 2018 20:08:55 +0000 Subject: [PATCH] style: Serialize a bunch of image properties with Servo. I had to fix the conversion for BackgroundSize too, hopefully we can simplify all this using cbindgen in the future instead of CalcValue. Differential Revision: https://phabricator.services.mozilla.com/D7580 --- components/style/gecko/conversions.rs | 22 ++++++++++++- components/style/gecko/url.rs | 20 +++++++++--- components/style/properties/gecko.mako.rs | 3 +- components/style/values/computed/length.rs | 37 +++++++++++++++------- 4 files changed, 63 insertions(+), 19 deletions(-) diff --git a/components/style/gecko/conversions.rs b/components/style/gecko/conversions.rs index c6009c96dee..bc0894c58d6 100644 --- a/components/style/gecko/conversions.rs +++ b/components/style/gecko/conversions.rs @@ -17,7 +17,7 @@ use gecko_bindings::sugar::ns_style_coord::{CoordData, CoordDataMut, CoordDataVa use std::f32::consts::PI; use stylesheets::{Origin, RulesMutateError}; use values::computed::{Angle, CalcLengthOrPercentage, Gradient, Image}; -use values::computed::{Integer, LengthOrPercentage, LengthOrPercentageOrAuto}; +use values::computed::{Integer, LengthOrPercentage, LengthOrPercentageOrAuto, NonNegativeLengthOrPercentageOrAuto}; use values::computed::{Percentage, TextAlign}; use values::computed::image::LineDirection; use values::computed::url::ComputedImageUrl; @@ -106,6 +106,26 @@ impl From for LengthOrPercentageOrAuto { } } +// FIXME(emilio): A lot of these impl From should probably become explicit or +// disappear as we move more stuff to cbindgen. +impl From for NonNegativeLengthOrPercentageOrAuto { + fn from(other: nsStyleCoord_CalcValue) -> Self { + use values::generics::NonNegative; + use style_traits::values::specified::AllowedNumericType; + NonNegative(if other.mLength < 0 || other.mPercent < 0. { + LengthOrPercentageOrAuto::Calc( + CalcLengthOrPercentage::with_clamping_mode( + Au(other.mLength).into(), + if other.mHasPercent { Some(Percentage(other.mPercent)) } else { None }, + AllowedNumericType::NonNegative, + ) + ) + } else { + other.into() + }) + } +} + impl From for CoordDataValue { fn from(reference: Angle) -> Self { match reference { diff --git a/components/style/gecko/url.rs b/components/style/gecko/url.rs index c00fc8c27e3..24bd9b66f97 100644 --- a/components/style/gecko/url.rs +++ b/components/style/gecko/url.rs @@ -273,14 +273,18 @@ impl ToComputedValue for SpecifiedImageUrl { } } -fn serialize_computed_url(url_value_data: &URLValueData, dest: &mut CssWriter) -> fmt::Result +fn serialize_computed_url( + url_value_data: &URLValueData, + dest: &mut CssWriter, + get_url: unsafe extern "C" fn(*const URLValueData, *mut nsCString) -> (), +) -> fmt::Result where W: Write, { dest.write_str("url(")?; unsafe { let mut string = nsCString::new(); - bindings::Gecko_GetComputedURLSpec(url_value_data, &mut string); + get_url(url_value_data, &mut string); string.as_str_unchecked().to_css(dest)?; } dest.write_char(')') @@ -298,7 +302,11 @@ impl ToCss for ComputedUrl { where W: Write, { - serialize_computed_url(&self.0.url_value._base, dest) + serialize_computed_url( + &self.0.url_value._base, + dest, + bindings::Gecko_GetComputedURLSpec, + ) } } @@ -319,7 +327,11 @@ impl ToCss for ComputedImageUrl { where W: Write, { - serialize_computed_url(&self.0.image_value._base, dest) + serialize_computed_url( + &self.0.image_value._base, + dest, + bindings::Gecko_GetComputedImageURLSpec, + ) } } diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 65ed6c4ed83..8b6298b01d2 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -4005,7 +4005,6 @@ fn static_assert() { pub fn clone_${shorthand}_size(&self) -> longhands::${shorthand}_size::computed_value::T { use gecko_bindings::structs::nsStyleCoord_CalcValue as CalcValue; use gecko_bindings::structs::nsStyleImageLayers_Size_DimensionType as DimensionType; - use values::generics::NonNegative; use values::computed::NonNegativeLengthOrPercentageOrAuto; use values::generics::background::BackgroundSize; @@ -4014,7 +4013,7 @@ fn static_assert() { NonNegativeLengthOrPercentageOrAuto::auto() } else { debug_assert_eq!(ty, DimensionType::eLengthPercentage as u8); - NonNegative(value.into()) + value.into() } } diff --git a/components/style/values/computed/length.rs b/components/style/values/computed/length.rs index 5acc2688224..d3bc0b5ebd0 100644 --- a/components/style/values/computed/length.rs +++ b/components/style/values/computed/length.rs @@ -202,21 +202,34 @@ impl ToCss for CalcLengthOrPercentage { { use num_traits::Zero; - let (length, percentage) = match (self.length, self.percentage) { - (l, None) => return l.to_css(dest), - (l, Some(p)) if l.px() == 0. => return p.to_css(dest), - (l, Some(p)) => (l, p), - }; + let length = self.unclamped_length(); + match self.percentage { + Some(p) => { + if length.px() == 0. && self.clamping_mode.clamp(p.0) == p.0 { + return p.to_css(dest); + } + } + None => { + if self.clamping_mode.clamp(length.px()) == length.px() { + return length.to_css(dest); + } + } + } dest.write_str("calc(")?; - percentage.to_css(dest)?; - - dest.write_str(if length.px() < Zero::zero() { - " - " + if let Some(percentage) = self.percentage { + percentage.to_css(dest)?; + if length.px() != 0. { + dest.write_str(if length.px() < Zero::zero() { + " - " + } else { + " + " + })?; + length.abs().to_css(dest)?; + } } else { - " + " - })?; - length.abs().to_css(dest)?; + length.to_css(dest)?; + } dest.write_str(")") }