diff options
author | Emilio Cobos Álvarez <emilio@crisal.io> | 2017-10-01 22:47:08 +0200 |
---|---|---|
committer | Emilio Cobos Álvarez <emilio@crisal.io> | 2017-10-01 22:54:12 +0200 |
commit | 5e4b5105f90ff5dcd060efb916b61dddbb4190d0 (patch) | |
tree | 4acd336dd6bdc65e6f640f79d7c62b8416263947 /components/layout/display_list_builder.rs | |
parent | a2403c5cd63d689283bc35ff9c11329a7b522caf (diff) | |
download | servo-5e4b5105f90ff5dcd060efb916b61dddbb4190d0.tar.gz servo-5e4b5105f90ff5dcd060efb916b61dddbb4190d0.zip |
style: Remove the last of the explicit style fixups.
This one is particularly dumb, I think.
Diffstat (limited to 'components/layout/display_list_builder.rs')
-rw-r--r-- | components/layout/display_list_builder.rs | 141 |
1 files changed, 95 insertions, 46 deletions
diff --git a/components/layout/display_list_builder.rs b/components/layout/display_list_builder.rs index 08b19d46a87..dc2375b76e8 100644 --- a/components/layout/display_list_builder.rs +++ b/components/layout/display_list_builder.rs @@ -50,8 +50,8 @@ use std::sync::Arc; use style::computed_values::{background_attachment, background_clip, background_origin}; use style::computed_values::{background_repeat, border_style, cursor}; use style::computed_values::{image_rendering, overflow_x, pointer_events, position, visibility}; -use style::logical_geometry::{LogicalPoint, LogicalRect, LogicalSize, WritingMode}; -use style::properties::{self, ComputedValues}; +use style::logical_geometry::{LogicalMargin, LogicalPoint, LogicalRect, LogicalSize, WritingMode}; +use style::properties::ComputedValues; use style::properties::longhands::border_image_repeat::computed_value::RepeatKeyword; use style::properties::style_structs; use style::servo::restyle_damage::REPAINT; @@ -138,12 +138,16 @@ fn get_cyclic<T>(arr: &[T], index: usize) -> &T { &arr[index % arr.len()] } +pub struct InlineNodeBorderInfo { + is_first_fragment_of_element: bool, + is_last_fragment_of_element: bool, +} + #[derive(Debug)] struct StackingContextInfo { children: Vec<StackingContext>, clip_scroll_nodes: Vec<ClipScrollNode>, } - impl StackingContextInfo { fn new() -> StackingContextInfo { StackingContextInfo { @@ -503,13 +507,15 @@ pub trait FragmentDisplayListBuilding { /// Adds the display items necessary to paint the borders of this fragment to a display list if /// necessary. fn build_display_list_for_borders_if_applicable( - &self, - state: &mut DisplayListBuildState, - style: &ComputedValues, - border_painting_mode: BorderPaintingMode, - bounds: &Rect<Au>, - display_list_section: DisplayListSection, - clip: &Rect<Au>); + &self, + state: &mut DisplayListBuildState, + style: &ComputedValues, + inline_node_info: Option<InlineNodeBorderInfo>, + border_painting_mode: BorderPaintingMode, + bounds: &Rect<Au>, + display_list_section: DisplayListSection, + clip: &Rect<Au>, + ); /// Adds the display items necessary to paint the outline of this fragment to the display list /// if necessary. @@ -1488,15 +1494,21 @@ impl FragmentDisplayListBuilding for Fragment { } fn build_display_list_for_borders_if_applicable( - &self, - state: &mut DisplayListBuildState, - style: &ComputedValues, - border_painting_mode: BorderPaintingMode, - bounds: &Rect<Au>, - display_list_section: DisplayListSection, - clip: &Rect<Au>) { + &self, + state: &mut DisplayListBuildState, + style: &ComputedValues, + inline_info: Option<InlineNodeBorderInfo>, + border_painting_mode: BorderPaintingMode, + bounds: &Rect<Au>, + display_list_section: DisplayListSection, + clip: &Rect<Au> + ) { let mut border = style.logical_border_width(); + if let Some(inline_info) = inline_info { + modify_border_width_for_inline_sides(&mut border, inline_info); + } + match border_painting_mode { BorderPaintingMode::Separate => {} BorderPaintingMode::Collapse(collapsed_borders) => { @@ -1518,6 +1530,7 @@ impl FragmentDisplayListBuilding for Fragment { border_style_struct.border_right_style, border_style_struct.border_bottom_style, border_style_struct.border_left_style); + if let BorderPaintingMode::Collapse(collapsed_borders) = border_painting_mode { collapsed_borders.adjust_border_colors_and_styles_for_painting(&mut colors, &mut border_style, @@ -1880,55 +1893,73 @@ impl FragmentDisplayListBuilding for Fragment { state, &*node.style, display_list_section, - &stacking_relative_border_box); + &stacking_relative_border_box, + ); + self.build_display_list_for_box_shadow_if_applicable( state, &*node.style, display_list_section, &stacking_relative_border_box, - clip); + clip, + ); - let mut style = node.style.clone(); - properties::modify_border_style_for_inline_sides( - &mut style, - node.flags.contains(FIRST_FRAGMENT_OF_ELEMENT), - node.flags.contains(LAST_FRAGMENT_OF_ELEMENT)); self.build_display_list_for_borders_if_applicable( state, - &*style, + &*node.style, + Some(InlineNodeBorderInfo { + is_first_fragment_of_element: node.flags.contains(FIRST_FRAGMENT_OF_ELEMENT), + is_last_fragment_of_element: node.flags.contains(LAST_FRAGMENT_OF_ELEMENT), + }), border_painting_mode, &stacking_relative_border_box, display_list_section, - clip); + clip, + ); + // FIXME(emilio): Why does outline not do the same width + // fixup as border? self.build_display_list_for_outline_if_applicable( state, &*node.style, &stacking_relative_border_box, - clip); + clip, + ); } } if !self.is_scanned_text_fragment() { - self.build_display_list_for_background_if_applicable(state, - &*self.style, - display_list_section, - &stacking_relative_border_box); - self.build_display_list_for_box_shadow_if_applicable(state, - &*self.style, - display_list_section, - &stacking_relative_border_box, - clip); - self.build_display_list_for_borders_if_applicable(state, - &*self.style, - border_painting_mode, - &stacking_relative_border_box, - display_list_section, - clip); - self.build_display_list_for_outline_if_applicable(state, - &*self.style, - &stacking_relative_border_box, - clip); + self.build_display_list_for_background_if_applicable( + state, + &*self.style, + display_list_section, + &stacking_relative_border_box, + ); + + self.build_display_list_for_box_shadow_if_applicable( + state, + &*self.style, + display_list_section, + &stacking_relative_border_box, + clip, + ); + + self.build_display_list_for_borders_if_applicable( + state, + &*self.style, + /* inline_node_info = */ None, + border_painting_mode, + &stacking_relative_border_box, + display_list_section, + clip, + ); + + self.build_display_list_for_outline_if_applicable( + state, + &*self.style, + &stacking_relative_border_box, + clip, + ); } } @@ -3135,6 +3166,24 @@ fn shadow_bounds(content_rect: &Rect<Au>, blur: Au, spread: Au) -> Rect<Au> { content_rect.inflate(inflation, inflation) } +/// Adjusts borders as appropriate to account for a fragment's status as the +/// first or last fragment within the range of an element. +/// +/// Specifically, this function sets border widths to zero on the sides for +/// which the fragment is not outermost. +fn modify_border_width_for_inline_sides( + border_width: &mut LogicalMargin<Au>, + inline_border_info: InlineNodeBorderInfo, +) { + if !inline_border_info.is_first_fragment_of_element { + border_width.inline_start = Au(0); + } + + if !inline_border_info.is_last_fragment_of_element { + border_width.inline_end = Au(0); + } +} + /// Allows a CSS color to be converted into a graphics color. pub trait ToGfxColor { /// Converts a CSS color to a graphics color. |