aboutsummaryrefslogtreecommitdiffstats
path: root/components/script_layout_interface/restyle_damage.rs
diff options
context:
space:
mode:
authorPatrick Walton <pcwalton@mimiga.net>2016-09-20 16:14:54 -0700
committerPatrick Walton <pcwalton@mimiga.net>2016-09-26 14:20:30 -0700
commit65e3db1c0d664c244880a01141b143cb27a5586d (patch)
tree79c17510c215f1b4efb53bd8242bca29d41da894 /components/script_layout_interface/restyle_damage.rs
parent1235f4bff613df791d5ceb02f3ee04177492563b (diff)
downloadservo-65e3db1c0d664c244880a01141b143cb27a5586d.tar.gz
servo-65e3db1c0d664c244880a01141b143cb27a5586d.zip
layout: Add a `REPOSITION` restyle damage type.
Separating out `REPOSITION` from `REPAINT` allows us to compute stacking-context-relative positions without rebuilding the display list. This saves a lot of time when responding to script-to-layout queries.
Diffstat (limited to 'components/script_layout_interface/restyle_damage.rs')
-rw-r--r--components/script_layout_interface/restyle_damage.rs60
1 files changed, 32 insertions, 28 deletions
diff --git a/components/script_layout_interface/restyle_damage.rs b/components/script_layout_interface/restyle_damage.rs
index ef33370e064..ff0e26af03f 100644
--- a/components/script_layout_interface/restyle_damage.rs
+++ b/components/script_layout_interface/restyle_damage.rs
@@ -15,31 +15,36 @@ bitflags! {
#[doc = "Currently unused; need to decide how this propagates."]
const REPAINT = 0x01,
+ #[doc = "The stacking-context-relative position of this node or its descendants has \
+ changed."]
+ #[doc = "Propagates both up and down the flow tree."]
+ const REPOSITION = 0x02,
+
#[doc = "Recompute the overflow regions (bounding box of object and all descendants)."]
#[doc = "Propagates down the flow tree because the computation is bottom-up."]
- const STORE_OVERFLOW = 0x02,
+ const STORE_OVERFLOW = 0x04,
#[doc = "Recompute intrinsic inline_sizes (minimum and preferred)."]
#[doc = "Propagates down the flow tree because the computation is"]
#[doc = "bottom-up."]
- const BUBBLE_ISIZES = 0x04,
+ const BUBBLE_ISIZES = 0x08,
#[doc = "Recompute actual inline-sizes and block-sizes, only taking out-of-flow children \
into account. \
Propagates up the flow tree because the computation is top-down."]
- const REFLOW_OUT_OF_FLOW = 0x08,
+ const REFLOW_OUT_OF_FLOW = 0x10,
#[doc = "Recompute actual inline_sizes and block_sizes."]
#[doc = "Propagates up the flow tree because the computation is"]
#[doc = "top-down."]
- const REFLOW = 0x10,
+ const REFLOW = 0x20,
#[doc = "Re-resolve generated content. \
Propagates up the flow tree because the computation is inorder."]
- const RESOLVE_GENERATED_CONTENT = 0x20,
+ const RESOLVE_GENERATED_CONTENT = 0x40,
#[doc = "The entire flow needs to be reconstructed."]
- const RECONSTRUCT_FLOW = 0x40
+ const RECONSTRUCT_FLOW = 0x80
}
}
@@ -63,7 +68,8 @@ impl TRestyleDamage for RestyleDamage {
/// `RestyleDamage::all()` will result in unnecessary sequential resolution
/// of generated content.
fn rebuild_and_reflow() -> RestyleDamage {
- REPAINT | STORE_OVERFLOW | BUBBLE_ISIZES | REFLOW_OUT_OF_FLOW | REFLOW | RECONSTRUCT_FLOW
+ REPAINT | REPOSITION | STORE_OVERFLOW | BUBBLE_ISIZES | REFLOW_OUT_OF_FLOW | REFLOW |
+ RECONSTRUCT_FLOW
}
}
@@ -72,9 +78,10 @@ impl RestyleDamage {
/// returns the damage that we should add to the *parent* of this flow.
pub fn damage_for_parent(self, child_is_absolutely_positioned: bool) -> RestyleDamage {
if child_is_absolutely_positioned {
- self & (REPAINT | STORE_OVERFLOW | REFLOW_OUT_OF_FLOW | RESOLVE_GENERATED_CONTENT)
+ self & (REPAINT | REPOSITION | STORE_OVERFLOW | REFLOW_OUT_OF_FLOW |
+ RESOLVE_GENERATED_CONTENT)
} else {
- self & (REPAINT | STORE_OVERFLOW | REFLOW | REFLOW_OUT_OF_FLOW |
+ self & (REPAINT | REPOSITION | STORE_OVERFLOW | REFLOW | REFLOW_OUT_OF_FLOW |
RESOLVE_GENERATED_CONTENT)
}
}
@@ -90,7 +97,7 @@ impl RestyleDamage {
// Absolute children are out-of-flow and therefore insulated from changes.
//
// FIXME(pcwalton): Au contraire, if the containing block dimensions change!
- self & REPAINT
+ self & (REPAINT | REPOSITION)
}
(true, false) => {
// Changing the position of an absolutely-positioned block requires us to reflow
@@ -103,7 +110,7 @@ impl RestyleDamage {
}
_ => {
// TODO(pcwalton): Take floatedness into account.
- self & (REPAINT | REFLOW)
+ self & (REPAINT | REPOSITION | REFLOW)
}
}
}
@@ -115,6 +122,7 @@ impl fmt::Display for RestyleDamage {
let to_iter =
[ (REPAINT, "Repaint")
+ , (REPOSITION, "Reposition")
, (STORE_OVERFLOW, "StoreOverflow")
, (BUBBLE_ISIZES, "BubbleISizes")
, (REFLOW_OUT_OF_FLOW, "ReflowOutOfFlow")
@@ -163,14 +171,8 @@ fn compute_damage(old: &ServoComputedValues, new: &ServoComputedValues) -> Resty
// FIXME: Test somehow that every property is included.
add_if_not_equal!(old, new, damage,
- [
- REPAINT,
- STORE_OVERFLOW,
- BUBBLE_ISIZES,
- REFLOW_OUT_OF_FLOW,
- REFLOW,
- RECONSTRUCT_FLOW
- ], [
+ [REPAINT, REPOSITION, STORE_OVERFLOW, BUBBLE_ISIZES, REFLOW_OUT_OF_FLOW,
+ REFLOW, RECONSTRUCT_FLOW], [
get_box.float, get_box.display, get_box.position, get_counters.content,
get_counters.counter_reset, get_counters.counter_increment,
get_inheritedbox._servo_under_display_none,
@@ -191,8 +193,8 @@ fn compute_damage(old: &ServoComputedValues, new: &ServoComputedValues) -> Resty
get_column.column_width, get_column.column_count
]) || (new.get_box().display == display::T::inline &&
add_if_not_equal!(old, new, damage,
- [REPAINT, STORE_OVERFLOW, BUBBLE_ISIZES, REFLOW_OUT_OF_FLOW, REFLOW,
- RECONSTRUCT_FLOW], [
+ [REPAINT, REPOSITION, STORE_OVERFLOW, BUBBLE_ISIZES,
+ REFLOW_OUT_OF_FLOW, REFLOW, RECONSTRUCT_FLOW], [
// For inline boxes only, border/padding styles are used in flow construction (to decide
// whether to create fragments for empty flows).
get_border.border_top_width, get_border.border_right_width,
@@ -200,7 +202,8 @@ fn compute_damage(old: &ServoComputedValues, new: &ServoComputedValues) -> Resty
get_padding.padding_top, get_padding.padding_right,
get_padding.padding_bottom, get_padding.padding_left
])) || add_if_not_equal!(old, new, damage,
- [ REPAINT, STORE_OVERFLOW, BUBBLE_ISIZES, REFLOW_OUT_OF_FLOW, REFLOW ],
+ [REPAINT, REPOSITION, STORE_OVERFLOW, BUBBLE_ISIZES,
+ REFLOW_OUT_OF_FLOW, REFLOW],
[get_border.border_top_width, get_border.border_right_width,
get_border.border_bottom_width, get_border.border_left_width,
get_margin.margin_top, get_margin.margin_right,
@@ -225,11 +228,14 @@ fn compute_damage(old: &ServoComputedValues, new: &ServoComputedValues) -> Resty
get_position.flex_shrink,
get_position.align_self
]) || add_if_not_equal!(old, new, damage,
- [ REPAINT, STORE_OVERFLOW, REFLOW_OUT_OF_FLOW ], [
+ [REPAINT, REPOSITION, STORE_OVERFLOW, REFLOW_OUT_OF_FLOW], [
get_position.top, get_position.left,
- get_position.right, get_position.bottom
+ get_position.right, get_position.bottom,
+ get_effects.opacity,
+ get_effects.transform, get_effects.transform_style, get_effects.transform_origin,
+ get_effects.perspective, get_effects.perspective_origin
]) || add_if_not_equal!(old, new, damage,
- [ REPAINT ], [
+ [REPAINT], [
get_color.color, get_background.background_color,
get_background.background_image, get_background.background_position,
get_background.background_repeat, get_background.background_attachment,
@@ -245,9 +251,7 @@ fn compute_damage(old: &ServoComputedValues, new: &ServoComputedValues) -> Resty
get_inheritedtext._servo_text_decorations_in_effect,
get_pointing.cursor, get_pointing.pointer_events,
get_effects.box_shadow, get_effects.clip, get_inheritedtext.text_shadow, get_effects.filter,
- get_effects.transform, get_effects.backface_visibility, get_effects.transform_style,
- get_effects.transform_origin, get_effects.perspective, get_effects.perspective_origin,
- get_effects.mix_blend_mode, get_effects.opacity, get_inheritedbox.image_rendering,
+ get_effects.mix_blend_mode, get_inheritedbox.image_rendering,
// Note: May require REFLOW et al. if `visibility: collapse` is implemented.
get_inheritedbox.visibility