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
This commit is contained in:
Emilio Cobos Álvarez 2018-10-05 20:08:55 +00:00
parent 0d5d5a9c82
commit 7345af613a
No known key found for this signature in database
GPG key ID: 056B727BB9C1027C
4 changed files with 63 additions and 19 deletions

View file

@ -17,7 +17,7 @@ use gecko_bindings::sugar::ns_style_coord::{CoordData, CoordDataMut, CoordDataVa
use std::f32::consts::PI; use std::f32::consts::PI;
use stylesheets::{Origin, RulesMutateError}; use stylesheets::{Origin, RulesMutateError};
use values::computed::{Angle, CalcLengthOrPercentage, Gradient, Image}; 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::{Percentage, TextAlign};
use values::computed::image::LineDirection; use values::computed::image::LineDirection;
use values::computed::url::ComputedImageUrl; use values::computed::url::ComputedImageUrl;
@ -106,6 +106,26 @@ impl From<nsStyleCoord_CalcValue> 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<nsStyleCoord_CalcValue> 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<Angle> for CoordDataValue { impl From<Angle> for CoordDataValue {
fn from(reference: Angle) -> Self { fn from(reference: Angle) -> Self {
match reference { match reference {

View file

@ -273,14 +273,18 @@ impl ToComputedValue for SpecifiedImageUrl {
} }
} }
fn serialize_computed_url<W>(url_value_data: &URLValueData, dest: &mut CssWriter<W>) -> fmt::Result fn serialize_computed_url<W>(
url_value_data: &URLValueData,
dest: &mut CssWriter<W>,
get_url: unsafe extern "C" fn(*const URLValueData, *mut nsCString) -> (),
) -> fmt::Result
where where
W: Write, W: Write,
{ {
dest.write_str("url(")?; dest.write_str("url(")?;
unsafe { unsafe {
let mut string = nsCString::new(); 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)?; string.as_str_unchecked().to_css(dest)?;
} }
dest.write_char(')') dest.write_char(')')
@ -298,7 +302,11 @@ impl ToCss for ComputedUrl {
where where
W: Write, 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 where
W: Write, W: Write,
{ {
serialize_computed_url(&self.0.image_value._base, dest) serialize_computed_url(
&self.0.image_value._base,
dest,
bindings::Gecko_GetComputedImageURLSpec,
)
} }
} }

View file

@ -4005,7 +4005,6 @@ fn static_assert() {
pub fn clone_${shorthand}_size(&self) -> longhands::${shorthand}_size::computed_value::T { pub fn clone_${shorthand}_size(&self) -> longhands::${shorthand}_size::computed_value::T {
use gecko_bindings::structs::nsStyleCoord_CalcValue as CalcValue; use gecko_bindings::structs::nsStyleCoord_CalcValue as CalcValue;
use gecko_bindings::structs::nsStyleImageLayers_Size_DimensionType as DimensionType; use gecko_bindings::structs::nsStyleImageLayers_Size_DimensionType as DimensionType;
use values::generics::NonNegative;
use values::computed::NonNegativeLengthOrPercentageOrAuto; use values::computed::NonNegativeLengthOrPercentageOrAuto;
use values::generics::background::BackgroundSize; use values::generics::background::BackgroundSize;
@ -4014,7 +4013,7 @@ fn static_assert() {
NonNegativeLengthOrPercentageOrAuto::auto() NonNegativeLengthOrPercentageOrAuto::auto()
} else { } else {
debug_assert_eq!(ty, DimensionType::eLengthPercentage as u8); debug_assert_eq!(ty, DimensionType::eLengthPercentage as u8);
NonNegative(value.into()) value.into()
} }
} }

View file

@ -202,21 +202,34 @@ impl ToCss for CalcLengthOrPercentage {
{ {
use num_traits::Zero; use num_traits::Zero;
let (length, percentage) = match (self.length, self.percentage) { let length = self.unclamped_length();
(l, None) => return l.to_css(dest), match self.percentage {
(l, Some(p)) if l.px() == 0. => return p.to_css(dest), Some(p) => {
(l, Some(p)) => (l, 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(")?; dest.write_str("calc(")?;
percentage.to_css(dest)?; if let Some(percentage) = self.percentage {
percentage.to_css(dest)?;
dest.write_str(if length.px() < Zero::zero() { if length.px() != 0. {
" - " dest.write_str(if length.px() < Zero::zero() {
" - "
} else {
" + "
})?;
length.abs().to_css(dest)?;
}
} else { } else {
" + " length.to_css(dest)?;
})?; }
length.abs().to_css(dest)?;
dest.write_str(")") dest.write_str(")")
} }