| Index: third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.cpp
|
| diff --git a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.cpp b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.cpp
|
| index 801017f91b2e7c3c8134a54d5b79f7b4cda593b5..1c0b74dc21e59da00a9e9a7a7fe1f5ae8a650905 100644
|
| --- a/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.cpp
|
| +++ b/third_party/WebKit/Source/platform/fonts/shaping/ShapeResultBuffer.cpp
|
| @@ -89,36 +89,29 @@ inline unsigned countGraphemesInCluster(const UChar* str,
|
|
|
| } // anonymous namespace
|
|
|
| -template <TextDirection direction>
|
| -float ShapeResultBuffer::fillGlyphBufferForRun(GlyphBuffer* glyphBuffer,
|
| - const ShapeResult::RunInfo* run,
|
| - const TextRun& textRun,
|
| - float initialAdvance,
|
| - unsigned from,
|
| - unsigned to,
|
| - unsigned runOffset) {
|
| - if (!run)
|
| - return 0;
|
| - float advanceSoFar = initialAdvance;
|
| - const unsigned numGlyphs = run->m_glyphData.size();
|
| - for (unsigned i = 0; i < numGlyphs; ++i) {
|
| - const HarfBuzzRunGlyphData& glyphData = run->m_glyphData[i];
|
| - uint16_t currentCharacterIndex =
|
| - run->m_startIndex + glyphData.characterIndex + runOffset;
|
| - if ((direction == TextDirection::kRtl && currentCharacterIndex >= to) ||
|
| - (direction == TextDirection::kLtr && currentCharacterIndex < from)) {
|
| - advanceSoFar += glyphData.advance;
|
| - } else if ((direction == TextDirection::kRtl &&
|
| - currentCharacterIndex >= from) ||
|
| - (direction == TextDirection::kLtr &&
|
| - currentCharacterIndex < to)) {
|
| - addGlyphToBuffer(glyphBuffer, advanceSoFar, run->m_direction,
|
| - run->m_fontData.get(), glyphData, textRun,
|
| - currentCharacterIndex);
|
| - advanceSoFar += glyphData.advance;
|
| - }
|
| +float ShapeResultBuffer::fillGlyphBufferForResult(GlyphBuffer* glyphBuffer,
|
| + const ShapeResult& result,
|
| + const TextRun& textRun,
|
| + float initialAdvance,
|
| + unsigned from,
|
| + unsigned to,
|
| + unsigned runOffset) {
|
| + auto totalAdvance = initialAdvance;
|
| +
|
| + for (const auto& run : result.m_runs) {
|
| + totalAdvance = run->forEachGlyphInRange(
|
| + totalAdvance, from, to, runOffset,
|
| + [&](const HarfBuzzRunGlyphData& glyphData, float totalAdvance,
|
| + uint16_t characterIndex) -> bool {
|
| +
|
| + addGlyphToBuffer(glyphBuffer, totalAdvance, run->m_direction,
|
| + run->m_fontData.get(), glyphData, textRun,
|
| + characterIndex);
|
| + return true;
|
| + });
|
| }
|
| - return advanceSoFar - initialAdvance;
|
| +
|
| + return totalAdvance;
|
| }
|
|
|
| float ShapeResultBuffer::fillGlyphBufferForTextEmphasisRun(
|
| @@ -214,7 +207,7 @@ float ShapeResultBuffer::fillGlyphBufferForTextEmphasisRun(
|
| float ShapeResultBuffer::fillFastHorizontalGlyphBuffer(
|
| GlyphBuffer* glyphBuffer,
|
| const TextRun& textRun) const {
|
| - ASSERT(!hasVerticalOffsets());
|
| + DCHECK(!hasVerticalOffsets());
|
|
|
| float advance = 0;
|
|
|
| @@ -223,23 +216,26 @@ float ShapeResultBuffer::fillFastHorizontalGlyphBuffer(
|
| const auto& wordResult = isLeftToRightDirection(textRun.direction())
|
| ? m_results[i]
|
| : m_results[m_results.size() - 1 - i];
|
| - ASSERT(!wordResult->hasVerticalOffsets());
|
| + DCHECK(!wordResult->hasVerticalOffsets());
|
|
|
| for (const auto& run : wordResult->m_runs) {
|
| - ASSERT(run);
|
| - ASSERT(HB_DIRECTION_IS_HORIZONTAL(run->m_direction));
|
| -
|
| - for (const auto& glyphData : run->m_glyphData) {
|
| - ASSERT(!glyphData.offset.height());
|
| -
|
| - if (!isSkipInkException(*glyphBuffer, textRun,
|
| - characterIndex + glyphData.characterIndex)) {
|
| - glyphBuffer->add(glyphData.glyph, run->m_fontData.get(),
|
| - advance + glyphData.offset.width());
|
| - }
|
| -
|
| - advance += glyphData.advance;
|
| - }
|
| + DCHECK(run);
|
| + DCHECK(HB_DIRECTION_IS_HORIZONTAL(run->m_direction));
|
| +
|
| + advance = run->forEachGlyph(
|
| + advance,
|
| + [&](const HarfBuzzRunGlyphData& glyphData,
|
| + float totalAdvance) -> bool {
|
| + DCHECK(!glyphData.offset.height());
|
| +
|
| + if (!isSkipInkException(
|
| + *glyphBuffer, textRun,
|
| + characterIndex + glyphData.characterIndex)) {
|
| + glyphBuffer->add(glyphData.glyph, run->m_fontData.get(),
|
| + totalAdvance + glyphData.offset.width());
|
| + }
|
| + return true;
|
| + });
|
| }
|
| characterIndex += wordResult->m_numCharacters;
|
| }
|
| @@ -264,22 +260,15 @@ float ShapeResultBuffer::fillGlyphBuffer(GlyphBuffer* glyphBuffer,
|
| for (unsigned j = 0; j < m_results.size(); j++) {
|
| unsigned resolvedIndex = m_results.size() - 1 - j;
|
| const RefPtr<const ShapeResult>& wordResult = m_results[resolvedIndex];
|
| - for (unsigned i = 0; i < wordResult->m_runs.size(); i++) {
|
| - advance += fillGlyphBufferForRun<TextDirection::kRtl>(
|
| - glyphBuffer, wordResult->m_runs[i].get(), textRun, advance, from,
|
| - to, wordOffset - wordResult->numCharacters());
|
| - }
|
| wordOffset -= wordResult->numCharacters();
|
| + advance = fillGlyphBufferForResult(glyphBuffer, *wordResult, textRun,
|
| + advance, from, to, wordOffset);
|
| }
|
| } else {
|
| unsigned wordOffset = 0;
|
| - for (unsigned j = 0; j < m_results.size(); j++) {
|
| - const RefPtr<const ShapeResult>& wordResult = m_results[j];
|
| - for (unsigned i = 0; i < wordResult->m_runs.size(); i++) {
|
| - advance += fillGlyphBufferForRun<TextDirection::kLtr>(
|
| - glyphBuffer, wordResult->m_runs[i].get(), textRun, advance, from,
|
| - to, wordOffset);
|
| - }
|
| + for (const auto& wordResult : m_results) {
|
| + advance = fillGlyphBufferForResult(glyphBuffer, *wordResult, textRun,
|
| + advance, from, to, wordOffset);
|
| wordOffset += wordResult->numCharacters();
|
| }
|
| }
|
|
|