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

Side by Side Diff: Source/platform/fonts/Font.cpp

Issue 116423007: Moving Text Simple/Complex Path prefix from Font.cpp to new File (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 12 months 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
OLDNEW
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
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
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
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
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
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
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 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698