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

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

Issue 2753743003: Make NGFragmentBuilder to keep track on text children. (Closed)
Patch Set: get a raw ptr of NGPhysicalFragment instead of RefPtr 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 side-by-side diff with in-line comments
Download patch
Index: third_party/WebKit/Source/core/layout/ng/ng_line_builder.cc
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_line_builder.cc b/third_party/WebKit/Source/core/layout/ng/ng_line_builder.cc
index d5b2d8c5e74873d6cea1953ae31ab5e2c0fa9a34..7b2af9ac5792dd0fd9a33d0971e4b8a5a5d5a613 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_line_builder.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_line_builder.cc
@@ -28,7 +28,9 @@ NGLineBuilder::NGLineBuilder(NGInlineNode* inline_box,
baseline_type_(constraint_space->WritingMode() ==
NGWritingMode::kHorizontalTopBottom
? FontBaseline::AlphabeticBaseline
- : FontBaseline::IdeographicBaseline)
+ : FontBaseline::IdeographicBaseline),
+ container_builder_(NGPhysicalFragment::kFragmentBox, inline_box_),
+ container_layout_result_(nullptr)
#if DCHECK_IS_ON()
,
is_bidi_reordered_(false)
@@ -206,7 +208,7 @@ void NGLineBuilder::BidiReorder(Vector<LineItemChunk, 32>* line_item_chunks) {
void NGLineBuilder::PlaceItems(
const Vector<LineItemChunk, 32>& line_item_chunks) {
const Vector<NGLayoutInlineItem>& items = inline_box_->Items();
- const unsigned fragment_start_index = fragments_.size();
+ const unsigned fragment_start_index = container_builder_.Children().size();
NGFragmentBuilder text_builder(NGPhysicalFragment::kFragmentText,
inline_box_);
@@ -280,18 +282,16 @@ void NGLineBuilder::PlaceItems(
RefPtr<NGPhysicalTextFragment> text_fragment = text_builder.ToTextFragment(
line_item_chunk.index, line_item_chunk.start_offset,
line_item_chunk.end_offset);
- fragments_.push_back(std::move(text_fragment));
NGLogicalOffset logical_offset(
line_box_data.inline_size + current_opportunity_.InlineStartOffset() -
ConstraintSpace().BfcOffset().inline_offset,
top);
- offsets_.push_back(logical_offset);
+ container_builder_.AddChild(std::move(text_fragment), logical_offset);
line_box_data.inline_size += line_item_chunk.inline_size;
}
- DCHECK_EQ(fragments_.size(), offsets_.size());
- if (fragment_start_index == fragments_.size()) {
+ if (fragment_start_index == container_builder_.Children().size()) {
// The line was empty. Remove the LineBoxData.
line_box_data_list_.shrink(line_box_data_list_.size() - 1);
return;
@@ -303,11 +303,12 @@ void NGLineBuilder::PlaceItems(
line_box_data.max_ascent_and_leading) {
LayoutUnit adjust_top(line_box_data.max_ascent_and_leading -
block_metrics.ascent_and_leading);
- for (unsigned i = fragment_start_index; i < offsets_.size(); i++)
- offsets_[i].block_offset += adjust_top;
+ auto& offsets = container_builder_.MutableOffsets();
+ for (unsigned i = fragment_start_index; i < offsets.size(); i++)
+ offsets[i].block_offset += adjust_top;
}
- line_box_data.fragment_end = fragments_.size();
+ line_box_data.fragment_end = container_builder_.Children().size();
line_box_data.top_with_leading = content_size_;
max_inline_size_ = std::max(max_inline_size_, line_box_data.inline_size);
content_size_ += LayoutUnit(line_box_data.max_ascent_and_leading +
@@ -378,25 +379,16 @@ void NGLineBuilder::FindNextLayoutOpportunity() {
RefPtr<NGLayoutResult> NGLineBuilder::CreateFragments() {
DCHECK(!HasItems()) << "Must call CreateLine()";
- DCHECK_EQ(fragments_.size(), offsets_.size());
-
- NGFragmentBuilder container_builder(NGPhysicalFragment::kFragmentBox,
- inline_box_);
-
- for (unsigned i = 0; i < fragments_.size(); i++) {
- // TODO(layout-dev): This should really be a std::move but
- // CopyFragmentDataToLayoutBlockFlow also uses the fragments.
- container_builder.AddChild(fragments_[i].get(), offsets_[i]);
- }
// TODO(kojii): Check if the line box width should be content or available.
// TODO(kojii): Need to take constraint_space into account.
- container_builder.SetInlineSize(max_inline_size_)
+ container_builder_.SetInlineSize(max_inline_size_)
.SetInlineOverflow(max_inline_size_)
.SetBlockSize(content_size_)
.SetBlockOverflow(content_size_);
- return container_builder.ToBoxFragment();
+ container_layout_result_ = container_builder_.ToBoxFragment();
+ return container_layout_result_;
}
void NGLineBuilder::CopyFragmentDataToLayoutBlockFlow() {
@@ -407,16 +399,21 @@ void NGLineBuilder::CopyFragmentDataToLayoutBlockFlow() {
Vector<unsigned, 32> text_offsets(items.size());
inline_box_->GetLayoutTextOffsets(&text_offsets);
- Vector<NGPhysicalFragment*, 32> fragments_for_bidi_runs;
+ Vector<const NGPhysicalFragment*, 32> fragments_for_bidi_runs;
fragments_for_bidi_runs.reserveInitialCapacity(items.size());
BidiRunList<BidiRun> bidi_runs;
LineInfo line_info;
unsigned fragment_index = 0;
+ NGPhysicalBoxFragment* box_fragment = toNGPhysicalBoxFragment(
+ container_layout_result_->PhysicalFragment().get());
for (const auto& line_box_data : line_box_data_list_) {
// Create a BidiRunList for this line.
for (; fragment_index < line_box_data.fragment_end; fragment_index++) {
- NGPhysicalTextFragment* text_fragment =
- toNGPhysicalTextFragment(fragments_[fragment_index].get());
+ const NGPhysicalFragment* fragment =
+ box_fragment->Children()[fragment_index].get();
+ if (!fragment->IsText())
+ continue;
+ const auto* text_fragment = toNGPhysicalTextFragment(fragment);
const NGLayoutInlineItem& item = items[text_fragment->ItemIndex()];
LayoutObject* layout_object = item.GetLayoutObject();
if (!layout_object) // Skip bidi controls.

Powered by Google App Engine
This is Rietveld 408576698