diff options
author | bors-servo <lbergstrom+bors@mozilla.com> | 2016-11-07 16:31:10 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2016-11-07 16:31:10 -0600 |
commit | d8ac5100e81ccbad4b5131688b96bedb9b5e279d (patch) | |
tree | 50e4518ec7459d74feeb6b4ea15f453238af31f1 /components/script_layout_interface | |
parent | f1c3e97fb47b6fbe1d82ebb30a38ab7afd4fe0b8 (diff) | |
parent | a2c7a9d0fb7174f9188640ba2fb5a3df7821c1a8 (diff) | |
download | servo-d8ac5100e81ccbad4b5131688b96bedb9b5e279d.tar.gz servo-d8ac5100e81ccbad4b5131688b96bedb9b5e279d.zip |
Auto merge of #14034 - bholley:more_concrete_types, r=emilio
incremental restyle: Use more concrete types in the style system
We need to hang both snapshots and restyle damage off of ElementData, and so we need them to be concrete to avoid infecting ElementData with the trait hierarchy.
<!-- Reviewable:start -->
---
This change is [<img src="https://reviewable.io/review_button.svg" height="34" align="absmiddle" alt="Reviewable"/>](https://reviewable.io/reviews/servo/servo/14034)
<!-- Reviewable:end -->
Diffstat (limited to 'components/script_layout_interface')
-rw-r--r-- | components/script_layout_interface/lib.rs | 3 | ||||
-rw-r--r-- | components/script_layout_interface/restyle_damage.rs | 267 | ||||
-rw-r--r-- | components/script_layout_interface/wrapper_traits.rs | 3 |
3 files changed, 2 insertions, 271 deletions
diff --git a/components/script_layout_interface/lib.rs b/components/script_layout_interface/lib.rs index b442e502b2b..284f6f33498 100644 --- a/components/script_layout_interface/lib.rs +++ b/components/script_layout_interface/lib.rs @@ -41,7 +41,6 @@ extern crate url; pub mod message; pub mod reporter; -pub mod restyle_damage; pub mod rpc; pub mod wrapper_traits; @@ -49,10 +48,10 @@ use canvas_traits::CanvasMsg; use core::nonzero::NonZero; use ipc_channel::ipc::IpcSender; use libc::c_void; -use restyle_damage::RestyleDamage; use std::sync::atomic::AtomicIsize; use style::atomic_refcell::AtomicRefCell; use style::data::ElementData; +use style::selector_impl::RestyleDamage; pub struct PartialPersistentLayoutData { /// Data that the style system associates with a node. When the diff --git a/components/script_layout_interface/restyle_damage.rs b/components/script_layout_interface/restyle_damage.rs deleted file mode 100644 index ff0e26af03f..00000000000 --- a/components/script_layout_interface/restyle_damage.rs +++ /dev/null @@ -1,267 +0,0 @@ -/* This Source Code Form is subject to the terms of the Mozilla Public - * License, v. 2.0. If a copy of the MPL was not distributed with this - * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ - -use std::fmt; -use std::sync::Arc; -use style::computed_values::display; -use style::dom::TRestyleDamage; -use style::properties::ServoComputedValues; - -bitflags! { - #[doc = "Individual layout actions that may be necessary after restyling."] - pub flags RestyleDamage: u8 { - #[doc = "Repaint the node itself."] - #[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 = 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 = 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 = 0x10, - - #[doc = "Recompute actual inline_sizes and block_sizes."] - #[doc = "Propagates up the flow tree because the computation is"] - #[doc = "top-down."] - const REFLOW = 0x20, - - #[doc = "Re-resolve generated content. \ - Propagates up the flow tree because the computation is inorder."] - const RESOLVE_GENERATED_CONTENT = 0x40, - - #[doc = "The entire flow needs to be reconstructed."] - const RECONSTRUCT_FLOW = 0x80 - } -} - -impl TRestyleDamage for RestyleDamage { - /// For Servo the style source is always the computed values. - type PreExistingComputedValues = Arc<ServoComputedValues>; - - fn empty() -> Self { - RestyleDamage::empty() - } - - fn compute(old: &Arc<ServoComputedValues>, - new: &Arc<ServoComputedValues>) -> RestyleDamage { - compute_damage(old, new) - } - - /// Returns a bitmask that represents a flow that needs to be rebuilt and - /// reflowed. - /// - /// Use this instead of `RestyleDamage::all()` because - /// `RestyleDamage::all()` will result in unnecessary sequential resolution - /// of generated content. - fn rebuild_and_reflow() -> RestyleDamage { - REPAINT | REPOSITION | STORE_OVERFLOW | BUBBLE_ISIZES | REFLOW_OUT_OF_FLOW | REFLOW | - RECONSTRUCT_FLOW - } -} - -impl RestyleDamage { - /// Supposing a flow has the given `position` property and this damage, - /// 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 | REPOSITION | STORE_OVERFLOW | REFLOW_OUT_OF_FLOW | - RESOLVE_GENERATED_CONTENT) - } else { - self & (REPAINT | REPOSITION | STORE_OVERFLOW | REFLOW | REFLOW_OUT_OF_FLOW | - RESOLVE_GENERATED_CONTENT) - } - } - - /// Supposing the *parent* of a flow with the given `position` property has this damage, - /// returns the damage that we should add to this flow. - pub fn damage_for_child(self, - parent_is_absolutely_positioned: bool, - child_is_absolutely_positioned: bool) - -> RestyleDamage { - match (parent_is_absolutely_positioned, child_is_absolutely_positioned) { - (false, true) => { - // Absolute children are out-of-flow and therefore insulated from changes. - // - // FIXME(pcwalton): Au contraire, if the containing block dimensions change! - self & (REPAINT | REPOSITION) - } - (true, false) => { - // Changing the position of an absolutely-positioned block requires us to reflow - // its kids. - if self.contains(REFLOW_OUT_OF_FLOW) { - self | REFLOW - } else { - self - } - } - _ => { - // TODO(pcwalton): Take floatedness into account. - self & (REPAINT | REPOSITION | REFLOW) - } - } - } -} - -impl fmt::Display for RestyleDamage { - fn fmt(&self, f: &mut fmt::Formatter) -> Result<(), fmt::Error> { - let mut first_elem = true; - - let to_iter = - [ (REPAINT, "Repaint") - , (REPOSITION, "Reposition") - , (STORE_OVERFLOW, "StoreOverflow") - , (BUBBLE_ISIZES, "BubbleISizes") - , (REFLOW_OUT_OF_FLOW, "ReflowOutOfFlow") - , (REFLOW, "Reflow") - , (RESOLVE_GENERATED_CONTENT, "ResolveGeneratedContent") - , (RECONSTRUCT_FLOW, "ReconstructFlow") - ]; - - for &(damage, damage_str) in &to_iter { - if self.contains(damage) { - if !first_elem { try!(write!(f, " | ")); } - try!(write!(f, "{}", damage_str)); - first_elem = false; - } - } - - if first_elem { - try!(write!(f, "NoDamage")); - } - - Ok(()) - } -} - -// NB: We need the braces inside the RHS due to Rust #8012. This particular -// version of this macro might be safe anyway, but we want to avoid silent -// breakage on modifications. -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.insert($($effect)|*); - true - } else { - false - } - }) -); - -fn compute_damage(old: &ServoComputedValues, new: &ServoComputedValues) -> RestyleDamage { - let mut damage = RestyleDamage::empty(); - - // This should check every CSS property, as enumerated in the fields of - // http://doc.servo.org/style/properties/struct.ServoComputedValues.html - - // FIXME: Test somehow that every property is included. - - add_if_not_equal!(old, new, damage, - [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, - get_list.quotes, get_list.list_style_type, - - // If these text or font properties change, we need to reconstruct the flow so that - // text shaping is re-run. - get_inheritedtext.letter_spacing, get_inheritedtext.text_rendering, - get_inheritedtext.text_transform, get_inheritedtext.word_spacing, - get_inheritedtext.overflow_wrap, get_inheritedtext.text_justify, - get_inheritedtext.white_space, get_inheritedtext.word_break, get_text.text_overflow, - get_font.font_family, get_font.font_style, get_font.font_variant, get_font.font_weight, - get_font.font_size, get_font.font_stretch, - get_inheritedbox.direction, get_inheritedbox.writing_mode, - get_inheritedbox.text_orientation, - get_text.text_decoration, get_text.unicode_bidi, - get_inheritedtable.empty_cells, get_inheritedtable.caption_side, - get_column.column_width, get_column.column_count - ]) || (new.get_box().display == display::T::inline && - add_if_not_equal!(old, new, damage, - [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, - get_border.border_bottom_width, get_border.border_left_width, - get_padding.padding_top, get_padding.padding_right, - get_padding.padding_bottom, get_padding.padding_left - ])) || add_if_not_equal!(old, new, damage, - [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, - get_margin.margin_bottom, get_margin.margin_left, - get_padding.padding_top, get_padding.padding_right, - get_padding.padding_bottom, get_padding.padding_left, - get_position.width, get_position.height, - get_inheritedtext.line_height, - get_inheritedtext.text_align, get_inheritedtext.text_indent, - get_table.table_layout, - get_inheritedtable.border_collapse, - get_inheritedtable.border_spacing, - get_column.column_gap, - get_position.flex_direction, - get_position.flex_wrap, - get_position.justify_content, - get_position.align_items, - get_position.align_content, - get_position.order, - get_position.flex_basis, - get_position.flex_grow, - get_position.flex_shrink, - get_position.align_self - ]) || add_if_not_equal!(old, new, damage, - [REPAINT, REPOSITION, STORE_OVERFLOW, REFLOW_OUT_OF_FLOW], [ - get_position.top, get_position.left, - 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], [ - get_color.color, get_background.background_color, - get_background.background_image, get_background.background_position, - get_background.background_repeat, get_background.background_attachment, - get_background.background_clip, get_background.background_origin, - get_background.background_size, - get_border.border_top_color, get_border.border_right_color, - get_border.border_bottom_color, get_border.border_left_color, - get_border.border_top_style, get_border.border_right_style, - get_border.border_bottom_style, get_border.border_left_style, - get_border.border_top_left_radius, get_border.border_top_right_radius, - get_border.border_bottom_left_radius, get_border.border_bottom_right_radius, - get_position.z_index, get_box._servo_overflow_clip_box, - 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.mix_blend_mode, get_inheritedbox.image_rendering, - - // Note: May require REFLOW et al. if `visibility: collapse` is implemented. - get_inheritedbox.visibility - ]); - - // If the layer requirements of this flow have changed due to the value - // of the transform, then reflow is required to rebuild the layers. - if old.transform_requires_layer() != new.transform_requires_layer() { - damage.insert(RestyleDamage::rebuild_and_reflow()); - } - - damage -} diff --git a/components/script_layout_interface/wrapper_traits.rs b/components/script_layout_interface/wrapper_traits.rs index 7bd91bdb0d0..9123c0c1f45 100644 --- a/components/script_layout_interface/wrapper_traits.rs +++ b/components/script_layout_interface/wrapper_traits.rs @@ -12,7 +12,6 @@ use gfx_traits::ByteIndex; use html5ever_atoms::{Namespace, LocalName}; use msg::constellation_msg::PipelineId; use range::Range; -use restyle_damage::RestyleDamage; use std::fmt::Debug; use std::sync::Arc; use style::atomic_refcell::AtomicRefCell; @@ -22,7 +21,7 @@ use style::data::ElementData; use style::dom::{LayoutIterator, NodeInfo, PresentationalHintsSynthetizer, TElement, TNode}; use style::dom::OpaqueNode; use style::properties::ServoComputedValues; -use style::selector_impl::{PseudoElement, PseudoElementCascadeType, ServoSelectorImpl}; +use style::selector_impl::{PseudoElement, PseudoElementCascadeType, RestyleDamage, ServoSelectorImpl}; use url::Url; #[derive(Copy, PartialEq, Clone, Debug)] |