OLD | NEW |
1 /* | 1 /* |
2 * Copyright (c) 2012 Google Inc. All rights reserved. | 2 * Copyright (c) 2012 Google Inc. All rights reserved. |
3 * Copyright (C) 2013 BlackBerry Limited. All rights reserved. | 3 * Copyright (C) 2013 BlackBerry Limited. All rights reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions are | 6 * modification, are permitted provided that the following conditions are |
7 * met: | 7 * met: |
8 * | 8 * |
9 * * Redistributions of source code must retain the above copyright | 9 * * Redistributions of source code must retain the above copyright |
10 * notice, this list of conditions and the following disclaimer. | 10 * notice, this list of conditions and the following disclaimer. |
(...skipping 197 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
208 { | 208 { |
209 DEFINE_STATIC_LOCAL(HarfBuzzRunCache, globalHarfBuzzRunCache, ()); | 209 DEFINE_STATIC_LOCAL(HarfBuzzRunCache, globalHarfBuzzRunCache, ()); |
210 return globalHarfBuzzRunCache; | 210 return globalHarfBuzzRunCache; |
211 } | 211 } |
212 | 212 |
213 static inline float harfBuzzPositionToFloat(hb_position_t value) | 213 static inline float harfBuzzPositionToFloat(hb_position_t value) |
214 { | 214 { |
215 return static_cast<float>(value) / (1 << 16); | 215 return static_cast<float>(value) / (1 << 16); |
216 } | 216 } |
217 | 217 |
218 static inline unsigned countGraphemesInCluster(const UChar* normalizedBuffer, un
signed normalizedBufferLength, uint16_t startIndex, uint16_t endIndex) | |
219 { | |
220 if (startIndex > endIndex) { | |
221 uint16_t tempIndex = startIndex; | |
222 startIndex = endIndex; | |
223 endIndex = tempIndex; | |
224 } | |
225 uint16_t length = endIndex - startIndex; | |
226 ASSERT(static_cast<unsigned>(startIndex + length) <= normalizedBufferLength)
; | |
227 TextBreakIterator* cursorPosIterator = cursorMovementIterator(&normalizedBuf
fer[startIndex], length); | |
228 | |
229 int cursorPos = cursorPosIterator->current(); | |
230 int numGraphemes = -1; | |
231 while (0 <= cursorPos) { | |
232 cursorPos = cursorPosIterator->next(); | |
233 numGraphemes++; | |
234 } | |
235 return numGraphemes < 0 ? 0 : numGraphemes; | |
236 } | |
237 | |
238 inline HarfBuzzShaper::HarfBuzzRun::HarfBuzzRun(const SimpleFontData* fontData,
unsigned startIndex, unsigned numCharacters, hb_direction_t direction, hb_script
_t script) | 218 inline HarfBuzzShaper::HarfBuzzRun::HarfBuzzRun(const SimpleFontData* fontData,
unsigned startIndex, unsigned numCharacters, hb_direction_t direction, hb_script
_t script) |
239 : m_fontData(fontData) | 219 : m_fontData(fontData) |
240 , m_startIndex(startIndex) | 220 , m_startIndex(startIndex) |
241 , m_numCharacters(numCharacters) | 221 , m_numCharacters(numCharacters) |
242 , m_numGlyphs(0) | 222 , m_numGlyphs(0) |
243 , m_direction(direction) | 223 , m_direction(direction) |
244 , m_script(script) | 224 , m_script(script) |
245 , m_width(0) | 225 , m_width(0) |
246 { | 226 { |
247 } | 227 } |
(...skipping 821 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1069 | 1049 |
1070 clusterAdvance += glyphData.advance; | 1050 clusterAdvance += glyphData.advance; |
1071 | 1051 |
1072 if (isClusterEnd) { | 1052 if (isClusterEnd) { |
1073 uint16_t clusterEnd; | 1053 uint16_t clusterEnd; |
1074 if (m_run.rtl()) | 1054 if (m_run.rtl()) |
1075 clusterEnd = currentCharacterIndex; | 1055 clusterEnd = currentCharacterIndex; |
1076 else | 1056 else |
1077 clusterEnd = isRunEnd ? currentRun->startIndex() + currentRun->n
umCharacters() : currentRun->glyphToCharacterIndex(i + 1); | 1057 clusterEnd = isRunEnd ? currentRun->startIndex() + currentRun->n
umCharacters() : currentRun->glyphToCharacterIndex(i + 1); |
1078 | 1058 |
1079 graphemesInCluster = countGraphemesInCluster(m_normalizedBuffer.get(
), m_normalizedBufferLength, clusterStart, clusterEnd); | 1059 graphemesInCluster = countCharactersAndGraphemesInCluster(m_normaliz
edBuffer.get(), m_normalizedBufferLength, clusterStart, clusterEnd).graphemes; |
1080 if (!graphemesInCluster || !clusterAdvance) | 1060 if (!graphemesInCluster || !clusterAdvance) |
1081 continue; | 1061 continue; |
1082 | 1062 |
1083 float glyphAdvanceX = clusterAdvance / graphemesInCluster; | 1063 float glyphAdvanceX = clusterAdvance / graphemesInCluster; |
1084 for (unsigned j = 0; j < graphemesInCluster; ++j) { | 1064 for (unsigned j = 0; j < graphemesInCluster; ++j) { |
1085 // Do not put emphasis marks on space, separator, and control ch
aracters. | 1065 // Do not put emphasis marks on space, separator, and control ch
aracters. |
1086 if (Character::canReceiveTextEmphasis(m_run[currentCharacterInde
x])) | 1066 if (Character::canReceiveTextEmphasis(m_run[currentCharacterInde
x])) |
1087 addEmphasisMark(glyphBuffer, advanceSoFar + glyphAdvanceX /
2); | 1067 addEmphasisMark(glyphBuffer, advanceSoFar + glyphAdvanceX /
2); |
1088 | 1068 |
1089 advanceSoFar += glyphAdvanceX; | 1069 advanceSoFar += glyphAdvanceX; |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1191 // possibly invalid from, to arguments. | 1171 // possibly invalid from, to arguments. |
1192 if (!foundToX && !foundFromX) | 1172 if (!foundToX && !foundFromX) |
1193 fromX = toX = 0; | 1173 fromX = toX = 0; |
1194 | 1174 |
1195 if (fromX < toX) | 1175 if (fromX < toX) |
1196 return FloatRect(point.x() + fromX, point.y(), toX - fromX, height); | 1176 return FloatRect(point.x() + fromX, point.y(), toX - fromX, height); |
1197 return FloatRect(point.x() + toX, point.y(), fromX - toX, height); | 1177 return FloatRect(point.x() + toX, point.y(), fromX - toX, height); |
1198 } | 1178 } |
1199 | 1179 |
1200 } // namespace blink | 1180 } // namespace blink |
OLD | NEW |