diff options
Diffstat (limited to 'components/layout/inline.rs')
-rw-r--r-- | components/layout/inline.rs | 106 |
1 files changed, 34 insertions, 72 deletions
diff --git a/components/layout/inline.rs b/components/layout/inline.rs index f8a19708d1e..0a2234bfa8b 100644 --- a/components/layout/inline.rs +++ b/components/layout/inline.rs @@ -6,13 +6,13 @@ use css::node_style::StyledNode; use context::LayoutContext; -use display_list_builder::{BackgroundAndBorderLevel, DisplayListBuildingResult, FragmentDisplayListBuilding}; +use display_list_builder::{FragmentDisplayListBuilding, InlineFlowDisplayListBuilding}; use floats::{FloatKind, Floats, PlacementInfo}; use flow::{BaseFlow, FlowClass, Flow, MutableFlowUtils, ForceNonfloatedFlag}; use flow::{IS_ABSOLUTELY_POSITIONED}; use flow; -use fragment::{Fragment, SpecificFragmentInfo}; -use fragment::{FragmentOverflowIterator, ScannedTextFragmentInfo}; +use fragment::{CoordinateSystem, Fragment, FragmentBorderBoxIterator, ScannedTextFragmentInfo}; +use fragment::{SpecificFragmentInfo}; use fragment::SplitInfo; use incremental::{REFLOW, REFLOW_OUT_OF_FLOW}; use layout_debug; @@ -20,16 +20,14 @@ use model::IntrinsicISizesContribution; use text; use collections::{RingBuf}; -use geom::{Rect, Size2D}; -use gfx::display_list::DisplayList; +use geom::{Point2D, Rect}; use gfx::font::FontMetrics; use gfx::font_context::FontContext; use gfx::text::glyph::CharIndex; +use servo_util::arc_ptr_eq; use servo_util::geometry::{Au, ZERO_RECT}; use servo_util::logical_geometry::{LogicalRect, LogicalSize, WritingMode}; -use servo_util::opts; use servo_util::range::{Range, RangeIndex}; -use servo_util::arc_ptr_eq; use std::cmp::max; use std::fmt; use std::mem; @@ -1186,44 +1184,29 @@ impl Flow for InlineFlow { fn compute_absolute_position(&mut self) { for fragment in self.fragments.fragments.iter_mut() { - let stacking_relative_position = match fragment.specific { + let stacking_relative_border_box = + fragment.stacking_relative_border_box(&self.base.stacking_relative_position, + &self.base + .absolute_position_info + .relative_containing_block_size, + CoordinateSystem::Self); + let clip = fragment.clipping_region_for_children(&self.base.clip, + &stacking_relative_border_box); + match fragment.specific { SpecificFragmentInfo::InlineBlock(ref mut info) => { + flow::mut_base(info.flow_ref.deref_mut()).clip = clip; let block_flow = info.flow_ref.as_block(); block_flow.base.absolute_position_info = self.base.absolute_position_info; - - // FIXME(#2795): Get the real container size - let container_size = Size2D::zero(); block_flow.base.stacking_relative_position = - self.base.stacking_relative_position + - fragment.border_box.start.to_physical(self.base.writing_mode, - container_size); - block_flow.base.stacking_relative_position + stacking_relative_border_box.origin; } SpecificFragmentInfo::InlineAbsoluteHypothetical(ref mut info) => { + flow::mut_base(info.flow_ref.deref_mut()).clip = clip; let block_flow = info.flow_ref.as_block(); block_flow.base.absolute_position_info = self.base.absolute_position_info; - - // FIXME(#2795): Get the real container size - let container_size = Size2D::zero(); block_flow.base.stacking_relative_position = - self.base.stacking_relative_position + - fragment.border_box.start.to_physical(self.base.writing_mode, - container_size); - block_flow.base.stacking_relative_position - - } - _ => continue, - }; - - let clip = fragment.clipping_region_for_children(&self.base.clip, - &stacking_relative_position); + stacking_relative_border_box.origin - match fragment.specific { - SpecificFragmentInfo::InlineBlock(ref mut info) => { - flow::mut_base(info.flow_ref.deref_mut()).clip = clip - } - SpecificFragmentInfo::InlineAbsoluteHypothetical(ref mut info) => { - flow::mut_base(info.flow_ref.deref_mut()).clip = clip } _ => {} } @@ -1235,38 +1218,7 @@ impl Flow for InlineFlow { fn update_late_computed_block_position_if_necessary(&mut self, _: Au) {} fn build_display_list(&mut self, layout_context: &LayoutContext) { - // TODO(#228): Once we form lines and have their cached bounds, we can be smarter and - // not recurse on a line if nothing in it can intersect the dirty region. - debug!("Flow: building display list for {} inline fragments", self.fragments.len()); - - let mut display_list = box DisplayList::new(); - for fragment in self.fragments.fragments.iter_mut() { - let fragment_origin = self.base.stacking_relative_position_of_child_fragment(fragment); - fragment.build_display_list(&mut *display_list, - layout_context, - fragment_origin, - BackgroundAndBorderLevel::Content, - &self.base.clip); - match fragment.specific { - SpecificFragmentInfo::InlineBlock(ref mut block_flow) => { - let block_flow = block_flow.flow_ref.deref_mut(); - flow::mut_base(block_flow).display_list_building_result - .add_to(&mut *display_list) - } - SpecificFragmentInfo::InlineAbsoluteHypothetical(ref mut block_flow) => { - let block_flow = block_flow.flow_ref.deref_mut(); - flow::mut_base(block_flow).display_list_building_result - .add_to(&mut *display_list) - } - _ => {} - } - } - - self.base.display_list_building_result = DisplayListBuildingResult::Normal(display_list); - - if opts::get().validate_display_list_geometry { - self.base.validate_display_list_geometry(); - } + self.build_display_list_for_inline(layout_context) } fn repair_style(&mut self, _: &Arc<ComputedValues>) {} @@ -1279,13 +1231,23 @@ impl Flow for InlineFlow { overflow } - fn iterate_through_fragment_overflow(&self, iterator: &mut FragmentOverflowIterator) { + fn iterate_through_fragment_border_boxes(&self, + iterator: &mut FragmentBorderBoxIterator, + stacking_context_position: &Point2D<Au>) { + // FIXME(#2795): Get the real container size. for fragment in self.fragments.fragments.iter() { - if iterator.should_process(fragment) { - let fragment_origin = - self.base.stacking_relative_position_of_child_fragment(fragment); - iterator.process(fragment, fragment.stacking_relative_bounds(&fragment_origin)); + if !iterator.should_process(fragment) { + continue } + + let stacking_relative_position = &self.base.stacking_relative_position; + let relative_containing_block_size = + &self.base.absolute_position_info.relative_containing_block_size; + iterator.process(fragment, + &fragment.stacking_relative_border_box(stacking_relative_position, + relative_containing_block_size, + CoordinateSystem::Parent) + .translate(stacking_context_position)) } } } |