OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) | 2 * Copyright (C) 1999 Lars Knoll (knoll@kde.org) |
3 * (C) 1999 Antti Koivisto (koivisto@kde.org) | 3 * (C) 1999 Antti Koivisto (koivisto@kde.org) |
4 * (C) 2000 Dirk Mueller (mueller@kde.org) | 4 * (C) 2000 Dirk Mueller (mueller@kde.org) |
5 * Copyright (C) 2003, 2006, 2010, 2011 Apple Inc. All rights reserved. | 5 * Copyright (C) 2003, 2006, 2010, 2011 Apple Inc. All rights reserved. |
6 * | 6 * |
7 * This library is free software; you can redistribute it and/or | 7 * This library is free software; you can redistribute it and/or |
8 * modify it under the terms of the GNU Library General Public | 8 * modify it under the terms of the GNU Library General Public |
9 * License as published by the Free Software Foundation; either | 9 * License as published by the Free Software Foundation; either |
10 * version 2 of the License, or (at your option) any later version. | 10 * version 2 of the License, or (at your option) any later version. |
(...skipping 60 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
71 0x212B, 0x213B, 0x2150, 0x2151, 0x2152, 0x217F, 0x2189, 0x2307, 0x2312, 0x23
CE, | 71 0x212B, 0x213B, 0x2150, 0x2151, 0x2152, 0x217F, 0x2189, 0x2307, 0x2312, 0x23
CE, |
72 0x2423, 0x25A0, 0x25A1, 0x25A2, 0x25AA, 0x25AB, 0x25B1, 0x25B2, 0x25B3, 0x25
B6, | 72 0x2423, 0x25A0, 0x25A1, 0x25A2, 0x25AA, 0x25AB, 0x25B1, 0x25B2, 0x25B3, 0x25
B6, |
73 0x25B7, 0x25BC, 0x25BD, 0x25C0, 0x25C1, 0x25C6, 0x25C7, 0x25C9, 0x25CB, 0x25
CC, | 73 0x25B7, 0x25BC, 0x25BD, 0x25C0, 0x25C1, 0x25C6, 0x25C7, 0x25C9, 0x25CB, 0x25
CC, |
74 0x25EF, 0x2605, 0x2606, 0x260E, 0x2616, 0x2617, 0x2640, 0x2642, 0x26A0, 0x26
BD, | 74 0x25EF, 0x2605, 0x2606, 0x260E, 0x2616, 0x2617, 0x2640, 0x2642, 0x26A0, 0x26
BD, |
75 0x26BE, 0x2713, 0x271A, 0x273F, 0x2740, 0x2756, 0x2B1A, 0xFE10, 0xFE11, 0xFE
12, | 75 0x26BE, 0x2713, 0x271A, 0x273F, 0x2740, 0x2756, 0x2B1A, 0xFE10, 0xFE11, 0xFE
12, |
76 0xFE19, 0xFF1D, | 76 0xFE19, 0xFF1D, |
77 // Emoji. | 77 // Emoji. |
78 0x1F100 | 78 0x1F100 |
79 }; | 79 }; |
80 | 80 |
81 Font::CodePath Font::s_codePath = Auto; | 81 CodePath Font::s_codePath = AutoPath; |
82 | 82 |
83 TypesettingFeatures Font::s_defaultTypesettingFeatures = 0; | 83 TypesettingFeatures Font::s_defaultTypesettingFeatures = 0; |
84 | 84 |
85 // =============================================================================
=============== | 85 // =============================================================================
=============== |
86 // Font Implementation (Cross-Platform Portion) | 86 // Font Implementation (Cross-Platform Portion) |
87 // =============================================================================
=============== | 87 // =============================================================================
=============== |
88 | 88 |
89 Font::Font() | 89 Font::Font() |
90 : m_letterSpacing(0) | 90 : m_letterSpacing(0) |
91 , m_wordSpacing(0) | 91 , m_wordSpacing(0) |
(...skipping 78 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
170 void Font::drawText(GraphicsContext* context, const TextRunPaintInfo& runInfo, c
onst FloatPoint& point, CustomFontNotReadyAction customFontNotReadyAction) const | 170 void Font::drawText(GraphicsContext* context, const TextRunPaintInfo& runInfo, c
onst FloatPoint& point, CustomFontNotReadyAction customFontNotReadyAction) const |
171 { | 171 { |
172 // Don't draw anything while we are using custom fonts that are in the proce
ss of loading, | 172 // Don't draw anything while we are using custom fonts that are in the proce
ss of loading, |
173 // except if the 'force' argument is set to true (in which case it will use
a fallback | 173 // except if the 'force' argument is set to true (in which case it will use
a fallback |
174 // font). | 174 // font). |
175 if (loadingCustomFonts() && customFontNotReadyAction == DoNotPaintIfFontNotR
eady) | 175 if (loadingCustomFonts() && customFontNotReadyAction == DoNotPaintIfFontNotR
eady) |
176 return; | 176 return; |
177 | 177 |
178 CodePath codePathToUse = codePath(runInfo.run); | 178 CodePath codePathToUse = codePath(runInfo.run); |
179 // FIXME: Use the fast code path once it handles partial runs with kerning a
nd ligatures. See http://webkit.org/b/100050 | 179 // FIXME: Use the fast code path once it handles partial runs with kerning a
nd ligatures. See http://webkit.org/b/100050 |
180 if (codePathToUse != Complex && typesettingFeatures() && (runInfo.from || ru
nInfo.to != runInfo.run.length())) | 180 if (codePathToUse != ComplexPath&& typesettingFeatures() && (runInfo.from ||
runInfo.to != runInfo.run.length())) |
181 codePathToUse = Complex; | 181 codePathToUse = ComplexPath; |
182 | 182 |
183 if (codePathToUse != Complex) | 183 if (codePathToUse != ComplexPath) |
184 return drawSimpleText(context, runInfo, point); | 184 return drawSimpleText(context, runInfo, point); |
185 | 185 |
186 return drawComplexText(context, runInfo, point); | 186 return drawComplexText(context, runInfo, point); |
187 } | 187 } |
188 | 188 |
189 void Font::drawEmphasisMarks(GraphicsContext* context, const TextRunPaintInfo& r
unInfo, const AtomicString& mark, const FloatPoint& point) const | 189 void Font::drawEmphasisMarks(GraphicsContext* context, const TextRunPaintInfo& r
unInfo, const AtomicString& mark, const FloatPoint& point) const |
190 { | 190 { |
191 if (loadingCustomFonts()) | 191 if (loadingCustomFonts()) |
192 return; | 192 return; |
193 | 193 |
194 CodePath codePathToUse = codePath(runInfo.run); | 194 CodePath codePathToUse = codePath(runInfo.run); |
195 // FIXME: Use the fast code path once it handles partial runs with kerning a
nd ligatures. See http://webkit.org/b/100050 | 195 // FIXME: Use the fast code path once it handles partial runs with kerning a
nd ligatures. See http://webkit.org/b/100050 |
196 if (codePathToUse != Complex && typesettingFeatures() && (runInfo.from || ru
nInfo.to != runInfo.run.length())) | 196 if (codePathToUse != ComplexPath && typesettingFeatures() && (runInfo.from |
| runInfo.to != runInfo.run.length())) |
197 codePathToUse = Complex; | 197 codePathToUse = ComplexPath; |
198 | 198 |
199 if (codePathToUse != Complex) | 199 if (codePathToUse != ComplexPath) |
200 drawEmphasisMarksForSimpleText(context, runInfo, mark, point); | 200 drawEmphasisMarksForSimpleText(context, runInfo, mark, point); |
201 else | 201 else |
202 drawEmphasisMarksForComplexText(context, runInfo, mark, point); | 202 drawEmphasisMarksForComplexText(context, runInfo, mark, point); |
203 } | 203 } |
204 | 204 |
205 float Font::width(const TextRun& run, HashSet<const SimpleFontData*>* fallbackFo
nts, GlyphOverflow* glyphOverflow) const | 205 float Font::width(const TextRun& run, HashSet<const SimpleFontData*>* fallbackFo
nts, GlyphOverflow* glyphOverflow) const |
206 { | 206 { |
207 CodePath codePathToUse = codePath(run); | 207 CodePath codePathToUse = codePath(run); |
208 if (codePathToUse != Complex) { | 208 if (codePathToUse != ComplexPath) { |
209 // The complex path is more restrictive about returning fallback fonts t
han the simple path, so we need an explicit test to make their behaviors match. | 209 // The complex path is more restrictive about returning fallback fonts t
han the simple path, so we need an explicit test to make their behaviors match. |
210 if (!canReturnFallbackFontsForComplexText()) | 210 if (!canReturnFallbackFontsForComplexText()) |
211 fallbackFonts = 0; | 211 fallbackFonts = 0; |
212 // The simple path can optimize the case where glyph overflow is not obs
ervable. | 212 // The simple path can optimize the case where glyph overflow is not obs
ervable. |
213 if (codePathToUse != SimpleWithGlyphOverflow && (glyphOverflow && !glyph
Overflow->computeBounds)) | 213 if (codePathToUse != SimpleWithGlyphOverflowPath && (glyphOverflow && !g
lyphOverflow->computeBounds)) |
214 glyphOverflow = 0; | 214 glyphOverflow = 0; |
215 } | 215 } |
216 | 216 |
217 bool hasKerningOrLigatures = typesettingFeatures() & (Kerning | Ligatures); | 217 bool hasKerningOrLigatures = typesettingFeatures() & (Kerning | Ligatures); |
218 bool hasWordSpacingOrLetterSpacing = wordSpacing() || letterSpacing(); | 218 bool hasWordSpacingOrLetterSpacing = wordSpacing() || letterSpacing(); |
219 float* cacheEntry = m_fontFallbackList->widthCache().add(run, std::numeric_l
imits<float>::quiet_NaN(), hasKerningOrLigatures, hasWordSpacingOrLetterSpacing,
glyphOverflow); | 219 float* cacheEntry = m_fontFallbackList->widthCache().add(run, std::numeric_l
imits<float>::quiet_NaN(), hasKerningOrLigatures, hasWordSpacingOrLetterSpacing,
glyphOverflow); |
220 if (cacheEntry && !std::isnan(*cacheEntry)) | 220 if (cacheEntry && !std::isnan(*cacheEntry)) |
221 return *cacheEntry; | 221 return *cacheEntry; |
222 | 222 |
223 float result; | 223 float result; |
224 if (codePathToUse == Complex) | 224 if (codePathToUse == ComplexPath) |
225 result = floatWidthForComplexText(run, fallbackFonts, glyphOverflow); | 225 result = floatWidthForComplexText(run, fallbackFonts, glyphOverflow); |
226 else | 226 else |
227 result = floatWidthForSimpleText(run, fallbackFonts, glyphOverflow); | 227 result = floatWidthForSimpleText(run, fallbackFonts, glyphOverflow); |
228 | 228 |
229 if (cacheEntry && (!fallbackFonts || fallbackFonts->isEmpty())) | 229 if (cacheEntry && (!fallbackFonts || fallbackFonts->isEmpty())) |
230 *cacheEntry = result; | 230 *cacheEntry = result; |
231 return result; | 231 return result; |
232 } | 232 } |
233 | 233 |
234 float Font::width(const TextRun& run, int& charsConsumed, String& glyphName) con
st | 234 float Font::width(const TextRun& run, int& charsConsumed, String& glyphName) con
st |
(...skipping 27 matching lines...) Expand all Loading... |
262 } | 262 } |
263 | 263 |
264 #endif | 264 #endif |
265 | 265 |
266 FloatRect Font::selectionRectForText(const TextRun& run, const FloatPoint& point
, int h, int from, int to) const | 266 FloatRect Font::selectionRectForText(const TextRun& run, const FloatPoint& point
, int h, int from, int to) const |
267 { | 267 { |
268 to = (to == -1 ? run.length() : to); | 268 to = (to == -1 ? run.length() : to); |
269 | 269 |
270 CodePath codePathToUse = codePath(run); | 270 CodePath codePathToUse = codePath(run); |
271 // FIXME: Use the fast code path once it handles partial runs with kerning a
nd ligatures. See http://webkit.org/b/100050 | 271 // FIXME: Use the fast code path once it handles partial runs with kerning a
nd ligatures. See http://webkit.org/b/100050 |
272 if (codePathToUse != Complex && typesettingFeatures() && (from || to != run.
length())) | 272 if (codePathToUse != ComplexPath && typesettingFeatures() && (from || to !=
run.length())) |
273 codePathToUse = Complex; | 273 codePathToUse = ComplexPath; |
274 | 274 |
275 if (codePathToUse != Complex) | 275 if (codePathToUse != ComplexPath) |
276 return selectionRectForSimpleText(run, point, h, from, to); | 276 return selectionRectForSimpleText(run, point, h, from, to); |
277 | 277 |
278 return selectionRectForComplexText(run, point, h, from, to); | 278 return selectionRectForComplexText(run, point, h, from, to); |
279 } | 279 } |
280 | 280 |
281 int Font::offsetForPosition(const TextRun& run, float x, bool includePartialGlyp
hs) const | 281 int Font::offsetForPosition(const TextRun& run, float x, bool includePartialGlyp
hs) const |
282 { | 282 { |
283 // FIXME: Use the fast code path once it handles partial runs with kerning a
nd ligatures. See http://webkit.org/b/100050 | 283 // FIXME: Use the fast code path once it handles partial runs with kerning a
nd ligatures. See http://webkit.org/b/100050 |
284 if (codePath(run) != Complex && !typesettingFeatures()) | 284 if (codePath(run) != ComplexPath && !typesettingFeatures()) |
285 return offsetForPositionForSimpleText(run, x, includePartialGlyphs); | 285 return offsetForPositionForSimpleText(run, x, includePartialGlyphs); |
286 | 286 |
287 return offsetForPositionForComplexText(run, x, includePartialGlyphs); | 287 return offsetForPositionForComplexText(run, x, includePartialGlyphs); |
288 } | 288 } |
289 | 289 |
290 template <typename CharacterType> | 290 template <typename CharacterType> |
291 static inline String normalizeSpacesInternal(const CharacterType* characters, un
signed length) | 291 static inline String normalizeSpacesInternal(const CharacterType* characters, un
signed length) |
292 { | 292 { |
293 StringBuilder normalized; | 293 StringBuilder normalized; |
294 normalized.reserveCapacity(length); | 294 normalized.reserveCapacity(length); |
(...skipping 25 matching lines...) Expand all Loading... |
320 bool Font::shouldUseSmoothing() | 320 bool Font::shouldUseSmoothing() |
321 { | 321 { |
322 return shouldUseFontSmoothing; | 322 return shouldUseFontSmoothing; |
323 } | 323 } |
324 | 324 |
325 void Font::setCodePath(CodePath p) | 325 void Font::setCodePath(CodePath p) |
326 { | 326 { |
327 s_codePath = p; | 327 s_codePath = p; |
328 } | 328 } |
329 | 329 |
330 Font::CodePath Font::codePath() | 330 CodePath Font::codePath() |
331 { | 331 { |
332 return s_codePath; | 332 return s_codePath; |
333 } | 333 } |
334 | 334 |
335 void Font::setDefaultTypesettingFeatures(TypesettingFeatures typesettingFeatures
) | 335 void Font::setDefaultTypesettingFeatures(TypesettingFeatures typesettingFeatures
) |
336 { | 336 { |
337 s_defaultTypesettingFeatures = typesettingFeatures; | 337 s_defaultTypesettingFeatures = typesettingFeatures; |
338 } | 338 } |
339 | 339 |
340 TypesettingFeatures Font::defaultTypesettingFeatures() | 340 TypesettingFeatures Font::defaultTypesettingFeatures() |
341 { | 341 { |
342 return s_defaultTypesettingFeatures; | 342 return s_defaultTypesettingFeatures; |
343 } | 343 } |
344 | 344 |
345 Font::CodePath Font::codePath(const TextRun& run) const | 345 CodePath Font::codePath(const TextRun& run) const |
346 { | 346 { |
347 if (s_codePath != Auto) | 347 if (s_codePath != AutoPath) |
348 return s_codePath; | 348 return s_codePath; |
349 | 349 |
350 #if ENABLE(SVG_FONTS) | 350 #if ENABLE(SVG_FONTS) |
351 if (run.renderingContext()) | 351 if (run.renderingContext()) |
352 return Simple; | 352 return SimplePath; |
353 #endif | 353 #endif |
354 | 354 |
355 if (m_fontDescription.featureSettings() && m_fontDescription.featureSettings
()->size() > 0) | 355 if (m_fontDescription.featureSettings() && m_fontDescription.featureSettings
()->size() > 0) |
356 return Complex; | 356 return ComplexPath; |
357 | 357 |
358 if (run.length() > 1 && !WidthIterator::supportsTypesettingFeatures(*this)) | 358 if (run.length() > 1 && !WidthIterator::supportsTypesettingFeatures(*this)) |
359 return Complex; | 359 return ComplexPath; |
360 | 360 |
361 if (!run.characterScanForCodePath()) | 361 if (!run.characterScanForCodePath()) |
362 return Simple; | 362 return SimplePath; |
363 | 363 |
364 if (run.is8Bit()) | 364 if (run.is8Bit()) |
365 return Simple; | 365 return SimplePath; |
366 | 366 |
367 // Start from 0 since drawing and highlighting also measure the characters b
efore run->from. | 367 // Start from 0 since drawing and highlighting also measure the characters b
efore run->from. |
368 return characterRangeCodePath(run.characters16(), run.length()); | 368 return characterRangeCodePath(run.characters16(), run.length()); |
369 } | 369 } |
370 | 370 |
371 static inline UChar keyExtractorUChar(const UChar* value) | 371 static inline UChar keyExtractorUChar(const UChar* value) |
372 { | 372 { |
373 return *value; | 373 return *value; |
374 } | 374 } |
375 | 375 |
376 static inline UChar32 keyExtractorUChar32(const UChar32* value) | 376 static inline UChar32 keyExtractorUChar32(const UChar32* value) |
377 { | 377 { |
378 return *value; | 378 return *value; |
379 } | 379 } |
380 | 380 |
381 Font::CodePath Font::characterRangeCodePath(const UChar* characters, unsigned le
n) | 381 CodePath Font::characterRangeCodePath(const UChar* characters, unsigned len) |
382 { | 382 { |
383 static const UChar complexCodePathRanges[] = { | 383 static const UChar complexCodePathRanges[] = { |
384 // U+02E5 through U+02E9 (Modifier Letters : Tone letters) | 384 // U+02E5 through U+02E9 (Modifier Letters : Tone letters) |
385 0x2E5, 0x2E9, | 385 0x2E5, 0x2E9, |
386 // U+0300 through U+036F Combining diacritical marks | 386 // U+0300 through U+036F Combining diacritical marks |
387 0x300, 0x36F, | 387 0x300, 0x36F, |
388 // U+0591 through U+05CF excluding U+05BE Hebrew combining marks, ... | 388 // U+0591 through U+05CF excluding U+05BE Hebrew combining marks, ... |
389 0x0591, 0x05BD, | 389 0x0591, 0x05BD, |
390 // ... Hebrew punctuation Paseq, Sof Pasuq and Nun Hafukha | 390 // ... Hebrew punctuation Paseq, Sof Pasuq and Nun Hafukha |
391 0x05BF, 0x05CF, | 391 0x05BF, 0x05CF, |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
423 0xA800, 0xABFF, | 423 0xA800, 0xABFF, |
424 // U+D7B0 through U+D7FF Hangul Jamo Ext. B | 424 // U+D7B0 through U+D7FF Hangul Jamo Ext. B |
425 0xD7B0, 0xD7FF, | 425 0xD7B0, 0xD7FF, |
426 // U+FE00 through U+FE0F Unicode variation selectors | 426 // U+FE00 through U+FE0F Unicode variation selectors |
427 0xFE00, 0xFE0F, | 427 0xFE00, 0xFE0F, |
428 // U+FE20 through U+FE2F Combining half marks | 428 // U+FE20 through U+FE2F Combining half marks |
429 0xFE20, 0xFE2F | 429 0xFE20, 0xFE2F |
430 }; | 430 }; |
431 static size_t complexCodePathRangesCount = WTF_ARRAY_LENGTH(complexCodePathR
anges); | 431 static size_t complexCodePathRangesCount = WTF_ARRAY_LENGTH(complexCodePathR
anges); |
432 | 432 |
433 CodePath result = Simple; | 433 CodePath result = SimplePath; |
434 for (unsigned i = 0; i < len; i++) { | 434 for (unsigned i = 0; i < len; i++) { |
435 const UChar c = characters[i]; | 435 const UChar c = characters[i]; |
436 | 436 |
437 // Shortcut for common case | 437 // Shortcut for common case |
438 if (c < 0x2E5) | 438 if (c < 0x2E5) |
439 continue; | 439 continue; |
440 | 440 |
441 // U+1E00 through U+2000 characters with diacritics and stacked diacriti
cs | 441 // U+1E00 through U+2000 characters with diacritics and stacked diacriti
cs |
442 if (c >= 0x1E00 && c <= 0x2000) { | 442 if (c >= 0x1E00 && c <= 0x2000) { |
443 result = SimpleWithGlyphOverflow; | 443 result = SimpleWithGlyphOverflowPath; |
444 continue; | 444 continue; |
445 } | 445 } |
446 | 446 |
447 // Surrogate pairs | 447 // Surrogate pairs |
448 if (c > 0xD7FF && c <= 0xDBFF) { | 448 if (c > 0xD7FF && c <= 0xDBFF) { |
449 if (i == len - 1) | 449 if (i == len - 1) |
450 continue; | 450 continue; |
451 | 451 |
452 UChar next = characters[++i]; | 452 UChar next = characters[++i]; |
453 if (!U16_IS_TRAIL(next)) | 453 if (!U16_IS_TRAIL(next)) |
454 continue; | 454 continue; |
455 | 455 |
456 UChar32 supplementaryCharacter = U16_GET_SUPPLEMENTARY(c, next); | 456 UChar32 supplementaryCharacter = U16_GET_SUPPLEMENTARY(c, next); |
457 | 457 |
458 if (supplementaryCharacter < 0x1F1E6) // U+1F1E6 through U+1F1FF Reg
ional Indicator Symbols | 458 if (supplementaryCharacter < 0x1F1E6) // U+1F1E6 through U+1F1FF Reg
ional Indicator Symbols |
459 continue; | 459 continue; |
460 if (supplementaryCharacter <= 0x1F1FF) | 460 if (supplementaryCharacter <= 0x1F1FF) |
461 return Complex; | 461 return ComplexPath; |
462 | 462 |
463 if (supplementaryCharacter < 0xE0100) // U+E0100 through U+E01EF Uni
code variation selectors. | 463 if (supplementaryCharacter < 0xE0100) // U+E0100 through U+E01EF Uni
code variation selectors. |
464 continue; | 464 continue; |
465 if (supplementaryCharacter <= 0xE01EF) | 465 if (supplementaryCharacter <= 0xE01EF) |
466 return Complex; | 466 return ComplexPath; |
467 | 467 |
468 // FIXME: Check for Brahmi (U+11000 block), Kaithi (U+11080 block) a
nd other complex scripts | 468 // FIXME: Check for Brahmi (U+11000 block), Kaithi (U+11080 block) a
nd other complex scripts |
469 // in plane 1 or higher. | 469 // in plane 1 or higher. |
470 | 470 |
471 continue; | 471 continue; |
472 } | 472 } |
473 | 473 |
474 // Search for other Complex cases | 474 // Search for other Complex cases |
475 UChar* boundingCharacter = approximateBinarySearch<UChar, UChar>( | 475 UChar* boundingCharacter = approximateBinarySearch<UChar, UChar>( |
476 (UChar*)complexCodePathRanges, complexCodePathRangesCount, c, keyExt
ractorUChar); | 476 (UChar*)complexCodePathRanges, complexCodePathRangesCount, c, keyExt
ractorUChar); |
477 // Exact matches are complex | 477 // Exact matches are complex |
478 if (*boundingCharacter == c) | 478 if (*boundingCharacter == c) |
479 return Complex; | 479 return ComplexPath; |
480 bool isEndOfRange = ((boundingCharacter - complexCodePathRanges) % 2); | 480 bool isEndOfRange = ((boundingCharacter - complexCodePathRanges) % 2); |
481 if (*boundingCharacter < c) { | 481 if (*boundingCharacter < c) { |
482 // Determine if we are in a range or out | 482 // Determine if we are in a range or out |
483 if (!isEndOfRange) | 483 if (!isEndOfRange) |
484 return Complex; | 484 return ComplexPath; |
485 continue; | 485 continue; |
486 } | 486 } |
487 ASSERT(*boundingCharacter > c); | 487 ASSERT(*boundingCharacter > c); |
488 // Determine if we are in a range or out - opposite condition to above | 488 // Determine if we are in a range or out - opposite condition to above |
489 if (isEndOfRange) | 489 if (isEndOfRange) |
490 return Complex; | 490 return ComplexPath; |
491 } | 491 } |
492 | 492 |
493 return result; | 493 return result; |
494 } | 494 } |
495 | 495 |
496 bool Font::isCJKIdeograph(UChar32 c) | 496 bool Font::isCJKIdeograph(UChar32 c) |
497 { | 497 { |
498 static const UChar32 cjkIdeographRanges[] = { | 498 static const UChar32 cjkIdeographRanges[] = { |
499 // CJK Radicals Supplement and Kangxi Radicals. | 499 // CJK Radicals Supplement and Kangxi Radicals. |
500 0x2E80, 0x2FDF, | 500 0x2E80, 0x2FDF, |
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
688 } | 688 } |
689 | 689 |
690 void Font::willUseFontData() const | 690 void Font::willUseFontData() const |
691 { | 691 { |
692 const FontFamily& family = fontDescription().family(); | 692 const FontFamily& family = fontDescription().family(); |
693 if (m_fontFallbackList && m_fontFallbackList->fontSelector() && !family.fami
lyIsEmpty()) | 693 if (m_fontFallbackList && m_fontFallbackList->fontSelector() && !family.fami
lyIsEmpty()) |
694 m_fontFallbackList->fontSelector()->willUseFontData(fontDescription(), f
amily.family()); | 694 m_fontFallbackList->fontSelector()->willUseFontData(fontDescription(), f
amily.family()); |
695 } | 695 } |
696 | 696 |
697 } | 697 } |
OLD | NEW |