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

Unified Diff: third_party/WebKit/Source/platform/fonts/shaping/CachingWordShapeIterator.h

Issue 1530833002: Refactor word segmentation in CachingWordShapeIterator (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Cleanup Created 5 years 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
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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;
}
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698