Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(5)

Side by Side Diff: third_party/WebKit/Source/core/layout/ng/ng_length_utils.cc

Issue 2714803002: [LayoutNG] Allow block-flow layout to be fragmented using new approach. (Closed)
Patch Set: rebase. Created 3 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "core/layout/ng/ng_length_utils.h" 5 #include "core/layout/ng/ng_length_utils.h"
6 6
7 #include "core/layout/ng/ng_constraint_space.h" 7 #include "core/layout/ng/ng_constraint_space.h"
8 #include "core/layout/ng/ng_constraint_space_builder.h" 8 #include "core/layout/ng/ng_constraint_space_builder.h"
9 #include "core/layout/ng/ng_fragment.h" 9 #include "core/layout/ng/ng_fragment.h"
10 #include "core/style/ComputedStyle.h" 10 #include "core/style/ComputedStyle.h"
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
49 if (type == LengthResolveType::kMinSize && length.isAuto()) 49 if (type == LengthResolveType::kMinSize && length.isAuto())
50 return LayoutUnit(); 50 return LayoutUnit();
51 51
52 if (type == LengthResolveType::kMarginBorderPaddingSize && length.isAuto()) 52 if (type == LengthResolveType::kMarginBorderPaddingSize && length.isAuto())
53 return LayoutUnit(); 53 return LayoutUnit();
54 54
55 // We don't need this when we're resolving margin/border/padding; skip 55 // We don't need this when we're resolving margin/border/padding; skip
56 // computing it as an optimization and to simplify the code below. 56 // computing it as an optimization and to simplify the code below.
57 NGBoxStrut border_and_padding; 57 NGBoxStrut border_and_padding;
58 if (type != LengthResolveType::kMarginBorderPaddingSize) { 58 if (type != LengthResolveType::kMarginBorderPaddingSize) {
59 border_and_padding = 59 border_and_padding = ComputeBorders(constraint_space, style) +
60 ComputeBorders(style) + ComputePadding(constraint_space, style); 60 ComputePadding(constraint_space, style);
61 } 61 }
62 switch (length.type()) { 62 switch (length.type()) {
63 case Auto: 63 case Auto:
64 case FillAvailable: { 64 case FillAvailable: {
65 LayoutUnit content_size = constraint_space.AvailableSize().inline_size; 65 LayoutUnit content_size = constraint_space.AvailableSize().inline_size;
66 NGBoxStrut margins = ComputeMargins( 66 NGBoxStrut margins = ComputeMargins(
67 constraint_space, style, 67 constraint_space, style,
68 FromPlatformWritingMode(style.getWritingMode()), style.direction()); 68 FromPlatformWritingMode(style.getWritingMode()), style.direction());
69 return std::max(border_and_padding.InlineSum(), 69 return std::max(border_and_padding.InlineSum(),
70 content_size - margins.InlineSum()); 70 content_size - margins.InlineSum());
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after
131 // a random negative number. 131 // a random negative number.
132 if (length.isPercentOrCalc() && 132 if (length.isPercentOrCalc() &&
133 constraint_space.PercentageResolutionSize().block_size == 133 constraint_space.PercentageResolutionSize().block_size ==
134 NGSizeIndefinite) 134 NGSizeIndefinite)
135 return content_size; 135 return content_size;
136 136
137 // We don't need this when we're resolving margin/border/padding; skip 137 // We don't need this when we're resolving margin/border/padding; skip
138 // computing it as an optimization and to simplify the code below. 138 // computing it as an optimization and to simplify the code below.
139 NGBoxStrut border_and_padding; 139 NGBoxStrut border_and_padding;
140 if (type != LengthResolveType::kMarginBorderPaddingSize) { 140 if (type != LengthResolveType::kMarginBorderPaddingSize) {
141 border_and_padding = 141 border_and_padding = ComputeBorders(constraint_space, style) +
142 ComputeBorders(style) + ComputePadding(constraint_space, style); 142 ComputePadding(constraint_space, style);
143 } 143 }
144 switch (length.type()) { 144 switch (length.type()) {
145 case FillAvailable: { 145 case FillAvailable: {
146 LayoutUnit content_size = constraint_space.AvailableSize().block_size; 146 LayoutUnit content_size = constraint_space.AvailableSize().block_size;
147 NGBoxStrut margins = ComputeMargins( 147 NGBoxStrut margins = ComputeMargins(
148 constraint_space, style, 148 constraint_space, style,
149 FromPlatformWritingMode(style.getWritingMode()), style.direction()); 149 FromPlatformWritingMode(style.getWritingMode()), style.direction());
150 return std::max(border_and_padding.BlockSum(), 150 return std::max(border_and_padding.BlockSum(),
151 content_size - margins.BlockSum()); 151 content_size - margins.BlockSum());
152 } 152 }
(...skipping 39 matching lines...) Expand 10 before | Expand all | Expand 10 after
192 NGConstraintSpaceBuilder builder(writing_mode); 192 NGConstraintSpaceBuilder builder(writing_mode);
193 builder.SetInitialContainingBlockSize( 193 builder.SetInitialContainingBlockSize(
194 NGPhysicalSize{LayoutUnit(), LayoutUnit()}); 194 NGPhysicalSize{LayoutUnit(), LayoutUnit()});
195 NGConstraintSpace* space = builder.ToConstraintSpace(writing_mode); 195 NGConstraintSpace* space = builder.ToConstraintSpace(writing_mode);
196 196
197 MinAndMaxContentSizes computed_sizes; 197 MinAndMaxContentSizes computed_sizes;
198 Length inline_size = style.logicalWidth(); 198 Length inline_size = style.logicalWidth();
199 if (inline_size.isAuto()) { 199 if (inline_size.isAuto()) {
200 CHECK(min_and_max.has_value()); 200 CHECK(min_and_max.has_value());
201 NGBoxStrut border_and_padding = 201 NGBoxStrut border_and_padding =
202 ComputeBorders(style) + ComputePadding(*space, style); 202 ComputeBorders(*space, style) + ComputePadding(*space, style);
203 computed_sizes.min_content = 203 computed_sizes.min_content =
204 min_and_max->min_content + border_and_padding.InlineSum(); 204 min_and_max->min_content + border_and_padding.InlineSum();
205 computed_sizes.max_content = 205 computed_sizes.max_content =
206 min_and_max->max_content + border_and_padding.InlineSum(); 206 min_and_max->max_content + border_and_padding.InlineSum();
207 } else { 207 } else {
208 computed_sizes.min_content = computed_sizes.max_content = 208 computed_sizes.min_content = computed_sizes.max_content =
209 ResolveInlineLength(*space, style, min_and_max, inline_size, 209 ResolveInlineLength(*space, style, min_and_max, inline_size,
210 LengthResolveType::kContentSize); 210 LengthResolveType::kContentSize);
211 } 211 }
212 212
(...skipping 134 matching lines...) Expand 10 before | Expand all | Expand 10 after
347 LengthResolveType::kMarginBorderPaddingSize); 347 LengthResolveType::kMarginBorderPaddingSize);
348 physical_dim.top = ResolveInlineLength( 348 physical_dim.top = ResolveInlineLength(
349 constraint_space, style, empty_sizes, style.marginTop(), 349 constraint_space, style, empty_sizes, style.marginTop(),
350 LengthResolveType::kMarginBorderPaddingSize); 350 LengthResolveType::kMarginBorderPaddingSize);
351 physical_dim.bottom = ResolveInlineLength( 351 physical_dim.bottom = ResolveInlineLength(
352 constraint_space, style, empty_sizes, style.marginBottom(), 352 constraint_space, style, empty_sizes, style.marginBottom(),
353 LengthResolveType::kMarginBorderPaddingSize); 353 LengthResolveType::kMarginBorderPaddingSize);
354 return physical_dim.ConvertToLogical(writing_mode, direction); 354 return physical_dim.ConvertToLogical(writing_mode, direction);
355 } 355 }
356 356
357 NGBoxStrut ComputeBorders(const ComputedStyle& style) { 357 NGBoxStrut ComputeBorders(const NGConstraintSpace& constraint_space,
358 const ComputedStyle& style) {
359 // If we are producing an anonymous fragment (e.g. a column) we shouldn't
360 // have any borders.
361 if (constraint_space.IsAnonymous())
362 return NGBoxStrut();
363
358 NGBoxStrut borders; 364 NGBoxStrut borders;
359 borders.inline_start = LayoutUnit(style.borderStartWidth()); 365 borders.inline_start = LayoutUnit(style.borderStartWidth());
360 borders.inline_end = LayoutUnit(style.borderEndWidth()); 366 borders.inline_end = LayoutUnit(style.borderEndWidth());
361 borders.block_start = LayoutUnit(style.borderBeforeWidth()); 367 borders.block_start = LayoutUnit(style.borderBeforeWidth());
362 borders.block_end = LayoutUnit(style.borderAfterWidth()); 368 borders.block_end = LayoutUnit(style.borderAfterWidth());
363 return borders; 369 return borders;
364 } 370 }
365 371
366 NGBoxStrut ComputePadding(const NGConstraintSpace& constraint_space, 372 NGBoxStrut ComputePadding(const NGConstraintSpace& constraint_space,
367 const ComputedStyle& style) { 373 const ComputedStyle& style) {
374 // If we are producing an anonymous fragment (e.g. a column) we shouldn't
375 // have any padding.
376 if (constraint_space.IsAnonymous())
377 return NGBoxStrut();
378
368 // We don't need these for padding computations 379 // We don't need these for padding computations
369 MinAndMaxContentSizes empty_sizes; 380 MinAndMaxContentSizes empty_sizes;
370 // Padding always gets computed relative to the inline size: 381 // Padding always gets computed relative to the inline size:
371 // https://www.w3.org/TR/CSS2/box.html#value-def-padding-width 382 // https://www.w3.org/TR/CSS2/box.html#value-def-padding-width
372 NGBoxStrut padding; 383 NGBoxStrut padding;
373 padding.inline_start = ResolveInlineLength( 384 padding.inline_start = ResolveInlineLength(
374 constraint_space, style, empty_sizes, style.paddingStart(), 385 constraint_space, style, empty_sizes, style.paddingStart(),
375 LengthResolveType::kMarginBorderPaddingSize); 386 LengthResolveType::kMarginBorderPaddingSize);
376 padding.inline_end = ResolveInlineLength( 387 padding.inline_end = ResolveInlineLength(
377 constraint_space, style, empty_sizes, style.paddingEnd(), 388 constraint_space, style, empty_sizes, style.paddingEnd(),
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
409 Optional<LayoutUnit> min, 420 Optional<LayoutUnit> min,
410 Optional<LayoutUnit> max) { 421 Optional<LayoutUnit> max) {
411 if (max && length > max.value()) 422 if (max && length > max.value())
412 length = max.value(); 423 length = max.value();
413 if (min && length < min.value()) 424 if (min && length < min.value())
414 length = min.value(); 425 length = min.value();
415 return length; 426 return length;
416 } 427 }
417 428
418 } // namespace blink 429 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698