aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--components/layout/block.rs228
1 files changed, 144 insertions, 84 deletions
diff --git a/components/layout/block.rs b/components/layout/block.rs
index 704d592e06d..5dc867e45ee 100644
--- a/components/layout/block.rs
+++ b/components/layout/block.rs
@@ -97,7 +97,11 @@ struct BSizeConstraintSolution {
}
impl BSizeConstraintSolution {
- fn new(block_start: Au, block_end: Au, block_size: Au, margin_block_start: Au, margin_block_end: Au)
+ fn new(block_start: Au,
+ block_end: Au,
+ block_size: Au,
+ margin_block_start: Au,
+ margin_block_end: Au)
-> BSizeConstraintSolution {
BSizeConstraintSolution {
block_start: block_start,
@@ -131,90 +135,147 @@ impl BSizeConstraintSolution {
// first box of the element.
let static_position_block_start = static_b_offset;
- let (block_start, block_end, block_size, margin_block_start, margin_block_end) = match (block_start, block_end, block_size) {
- (MaybeAuto::Auto, MaybeAuto::Auto, MaybeAuto::Auto) => {
- let margin_block_start = block_start_margin.specified_or_zero();
- let margin_block_end = block_end_margin.specified_or_zero();
- let block_start = static_position_block_start;
- // Now it is the same situation as block-start Specified and block-end
- // and block-size Auto.
-
- let block_size = content_block_size;
- let sum = block_start + block_size + margin_block_start + margin_block_end;
- (block_start, available_block_size - sum, block_size, margin_block_start, margin_block_end)
- }
- (MaybeAuto::Specified(block_start), MaybeAuto::Specified(block_end), MaybeAuto::Specified(block_size)) => {
- match (block_start_margin, block_end_margin) {
- (MaybeAuto::Auto, MaybeAuto::Auto) => {
- let total_margin_val = available_block_size - block_start - block_end - block_size;
- (block_start, block_end, block_size,
- total_margin_val.scale_by(0.5),
- total_margin_val.scale_by(0.5))
- }
- (MaybeAuto::Specified(margin_block_start), MaybeAuto::Auto) => {
- let sum = block_start + block_end + block_size + margin_block_start;
- (block_start, block_end, block_size, margin_block_start, available_block_size - sum)
- }
- (MaybeAuto::Auto, MaybeAuto::Specified(margin_block_end)) => {
- let sum = block_start + block_end + block_size + margin_block_end;
- (block_start, block_end, block_size, available_block_size - sum, margin_block_end)
- }
- (MaybeAuto::Specified(margin_block_start), MaybeAuto::Specified(margin_block_end)) => {
- // Values are over-constrained. Ignore value for 'block-end'.
- let sum = block_start + block_size + margin_block_start + margin_block_end;
- (block_start, available_block_size - sum, block_size, margin_block_start, margin_block_end)
+ let (block_start, block_end, block_size, margin_block_start, margin_block_end) =
+ match (block_start, block_end, block_size) {
+ (MaybeAuto::Auto, MaybeAuto::Auto, MaybeAuto::Auto) => {
+ let margin_block_start = block_start_margin.specified_or_zero();
+ let margin_block_end = block_end_margin.specified_or_zero();
+ let block_start = static_position_block_start;
+ // Now it is the same situation as block-start Specified and block-end
+ // and block-size Auto.
+
+ let block_size = content_block_size;
+ let sum = block_start + block_size + margin_block_start + margin_block_end;
+ (block_start,
+ available_block_size - sum,
+ block_size,
+ margin_block_start,
+ margin_block_end)
+ }
+ (MaybeAuto::Specified(block_start),
+ MaybeAuto::Specified(block_end),
+ MaybeAuto::Specified(block_size)) => {
+ match (block_start_margin, block_end_margin) {
+ (MaybeAuto::Auto, MaybeAuto::Auto) => {
+ let total_margin_val =
+ available_block_size - block_start - block_end - block_size;
+ (block_start, block_end, block_size,
+ total_margin_val.scale_by(0.5),
+ total_margin_val.scale_by(0.5))
+ }
+ (MaybeAuto::Specified(margin_block_start), MaybeAuto::Auto) => {
+ let sum = block_start + block_end + block_size + margin_block_start;
+ (block_start,
+ block_end,
+ block_size,
+ margin_block_start,
+ available_block_size - sum)
+ }
+ (MaybeAuto::Auto, MaybeAuto::Specified(margin_block_end)) => {
+ let sum = block_start + block_end + block_size + margin_block_end;
+ (block_start,
+ block_end,
+ block_size,
+ available_block_size - sum,
+ margin_block_end)
+ }
+ (MaybeAuto::Specified(margin_block_start),
+ MaybeAuto::Specified(margin_block_end)) => {
+ // Values are over-constrained. Ignore value for 'block-end'.
+ let sum = block_start + block_size + margin_block_start +
+ margin_block_end;
+ (block_start,
+ available_block_size - sum,
+ block_size,
+ margin_block_start,
+ margin_block_end)
+ }
}
}
- }
- // For the rest of the cases, auto values for margin are set to 0
+ // For the rest of the cases, auto values for margin are set to 0
+
+ // If only one is Auto, solve for it
+ (MaybeAuto::Auto,
+ MaybeAuto::Specified(block_end),
+ MaybeAuto::Specified(block_size)) => {
+ let margin_block_start = block_start_margin.specified_or_zero();
+ let margin_block_end = block_end_margin.specified_or_zero();
+ let sum = block_end + block_size + margin_block_start + margin_block_end;
+ (available_block_size - sum,
+ block_end,
+ block_size,
+ margin_block_start,
+ margin_block_end)
+ }
+ (MaybeAuto::Specified(block_start),
+ MaybeAuto::Auto,
+ MaybeAuto::Specified(block_size)) => {
+ let margin_block_start = block_start_margin.specified_or_zero();
+ let margin_block_end = block_end_margin.specified_or_zero();
+ let sum = block_start + block_size + margin_block_start + margin_block_end;
+ (block_start,
+ available_block_size - sum,
+ block_size,
+ margin_block_start,
+ margin_block_end)
+ }
+ (MaybeAuto::Specified(block_start),
+ MaybeAuto::Specified(block_end),
+ MaybeAuto::Auto) => {
+ let margin_block_start = block_start_margin.specified_or_zero();
+ let margin_block_end = block_end_margin.specified_or_zero();
+ let sum = block_start + block_end + margin_block_start + margin_block_end;
+ (block_start,
+ block_end,
+ available_block_size - sum,
+ margin_block_start,
+ margin_block_end)
+ }
- // If only one is Auto, solve for it
- (MaybeAuto::Auto, MaybeAuto::Specified(block_end), MaybeAuto::Specified(block_size)) => {
- let margin_block_start = block_start_margin.specified_or_zero();
- let margin_block_end = block_end_margin.specified_or_zero();
- let sum = block_end + block_size + margin_block_start + margin_block_end;
- (available_block_size - sum, block_end, block_size, margin_block_start, margin_block_end)
- }
- (MaybeAuto::Specified(block_start), MaybeAuto::Auto, MaybeAuto::Specified(block_size)) => {
- let margin_block_start = block_start_margin.specified_or_zero();
- let margin_block_end = block_end_margin.specified_or_zero();
- let sum = block_start + block_size + margin_block_start + margin_block_end;
- (block_start, available_block_size - sum, block_size, margin_block_start, margin_block_end)
- }
- (MaybeAuto::Specified(block_start), MaybeAuto::Specified(block_end), MaybeAuto::Auto) => {
- let margin_block_start = block_start_margin.specified_or_zero();
- let margin_block_end = block_end_margin.specified_or_zero();
- let sum = block_start + block_end + margin_block_start + margin_block_end;
- (block_start, block_end, available_block_size - sum, margin_block_start, margin_block_end)
- }
+ // If block-size is auto, then block-size is content block-size. Solve for the
+ // non-auto value.
+ (MaybeAuto::Specified(block_start), MaybeAuto::Auto, MaybeAuto::Auto) => {
+ let margin_block_start = block_start_margin.specified_or_zero();
+ let margin_block_end = block_end_margin.specified_or_zero();
+ let block_size = content_block_size;
+ let sum = block_start + block_size + margin_block_start + margin_block_end;
+ (block_start,
+ available_block_size - sum,
+ block_size,
+ margin_block_start,
+ margin_block_end)
+ }
+ (MaybeAuto::Auto, MaybeAuto::Specified(block_end), MaybeAuto::Auto) => {
+ let margin_block_start = block_start_margin.specified_or_zero();
+ let margin_block_end = block_end_margin.specified_or_zero();
+ let block_size = content_block_size;
+ let sum = block_end + block_size + margin_block_start + margin_block_end;
+ (available_block_size - sum,
+ block_end,
+ block_size,
+ margin_block_start,
+ margin_block_end)
+ }
- // If block-size is auto, then block-size is content block-size. Solve for the
- // non-auto value.
- (MaybeAuto::Specified(block_start), MaybeAuto::Auto, MaybeAuto::Auto) => {
- let margin_block_start = block_start_margin.specified_or_zero();
- let margin_block_end = block_end_margin.specified_or_zero();
- let block_size = content_block_size;
- let sum = block_start + block_size + margin_block_start + margin_block_end;
- (block_start, available_block_size - sum, block_size, margin_block_start, margin_block_end)
- }
- (MaybeAuto::Auto, MaybeAuto::Specified(block_end), MaybeAuto::Auto) => {
- let margin_block_start = block_start_margin.specified_or_zero();
- let margin_block_end = block_end_margin.specified_or_zero();
- let block_size = content_block_size;
- let sum = block_end + block_size + margin_block_start + margin_block_end;
- (available_block_size - sum, block_end, block_size, margin_block_start, margin_block_end)
- }
+ (MaybeAuto::Auto, MaybeAuto::Auto, MaybeAuto::Specified(block_size)) => {
+ let margin_block_start = block_start_margin.specified_or_zero();
+ let margin_block_end = block_end_margin.specified_or_zero();
+ let block_start = static_position_block_start;
+ let sum = block_start + block_size + margin_block_start + margin_block_end;
+ (block_start,
+ available_block_size - sum,
+ block_size,
+ margin_block_start,
+ margin_block_end)
+ }
+ };
- (MaybeAuto::Auto, MaybeAuto::Auto, MaybeAuto::Specified(block_size)) => {
- let margin_block_start = block_start_margin.specified_or_zero();
- let margin_block_end = block_end_margin.specified_or_zero();
- let block_start = static_position_block_start;
- let sum = block_start + block_size + margin_block_start + margin_block_end;
- (block_start, available_block_size - sum, block_size, margin_block_start, margin_block_end)
- }
- };
- BSizeConstraintSolution::new(block_start, block_end, block_size, margin_block_start, margin_block_end)
+ BSizeConstraintSolution::new(block_start,
+ block_end,
+ block_size,
+ margin_block_start,
+ margin_block_end)
}
/// Solve the vertical constraint equation for absolute replaced elements.
@@ -447,8 +508,8 @@ impl<'a> PreorderFlowTraversal for AbsoluteAssignBSizesTraversal<'a> {
return
}
- let AbsoluteAssignBSizesTraversal(ref ctx) = *self;
- block_flow.calculate_absolute_block_size_and_margins(*ctx);
+ let AbsoluteAssignBSizesTraversal(ref layout_context) = *self;
+ block_flow.calculate_absolute_block_size_and_margins(*layout_context);
}
}
@@ -1166,9 +1227,8 @@ impl BlockFlow {
loop {
match candidate_block_size_iterator.next() {
Some(block_size_used_val) => {
- solution =
- Some(BSizeConstraintSolution::
- solve_vertical_constraints_abs_nonreplaced(
+ solution = Some(
+ BSizeConstraintSolution::solve_vertical_constraints_abs_nonreplaced(
block_size_used_val,
margin_block_start,
margin_block_end,