aboutsummaryrefslogtreecommitdiffstats
path: root/components/layout/table_rowgroup.rs
diff options
context:
space:
mode:
Diffstat (limited to 'components/layout/table_rowgroup.rs')
-rw-r--r--components/layout/table_rowgroup.rs107
1 files changed, 46 insertions, 61 deletions
diff --git a/components/layout/table_rowgroup.rs b/components/layout/table_rowgroup.rs
index 7efb2e96d09..1a4b1ce374a 100644
--- a/components/layout/table_rowgroup.rs
+++ b/components/layout/table_rowgroup.rs
@@ -14,11 +14,11 @@ use flow::{TableRowGroupFlowClass, FlowClass, Flow, ImmutableFlowUtils};
use flow;
use fragment::Fragment;
use layout_debug;
-use table::{InternalTable, TableFlow};
+use model::IntrinsicISizesContribution;
+use table::{ColumnInlineSize, InternalTable, TableFlow};
use wrapper::ThreadSafeLayoutNode;
use servo_util::geometry::Au;
-use std::cmp::max;
use std::fmt;
/// A table formatting context.
@@ -26,14 +26,8 @@ use std::fmt;
pub struct TableRowGroupFlow {
pub block_flow: BlockFlow,
- /// Column inline-sizes
- pub col_inline_sizes: Vec<Au>,
-
- /// Column min inline-sizes.
- pub col_min_inline_sizes: Vec<Au>,
-
- /// Column pref inline-sizes.
- pub col_pref_inline_sizes: Vec<Au>,
+ /// Information about the inline-sizes of each column.
+ pub column_inline_sizes: Vec<ColumnInlineSize>,
}
impl TableRowGroupFlow {
@@ -42,9 +36,7 @@ impl TableRowGroupFlow {
-> TableRowGroupFlow {
TableRowGroupFlow {
block_flow: BlockFlow::from_node_and_fragment(node, fragment),
- col_inline_sizes: vec!(),
- col_min_inline_sizes: vec!(),
- col_pref_inline_sizes: vec!(),
+ column_inline_sizes: Vec::new(),
}
}
@@ -53,9 +45,7 @@ impl TableRowGroupFlow {
-> TableRowGroupFlow {
TableRowGroupFlow {
block_flow: BlockFlow::from_node(constructor, node),
- col_inline_sizes: vec!(),
- col_min_inline_sizes: vec!(),
- col_pref_inline_sizes: vec!(),
+ column_inline_sizes: Vec::new(),
}
}
@@ -64,8 +54,8 @@ impl TableRowGroupFlow {
}
fn initialize_offsets(&mut self) -> (Au, Au, Au) {
- // TODO: If border-collapse: collapse, block-start_offset, block-end_offset, and inline-start_offset
- // should be updated. Currently, they are set as Au(0).
+ // TODO: If border-collapse: collapse, block-start_offset, block-end_offset, and
+ // inline-start_offset should be updated. Currently, they are set as Au(0).
(Au(0), Au(0), Au(0))
}
@@ -120,16 +110,8 @@ impl Flow for TableRowGroupFlow {
&mut self.block_flow
}
- fn col_inline_sizes<'a>(&'a mut self) -> &'a mut Vec<Au> {
- &mut self.col_inline_sizes
- }
-
- fn col_min_inline_sizes<'a>(&'a self) -> &'a Vec<Au> {
- &self.col_min_inline_sizes
- }
-
- fn col_pref_inline_sizes<'a>(&'a self) -> &'a Vec<Au> {
- &self.col_pref_inline_sizes
+ fn column_inline_sizes<'a>(&'a mut self) -> &'a mut Vec<ColumnInlineSize> {
+ &mut self.column_inline_sizes
}
/// Recursively (bottom-up) determines the context's preferred and minimum inline-sizes. When
@@ -143,49 +125,47 @@ impl Flow for TableRowGroupFlow {
/// used in fixed table layout calculation.
fn bubble_inline_sizes(&mut self) {
let _scope = layout_debug_scope!("table_rowgroup::bubble_inline_sizes {:s}",
- self.block_flow.base.debug_id());
-
- let mut min_inline_size = Au(0);
- let mut pref_inline_size = Au(0);
+ self.block_flow.base.debug_id());
+ let mut computation = IntrinsicISizesContribution::new();
for kid in self.block_flow.base.child_iter() {
assert!(kid.is_table_row());
- // calculate min_inline-size & pref_inline-size for automatic table layout calculation
- // 'self.col_min_inline-sizes' collects the maximum value of cells' min-inline-sizes for each column.
- // 'self.col_pref_inline-sizes' collects the maximum value of cells' pref-inline-sizes for each column.
- if self.col_inline_sizes.is_empty() { // First Row
- assert!(self.col_min_inline_sizes.is_empty() && self.col_pref_inline_sizes.is_empty());
- // 'self.col_inline-sizes' collects the specified column inline-sizes from the first table-row for fixed table layout calculation.
- self.col_inline_sizes = kid.col_inline_sizes().clone();
- self.col_min_inline_sizes = kid.col_min_inline_sizes().clone();
- self.col_pref_inline_sizes = kid.col_pref_inline_sizes().clone();
+ // Calculate minimum and preferred inline sizes for automatic table layout.
+ if self.column_inline_sizes.is_empty() {
+ // We're the first row.
+ debug_assert!(self.column_inline_sizes.is_empty());
+ self.column_inline_sizes = kid.column_inline_sizes().clone();
} else {
- min_inline_size = TableFlow::update_col_inline_sizes(&mut self.col_min_inline_sizes, kid.col_min_inline_sizes());
- pref_inline_size = TableFlow::update_col_inline_sizes(&mut self.col_pref_inline_sizes, kid.col_pref_inline_sizes());
+ let mut child_intrinsic_sizes =
+ TableFlow::update_column_inline_sizes(&mut self.column_inline_sizes,
+ kid.column_inline_sizes());
// update the number of column inline-sizes from table-rows.
- let num_cols = self.col_inline_sizes.len();
- let num_child_cols = kid.col_min_inline_sizes().len();
- for i in range(num_cols, num_child_cols) {
- self.col_inline_sizes.push(Au::new(0));
- let new_kid_min = kid.col_min_inline_sizes()[i];
- self.col_min_inline_sizes.push(kid.col_min_inline_sizes()[i]);
- let new_kid_pref = kid.col_pref_inline_sizes()[i];
- self.col_pref_inline_sizes.push(kid.col_pref_inline_sizes()[i]);
- min_inline_size = min_inline_size + new_kid_min;
- pref_inline_size = pref_inline_size + new_kid_pref;
+ let column_count = self.column_inline_sizes.len();
+ let child_column_count = kid.column_inline_sizes().len();
+ for i in range(column_count, child_column_count) {
+ let this_column_inline_size = (*kid.column_inline_sizes())[i];
+
+ // FIXME(pcwalton): Ignoring the percentage here seems dubious.
+ child_intrinsic_sizes.minimum_inline_size =
+ child_intrinsic_sizes.minimum_inline_size +
+ this_column_inline_size.minimum_length;
+ child_intrinsic_sizes.preferred_inline_size =
+ child_intrinsic_sizes.preferred_inline_size +
+ this_column_inline_size.preferred;
+ self.column_inline_sizes.push(this_column_inline_size);
}
+
+ computation.union_block(&child_intrinsic_sizes)
}
}
- self.block_flow.base.intrinsic_inline_sizes.minimum_inline_size = min_inline_size;
- self.block_flow.base.intrinsic_inline_sizes.preferred_inline_size = max(
- min_inline_size, pref_inline_size);
+ self.block_flow.base.intrinsic_inline_sizes = computation.finish()
}
- /// Recursively (top-down) determines the actual inline-size of child contexts and fragments. When
- /// called on this context, the context has had its inline-size set by the parent context.
+ /// Recursively (top-down) determines the actual inline-size of child contexts and fragments.
+ /// When called on this context, the context has had its inline-size set by the parent context.
fn assign_inline_sizes(&mut self, ctx: &LayoutContext) {
let _scope = layout_debug_scope!("table_rowgroup::assign_inline_sizes {:s}",
self.block_flow.base.debug_id());
@@ -199,9 +179,14 @@ impl Flow for TableRowGroupFlow {
let content_inline_size = containing_block_inline_size;
let inline_size_computer = InternalTable;
- inline_size_computer.compute_used_inline_size(&mut self.block_flow, ctx, containing_block_inline_size);
-
- self.block_flow.propagate_assigned_inline_size_to_children(inline_start_content_edge, content_inline_size, Some(self.col_inline_sizes.clone()));
+ inline_size_computer.compute_used_inline_size(&mut self.block_flow,
+ ctx,
+ containing_block_inline_size);
+
+ self.block_flow.propagate_assigned_inline_size_to_children(
+ inline_start_content_edge,
+ content_inline_size,
+ Some(self.column_inline_sizes.as_slice()));
}
fn assign_block_size<'a>(&mut self, ctx: &'a LayoutContext<'a>) {