diff options
Diffstat (limited to 'src/components/main/layout/incremental.rs')
-rw-r--r-- | src/components/main/layout/incremental.rs | 162 |
1 files changed, 21 insertions, 141 deletions
diff --git a/src/components/main/layout/incremental.rs b/src/components/main/layout/incremental.rs index e050418886e..710e3979e0b 100644 --- a/src/components/main/layout/incremental.rs +++ b/src/components/main/layout/incremental.rs @@ -4,100 +4,34 @@ use style::ComputedValues; -/// Individual layout actions that may be necessary after restyling. -/// -/// If you add to this enum, also add the value to RestyleDamage::all below. -/// (FIXME: do this automatically) -pub enum RestyleEffect { - /// Repaint the node itself. - /// Currently unused; need to decide how this propagates. - Repaint = 0x01, - - /// Recompute intrinsic widths (minimum and preferred). - /// Propagates down the flow tree because the computation is - /// bottom-up. - BubbleWidths = 0x02, - - /// Recompute actual widths and heights. - /// Propagates up the flow tree because the computation is - /// top-down. - Reflow = 0x04, -} - -/// A set of RestyleEffects. -// FIXME: Switch to librustc/util/enum_set.rs if that gets moved into -// libextra (Rust #8054) -pub struct RestyleDamage { - bits: int +bitflags! { + #[doc = "Individual layout actions that may be necessary after restyling."] + flags RestyleDamage: int { + #[doc = "Repaint the node itself."] + #[doc = "Currently unused; need to decide how this propagates."] + static Repaint = 0x01, + + #[doc = "Recompute intrinsic widths (minimum and preferred)."] + #[doc = "Propagates down the flow tree because the computation is"] + #[doc = "bottom-up."] + static BubbleWidths = 0x02, + + #[doc = "Recompute actual widths and heights."] + #[doc = "Propagates up the flow tree because the computation is"] + #[doc = "top-down."] + static Reflow = 0x04 + } } -// Provide literal syntax of the form restyle_damage!(Repaint, Reflow) -macro_rules! restyle_damage( - ( $($damage:ident),* ) => ( - RestyleDamage::none() $( .add($damage) )* - ) -) - impl RestyleDamage { - pub fn none() -> RestyleDamage { - RestyleDamage { bits: 0 } - } - - pub fn all() -> RestyleDamage { - restyle_damage!(Repaint, BubbleWidths, Reflow) - } - - /// Create a RestyleDamage from the underlying bit field. - /// We would rather not allow this, but some types in script - /// need to store RestyleDamage without depending on this crate. - pub fn from_int(n: int) -> RestyleDamage { - RestyleDamage { bits: n } - } - - pub fn to_int(self) -> int { - self.bits - } - - pub fn is_empty(self) -> bool { - self.bits == 0 - } - - pub fn is_nonempty(self) -> bool { - self.bits != 0 - } - - pub fn add(self, effect: RestyleEffect) -> RestyleDamage { - RestyleDamage { bits: self.bits | (effect as int) } - } - - pub fn has(self, effect: RestyleEffect) -> bool { - (self.bits & (effect as int)) != 0 - } - - pub fn lacks(self, effect: RestyleEffect) -> bool { - (self.bits & (effect as int)) == 0 - } - - pub fn union(self, other: RestyleDamage) -> RestyleDamage { - RestyleDamage { bits: self.bits | other.bits } - } - - pub fn union_in_place(&mut self, other: RestyleDamage) { - self.bits = self.bits | other.bits; - } - - pub fn intersect(self, other: RestyleDamage) -> RestyleDamage { - RestyleDamage { bits: self.bits & other.bits } - } - /// Elements of self which should also get set on any ancestor flow. pub fn propagate_up(self) -> RestyleDamage { - self.intersect(restyle_damage!(Reflow)) + self & Reflow } /// Elements of self which should also get set on any child flows. pub fn propagate_down(self) -> RestyleDamage { - self.intersect(restyle_damage!(BubbleWidths)) + self & BubbleWidths } } @@ -108,13 +42,13 @@ macro_rules! add_if_not_equal( ($old:ident, $new:ident, $damage:ident, [ $($effect:ident),* ], [ $($style_struct_getter:ident.$name:ident),* ]) => ({ if $( ($old.$style_struct_getter().$name != $new.$style_struct_getter().$name) )||* { - $damage.union_in_place( restyle_damage!( $($effect),* ) ); + $damage.insert($($effect)|*); } }) ) pub fn compute_damage(old: &ComputedValues, new: &ComputedValues) -> RestyleDamage { - let mut damage = RestyleDamage::none(); + let mut damage = RestyleDamage::empty(); // This checks every CSS property, as enumerated in // impl<'self> CssComputedStyle<'self> @@ -142,57 +76,3 @@ pub fn compute_damage(old: &ComputedValues, new: &ComputedValues) -> RestyleDama damage } - - -#[cfg(test)] -mod restyle_damage_tests { - use super::*; - - #[test] - fn none_is_empty() { - let d = RestyleDamage::none(); - assert!(!d.has(Repaint)); - assert!(!d.has(BubbleWidths)); - assert!(d.lacks(Repaint)); - assert!(d.lacks(BubbleWidths)); - } - - #[test] - fn all_is_full() { - let d = RestyleDamage::all(); - assert!(d.has(Repaint)); - assert!(d.has(BubbleWidths)); - assert!(!d.lacks(Repaint)); - assert!(!d.lacks(BubbleWidths)); - } - - #[test] - fn can_add() { - assert!(RestyleDamage::none().add(BubbleWidths).has(BubbleWidths)); - } - - #[test] - fn can_union() { - let d = restyle_damage!(Repaint).union(restyle_damage!(BubbleWidths)); - assert!(d.has(Repaint)); - assert!(d.has(BubbleWidths)); - } - - #[test] - fn can_union_in_place() { - let mut d = restyle_damage!(Repaint); - d.union_in_place(restyle_damage!(BubbleWidths)); - assert!(d.has(Repaint)); - assert!(d.has(BubbleWidths)); - } - - #[test] - fn can_intersect() { - let x = restyle_damage!(Repaint, BubbleWidths); - let y = restyle_damage!(Repaint, Reflow); - let d = x.intersect(y); - assert!(d.has(Repaint)); - assert!(d.lacks(BubbleWidths)); - assert!(d.lacks(Reflow)); - } -} |