summaryrefslogtreecommitdiff
path: root/vcl/generic
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2012-08-31 13:17:55 +0100
committerCaolán McNamara <caolanm@redhat.com>2012-08-31 13:18:26 +0100
commitfab0a2c6068577081abdad90a3b1191b6fc5df29 (patch)
tree28b5eea2ca7ca6686cd121f8d7e84c52832f0945 /vcl/generic
parent0d6e3a01a57146a74520c551b3cd316640cea0b7 (diff)
workaround fdo#35118 in the absence of fdo#19869
Change-Id: Ie87671bbb9a7c883651a9467b9364dbbcd0da9a1
Diffstat (limited to 'vcl/generic')
-rw-r--r--vcl/generic/fontmanager/fontconfig.cxx63
1 files changed, 39 insertions, 24 deletions
diff --git a/vcl/generic/fontmanager/fontconfig.cxx b/vcl/generic/fontmanager/fontconfig.cxx
index fbe18dd22169..a90ecaf699e3 100644
--- a/vcl/generic/fontmanager/fontconfig.cxx
+++ b/vcl/generic/fontmanager/fontconfig.cxx
@@ -32,7 +32,7 @@
#include "vcl/fontmanager.hxx"
#include "vcl/vclenum.hxx"
#include "outfont.hxx"
-#include <i18npool/mslangid.hxx>
+#include <i18npool/languagetag.hxx>
using namespace psp;
@@ -777,6 +777,37 @@ static void addtopattern(FcPattern *pPattern,
}
}
+namespace
+{
+ //Someday fontconfig will hopefully use bcp47, see fdo#19869
+ //In the meantime try something that will fit to workaround fdo#35118
+ OString mapToFontConfigLangTag(const LanguageTag &rLangTag)
+ {
+ FcStrSet *pLangSet = FcGetLangs();
+ OString sLangAttrib;
+
+ sLangAttrib = OUStringToOString(rLangTag.getBcp47(), RTL_TEXTENCODING_UTF8).toAsciiLowerCase();
+ if (FcStrSetMember(pLangSet, (const FcChar8*)sLangAttrib.getStr()))
+ return sLangAttrib;
+
+ sLangAttrib = OUStringToOString(rLangTag.getLanguageAndScript(), RTL_TEXTENCODING_UTF8).toAsciiLowerCase();
+ if (FcStrSetMember(pLangSet, (const FcChar8*)sLangAttrib.getStr()))
+ return sLangAttrib;
+
+ OString sLang = OUStringToOString(rLangTag.getLanguage(), RTL_TEXTENCODING_UTF8).toAsciiLowerCase();
+ OString sRegion = OUStringToOString(rLangTag.getCountry(), RTL_TEXTENCODING_UTF8).toAsciiLowerCase();
+
+ sLangAttrib = sLang + OString('-') + sRegion;
+ if (FcStrSetMember(pLangSet, (const FcChar8*)sLangAttrib.getStr()))
+ return sLangAttrib;
+
+ if (FcStrSetMember(pLangSet, (const FcChar8*)sLang.getStr()))
+ return sLangAttrib;
+
+ return OString();
+ }
+}
+
bool PrintFontManager::Substitute( FontSelectPattern &rPattern, rtl::OUString& rMissingCodes )
{
bool bRet = false;
@@ -793,16 +824,10 @@ bool PrintFontManager::Substitute( FontSelectPattern &rPattern, rtl::OUString& r
const FcChar8* pTargetNameUtf8 = (FcChar8*)aTargetName.getStr();
FcPatternAddString(pPattern, FC_FAMILY, pTargetNameUtf8);
- const rtl::OString aLangAttrib = MsLangId::convertLanguageToIsoByteString(rPattern.meLanguage);
- if( !aLangAttrib.isEmpty() )
- {
- const FcChar8* pLangAttribUtf8;
- if (aLangAttrib.equalsIgnoreAsciiCase(OString(RTL_CONSTASCII_STRINGPARAM("pa-in"))))
- pLangAttribUtf8 = (FcChar8*)"pa";
- else
- pLangAttribUtf8 = (FcChar8*)aLangAttrib.getStr();
- FcPatternAddString(pPattern, FC_LANG, pLangAttribUtf8);
- }
+ const LanguageTag aLangTag(rPattern.meLanguage);
+ const rtl::OString aLangAttrib = mapToFontConfigLangTag(aLangTag);
+ if (!aLangAttrib.isEmpty())
+ FcPatternAddString(pPattern, FC_LANG, (FcChar8*)aLangAttrib.getStr());
// Add required Unicode characters, if any
if ( !rMissingCodes.isEmpty() )
@@ -1040,20 +1065,10 @@ bool PrintFontManager::matchFont( FastPrintFontInfo& rInfo, const com::sun::star
FcConfig* pConfig = FcConfigGetCurrent();
FcPattern* pPattern = FcPatternCreate();
- OString aLangAttrib;
// populate pattern with font characteristics
- if( !rLocale.Language.isEmpty() )
- {
- OUStringBuffer aLang(6);
- aLang.append( rLocale.Language );
- if( !rLocale.Country.isEmpty() )
- {
- aLang.append( sal_Unicode('-') );
- aLang.append( rLocale.Country );
- }
- aLangAttrib = OUStringToOString( aLang.makeStringAndClear(), RTL_TEXTENCODING_UTF8 );
- }
- if( !aLangAttrib.isEmpty() )
+ const LanguageTag aLangTag(rLocale);
+ const rtl::OString aLangAttrib = mapToFontConfigLangTag(aLangTag);
+ if (!aLangAttrib.isEmpty())
FcPatternAddString(pPattern, FC_LANG, (FcChar8*)aLangAttrib.getStr());
OString aFamily = OUStringToOString( rInfo.m_aFamilyName, RTL_TEXTENCODING_UTF8 );