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

Unified Diff: third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc

Issue 2867293002: [LayoutNG] Compute baseline from fragment tree (Closed)
Patch Set: Cleanup Created 3 years, 5 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc
diff --git a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc
index c1792201e175ec5e1339ef780b5eb4ef3216216a..330a8b93e2986640ca975447bd3a409431e3296d 100644
--- a/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc
+++ b/third_party/WebKit/Source/core/layout/ng/inline/ng_inline_layout_algorithm.cc
@@ -4,6 +4,7 @@
#include "core/layout/ng/inline/ng_inline_layout_algorithm.h"
+#include "core/layout/ng/inline/ng_baseline.h"
#include "core/layout/ng/inline/ng_bidi_paragraph.h"
#include "core/layout/ng/inline/ng_inline_break_token.h"
#include "core/layout/ng/inline/ng_inline_node.h"
@@ -287,25 +288,15 @@ NGInlineBoxState* NGInlineLayoutAlgorithm::PlaceAtomicInline(
NGInlineBoxState* box =
box_states_.OnOpenTag(item, *item_result, line_box, position);
- // For replaced elements, inline-block elements, and inline-table elements,
- // the height is the height of their margin box.
- // https://drafts.csswg.org/css2/visudet.html#line-height
NGBoxFragment fragment(
ConstraintSpace().WritingMode(),
ToNGPhysicalBoxFragment(
item_result->layout_result->PhysicalFragment().Get()));
- LayoutUnit block_size =
- fragment.BlockSize() + item_result->margins.BlockSum();
-
- // TODO(kojii): Add baseline position to NGPhysicalFragment.
- LayoutBox* layout_box = ToLayoutBox(item.GetLayoutObject());
- LineDirectionMode line_direction_mode =
- IsHorizontalWritingMode() ? LineDirectionMode::kHorizontalLine
- : LineDirectionMode::kVerticalLine;
- LayoutUnit baseline_offset(layout_box->BaselinePosition(
- baseline_type_, line_info.UseFirstLineStyle(), line_direction_mode));
-
- NGLineHeightMetrics metrics(baseline_offset, block_size - baseline_offset);
+ NGLineHeightMetrics metrics = fragment.BaselineMetrics(
+ {line_info.UseFirstLineStyle()
+ ? NGBaselineAlgorithmType::kAtomicInlineForFirstLine
+ : NGBaselineAlgorithmType::kAtomicInline,
+ baseline_type_});
box->metrics.Unite(metrics);
// TODO(kojii): Figure out what to do with OOF in NGLayoutResult.
@@ -315,7 +306,7 @@ NGInlineBoxState* NGInlineLayoutAlgorithm::PlaceAtomicInline(
// |fragment| directly. Currently |CopyFragmentDataToLayoutBlockFlow|
// requires a text fragment.
text_builder->SetDirection(style.Direction());
- text_builder->SetSize({fragment.InlineSize(), block_size});
+ text_builder->SetSize({fragment.InlineSize(), metrics.LineHeight()});
LayoutUnit line_top = item_result->margins.block_start - metrics.ascent;
RefPtr<NGPhysicalTextFragment> text_fragment = text_builder->ToTextFragment(
item_result->item_index, item_result->start_offset,
@@ -406,6 +397,50 @@ LayoutUnit NGInlineLayoutAlgorithm::ComputeContentSize(
return content_size;
}
+// Add a baseline from a child line box.
+// @return false if the specified child is not a line box.
+bool NGInlineLayoutAlgorithm::AddBaseline(const NGBaselineRequest& request,
+ unsigned child_index) {
+ const NGPhysicalFragment* child =
+ container_builder_.Children()[child_index].Get();
+ if (!child->IsLineBox())
+ return false;
+
+ const NGPhysicalLineBoxFragment* line_box =
+ ToNGPhysicalLineBoxFragment(child);
+ LayoutUnit offset = line_box->BaselinePosition(request.baseline_type);
+ container_builder_.AddBaseline(
+ request.algorithm_type, request.baseline_type,
+ offset + container_builder_.Offsets()[child_index].block_offset);
+ return true;
+}
+
+// Compute requested baselines from child line boxes.
+void NGInlineLayoutAlgorithm::PropagateBaselinesFromChildren() {
+ const Vector<NGBaselineRequest>& requests =
+ ConstraintSpace().BaselineRequests();
+ if (requests.IsEmpty())
+ return;
+
+ for (const auto& request : requests) {
+ switch (request.algorithm_type) {
+ case NGBaselineAlgorithmType::kAtomicInline:
+ case NGBaselineAlgorithmType::kAtomicInlineForFirstLine:
+ for (unsigned i = container_builder_.Children().size(); i--;) {
+ if (AddBaseline(request, i))
+ break;
+ }
+ break;
+ case NGBaselineAlgorithmType::kFirstLine:
+ for (unsigned i = 0; i < container_builder_.Children().size(); i++) {
+ if (AddBaseline(request, i))
+ break;
+ }
+ break;
+ }
+ }
+}
+
RefPtr<NGLayoutResult> NGInlineLayoutAlgorithm::Layout() {
// Line boxes should start at (0,0).
// The parent NGBlockLayoutAlgorithm places the anonymous wrapper using the
@@ -429,6 +464,8 @@ RefPtr<NGLayoutResult> NGInlineLayoutAlgorithm::Layout() {
container_builder_.SetEndMarginStrut(ConstraintSpace().MarginStrut());
}
+ PropagateBaselinesFromChildren();
+
return container_builder_.ToBoxFragment();
}

Powered by Google App Engine
This is Rietveld 408576698