diff options
author | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2017-07-13 12:20:30 +0200 |
---|---|---|
committer | Fernando Jiménez Moreno <ferjmoreno@gmail.com> | 2017-07-13 12:20:30 +0200 |
commit | 6ae4bf6ee817b2df642beaf8ed7fafbb7ad4e62e (patch) | |
tree | 4292b6ee6785750cb5bb225c2614a4aeef84e512 /components/style/gecko/conversions.rs | |
parent | 9d74ae890b31fc45452ae60af7d89573fc52a86f (diff) | |
download | servo-6ae4bf6ee817b2df642beaf8ed7fafbb7ad4e62e.tar.gz servo-6ae4bf6ee817b2df642beaf8ed7fafbb7ad4e62e.zip |
Implement serialization of linear-gradient the same ways as in Gecko
Diffstat (limited to 'components/style/gecko/conversions.rs')
-rw-r--r-- | components/style/gecko/conversions.rs | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/components/style/gecko/conversions.rs b/components/style/gecko/conversions.rs index 6314069cb18..0bc666db0b1 100644 --- a/components/style/gecko/conversions.rs +++ b/components/style/gecko/conversions.rs @@ -15,6 +15,7 @@ use gecko_bindings::bindings::{Gecko_InitializeImageCropRect, Gecko_SetImageElem use gecko_bindings::structs::{nsCSSUnit, nsStyleCoord_CalcValue, nsStyleImage}; use gecko_bindings::structs::{nsresult, SheetType}; use gecko_bindings::sugar::ns_style_coord::{CoordDataValue, CoordData, CoordDataMut}; +use std::f32::consts::PI; use stylesheets::{Origin, RulesMutateError}; use values::computed::{Angle, CalcLengthOrPercentage, Gradient, Image}; use values::computed::{LengthOrPercentage, LengthOrPercentageOrAuto}; @@ -215,10 +216,35 @@ impl nsStyleImage { match direction { LineDirection::Angle(angle) => { + // PI radians (180deg) is ignored because it is the default value. + if angle.radians() != PI { + unsafe { + (*gecko_gradient).mAngle.set(angle); + } + } + }, + LineDirection::Horizontal(x) => { + let x = match x { + X::Left => 0.0, + X::Right => 1.0, + }; + unsafe { - (*gecko_gradient).mAngle.set(angle); - (*gecko_gradient).mBgPosX.set_value(CoordDataValue::None); - (*gecko_gradient).mBgPosY.set_value(CoordDataValue::None); + (*gecko_gradient).mBgPosX + .set_value(CoordDataValue::Percent(x)); + (*gecko_gradient).mBgPosY + .set_value(CoordDataValue::Percent(0.5)); + } + }, + LineDirection::Vertical(y) => { + // Y::Bottom (to bottom) is ignored because it is the default value. + if y == Y::Top { + unsafe { + (*gecko_gradient).mBgPosX + .set_value(CoordDataValue::Percent(0.5)); + (*gecko_gradient).mBgPosY + .set_value(CoordDataValue::Percent(0.0)); + } } }, LineDirection::Corner(horiz, vert) => { @@ -232,7 +258,6 @@ impl nsStyleImage { }; unsafe { - (*gecko_gradient).mAngle.set_value(CoordDataValue::None); (*gecko_gradient).mBgPosX .set_value(CoordDataValue::Percent(percent_x)); (*gecko_gradient).mBgPosY @@ -245,14 +270,9 @@ impl nsStyleImage { if let Some(position) = position { (*gecko_gradient).mBgPosX.set(position.horizontal); (*gecko_gradient).mBgPosY.set(position.vertical); - } else { - (*gecko_gradient).mBgPosX.set_value(CoordDataValue::None); - (*gecko_gradient).mBgPosY.set_value(CoordDataValue::None); } if let Some(angle) = angle { (*gecko_gradient).mAngle.set(angle); - } else { - (*gecko_gradient).mAngle.set_value(CoordDataValue::None); } } }, @@ -304,12 +324,7 @@ impl nsStyleImage { unsafe { if let Some(angle) = angle { (*gecko_gradient).mAngle.set(angle); - } else { - (*gecko_gradient).mAngle.set_value(CoordDataValue::None); } - - (*gecko_gradient).mBgPosX.set_value(CoordDataValue::None); - (*gecko_gradient).mBgPosY.set_value(CoordDataValue::None); } // Setting radius values depending shape |