diff --git a/components/style/gecko_conversions.rs b/components/style/gecko_conversions.rs index 95ab9eb8b00..56e2e3bbc5f 100644 --- a/components/style/gecko_conversions.rs +++ b/components/style/gecko_conversions.rs @@ -8,7 +8,7 @@ use app_units::Au; use gecko_bindings::structs::nsStyleCoord_CalcValue; -use values::computed::CalcLengthOrPercentage; +use values::computed::{CalcLengthOrPercentage, LengthOrPercentage}; impl From for nsStyleCoord_CalcValue { fn from(other: CalcLengthOrPercentage) -> nsStyleCoord_CalcValue { @@ -34,3 +34,35 @@ impl From for CalcLengthOrPercentage { } } } + +impl From for nsStyleCoord_CalcValue { + fn from(other: LengthOrPercentage) -> nsStyleCoord_CalcValue { + match other { + LengthOrPercentage::Length(au) => { + nsStyleCoord_CalcValue { + mLength: au.0, + mPercent: 0.0, + mHasPercent: false, + } + }, + LengthOrPercentage::Percentage(pc) => { + nsStyleCoord_CalcValue { + mLength: 0, + mPercent: pc, + mHasPercent: true, + } + }, + LengthOrPercentage::Calc(calc) => calc.into(), + } + } +} + +impl From for LengthOrPercentage { + fn from(other: nsStyleCoord_CalcValue) -> LengthOrPercentage { + match (other.mHasPercent, other.mLength) { + (false, _) => LengthOrPercentage::Length(Au(other.mLength)), + (true, 0) => LengthOrPercentage::Percentage(other.mPercent), + _ => LengthOrPercentage::Calc(other.into()), + } + } +} diff --git a/components/style/properties/gecko.mako.rs b/components/style/properties/gecko.mako.rs index 074e4e08579..24893da9f7b 100644 --- a/components/style/properties/gecko.mako.rs +++ b/components/style/properties/gecko.mako.rs @@ -922,7 +922,8 @@ fn static_assert() { // add support for parsing these lists in servo and pushing to nsTArray's. <% skip_background_longhands = """background-color background-repeat background-image background-clip - background-origin background-attachment""" %> + background-origin background-attachment + background-position""" %> <%self:impl_trait style_struct_name="Background" skip_longhands="${skip_background_longhands}" skip_additionals="*"> @@ -1010,6 +1011,29 @@ fn static_assert() { }; } + pub fn copy_background_position_from(&mut self, other: &Self) { + self.gecko.mImage.mPositionXCount = cmp::min(1, other.gecko.mImage.mPositionXCount); + self.gecko.mImage.mPositionYCount = cmp::min(1, other.gecko.mImage.mPositionYCount); + self.gecko.mImage.mLayers.mFirstElement.mPosition = + other.gecko.mImage.mLayers.mFirstElement.mPosition; + } + + pub fn clone_background_position(&self) -> longhands::background_position::computed_value::T { + let position = &self.gecko.mImage.mLayers.mFirstElement.mPosition; + longhands::background_position::computed_value::T { + horizontal: position.mXPosition.into(), + vertical: position.mYPosition.into(), + } + } + + pub fn set_background_position(&mut self, v: longhands::background_position::computed_value::T) { + let position = &mut self.gecko.mImage.mLayers.mFirstElement.mPosition; + position.mXPosition = v.horizontal.into(); + position.mYPosition = v.vertical.into(); + self.gecko.mImage.mPositionXCount = 1; + self.gecko.mImage.mPositionYCount = 1; + } + pub fn copy_background_image_from(&mut self, other: &Self) { unsafe { Gecko_CopyImageValueFrom(&mut self.gecko.mImage.mLayers.mFirstElement.mImage,