| Index: third_party/WebKit/Source/platform/fonts/shaping/CachingWordShapeIterator.h
|
| diff --git a/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShapeIterator.h b/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShapeIterator.h
|
| index 42ba703dbc07a75d2c60526340f590568a3f2493..a616714f32cc50e4e3e273db6d118318ee46ab13 100644
|
| --- a/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShapeIterator.h
|
| +++ b/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShapeIterator.h
|
| @@ -100,34 +100,53 @@ private:
|
|
|
| bool nextWord(RefPtr<ShapeResult>* wordResult)
|
| {
|
| - unsigned length = m_textRun.length();
|
| - if (m_startIndex < length) {
|
| - if (m_textRun[m_startIndex] == spaceCharacter
|
| - || m_textRun[m_startIndex] == tabulationCharacter) {
|
| - TextRun wordRun = m_textRun.subRun(m_startIndex, 1);
|
| - *wordResult = shapeWord(wordRun, m_font);
|
| - m_startIndex++;
|
| - return *wordResult;
|
| - }
|
| + return shapeToEndIndex(wordResult, nextWordEndIndex());
|
| + }
|
| +
|
| + static bool isWordDelimiter(UChar ch)
|
| + {
|
| + return ch == spaceCharacter || ch == tabulationCharacter;
|
| + }
|
| +
|
| + unsigned nextWordEndIndex()
|
| + {
|
| + const unsigned length = m_textRun.length();
|
| + if (m_startIndex >= length)
|
| + return 0;
|
| +
|
| + if (m_startIndex + 1u == length || isWordDelimiter(m_textRun[m_startIndex]))
|
| + return m_startIndex + 1;
|
|
|
| - return nextUntilCharacterOrTab(wordResult, spaceCharacter);
|
| + for (unsigned i = m_startIndex + 1; ; i++) {
|
| + if (i == length || isWordDelimiter(m_textRun[i]))
|
| + return i;
|
| + }
|
| + }
|
| +
|
| + bool shapeToEndIndex(RefPtr<ShapeResult>* result, unsigned endIndex)
|
| + {
|
| + if (!endIndex || endIndex <= m_startIndex)
|
| + return false;
|
| +
|
| + const unsigned length = m_textRun.length();
|
| + if (!m_startIndex && endIndex == length) {
|
| + *result = shapeWord(m_textRun, m_font);
|
| + } else {
|
| + ASSERT(endIndex <= length);
|
| + TextRun subRun = m_textRun.subRun(m_startIndex, endIndex - m_startIndex);
|
| + *result = shapeWord(subRun, m_font);
|
| }
|
| - return false;
|
| + m_startIndex = endIndex;
|
| + return *result;
|
| }
|
|
|
| - bool nextUntilCharacterOrTab(RefPtr<ShapeResult>* wordResult, UChar delimiter)
|
| + unsigned endIndexUntil(UChar ch)
|
| {
|
| unsigned length = m_textRun.length();
|
| ASSERT(m_startIndex < length);
|
| for (unsigned i = m_startIndex + 1; ; i++) {
|
| - if (i == length || m_textRun[i] == delimiter
|
| - || m_textRun[i] == tabulationCharacter) {
|
| - TextRun wordRun = m_textRun.subRun(m_startIndex,
|
| - i - m_startIndex);
|
| - m_startIndex = i;
|
| - *wordResult = shapeWord(wordRun, m_font);
|
| - return *wordResult;
|
| - }
|
| + if (i == length || m_textRun[i] == ch)
|
| + return i;
|
| }
|
| }
|
|
|
| @@ -147,14 +166,13 @@ private:
|
| }
|
| }
|
| } else if (!m_shapeByWord) {
|
| - if (!nextUntilCharacterOrTab(wordResult, 0))
|
| + if (!shapeToEndIndex(wordResult, endIndexUntil(tabulationCharacter)))
|
| return false;
|
| } else {
|
| if (!nextWord(wordResult))
|
| return false;
|
| }
|
| - if (!*wordResult)
|
| - return false;
|
| + ASSERT(*wordResult);
|
| m_widthSoFar += (*wordResult)->width();
|
| return true;
|
| }
|
|
|