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; }
// 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 contentScript, const AtomicString& contentLocale, UScriptCode* scriptChecked, SkFontMgr* fontManager) { ASSERT(character); ASSERT(fontManager); const UChar* family = getFontBasedOnUnicodeBlock(character, fontManager); if (family) { if (scriptChecked) *scriptChecked = USCRIPT_INVALID_CODE; return family; } 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); // For unified-Han scripts, try the lang attribute. if (script == USCRIPT_HAN) { if (isUnambiguousUnifiedHanScript(contentScript)) script = contentScript; else script = scriptCodeForUnifiedHanFromSubtags(contentLocale); } family = getFontFamilyForScript(script, generic, fontManager); // 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"; } }