aboutsummaryrefslogtreecommitdiffstats
path: root/components/style/gecko/conversions.rs
diff options
context:
space:
mode:
authorFernando Jiménez Moreno <ferjmoreno@gmail.com>2017-07-13 12:20:30 +0200
committerFernando Jiménez Moreno <ferjmoreno@gmail.com>2017-07-13 12:20:30 +0200
commit6ae4bf6ee817b2df642beaf8ed7fafbb7ad4e62e (patch)
tree4292b6ee6785750cb5bb225c2614a4aeef84e512 /components/style/gecko/conversions.rs
parent9d74ae890b31fc45452ae60af7d89573fc52a86f (diff)
downloadservo-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.rs43
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