diff options
author | Caolán McNamara <caolanm@redhat.com> | 2013-03-11 20:18:51 +0000 |
---|---|---|
committer | Caolán McNamara <caolanm@redhat.com> | 2013-03-11 21:45:38 +0000 |
commit | 9d3df36463353bb8ec71cf35bd0bf5d79b5d3d66 (patch) | |
tree | c4dbd5121ddb71e425536da3b70a7750f9bf46c7 | |
parent | 4386a0dad2388270428f8489cea7f84485ca5143 (diff) |
Resolves: fdo#62154 propogate text language down to icu for locl
Change-Id: I92f40d0a1e88b5cb0e6f07a1e6e4a8bd41cb8102
-rw-r--r-- | vcl/generic/glyphs/gcach_layout.cxx | 180 | ||||
-rw-r--r-- | vcl/inc/sallayout.hxx | 3 | ||||
-rw-r--r-- | vcl/source/gdi/outdev3.cxx | 2 | ||||
-rw-r--r-- | vcl/source/gdi/sallayout.cxx | 3 |
4 files changed, 182 insertions, 6 deletions
diff --git a/vcl/generic/glyphs/gcach_layout.cxx b/vcl/generic/glyphs/gcach_layout.cxx index a9f373eea649..815ace6f790d 100644 --- a/vcl/generic/glyphs/gcach_layout.cxx +++ b/vcl/generic/glyphs/gcach_layout.cxx @@ -23,2 +23,6 @@ +#include <boost/static_assert.hpp> + +#include <i18npool/mslangid.hxx> + #include <vcl/svapp.hxx> @@ -30,2 +34,3 @@ #include <layout/LEFontInstance.h> +#include <layout/LELanguages.h> #include <layout/LEScripts.h> @@ -267,2 +272,3 @@ private: + LanguageCodes meLanguageCode; le_int32 meScriptCode; @@ -282,2 +288,3 @@ IcuLayoutEngine::IcuLayoutEngine( ServerFont& rServerFont ) : maIcuFont( rServerFont ), + meLanguageCode( nullLanguageCode ), meScriptCode( USCRIPT_INVALID_CODE ), @@ -311,2 +318,165 @@ static bool needNextCode(sal_Unicode cChar) +namespace +{ + LanguageCodes mapLanguageTypetoICU(LanguageType eLangCode) + { + LanguageTag aLangTag(eLangCode); + OUString sLanguage = aLangTag.getLanguage(); + + if (sLanguage == "af") // Afrikaans + return afkLanguageCode; + else if (sLanguage == "ar") // Arabic + return araLanguageCode; + else if (sLanguage == "as") // Assamese + return asmLanguageCode; + else if (sLanguage == "be") // Belarussian + return belLanguageCode; + else if (sLanguage == "bn") // Bengali + return benLanguageCode; + else if (sLanguage == "bo") // Tibetan + return tibLanguageCode; + else if (sLanguage == "bu") // Bulgarian + return bgrLanguageCode; + else if (sLanguage == "ca") // Catalan + return catLanguageCode; + else if (sLanguage == "cs") // Czech + return csyLanguageCode; + else if (sLanguage == "ch") // Chechen + return cheLanguageCode; + else if (sLanguage == "co") // Coptic + return copLanguageCode; + else if (sLanguage == "cy") // Welsh + return welLanguageCode; + else if (sLanguage == "da") // Danish + return danLanguageCode; + else if (sLanguage == "de") // German + return deuLanguageCode; + else if (sLanguage == "dz") // Dzongkha + return dznLanguageCode; + else if (sLanguage == "el") // Greek + return ellLanguageCode; + else if (sLanguage == "en") // English + return engLanguageCode; + else if (sLanguage == "et") // Estonian + return etiLanguageCode; + else if (sLanguage == "eu") // Basque + return euqLanguageCode; + else if (sLanguage == "fa") // Farsi + return farLanguageCode; + else if (sLanguage == "fi") // Finnish + return finLanguageCode; + else if (sLanguage == "fr") // French + return fraLanguageCode; + else if (sLanguage == "ga") // Irish Gaelic + return gaeLanguageCode; + else if (sLanguage == "gu") // Gujarati + return gujLanguageCode; + else if (sLanguage == "ha") // Hausa + return hauLanguageCode; + else if (sLanguage == "he") // Hebrew + return iwrLanguageCode; + else if (sLanguage == "hi") // Hindi + return hinLanguageCode; + else if (sLanguage == "hr") // Croatian + return hrvLanguageCode; + else if (sLanguage == "hu") // Hungarian + return hunLanguageCode; + else if (sLanguage == "hy") // Armenian + return hyeLanguageCode; + else if (sLanguage == "id") // Indonesian + return indLanguageCode; + else if (sLanguage == "it") // Italian + return itaLanguageCode; + else if (sLanguage == "ja") // Japanese + return janLanguageCode; + else if (sLanguage == "kn") // Kannada + return kanLanguageCode; + else if (sLanguage == "ks") // Kashmiri + return kshLanguageCode; + else if (sLanguage == "kh") // Khmer + return khmLanguageCode; + else if (sLanguage == "kok") // Konkani + return kokLanguageCode; + else if (sLanguage == "ko") // Korean + return korLanguageCode; + else if (sLanguage == "ml") // Malayalam - Reformed (should there be some bcp47 tag for Traditional Malayalam) + return mlrLanguageCode; + else if (sLanguage == "mr") // Marathi + return marLanguageCode; + else if (sLanguage == "mt") // Maltese + return mtsLanguageCode; + else if (sLanguage == "mni") // Manipuri + return mniLanguageCode; + else if (sLanguage == "mn") // Mongolian + return mngLanguageCode; + else if (sLanguage == "ne") // Nepali + return nepLanguageCode; + else if (sLanguage == "or") // Oriya + return oriLanguageCode; + else if (sLanguage == "pl") // Polish + return plkLanguageCode; + else if (sLanguage == "po") // Portuguese + return ptgLanguageCode; + else if (sLanguage == "ps") // Pashto + return pasLanguageCode; + else if (sLanguage == "ro") // Romanian + return romLanguageCode; + else if (sLanguage == "ru") // Russian + return rusLanguageCode; + else if (sLanguage == "sa") // Sanskrit + return sanLanguageCode; + else if (sLanguage == "si") // Sinhalese + return snhLanguageCode; + else if (sLanguage == "sk") // Slovak + return skyLanguageCode; + else if (sLanguage == "sd") // Sindhi + return sndLanguageCode; + else if (sLanguage == "sl") // Slovenian + return slvLanguageCode; + else if (sLanguage == "es") // Spanish + return espLanguageCode; + else if (sLanguage == "sq") // Albanian + return sqiLanguageCode; + else if (sLanguage == "sr") // Serbian + return srbLanguageCode; + else if (sLanguage == "sv") // Swedish + return sveLanguageCode; + else if (sLanguage == "syr") // Syriac + return syrLanguageCode; + else if (sLanguage == "ta") // Tamil + return tamLanguageCode; + else if (sLanguage == "te") // Telugu + return telLanguageCode; + else if (sLanguage == "th") // Thai + return thaLanguageCode; + else if (sLanguage == "tu") // Turkish + return trkLanguageCode; + else if (sLanguage == "ur") // Urdu + return urdLanguageCode; + else if (sLanguage == "yi") // Yiddish + return jiiLanguageCode; + else if (sLanguage == "zh") // Chinese + { + OUString sScript = aLangTag.getScript(); + if (sScript.isEmpty()) + { + if (MsLangId::isTraditionalChinese(eLangCode)) + sScript = "Hant"; + else + sScript = "Hans"; + } + if (sScript == "Latn") + return zhpLanguageCode; + else if (sScript == "Hans") + return zhsLanguageCode; + else if (sScript == "Hant") + return zhtLanguageCode; + } + + //if there are new ones, please reexamine the mapping list for the new ones + BOOST_STATIC_ASSERT(languageCodeCount == 72); + return nullLanguageCode; + } +} + //See https://bugs.freedesktop.org/show_bug.cgi?id=31016 @@ -381,5 +551,9 @@ bool IcuLayoutEngine::layout(ServerFontLayout& rLayout, ImplLayoutArgs& rArgs) + LanguageCodes eLanguageCode = mapLanguageTypetoICU(rArgs.meLanguage); + // get layout engine matching to this script and ligature/kerning combination // no engine change necessary if script is latin - if( !mpIcuLE || ((eScriptCode != meScriptCode) && (eScriptCode > USCRIPT_INHERITED)) || (mnLayoutFlags != nLayoutFlags) ) + if ( !mpIcuLE || + ((eScriptCode != meScriptCode) && (eScriptCode > USCRIPT_INHERITED)) || + (mnLayoutFlags != nLayoutFlags) || (meLanguageCode != eLanguageCode) ) { @@ -387,6 +561,6 @@ bool IcuLayoutEngine::layout(ServerFontLayout& rLayout, ImplLayoutArgs& rArgs) delete mpIcuLE; + meLanguageCode = eLanguageCode; meScriptCode = eScriptCode; mnLayoutFlags = nLayoutFlags; - le_int32 eLangCode = 0; // TODO: get better value - mpIcuLE = LayoutEngine::layoutEngineFactory( &maIcuFont, eScriptCode, eLangCode, nLayoutFlags, rcIcu ); + mpIcuLE = LayoutEngine::layoutEngineFactory( &maIcuFont, eScriptCode, eLanguageCode, nLayoutFlags, rcIcu ); if( LE_FAILURE(rcIcu) ) diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx index e86ecdbe1ca4..e0c13d65a165 100644 --- a/vcl/inc/sallayout.hxx +++ b/vcl/inc/sallayout.hxx @@ -89,2 +89,3 @@ public: // string related inputs + LanguageType meLanguage; int mnFlags; @@ -106,3 +107,3 @@ public: ImplLayoutArgs( const sal_Unicode* pStr, int nLength, - int nMinCharPos, int nEndCharPos, int nFlags ); + int nMinCharPos, int nEndCharPos, int nFlags, LanguageType eLanguage ); diff --git a/vcl/source/gdi/outdev3.cxx b/vcl/source/gdi/outdev3.cxx index d218a809ddd6..cb23cf52ee3e 100644 --- a/vcl/source/gdi/outdev3.cxx +++ b/vcl/source/gdi/outdev3.cxx @@ -6019,3 +6019,3 @@ ImplLayoutArgs OutputDevice::ImplPrepareLayoutArgs( String& rStr, // set layout options - ImplLayoutArgs aLayoutArgs( rStr.GetBuffer(), rStr.Len(), nMinIndex, nEndIndex, nLayoutFlags ); + ImplLayoutArgs aLayoutArgs( rStr.GetBuffer(), rStr.Len(), nMinIndex, nEndIndex, nLayoutFlags, maFont.GetLanguage() ); diff --git a/vcl/source/gdi/sallayout.cxx b/vcl/source/gdi/sallayout.cxx index c0aae95187ae..9df49c42f69b 100644 --- a/vcl/source/gdi/sallayout.cxx +++ b/vcl/source/gdi/sallayout.cxx @@ -430,4 +430,5 @@ bool ImplLayoutRuns::GetRun( int* nMinRunPos, int* nEndRunPos, bool* bRightToLef ImplLayoutArgs::ImplLayoutArgs( const sal_Unicode* pStr, int nLen, - int nMinCharPos, int nEndCharPos, int nFlags ) + int nMinCharPos, int nEndCharPos, int nFlags, LanguageType eLanguage ) : + meLanguage( eLanguage ), mnFlags( nFlags ), |