diff options
author | Khaled Hosny <khaledhosny@eglug.org> | 2016-11-01 22:22:30 +0200 |
---|---|---|
committer | Khaled Hosny <khaledhosny@eglug.org> | 2016-11-01 23:46:32 +0200 |
commit | d66ec48fe879a26ec542661c04e5c2b8271b7d64 (patch) | |
tree | bf5b95dacbce4d928c6e45f56f711140653bf140 /vcl/win | |
parent | 35bfb8fb0cfae23afdc65d6fa24d95b64f67b68f (diff) |
Use the font language instead of guessing it
Similar to what we do with FontConfig.
Change-Id: Id01dabe0b52e4e3aea54073d42b719a924025920
Diffstat (limited to 'vcl/win')
-rw-r--r-- | vcl/win/gdi/salfont.cxx | 160 |
1 files changed, 2 insertions, 158 deletions
diff --git a/vcl/win/gdi/salfont.cxx b/vcl/win/gdi/salfont.cxx index b4341848d43d..c8c9893385de 100644 --- a/vcl/win/gdi/salfont.cxx +++ b/vcl/win/gdi/salfont.cxx @@ -134,150 +134,6 @@ RawFontData::RawFontData( HDC hDC, DWORD nTableTag ) } // platform specific font substitution hooks for glyph fallback enhancement -// TODO: move into i18n module (maybe merge with svx/ucsubset.* -// or merge with i18nutil/source/utility/unicode_data.h) -struct Unicode2LangType -{ - sal_UCS4 mnMinCode; - sal_UCS4 mnMaxCode; - LanguageType mnLangID; -}; - -// entries marked with default-CJK get replaced with the default-CJK language -#define LANGUAGE_DEFAULT_CJK 0xFFF0 - -// map unicode ranges to languages supported by OOo -// NOTE: due to the binary search used this list must be sorted by mnMinCode -static Unicode2LangType aLangFromCodeChart[]= { - {0x0000, 0x007F, LANGUAGE_ENGLISH}, // Basic Latin - {0x0080, 0x024F, LANGUAGE_ENGLISH}, // Latin Extended-A and Latin Extended-B - {0x0250, 0x02AF, LANGUAGE_SYSTEM}, // IPA Extensions - {0x0370, 0x03FF, LANGUAGE_GREEK}, // Greek - {0x0590, 0x05FF, LANGUAGE_HEBREW}, // Hebrew - {0x0600, 0x06FF, LANGUAGE_ARABIC_PRIMARY_ONLY}, // Arabic - {0x0900, 0x097F, LANGUAGE_HINDI}, // Devanagari - {0x0980, 0x09FF, LANGUAGE_BENGALI}, // Bengali - {0x0A80, 0x0AFF, LANGUAGE_GUJARATI}, // Gujarati - {0x0B00, 0x0B7F, LANGUAGE_ODIA}, // Odia - {0x0B80, 0x0BFF, LANGUAGE_TAMIL}, // Tamil - {0x0C00, 0x0C7F, LANGUAGE_TELUGU}, // Telugu - {0x0C80, 0x0CFF, LANGUAGE_KANNADA}, // Kannada - {0x0D00, 0x0D7F, LANGUAGE_MALAYALAM}, // Malayalam - {0x0D80, 0x0D7F, LANGUAGE_SINHALESE_SRI_LANKA}, // Sinhala - {0x0E00, 0x0E7F, LANGUAGE_THAI}, // Thai - {0x0E80, 0x0EFF, LANGUAGE_LAO}, // Lao - {0x0F00, 0x0FFF, LANGUAGE_TIBETAN}, // Tibetan - {0x1000, 0x109F, LANGUAGE_BURMESE}, // Burmese - {0x10A0, 0x10FF, LANGUAGE_GEORGIAN}, // Georgian - {0x1100, 0x11FF, LANGUAGE_KOREAN}, // Hangul Jamo, Korean-specific -// {0x1200, 0x139F, LANGUAGE_AMHARIC_ETHIOPIA}, // Ethiopic -// {0x1200, 0x139F, LANGUAGE_TIGRIGNA_ETHIOPIA}, // Ethiopic - {0x13A0, 0x13FF, LANGUAGE_CHEROKEE_UNITED_STATES}, // Cherokee -// {0x1400, 0x167F, LANGUAGE_CANADIAN_ABORIGINAL}, // Canadian Aboriginal Syllabics -// {0x1680, 0x169F, LANGUAGE_OGHAM}, // Ogham -// {0x16A0, 0x16F0, LANGUAGE_RUNIC}, // Runic -// {0x1700, 0x171F, LANGUAGE_TAGALOG}, // Tagalog -// {0x1720, 0x173F, LANGUAGE_HANUNOO}, // Hanunoo -// {0x1740, 0x175F, LANGUAGE_BUHID}, // Buhid -// {0x1760, 0x177F, LANGUAGE_TAGBANWA}, // Tagbanwa - {0x1780, 0x17FF, LANGUAGE_KHMER}, // Khmer - {0x18A0, 0x18AF, LANGUAGE_MONGOLIAN_MONGOLIAN_MONGOLIA}, // Mongolian -// {0x1900, 0x194F, LANGUAGE_LIMBU}, // Limbu -// {0x1950, 0x197F, LANGUAGE_TAILE}, // Tai Le -// {0x1980, 0x19DF, LANGUAGE_TAILUE}, // Tai Lue - {0x19E0, 0x19FF, LANGUAGE_KHMER}, // Khmer Symbols -// {0x1A00, 0x1A1F, LANGUAGE_BUGINESE}, // Buginese/Lontara -// {0x1B00, 0x1B7F, LANGUAGE_BALINESE}, // Balinese -// {0x1D00, 0x1DFF, LANGUAGE_NONE}, // Phonetic Symbols - {0x1E00, 0x1EFF, LANGUAGE_ENGLISH}, // Latin Extended Additional - {0x1F00, 0x1FFF, LANGUAGE_GREEK}, // Greek Extended - {0x2C60, 0x2C7F, LANGUAGE_ENGLISH}, // Latin Extended-C - {0x2E80, 0x2FFf, LANGUAGE_CHINESE_SIMPLIFIED}, // CJK Radicals Supplement + Kangxi Radical + Ideographic Description Characters - {0x3000, 0x303F, LANGUAGE_DEFAULT_CJK}, // CJK Symbols and punctuation - {0x3040, 0x30FF, LANGUAGE_JAPANESE}, // Japanese Hiragana + Katakana - {0x3100, 0x312F, LANGUAGE_CHINESE_TRADITIONAL}, // Bopomofo - {0x3130, 0x318F, LANGUAGE_KOREAN}, // Hangul Compatibility Jamo, Kocrean-specific - {0x3190, 0x319F, LANGUAGE_JAPANESE}, // Kanbun - {0x31A0, 0x31BF, LANGUAGE_CHINESE_TRADITIONAL}, // Bopomofo Extended - {0x31C0, 0x31EF, LANGUAGE_DEFAULT_CJK}, // CJK Ideographs - {0x31F0, 0x31FF, LANGUAGE_JAPANESE}, // Japanese Katakana Phonetic Extensions - {0x3200, 0x321F, LANGUAGE_KOREAN}, // Parenthesized Hangul - {0x3220, 0x325F, LANGUAGE_DEFAULT_CJK}, // Parenthesized Ideographs - {0x3260, 0x327F, LANGUAGE_KOREAN}, // Circled Hangul - {0x3280, 0x32CF, LANGUAGE_DEFAULT_CJK}, // Circled Ideographs - {0x32d0, 0x32FF, LANGUAGE_JAPANESE}, // Japanese Circled Katakana - {0x3400, 0x4DBF, LANGUAGE_DEFAULT_CJK}, // CJK Unified Ideographs Extension A - {0x4E00, 0x9FCF, LANGUAGE_DEFAULT_CJK}, // Unified CJK Ideographs - {0xA720, 0xA7FF, LANGUAGE_ENGLISH}, // Latin Extended-D - {0xAC00, 0xD7AF, LANGUAGE_KOREAN}, // Hangul Syllables, Korean-specific - {0xF900, 0xFAFF, LANGUAGE_DEFAULT_CJK}, // CJK Compatibility Ideographs - {0xFB00, 0xFB4F, LANGUAGE_HEBREW}, // Hebrew Presentation Forms - {0xFB50, 0xFDFF, LANGUAGE_ARABIC_PRIMARY_ONLY}, // Arabic Presentation Forms-A - {0xFE70, 0xFEFE, LANGUAGE_ARABIC_PRIMARY_ONLY}, // Arabic Presentation Forms-B - {0xFF65, 0xFF9F, LANGUAGE_JAPANESE}, // Japanese Halfwidth Katakana variant - {0xFFA0, 0xFFDC, LANGUAGE_KOREAN}, // Kocrean halfwidth hangual variant - {0x10140, 0x1018F, LANGUAGE_GREEK}, // Ancient Greak numbers - {0x1D200, 0x1D24F, LANGUAGE_GREEK}, // Ancient Greek Musical - {0x20000, 0x2A6DF, LANGUAGE_DEFAULT_CJK}, // CJK Unified Ideographs Extension B - {0x2F800, 0x2FA1F, LANGUAGE_DEFAULT_CJK} // CJK Compatibility Ideographs Supplement -}; - -// get language matching to the missing char -LanguageType MapCharToLanguage( sal_UCS4 uChar ) -{ - // entries marked with default-CJK get replaced with the preferred CJK language - static bool bFirst = true; - if( bFirst ) - { - bFirst = false; - - // use method suggested in #i97086# to determine the systems default language - // TODO: move into i18npool or sal/osl/w32/nlsupport.c - LanguageType nDefaultLang = 0; - HKEY hKey = nullptr; - LONG lResult = ::RegOpenKeyExA( HKEY_LOCAL_MACHINE, - "SYSTEM\\CurrentControlSet\\Control\\Nls\\Language", - 0, KEY_QUERY_VALUE, &hKey ); - char aKeyValBuf[16]; - DWORD nKeyValSize = sizeof(aKeyValBuf); - if( ERROR_SUCCESS == lResult ) - lResult = RegQueryValueExA( hKey, "Default", nullptr, nullptr, reinterpret_cast<LPBYTE>(aKeyValBuf), &nKeyValSize ); - aKeyValBuf[ sizeof(aKeyValBuf)-1 ] = '\0'; - if( ERROR_SUCCESS == lResult ) - nDefaultLang = (LanguageType)rtl_str_toInt32( aKeyValBuf, 16 ); - - // TODO: use the default-CJK language selected in - // Tools->Options->LangSettings->Languages when it becomes available here - if( !nDefaultLang ) - nDefaultLang = Application::GetSettings().GetUILanguageTag().getLanguageType(); - - LanguageType nDefaultCJK = MsLangId::isCJK(nDefaultLang) ? nDefaultLang : LANGUAGE_CHINESE; - - // change the marked entries to preferred language - static const int nCount = SAL_N_ELEMENTS(aLangFromCodeChart); - for( int i = 0; i < nCount; ++i ) - { - if( aLangFromCodeChart[ i].mnLangID == LANGUAGE_DEFAULT_CJK ) - aLangFromCodeChart[ i].mnLangID = nDefaultCJK; - } - } - - // binary search - int nLow = 0; - int nHigh = SAL_N_ELEMENTS(aLangFromCodeChart) - 1; - while( nLow <= nHigh ) - { - int nMiddle = (nHigh + nLow) / 2; - if( uChar < aLangFromCodeChart[ nMiddle].mnMinCode ) - nHigh = nMiddle - 1; - else if( uChar > aLangFromCodeChart[ nMiddle].mnMaxCode ) - nLow = nMiddle + 1; - else - return aLangFromCodeChart[ nMiddle].mnLangID; - } - - return LANGUAGE_DONTKNOW; -} class WinPreMatchFontSubstititution : public ImplPreMatchFontSubstitution @@ -404,22 +260,10 @@ bool WinPreMatchFontSubstititution::FindFontSubstitute(FontSelectPattern& rFontS bool WinGlyphFallbackSubstititution::FindFontSubstitute( FontSelectPattern& rFontSelData, OUString& rMissingChars ) const { // guess a locale matching to the missing chars - LanguageType eLang = LANGUAGE_DONTKNOW; + LanguageType eLang = rFontSelData.meLanguage; LanguageTag aLanguageTag( eLang); - sal_Int32 nStrIdx = 0; - const sal_Int32 nStrLen = rMissingChars.getLength(); - while( nStrIdx < nStrLen ) - { - const sal_UCS4 uChar = rMissingChars.iterateCodePoints( &nStrIdx ); - eLang = MapCharToLanguage( uChar ); - if( eLang == LANGUAGE_DONTKNOW ) - continue; - aLanguageTag.reset( eLang); - break; - } - - // fall back to default UI locale if the missing characters are inconclusive + // fall back to default UI locale if the font language is inconclusive if( eLang == LANGUAGE_DONTKNOW ) aLanguageTag = Application::GetSettings().GetUILanguageTag(); |