Index: Source/platform/fonts/FontFallbackWin.cpp |
diff --git a/Source/platform/fonts/FontFallbackWin.cpp b/Source/platform/fonts/FontFallbackWin.cpp |
deleted file mode 100644 |
index 8173ab36c15fc5659b64b5e41088b48c8717762b..0000000000000000000000000000000000000000 |
--- a/Source/platform/fonts/FontFallbackWin.cpp |
+++ /dev/null |
@@ -1,348 +0,0 @@ |
-/* |
- * Copyright (c) 2006, 2007, 2008, 2009, 2010, 2012 Google Inc. All rights reserved. |
- * |
- * Redistribution and use in source and binary forms, with or without |
- * modification, are permitted provided that the following conditions are |
- * met: |
- * |
- * * Redistributions of source code must retain the above copyright |
- * notice, this list of conditions and the following disclaimer. |
- * * Redistributions in binary form must reproduce the above |
- * copyright notice, this list of conditions and the following disclaimer |
- * in the documentation and/or other materials provided with the |
- * distribution. |
- * * Neither the name of Google Inc. nor the names of its |
- * contributors may be used to endorse or promote products derived from |
- * this software without specific prior written permission. |
- * |
- * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
- * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
- * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
- * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
- * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
- * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
- * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
- * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
- * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
- * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
- * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
- */ |
- |
-#include "config.h" |
-#include "platform/fonts/FontFallbackWin.h" |
- |
-#include "platform/win/HWndDC.h" |
-#include "wtf/HashMap.h" |
-#include "wtf/text/StringHash.h" |
-#include "wtf/text/WTFString.h" |
-#include <limits> |
-#include <unicode/locid.h> |
-#include <unicode/uchar.h> |
- |
-namespace WebCore { |
- |
-namespace { |
- |
-bool isFontPresent(const UChar* fontName) |
-{ |
- HFONT hfont = CreateFont(12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, fontName); |
- if (!hfont) |
- return false; |
- HWndDC dc(0); |
- HGDIOBJ oldFont = static_cast<HFONT>(SelectObject(dc, hfont)); |
- WCHAR actualFontName[LF_FACESIZE]; |
- GetTextFace(dc, LF_FACESIZE, actualFontName); |
- actualFontName[LF_FACESIZE - 1] = 0; |
- SelectObject(dc, oldFont); |
- DeleteObject(hfont); |
- // We don't have to worry about East Asian fonts with locale-dependent |
- // names here for now. |
- // FIXME: Why not? |
- return !wcscmp(fontName, actualFontName); |
-} |
- |
-// A simple mapping from UScriptCode to family name. This is a sparse array, |
-// which works well since the range of UScriptCode values is small. |
-typedef const UChar* ScriptToFontMap[USCRIPT_CODE_LIMIT]; |
- |
-void initializeScriptFontMap(ScriptToFontMap& scriptFontMap) |
-{ |
- struct FontMap { |
- UScriptCode script; |
- const UChar* family; |
- }; |
- |
- static const FontMap fontMap[] = { |
- {USCRIPT_LATIN, L"times new roman"}, |
- {USCRIPT_GREEK, L"times new roman"}, |
- {USCRIPT_CYRILLIC, L"times new roman"}, |
- // FIXME: Consider trying new Vista fonts before XP fonts for CJK. |
- // Some Vista users do want to use Vista cleartype CJK fonts. If we |
- // did, the results of tests with CJK characters would have to be |
- // regenerated for Vista. |
- {USCRIPT_SIMPLIFIED_HAN, L"simsun"}, |
- {USCRIPT_TRADITIONAL_HAN, L"pmingliu"}, |
- {USCRIPT_HIRAGANA, L"ms pgothic"}, |
- {USCRIPT_KATAKANA, L"ms pgothic"}, |
- {USCRIPT_KATAKANA_OR_HIRAGANA, L"ms pgothic"}, |
- {USCRIPT_HANGUL, L"gulim"}, |
- {USCRIPT_THAI, L"tahoma"}, |
- {USCRIPT_HEBREW, L"david"}, |
- {USCRIPT_ARABIC, L"tahoma"}, |
- {USCRIPT_DEVANAGARI, L"mangal"}, |
- {USCRIPT_BENGALI, L"vrinda"}, |
- {USCRIPT_GURMUKHI, L"raavi"}, |
- {USCRIPT_GUJARATI, L"shruti"}, |
- {USCRIPT_TAMIL, L"latha"}, |
- {USCRIPT_TELUGU, L"gautami"}, |
- {USCRIPT_KANNADA, L"tunga"}, |
- {USCRIPT_GEORGIAN, L"sylfaen"}, |
- {USCRIPT_ARMENIAN, L"sylfaen"}, |
- {USCRIPT_THAANA, L"mv boli"}, |
- {USCRIPT_CANADIAN_ABORIGINAL, L"euphemia"}, |
- {USCRIPT_CHEROKEE, L"plantagenet cherokee"}, |
- {USCRIPT_MONGOLIAN, L"mongolian balti"}, |
- // For USCRIPT_COMMON, we map blocks to scripts when |
- // that makes sense. |
- }; |
- |
- struct ScriptToFontFamilies { |
- UScriptCode script; |
- const UChar** families; |
- }; |
- |
- // Kartika on Vista or earlier lacks the support for Chillu |
- // letters added to Unicode 5.1. |
- // Try AnjaliOldLipi (a very widely used Malaylalam font with the full |
- // Unicode 5.x support) before falling back to Kartika. |
- static const UChar* malayalamFonts[] = {L"AnjaliOldLipi", L"Lohit Malayalam", L"Kartika", L"Rachana", 0}; |
- // Try Khmer OS before Vista fonts because 'Khmer OS' goes along better |
- // with Latin and looks better/larger for the same size. |
- static const UChar* khmerFonts[] = {L"Khmer OS", L"MoolBoran", L"DaunPenh", L"Code2000", 0}; |
- // For the following 6 scripts, two or fonts are listed. The fonts in |
- // the 1st slot are not available on Windows XP. To support these |
- // scripts on XP, listed in the rest of slots are widely used |
- // fonts. |
- static const UChar* ethiopicFonts[] = {L"Nyala", L"Abyssinica SIL", L"Ethiopia Jiret", L"Visual Geez Unicode", L"GF Zemen Unicode", 0}; |
- static const UChar* oriyaFonts[] = {L"Kalinga", L"ori1Uni", L"Lohit Oriya", 0}; |
- static const UChar* laoFonts[] = {L"DokChampa", L"Saysettha OT", L"Phetsarath OT", L"Code2000", 0}; |
- static const UChar* tibetanFonts[] = {L"Microsoft Himalaya", L"Jomolhari", L"Tibetan Machine Uni", 0}; |
- static const UChar* sinhalaFonts[] = {L"Iskoola Pota", L"AksharUnicode", 0}; |
- static const UChar* yiFonts[] = {L"Microsoft Yi Balti", L"Nuosu SIL", L"Code2000", 0}; |
- // http://www.bethmardutho.org/support/meltho/download/index.php |
- static const UChar* syriacFonts[] = {L"Estrangelo Edessa", L"Estrangelo Nisibin", L"Code2000", 0}; |
- // No Myanmar/Burmese font is shipped with Windows, yet. Try a few |
- // widely available/used ones that supports Unicode 5.1 or later. |
- static const UChar* myanmarFonts[] = {L"Padauk", L"Parabaik", L"Myanmar3", L"Code2000", 0}; |
- |
- static const ScriptToFontFamilies scriptToFontFamilies[] = { |
- {USCRIPT_MALAYALAM, malayalamFonts}, |
- {USCRIPT_KHMER, khmerFonts}, |
- {USCRIPT_ETHIOPIC, ethiopicFonts}, |
- {USCRIPT_ORIYA, oriyaFonts}, |
- {USCRIPT_LAO, laoFonts}, |
- {USCRIPT_TIBETAN, tibetanFonts}, |
- {USCRIPT_SINHALA, sinhalaFonts}, |
- {USCRIPT_YI, yiFonts}, |
- {USCRIPT_SYRIAC, syriacFonts}, |
- {USCRIPT_MYANMAR, myanmarFonts}, |
- }; |
- |
- for (size_t i = 0; i < WTF_ARRAY_LENGTH(fontMap); ++i) |
- scriptFontMap[fontMap[i].script] = fontMap[i].family; |
- |
- // FIXME: Instead of scanning the hard-coded list, we have to |
- // use EnumFont* to 'inspect' fonts to pick up fonts covering scripts |
- // when it's possible (e.g. using OS/2 table). If we do that, this |
- // had better be pulled out of here. |
- for (size_t i = 0; i < WTF_ARRAY_LENGTH(scriptToFontFamilies); ++i) { |
- UScriptCode script = scriptToFontFamilies[i].script; |
- scriptFontMap[script] = 0; |
- const UChar** familyPtr = scriptToFontFamilies[i].families; |
- while (*familyPtr) { |
- if (isFontPresent(*familyPtr)) { |
- scriptFontMap[script] = *familyPtr; |
- break; |
- } |
- ++familyPtr; |
- } |
- } |
- |
- // Initialize the locale-dependent mapping. |
- // Since Chrome synchronizes the ICU default locale with its UI locale, |
- // this ICU locale tells the current UI locale of Chrome. |
- icu::Locale locale = icu::Locale::getDefault(); |
- const UChar* localeFamily = 0; |
- if (locale == icu::Locale::getJapanese()) { |
- localeFamily = scriptFontMap[USCRIPT_HIRAGANA]; |
- } else if (locale == icu::Locale::getKorean()) { |
- localeFamily = scriptFontMap[USCRIPT_HANGUL]; |
- } else if (locale == icu::Locale::getTraditionalChinese()) { |
- localeFamily = scriptFontMap[USCRIPT_TRADITIONAL_HAN]; |
- } else { |
- // For other locales, use the simplified Chinese font for Han. |
- localeFamily = scriptFontMap[USCRIPT_SIMPLIFIED_HAN]; |
- } |
- if (localeFamily) |
- scriptFontMap[USCRIPT_HAN] = localeFamily; |
-} |
- |
-// There are a lot of characters in USCRIPT_COMMON that can be covered |
-// by fonts for scripts closely related to them. See |
-// http://unicode.org/cldr/utility/list-unicodeset.jsp?a=[:Script=Common:] |
-// FIXME: make this more efficient with a wider coverage |
-UScriptCode getScriptBasedOnUnicodeBlock(int ucs4) |
-{ |
- UBlockCode block = ublock_getCode(ucs4); |
- switch (block) { |
- case UBLOCK_CJK_SYMBOLS_AND_PUNCTUATION: |
- return USCRIPT_HAN; |
- case UBLOCK_HIRAGANA: |
- case UBLOCK_KATAKANA: |
- return USCRIPT_HIRAGANA; |
- case UBLOCK_ARABIC: |
- return USCRIPT_ARABIC; |
- case UBLOCK_THAI: |
- return USCRIPT_THAI; |
- case UBLOCK_GREEK: |
- return USCRIPT_GREEK; |
- case UBLOCK_DEVANAGARI: |
- // For Danda and Double Danda (U+0964, U+0965), use a Devanagari |
- // font for now although they're used by other scripts as well. |
- // Without a context, we can't do any better. |
- return USCRIPT_DEVANAGARI; |
- case UBLOCK_ARMENIAN: |
- return USCRIPT_ARMENIAN; |
- case UBLOCK_GEORGIAN: |
- return USCRIPT_GEORGIAN; |
- case UBLOCK_KANNADA: |
- return USCRIPT_KANNADA; |
- default: |
- return USCRIPT_COMMON; |
- } |
-} |
- |
-UScriptCode getScript(int ucs4) |
-{ |
- UErrorCode err = U_ZERO_ERROR; |
- UScriptCode script = uscript_getScript(ucs4, &err); |
- // If script is invalid, common or inherited or there's an error, |
- // infer a script based on the unicode block of a character. |
- if (script <= USCRIPT_INHERITED || U_FAILURE(err)) |
- script = getScriptBasedOnUnicodeBlock(ucs4); |
- return script; |
-} |
- |
-} // namespace |
- |
-// FIXME: this is font fallback code version 0.1 |
-// - Cover all the scripts |
-// - Get the default font for each script/generic family from the |
-// preference instead of hardcoding in the source. |
-// (at least, read values from the registry for IE font settings). |
-// - Support generic families (from FontDescription) |
-// - If the default font for a script is not available, |
-// try some more fonts known to support it. Finally, we can |
-// use EnumFontFamilies or similar APIs to come up with a list of |
-// fonts supporting the script and cache the result. |
-// - Consider using UnicodeSet (or UnicodeMap) converted from |
-// GLYPHSET (BMP) or directly read from truetype cmap tables to |
-// keep track of which character is supported by which font |
-// - Update script_font_cache in response to WM_FONTCHANGE |
- |
-const UChar* getFontFamilyForScript(UScriptCode script, |
- FontDescription::GenericFamilyType generic) |
-{ |
- static ScriptToFontMap scriptFontMap; |
- static bool initialized = false; |
- if (!initialized) { |
- initializeScriptFontMap(scriptFontMap); |
- initialized = true; |
- } |
- if (script == USCRIPT_INVALID_CODE) |
- return 0; |
- ASSERT(script < USCRIPT_CODE_LIMIT); |
- return scriptFontMap[script]; |
-} |
- |
-// FIXME: |
-// - Handle 'Inherited', 'Common' and 'Unknown' |
-// (see http://www.unicode.org/reports/tr24/#Usage_Model ) |
-// For 'Inherited' and 'Common', perhaps we need to |
-// accept another parameter indicating the previous family |
-// and just return it. |
-// - All the characters (or characters up to the point a single |
-// font can cover) need to be taken into account |
-const UChar* getFallbackFamily(UChar32 character, |
- FontDescription::GenericFamilyType generic, |
- UScriptCode* scriptChecked) |
-{ |
- ASSERT(character); |
- UScriptCode script = getScript(character); |
- |
- // For the full-width ASCII characters (U+FF00 - U+FF5E), use the font for |
- // Han (determined in a locale-dependent way above). Full-width ASCII |
- // characters are rather widely used in Japanese and Chinese documents and |
- // they're fully covered by Chinese, Japanese and Korean fonts. |
- if (0xFF00 < character && character < 0xFF5F) |
- script = USCRIPT_HAN; |
- |
- if (script == USCRIPT_COMMON) |
- script = getScriptBasedOnUnicodeBlock(character); |
- |
- const UChar* family = getFontFamilyForScript(script, generic); |
- // Another lame work-around to cover non-BMP characters. |
- // If the font family for script is not found or the character is |
- // not in BMP (> U+FFFF), we resort to the hard-coded list of |
- // fallback fonts for now. |
- if (!family || character > 0xFFFF) { |
- int plane = character >> 16; |
- switch (plane) { |
- case 1: |
- family = L"code2001"; |
- break; |
- case 2: |
- // Use a Traditional Chinese ExtB font if in Traditional Chinese locale. |
- // Otherwise, use a Simplified Chinese ExtB font. Windows Japanese |
- // fonts do support a small subset of ExtB (that are included in JIS X 0213), |
- // but its coverage is rather sparse. |
- // Eventually, this should be controlled by lang/xml:lang. |
- if (icu::Locale::getDefault() == icu::Locale::getTraditionalChinese()) |
- family = L"pmingliu-extb"; |
- else |
- family = L"simsun-extb"; |
- break; |
- default: |
- family = L"lucida sans unicode"; |
- } |
- } |
- |
- if (scriptChecked) |
- *scriptChecked = script; |
- return family; |
-} |
- |
- |
-const UChar* getFallbackFamilyForFirstNonCommonCharacter(const UChar* characters, |
- int length, |
- FontDescription::GenericFamilyType generic) |
-{ |
- ASSERT(characters && characters[0] && length > 0); |
- UScriptCode script = USCRIPT_COMMON; |
- |
- // Sometimes characters common to script (e.g. space) is at |
- // the beginning of a string so that we need to skip them |
- // to get a font required to render the string. |
- int i = 0; |
- UChar32 ucs4 = 0; |
- while (i < length && script == USCRIPT_COMMON) { |
- U16_NEXT(characters, i, length, ucs4); |
- script = getScript(ucs4); |
- } |
- |
- const UChar* family = getFallbackFamily(ucs4, generic, 0); |
- |
- return family; |
-} |
- |
-} // namespace WebCore |