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..ce44d9ca98de9a85eb971cdc768c6132dda4419a 100644 |
--- a/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShapeIterator.h |
+++ b/third_party/WebKit/Source/platform/fonts/shaping/CachingWordShapeIterator.h |
@@ -98,35 +98,70 @@ private: |
return shapeResult.release(); |
} |
- bool nextWord(RefPtr<ShapeResult>* wordResult) |
+ bool shapeRange(RefPtr<ShapeResult>* result, std::pair<unsigned, unsigned> range) |
{ |
- 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; |
+ if (!range.second) |
+ return false; |
+ |
+ if (!range.first && range.second == static_cast<unsigned>(m_textRun.length())) { |
+ *result = shapeWord(m_textRun, m_font); |
+ return *result; |
+ } |
+ |
+ TextRun subRun = m_textRun.subRun(range.first, range.second); |
+ *result = shapeWord(subRun, m_font); |
+ return *result; |
+ } |
+ |
+ std::pair<unsigned, unsigned> nextWordRange() |
drott
2015/12/16 12:40:58
I'd suggest making std::pair<unsigned, unsigned> a
kojii
2015/12/16 12:53:34
That one I was wondering, thank you for pointing i
|
+ { |
+ const unsigned start = m_startIndex; |
+ const unsigned length = m_textRun.length(); |
+ if (start >= length) |
+ return std::make_pair(0, 0); |
+ |
+ if (m_textRun[start] == spaceCharacter |
+ || m_textRun[start] == tabulationCharacter) { |
+ m_startIndex++; |
+ return std::make_pair(start, 1); |
+ } |
+ |
+ for (unsigned i = start + 1; ; i++) { |
drott
2015/12/16 12:40:59
Can this loop and use nextRangeUntil as well?
kojii
2015/12/16 12:53:34
This needs two characters, and possibly more other
|
+ if (i == length || m_textRun[i] == spaceCharacter |
+ || m_textRun[i] == tabulationCharacter) { |
+ m_startIndex = i; |
+ return std::make_pair(start, i - start); |
} |
+ } |
+ } |
- return nextUntilCharacterOrTab(wordResult, spaceCharacter); |
+ bool nextWord(RefPtr<ShapeResult>* wordResult) |
+ { |
+ return shapeRange(wordResult, nextWordRange()); |
+ } |
+ |
+ std::pair<unsigned, unsigned> nextRangeUntil(UChar ch) |
drott
2015/12/16 12:40:59
What's the difference between nextRangeUntil and n
kojii
2015/12/16 12:53:34
"Until" exists loop when "==" while "While" exists
|
+ { |
+ const unsigned start = m_startIndex; |
+ const unsigned length = m_textRun.length(); |
+ ASSERT(m_startIndex < length); |
+ for (unsigned i = start + 1; ; i++) { |
+ if (i == length || m_textRun[i] == ch) { |
+ m_startIndex = i; |
+ return std::make_pair(start, i - start); |
+ } |
} |
- return false; |
} |
- bool nextUntilCharacterOrTab(RefPtr<ShapeResult>* wordResult, UChar delimiter) |
+ std::pair<unsigned, unsigned> nextRangeWhile(UChar ch) |
{ |
- unsigned length = m_textRun.length(); |
+ const unsigned start = m_startIndex; |
+ const 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); |
+ for (unsigned i = start + 1; ; i++) { |
+ if (i == length || m_textRun[i] != ch) { |
m_startIndex = i; |
- *wordResult = shapeWord(wordRun, m_font); |
- return *wordResult; |
+ return std::make_pair(start, i - start); |
} |
} |
} |
@@ -138,23 +173,17 @@ private: |
return false; |
if (UNLIKELY(m_textRun[m_startIndex] == tabulationCharacter)) { |
- for (unsigned i = m_startIndex + 1; ; i++) { |
- if (i == length || m_textRun[i] != tabulationCharacter) { |
- *wordResult = ShapeResult::createForTabulationCharacters( |
- m_font, m_textRun, m_widthSoFar, i - m_startIndex); |
- m_startIndex = i; |
- break; |
- } |
- } |
+ *wordResult = ShapeResult::createForTabulationCharacters( |
+ m_font, m_textRun, m_widthSoFar, |
+ nextRangeWhile(tabulationCharacter).second); |
} else if (!m_shapeByWord) { |
- if (!nextUntilCharacterOrTab(wordResult, 0)) |
+ if (!shapeRange(wordResult, nextRangeUntil(tabulationCharacter))) |
return false; |
} else { |
if (!nextWord(wordResult)) |
return false; |
} |
- if (!*wordResult) |
- return false; |
+ ASSERT(*wordResult); |
drott
2015/12/16 12:40:59
What has changed to be able upgrade this to an ass
kojii
2015/12/16 12:53:34
Actually, nothing; even before the patch, this sho
|
m_widthSoFar += (*wordResult)->width(); |
return true; |
} |