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

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

Issue 2702853002: [LayoutNG] Shape items with context (Closed)
Patch Set: Add null check Created 3 years, 10 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_inline_node.cc
diff --git a/third_party/WebKit/Source/core/layout/ng/ng_inline_node.cc b/third_party/WebKit/Source/core/layout/ng/ng_inline_node.cc
index 406a7401f6344080e1efe4eafa2e6982f0aa291b..31cd0364943e8481e4467096fcfbe0c6b8371d1f 100644
--- a/third_party/WebKit/Source/core/layout/ng/ng_inline_node.cc
+++ b/third_party/WebKit/Source/core/layout/ng/ng_inline_node.cc
@@ -21,6 +21,7 @@
#include "platform/fonts/CharacterRange.h"
#include "platform/fonts/shaping/CachingWordShapeIterator.h"
#include "platform/fonts/shaping/CachingWordShaper.h"
+#include "platform/fonts/shaping/HarfBuzzShaper.h"
#include "platform/fonts/shaping/ShapeResultBuffer.h"
#include "wtf/text/CharacterNames.h"
@@ -199,44 +200,34 @@ LayoutUnit NGLayoutInlineItem::InlineSize(unsigned start, unsigned end) const {
if (start == end)
return LayoutUnit();
- if (!style_) {
+ if (!style_ || !shape_result_) {
// Bidi controls do not have widths.
// TODO(kojii): Atomic inline not supported yet.
return LayoutUnit();
}
- float total_width = 0;
- for (const auto& result : shape_results_)
- total_width += result->width();
-
if (start == start_offset_ && end == end_offset_)
- return LayoutUnit(total_width);
+ return LayoutUnit(shape_result_->width());
return LayoutUnit(ShapeResultBuffer::getCharacterRange(
- shape_results_, Direction(), total_width,
+ shape_result_, Direction(), shape_result_->width(),
start - StartOffset(), end - StartOffset())
.width());
}
void NGInlineNode::ShapeText() {
- // TODO(layout-dev): Should pass the entire range to the shaper as context
- // and then shape each item based on the relevant font.
+ // TODO(eae): Add support for shaping latin-1 text?
+ text_content_.ensure16Bit();
+
+ // Shape each item with the full context of the entire node.
+ HarfBuzzShaper shaper(text_content_.characters16(), text_content_.length());
for (auto& item : items_) {
// Skip object replacement characters and bidi control characters.
if (!item.style_)
continue;
- StringView item_text(text_content_, item.start_offset_,
- item.end_offset_ - item.start_offset_);
- const Font& item_font = item.style_->font();
- ShapeCache* shape_cache = item_font.shapeCache();
-
- TextRun item_run(item_text);
- item_run.setDirection(item.Direction());
- CachingWordShapeIterator iterator(shape_cache, item_run, &item_font);
- RefPtr<const ShapeResult> word_result;
- while (iterator.next(&word_result)) {
- item.shape_results_.push_back(std::move(word_result));
- }
+
+ item.shape_result_ = shaper.shape(&item.Style()->font(), item.Direction(),
+ item.StartOffset(), item.EndOffset());
}
}

Powered by Google App Engine
This is Rietveld 408576698