From be105b543dace01407e242b0e76071aab65d27e6 Mon Sep 17 00:00:00 2001 From: Cameron McCormack Date: Mon, 1 Aug 2016 20:41:56 -0500 Subject: [PATCH] servo: Merge #12651 - Add support for background-position in geckolib (from heycam:background-position); r=Manishearth r? @Manishearth --- - [X] `./mach build -d` does not report any errors - [X] `./mach test-tidy` does not report any errors - [ ] These changes fix #__ (github issue number if applicable). - [ ] There are tests for these changes OR - [X] These changes do not require tests because this is a geckolib-only change Source-Repo: https://github.com/servo/servo Source-Revision: f16aac0e5d53fce673b884476a68b9439f6042ba --- servo/components/style/gecko_conversions.rs | 34 ++++++++++++++++++- .../components/style/properties/gecko.mako.rs | 26 +++++++++++++- 2 files changed, 58 insertions(+), 2 deletions(-) diff --git a/servo/components/style/gecko_conversions.rs b/servo/components/style/gecko_conversions.rs index 95ab9eb8b00d..56e2e3bbc5fe 100644 --- a/servo/components/style/gecko_conversions.rs +++ b/servo/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/servo/components/style/properties/gecko.mako.rs b/servo/components/style/properties/gecko.mako.rs index 074e4e08579d..24893da9f7ba 100644 --- a/servo/components/style/properties/gecko.mako.rs +++ b/servo/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,