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

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

Issue 2739683006: Use Opportunity Iterator to position text fragments in NGLineBuilder (Closed)
Patch Set: add font-family 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 40fcb427f5851961060478cd39480f445ed18596..de7113fd50971d28ebed21987033cb45dae6a74a 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
@@ -20,7 +20,7 @@
namespace blink {
NGLineBuilder::NGLineBuilder(NGInlineNode* inline_box,
- const NGConstraintSpace* constraint_space)
+ NGConstraintSpace* constraint_space)
: inline_box_(inline_box),
constraint_space_(constraint_space),
baseline_type_(constraint_space->WritingMode() ==
@@ -35,7 +35,7 @@ NGLineBuilder::NGLineBuilder(NGInlineNode* inline_box,
}
bool NGLineBuilder::CanFitOnLine() const {
- LayoutUnit available_size = constraint_space_->AvailableSize().inline_size;
+ LayoutUnit available_size = current_opportunity_.InlineSize();
if (available_size == NGSizeIndefinite)
return true;
return end_position_ <= available_size;
@@ -59,6 +59,8 @@ void NGLineBuilder::SetStart(unsigned index, unsigned offset) {
start_index_ = last_index_ = last_break_opportunity_index_ = index;
start_offset_ = end_offset_ = last_break_opportunity_offset_ = offset;
end_position_ = last_break_opportunity_position_ = LayoutUnit();
+
+ FindNextLayoutOpportunity();
}
void NGLineBuilder::SetEnd(unsigned end_offset) {
@@ -146,6 +148,8 @@ void NGLineBuilder::CreateLineUpToLastBreakOpportunity() {
#if DCHECK_IS_ON()
is_bidi_reordered_ = false;
#endif
+
+ FindNextLayoutOpportunity();
}
void NGLineBuilder::BidiReorder(Vector<LineItemChunk, 32>* line_item_chunks) {
@@ -189,7 +193,7 @@ void NGLineBuilder::PlaceItems(
NGFragmentBuilder text_builder(NGPhysicalFragment::kFragmentText,
inline_box_);
- text_builder.SetWritingMode(constraint_space_->WritingMode());
+ text_builder.SetWritingMode(ConstraintSpace().WritingMode());
line_box_data_list_.grow(line_box_data_list_.size() + 1);
LineBoxData& line_box_data = line_box_data_list_.back();
@@ -238,7 +242,12 @@ void NGLineBuilder::PlaceItems(
line_item_chunk.index, line_item_chunk.start_offset,
line_item_chunk.end_offset);
fragments_.push_back(std::move(text_fragment));
- offsets_.push_back(NGLogicalOffset(line_box_data.inline_size, top));
+
+ NGLogicalOffset logical_offset(
+ line_box_data.inline_size + current_opportunity_.InlineStartOffset() -
+ ConstraintSpace().BfcOffset().inline_offset,
+ top);
+ offsets_.push_back(logical_offset);
line_box_data.inline_size += line_item_chunk.inline_size;
}
DCHECK_EQ(fragments_.size(), offsets_.size());
@@ -319,6 +328,15 @@ void NGLineBuilder::AccumulateUsedFonts(const NGLayoutInlineItem& item,
}
}
+void NGLineBuilder::FindNextLayoutOpportunity() {
+ NGLogicalOffset iter_offset = constraint_space_->BfcOffset();
+ iter_offset.block_offset += content_size_;
+ auto* iter = constraint_space_->LayoutOpportunityIterator(iter_offset);
+ NGLayoutOpportunity opportunity = iter->Next();
+ if (!opportunity.IsEmpty())
+ current_opportunity_ = opportunity;
+}
+
void NGLineBuilder::CreateFragments(NGFragmentBuilder* container_builder) {
DCHECK(!HasItems()) << "Must call CreateLine()";
DCHECK_EQ(fragments_.size(), offsets_.size());
@@ -330,7 +348,6 @@ void NGLineBuilder::CreateFragments(NGFragmentBuilder* container_builder) {
}
// 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_)
.SetInlineOverflow(max_inline_size_)
.SetBlockSize(content_size_)
@@ -387,7 +404,7 @@ void NGLineBuilder::CopyFragmentDataToLayoutBlockFlow() {
BidiRun* run = bidi_runs.firstRun();
for (auto* physical_fragment : fragments_for_bidi_runs) {
DCHECK(run);
- NGTextFragment fragment(constraint_space_->WritingMode(),
+ NGTextFragment fragment(ConstraintSpace().WritingMode(),
toNGPhysicalTextFragment(physical_fragment));
InlineBox* inline_box = run->m_box;
inline_box->setLogicalWidth(fragment.InlineSize());
@@ -412,5 +429,4 @@ void NGLineBuilder::CopyFragmentDataToLayoutBlockFlow() {
fragments_for_bidi_runs.clear();
}
}
-
} // namespace blink

Powered by Google App Engine
This is Rietveld 408576698