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

Side by Side Diff: third_party/WebKit/Source/platform/fonts/win/FontFallbackWin.cpp

Issue 2192703002: More LayoutLocale refactor with additional Chinese support (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Comment updated as per drott review Created 4 years, 4 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) 2006, 2007, 2008, 2009, 2010, 2012 Google Inc. All rights reser ved. 2 * Copyright (c) 2006, 2007, 2008, 2009, 2010, 2012 Google Inc. All rights reser ved.
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 are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 12 matching lines...) Expand all
23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 23 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 24 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 25 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 26 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 28 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 */ 29 */
30 30
31 #include "platform/fonts/win/FontFallbackWin.h" 31 #include "platform/fonts/win/FontFallbackWin.h"
32 32
33 #include "platform/fonts/AcceptLanguagesResolver.h"
34 #include "platform/fonts/FontCache.h" 33 #include "platform/fonts/FontCache.h"
35 #include "SkFontMgr.h" 34 #include "SkFontMgr.h"
36 #include "SkTypeface.h" 35 #include "SkTypeface.h"
37 #include "wtf/HashMap.h" 36 #include "wtf/HashMap.h"
38 #include "wtf/StringExtras.h" 37 #include "wtf/StringExtras.h"
39 #include "wtf/text/StringHash.h" 38 #include "wtf/text/StringHash.h"
40 #include "wtf/text/WTFString.h" 39 #include "wtf/text/WTFString.h"
41 #include <limits> 40 #include <limits>
42 #include <unicode/uchar.h> 41 #include <unicode/uchar.h>
43 42
(...skipping 255 matching lines...) Expand 10 before | Expand all | Expand 10 after
299 const UChar** familyPtr = scriptToFontFamilies[i].families; 298 const UChar** familyPtr = scriptToFontFamilies[i].families;
300 while (*familyPtr) { 299 while (*familyPtr) {
301 if (isFontPresent(*familyPtr, fontManager)) { 300 if (isFontPresent(*familyPtr, fontManager)) {
302 scriptFontMap[script] = *familyPtr; 301 scriptFontMap[script] = *familyPtr;
303 break; 302 break;
304 } 303 }
305 ++familyPtr; 304 ++familyPtr;
306 } 305 }
307 } 306 }
308 307
309 // Initialize the locale-dependent mapping. 308 // Initialize the locale-dependent mapping from system locale.
310 // Since Chrome synchronizes the ICU default locale with its UI locale, 309 UScriptCode hanScript = LayoutLocale::getSystem().scriptForHan();
311 // this ICU locale tells the current UI locale of Chrome. 310 if (const UChar* localeFamily = scriptFontMap[hanScript])
312 UScriptCode hanScript = scriptCodeForHanFromLocale(
313 icu::Locale::getDefault().getName(), '_');
314 // For other locales, use the simplified Chinese font for Han.
315 const UChar* localeFamily = scriptFontMap[hanScript == USCRIPT_COMMON
316 ? USCRIPT_SIMPLIFIED_HAN : hanScript];
317 if (localeFamily)
318 scriptFontMap[USCRIPT_HAN] = localeFamily; 311 scriptFontMap[USCRIPT_HAN] = localeFamily;
319 } 312 }
320 313
321 static UScriptCode scriptForHan(const LayoutLocale& contentLocale)
322 {
323 UScriptCode script = contentLocale.scriptForHan();
324 if (script != USCRIPT_HAN)
325 return script;
326 script = AcceptLanguagesResolver::preferredHanScript();
327 if (script != USCRIPT_COMMON)
328 return script;
329 // Use UI locale. See initializeScriptFontMap().
330 return USCRIPT_HAN;
331 }
332
333 // There are a lot of characters in USCRIPT_COMMON that can be covered 314 // There are a lot of characters in USCRIPT_COMMON that can be covered
334 // by fonts for scripts closely related to them. See 315 // by fonts for scripts closely related to them. See
335 // http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Script=Common:] 316 // http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Script=Common:]
336 // FIXME: make this more efficient with a wider coverage 317 // FIXME: make this more efficient with a wider coverage
337 UScriptCode getScriptBasedOnUnicodeBlock(int ucs4) 318 UScriptCode getScriptBasedOnUnicodeBlock(int ucs4)
338 { 319 {
339 UBlockCode block = ublock_getCode(ucs4); 320 UBlockCode block = ublock_getCode(ucs4);
340 switch (block) { 321 switch (block) {
341 case UBLOCK_CJK_SYMBOLS_AND_PUNCTUATION: 322 case UBLOCK_CJK_SYMBOLS_AND_PUNCTUATION:
342 return USCRIPT_HAN; 323 return USCRIPT_HAN;
(...skipping 130 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 // FIXME: 454 // FIXME:
474 // - Handle 'Inherited', 'Common' and 'Unknown' 455 // - Handle 'Inherited', 'Common' and 'Unknown'
475 // (see http://www.unicode.org/reports/tr24/#Usage_Model ) 456 // (see http://www.unicode.org/reports/tr24/#Usage_Model )
476 // For 'Inherited' and 'Common', perhaps we need to 457 // For 'Inherited' and 'Common', perhaps we need to
477 // accept another parameter indicating the previous family 458 // accept another parameter indicating the previous family
478 // and just return it. 459 // and just return it.
479 // - All the characters (or characters up to the point a single 460 // - All the characters (or characters up to the point a single
480 // font can cover) need to be taken into account 461 // font can cover) need to be taken into account
481 const UChar* getFallbackFamily(UChar32 character, 462 const UChar* getFallbackFamily(UChar32 character,
482 FontDescription::GenericFamilyType generic, 463 FontDescription::GenericFamilyType generic,
483 const LayoutLocale& contentLocale, 464 const LayoutLocale* contentLocale,
484 UScriptCode* scriptChecked, 465 UScriptCode* scriptChecked,
485 FontFallbackPriority fallbackPriority, 466 FontFallbackPriority fallbackPriority,
486 SkFontMgr* fontManager) 467 SkFontMgr* fontManager)
487 { 468 {
488 ASSERT(character); 469 ASSERT(character);
489 ASSERT(fontManager); 470 ASSERT(fontManager);
490 UBlockCode block = fallbackPriority == FontFallbackPriority::EmojiEmoji ? 471 UBlockCode block = fallbackPriority == FontFallbackPriority::EmojiEmoji ?
491 UBLOCK_EMOTICONS : ublock_getCode(character); 472 UBLOCK_EMOTICONS : ublock_getCode(character);
492 const UChar* family = getFontBasedOnUnicodeBlock(block, fontManager); 473 const UChar* family = getFontBasedOnUnicodeBlock(block, fontManager);
493 if (family) { 474 if (family) {
494 if (scriptChecked) 475 if (scriptChecked)
495 *scriptChecked = USCRIPT_INVALID_CODE; 476 *scriptChecked = USCRIPT_INVALID_CODE;
496 return family; 477 return family;
497 } 478 }
498 479
499 UScriptCode script = getScript(character); 480 UScriptCode script = getScript(character);
500 481
501 // For the full-width ASCII characters (U+FF00 - U+FF5E), use the font for 482 // For the full-width ASCII characters (U+FF00 - U+FF5E), use the font for
502 // Han (determined in a locale-dependent way above). Full-width ASCII 483 // Han (determined in a locale-dependent way above). Full-width ASCII
503 // characters are rather widely used in Japanese and Chinese documents and 484 // characters are rather widely used in Japanese and Chinese documents and
504 // they're fully covered by Chinese, Japanese and Korean fonts. 485 // they're fully covered by Chinese, Japanese and Korean fonts.
505 if (0xFF00 < character && character < 0xFF5F) 486 if (0xFF00 < character && character < 0xFF5F)
506 script = USCRIPT_HAN; 487 script = USCRIPT_HAN;
507 488
508 if (script == USCRIPT_COMMON) 489 if (script == USCRIPT_COMMON)
509 script = getScriptBasedOnUnicodeBlock(character); 490 script = getScriptBasedOnUnicodeBlock(character);
510 491
511 // For unified-Han scripts, try the lang attribute, system, or 492 // For unified-Han scripts, try the lang attribute, system, or
512 // accept-languages. 493 // accept-languages.
513 if (script == USCRIPT_HAN) 494 if (script == USCRIPT_HAN) {
514 script = scriptForHan(contentLocale); 495 if (const LayoutLocale* localeForHan = LayoutLocale::localeForHan(conten tLocale))
496 script = localeForHan->scriptForHan();
497 // If still unknown, USCRIPT_HAN uses UI locale.
498 // See initializeScriptFontMap().
499 }
515 500
516 family = getFontFamilyForScript(script, generic, fontManager); 501 family = getFontFamilyForScript(script, generic, fontManager);
517 // Another lame work-around to cover non-BMP characters. 502 // Another lame work-around to cover non-BMP characters.
518 // If the font family for script is not found or the character is 503 // If the font family for script is not found or the character is
519 // not in BMP (> U+FFFF), we resort to the hard-coded list of 504 // not in BMP (> U+FFFF), we resort to the hard-coded list of
520 // fallback fonts for now. 505 // fallback fonts for now.
521 if (!family || character > 0xFFFF) { 506 if (!family || character > 0xFFFF) {
522 int plane = character >> 16; 507 int plane = character >> 16;
523 switch (plane) { 508 switch (plane) {
524 case 1: 509 case 1:
(...skipping 14 matching lines...) Expand all
539 family = L"lucida sans unicode"; 524 family = L"lucida sans unicode";
540 } 525 }
541 } 526 }
542 527
543 if (scriptChecked) 528 if (scriptChecked)
544 *scriptChecked = script; 529 *scriptChecked = script;
545 return family; 530 return family;
546 } 531 }
547 532
548 } // namespace blink 533 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698