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

Side by Side 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 unified diff | Download patch
« no previous file with comments | « no previous file | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 * Copyright (C) 2015 Google Inc. All rights reserved. 2 * Copyright (C) 2015 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions 5 * modification, are permitted provided that the following conditions
6 * are met: 6 * are met:
7 * 1. Redistributions of source code must retain the above copyright 7 * 1. Redistributions of source code must retain the above copyright
8 * notice, this list of conditions and the following disclaimer. 8 * notice, this list of conditions and the following disclaimer.
9 * 2. Redistributions in binary form must reproduce the above copyright 9 * 2. Redistributions in binary form must reproduce the above copyright
10 * notice, this list of conditions and the following disclaimer in the 10 * notice, this list of conditions and the following disclaimer in the
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
91 RefPtr<ShapeResult> shapeResult = shaper.shapeResult(); 91 RefPtr<ShapeResult> shapeResult = shaper.shapeResult();
92 if (!shapeResult) 92 if (!shapeResult)
93 return nullptr; 93 return nullptr;
94 94
95 if (cacheEntry) 95 if (cacheEntry)
96 cacheEntry->m_shapeResult = shapeResult; 96 cacheEntry->m_shapeResult = shapeResult;
97 97
98 return shapeResult.release(); 98 return shapeResult.release();
99 } 99 }
100 100
101 bool shapeRange(RefPtr<ShapeResult>* result, std::pair<unsigned, unsigned> r ange)
102 {
103 if (!range.second)
104 return false;
105
106 if (!range.first && range.second == static_cast<unsigned>(m_textRun.leng th())) {
107 *result = shapeWord(m_textRun, m_font);
108 return *result;
109 }
110
111 TextRun subRun = m_textRun.subRun(range.first, range.second);
112 *result = shapeWord(subRun, m_font);
113 return *result;
114 }
115
116 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
117 {
118 const unsigned start = m_startIndex;
119 const unsigned length = m_textRun.length();
120 if (start >= length)
121 return std::make_pair(0, 0);
122
123 if (m_textRun[start] == spaceCharacter
124 || m_textRun[start] == tabulationCharacter) {
125 m_startIndex++;
126 return std::make_pair(start, 1);
127 }
128
129 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
130 if (i == length || m_textRun[i] == spaceCharacter
131 || m_textRun[i] == tabulationCharacter) {
132 m_startIndex = i;
133 return std::make_pair(start, i - start);
134 }
135 }
136 }
137
101 bool nextWord(RefPtr<ShapeResult>* wordResult) 138 bool nextWord(RefPtr<ShapeResult>* wordResult)
102 { 139 {
103 unsigned length = m_textRun.length(); 140 return shapeRange(wordResult, nextWordRange());
104 if (m_startIndex < length) {
105 if (m_textRun[m_startIndex] == spaceCharacter
106 || m_textRun[m_startIndex] == tabulationCharacter) {
107 TextRun wordRun = m_textRun.subRun(m_startIndex, 1);
108 *wordResult = shapeWord(wordRun, m_font);
109 m_startIndex++;
110 return *wordResult;
111 }
112
113 return nextUntilCharacterOrTab(wordResult, spaceCharacter);
114 }
115 return false;
116 } 141 }
117 142
118 bool nextUntilCharacterOrTab(RefPtr<ShapeResult>* wordResult, UChar delimite r) 143 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
119 { 144 {
120 unsigned length = m_textRun.length(); 145 const unsigned start = m_startIndex;
146 const unsigned length = m_textRun.length();
121 ASSERT(m_startIndex < length); 147 ASSERT(m_startIndex < length);
122 for (unsigned i = m_startIndex + 1; ; i++) { 148 for (unsigned i = start + 1; ; i++) {
123 if (i == length || m_textRun[i] == delimiter 149 if (i == length || m_textRun[i] == ch) {
124 || m_textRun[i] == tabulationCharacter) {
125 TextRun wordRun = m_textRun.subRun(m_startIndex,
126 i - m_startIndex);
127 m_startIndex = i; 150 m_startIndex = i;
128 *wordResult = shapeWord(wordRun, m_font); 151 return std::make_pair(start, i - start);
129 return *wordResult;
130 } 152 }
131 } 153 }
132 } 154 }
155
156 std::pair<unsigned, unsigned> nextRangeWhile(UChar ch)
157 {
158 const unsigned start = m_startIndex;
159 const unsigned length = m_textRun.length();
160 ASSERT(m_startIndex < length);
161 for (unsigned i = start + 1; ; i++) {
162 if (i == length || m_textRun[i] != ch) {
163 m_startIndex = i;
164 return std::make_pair(start, i - start);
165 }
166 }
167 }
133 168
134 bool nextForAllowTabs(RefPtr<ShapeResult>* wordResult) 169 bool nextForAllowTabs(RefPtr<ShapeResult>* wordResult)
135 { 170 {
136 unsigned length = m_textRun.length(); 171 unsigned length = m_textRun.length();
137 if (m_startIndex >= length) 172 if (m_startIndex >= length)
138 return false; 173 return false;
139 174
140 if (UNLIKELY(m_textRun[m_startIndex] == tabulationCharacter)) { 175 if (UNLIKELY(m_textRun[m_startIndex] == tabulationCharacter)) {
141 for (unsigned i = m_startIndex + 1; ; i++) { 176 *wordResult = ShapeResult::createForTabulationCharacters(
142 if (i == length || m_textRun[i] != tabulationCharacter) { 177 m_font, m_textRun, m_widthSoFar,
143 *wordResult = ShapeResult::createForTabulationCharacters( 178 nextRangeWhile(tabulationCharacter).second);
144 m_font, m_textRun, m_widthSoFar, i - m_startIndex);
145 m_startIndex = i;
146 break;
147 }
148 }
149 } else if (!m_shapeByWord) { 179 } else if (!m_shapeByWord) {
150 if (!nextUntilCharacterOrTab(wordResult, 0)) 180 if (!shapeRange(wordResult, nextRangeUntil(tabulationCharacter)))
151 return false; 181 return false;
152 } else { 182 } else {
153 if (!nextWord(wordResult)) 183 if (!nextWord(wordResult))
154 return false; 184 return false;
155 } 185 }
156 if (!*wordResult) 186 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
157 return false;
158 m_widthSoFar += (*wordResult)->width(); 187 m_widthSoFar += (*wordResult)->width();
159 return true; 188 return true;
160 } 189 }
161 190
162 ShapeCache* m_shapeCache; 191 ShapeCache* m_shapeCache;
163 const TextRun& m_textRun; 192 const TextRun& m_textRun;
164 const Font* m_font; 193 const Font* m_font;
165 float m_widthSoFar; // Used only when allowTabs() 194 float m_widthSoFar; // Used only when allowTabs()
166 unsigned m_startIndex : 30; 195 unsigned m_startIndex : 30;
167 unsigned m_wordResultCachable : 1; 196 unsigned m_wordResultCachable : 1;
168 unsigned m_shapeByWord : 1; 197 unsigned m_shapeByWord : 1;
169 }; 198 };
170 199
171 } // namespace blink 200 } // namespace blink
172 201
173 #endif // CachingWordShapeIterator_h 202 #endif // CachingWordShapeIterator_h
OLDNEW
« 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