d8184f2
From 36644331aad8382ccab7fb19d7ab3339bbff0c20 Mon Sep 17 00:00:00 2001
d8184f2
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
d8184f2
Date: Thu, 1 Dec 2011 14:18:09 +0100
d8184f2
Subject: [PATCH 2/2] #i105784# vcl: improve selection of fallback font by
d8184f2
 supplying language hint when none exists
d8184f2
d8184f2
---
d8184f2
 vcl/generic/fontmanager/fontconfig.cxx |  143 +++++++++++++++++++++++++++++++-
d8184f2
 1 files changed, 141 insertions(+), 2 deletions(-)
d8184f2
d8184f2
diff --git a/vcl/generic/fontmanager/fontconfig.cxx b/vcl/generic/fontmanager/fontconfig.cxx
d8184f2
index 4d02a76..ecd3b5d 100644
d8184f2
--- a/vcl/generic/fontmanager/fontconfig.cxx
d8184f2
+++ b/vcl/generic/fontmanager/fontconfig.cxx
d8184f2
@@ -89,6 +89,9 @@ using namespace psp;
8076325
 
8076325
 #include "sal/alloca.h"
8076325
 
8076325
+#include <i18nutil/unicode.hxx>  //unicode::getUnicodeScriptType
8076325
+#include <com/sun/star/i18n/ScriptType.hdl> //ScriptType
8076325
+
8076325
 #include <utility>
8076325
 #include <algorithm>
8076325
 
d8184f2
@@ -747,6 +750,138 @@ static void addtopattern(FcPattern *pPattern,
8076325
     }
8076325
 }
8076325
 
8076325
+static const char* pick_sample_language(const sal_uInt32 cCode)
8076325
+{
8076325
+    using namespace ::com::sun::star::i18n;
8076325
+
8076325
+    static ScriptTypeList aScripts[] =
8076325
+    {
8076325
+        { UnicodeScript_kBasicLatin, UnicodeScript_kBasicLatin, UnicodeScript_kBasicLatin },
8076325
+        { UnicodeScript_kLatin1Supplement, UnicodeScript_kLatin1Supplement, UnicodeScript_kLatin1Supplement },
8076325
+        { UnicodeScript_kLatinExtendedA, UnicodeScript_kLatinExtendedA, UnicodeScript_kLatinExtendedA },
8076325
+        { UnicodeScript_kLatinExtendedB, UnicodeScript_kLatinExtendedB, UnicodeScript_kLatinExtendedB },
8076325
+        { UnicodeScript_kGreek, UnicodeScript_kGreek, UnicodeScript_kGreek },
8076325
+        { UnicodeScript_kCyrillic, UnicodeScript_kCyrillic, UnicodeScript_kCyrillic },
8076325
+        { UnicodeScript_kArmenian, UnicodeScript_kArmenian, UnicodeScript_kArmenian },
8076325
+        { UnicodeScript_kHebrew, UnicodeScript_kHebrew, UnicodeScript_kHebrew },
8076325
+        { UnicodeScript_kArabic, UnicodeScript_kArabic, UnicodeScript_kArabic },
8076325
+        { UnicodeScript_kSyriac, UnicodeScript_kSyriac, UnicodeScript_kSyriac },
8076325
+        { UnicodeScript_kThaana, UnicodeScript_kThaana, UnicodeScript_kThaana },
8076325
+        { UnicodeScript_kDevanagari, UnicodeScript_kDevanagari, UnicodeScript_kDevanagari },
8076325
+        { UnicodeScript_kBengali, UnicodeScript_kBengali, UnicodeScript_kBengali },
8076325
+        { UnicodeScript_kGurmukhi, UnicodeScript_kGurmukhi, UnicodeScript_kGurmukhi },
8076325
+        { UnicodeScript_kGujarati, UnicodeScript_kGujarati, UnicodeScript_kGujarati },
8076325
+        { UnicodeScript_kOriya, UnicodeScript_kOriya, UnicodeScript_kOriya },
8076325
+        { UnicodeScript_kTamil, UnicodeScript_kTamil, UnicodeScript_kTamil },
8076325
+        { UnicodeScript_kTelugu, UnicodeScript_kTelugu, UnicodeScript_kTelugu },
8076325
+        { UnicodeScript_kKannada, UnicodeScript_kKannada, UnicodeScript_kKannada },
8076325
+        { UnicodeScript_kMalayalam, UnicodeScript_kMalayalam, UnicodeScript_kMalayalam },
8076325
+        { UnicodeScript_kSinhala, UnicodeScript_kSinhala, UnicodeScript_kSinhala },
8076325
+        { UnicodeScript_kThai, UnicodeScript_kThai, UnicodeScript_kThai },
8076325
+        { UnicodeScript_kLao, UnicodeScript_kLao, UnicodeScript_kLao },
8076325
+        { UnicodeScript_kTibetan, UnicodeScript_kTibetan, UnicodeScript_kTibetan },
8076325
+        { UnicodeScript_kMyanmar, UnicodeScript_kMyanmar, UnicodeScript_kMyanmar },
8076325
+        { UnicodeScript_kGeorgian, UnicodeScript_kGeorgian, UnicodeScript_kGeorgian },
8076325
+        { UnicodeScript_kHangulJamo, UnicodeScript_kHangulJamo, UnicodeScript_kHangulJamo },
8076325
+        { UnicodeScript_kEthiopic, UnicodeScript_kEthiopic, UnicodeScript_kEthiopic },
8076325
+        { UnicodeScript_kCherokee, UnicodeScript_kCherokee, UnicodeScript_kCherokee },
8076325
+        { UnicodeScript_kUnifiedCanadianAboriginalSyllabics, 
8076325
+            UnicodeScript_kUnifiedCanadianAboriginalSyllabics, 
8076325
+            UnicodeScript_kUnifiedCanadianAboriginalSyllabics },
8076325
+        { UnicodeScript_kKhmer, UnicodeScript_kKhmer, UnicodeScript_kKhmer },
8076325
+        { UnicodeScript_kMongolian, UnicodeScript_kMongolian, UnicodeScript_kMongolian },
8076325
+        { UnicodeScript_kLatinExtendedAdditional, UnicodeScript_kLatinExtendedAdditional,
8076325
+          UnicodeScript_kLatinExtendedAdditional },
8076325
+        { UnicodeScript_kGreekExtended, UnicodeScript_kGreekExtended, UnicodeScript_kGreekExtended },
8076325
+        { UnicodeScript_kHiragana, UnicodeScript_kHiragana, UnicodeScript_kHiragana },
8076325
+        { UnicodeScript_kKatakana, UnicodeScript_kKatakana, UnicodeScript_kKatakana },
8076325
+        { UnicodeScript_kHangulCompatibilityJamo, UnicodeScript_kHangulCompatibilityJamo, 
8076325
+          UnicodeScript_kHangulCompatibilityJamo },
8076325
+        { UnicodeScript_kHangulSyllable, UnicodeScript_kHangulSyllable,
8076325
+          UnicodeScript_kHangulSyllable },
8076325
+        { UnicodeScript_kArabicPresentationB, UnicodeScript_kArabicPresentationB,
8076325
+          UnicodeScript_kArabicPresentationB },
8076325
+        { UnicodeScript_kScriptCount, UnicodeScript_kScriptCount, UnicodeScript_kScriptCount }
8076325
+    };
8076325
+
8076325
+    switch (unicode::getUnicodeScriptType(cCode, aScripts, UnicodeScript_kScriptCount))
8076325
+    {
8076325
+        case UnicodeScript_kBasicLatin:
8076325
+        case UnicodeScript_kLatin1Supplement:
8076325
+        case UnicodeScript_kLatinExtendedA:
8076325
+        case UnicodeScript_kLatinExtendedB:
8076325
+        case UnicodeScript_kLatinExtendedAdditional:
8076325
+            return "en";
8076325
+        case UnicodeScript_kGreek:
8076325
+        case UnicodeScript_kGreekExtended:
8076325
+            return "el";
8076325
+        case UnicodeScript_kCyrillic:
8076325
+            return "ru";
8076325
+        case UnicodeScript_kArmenian:
8076325
+            return "hy";
8076325
+        case UnicodeScript_kHebrew:
8076325
+            return "he";
8076325
+        case UnicodeScript_kArabic:
8076325
+        case UnicodeScript_kArabicPresentationB:
8076325
+            return "ar";
8076325
+        case UnicodeScript_kSyriac:
8076325
+            return "syr";
8076325
+        case UnicodeScript_kThaana:
8076325
+            return "dv";
8076325
+        case UnicodeScript_kDevanagari:
8076325
+            return "hi";
8076325
+        case UnicodeScript_kBengali:
8076325
+            return "bn";
8076325
+        case UnicodeScript_kGurmukhi:
8076325
+            return "pa";
8076325
+        case UnicodeScript_kGujarati:
8076325
+            return "gu";
8076325
+        case UnicodeScript_kOriya:
8076325
+            return "or";
8076325
+        case UnicodeScript_kTamil:
8076325
+            return "ta";
8076325
+        case UnicodeScript_kTelugu:
8076325
+            return "te";
8076325
+        case UnicodeScript_kKannada:
8076325
+            return "ka";
8076325
+        case UnicodeScript_kMalayalam:
8076325
+            return "ml";
8076325
+        case UnicodeScript_kSinhala:
8076325
+            return "si";
8076325
+        case UnicodeScript_kThai:
8076325
+            return "th";
8076325
+        case UnicodeScript_kLao:
8076325
+            return "lo";
8076325
+        case UnicodeScript_kTibetan:
8076325
+            return "bo";
8076325
+        case UnicodeScript_kMyanmar:
8076325
+            return "my";
8076325
+        case UnicodeScript_kGeorgian:
8076325
+            return "ka";
8076325
+        case UnicodeScript_kHangulJamo:
8076325
+        case UnicodeScript_kHangulCompatibilityJamo:
8076325
+        case UnicodeScript_kHangulSyllable:
8076325
+            return "ko";
8076325
+        case UnicodeScript_kEthiopic:
8076325
+            return "am";
8076325
+        case UnicodeScript_kCherokee:
8076325
+            return "chr";
8076325
+        case UnicodeScript_kUnifiedCanadianAboriginalSyllabics:
8076325
+            return "ui";
8076325
+        case UnicodeScript_kKhmer:
8076325
+            return "km";
8076325
+        case UnicodeScript_kMongolian:
8076325
+            return "mn";
8076325
+        case UnicodeScript_kHiragana:
8076325
+        case UnicodeScript_kKatakana:
8076325
+            return "ja";
8076325
+        default:
8076325
+            break;
8076325
+    }
8076325
+
8076325
+    return NULL;
8076325
+}
8076325
+
8dd8adf
 bool PrintFontManager::Substitute( FontSelectPattern &rPattern, rtl::OUString& rMissingCodes )
d8184f2
 {
d8184f2
     bool bRet = false;
d8184f2
@@ -764,14 +899,13 @@ bool PrintFontManager::Substitute( FontSelectPattern &rPattern, rtl::OUString& r
d8184f2
     FcPatternAddString(pPattern, FC_FAMILY, pTargetNameUtf8);
8076325
 
d8184f2
     const rtl::OString aLangAttrib = MsLangId::convertLanguageToIsoByteString(rPattern.meLanguage);
5050f39
+    const FcChar8* pLangAttribUtf8 = NULL;
8dd8adf
     if( !aLangAttrib.isEmpty() )
5050f39
     {
5050f39
-        const FcChar8* pLangAttribUtf8;
d8184f2
         if (aLangAttrib.equalsIgnoreAsciiCase(OString(RTL_CONSTASCII_STRINGPARAM("pa-in"))))
5050f39
             pLangAttribUtf8 = (FcChar8*)"pa";
5050f39
         else
d8184f2
             pLangAttribUtf8 = (FcChar8*)aLangAttrib.getStr();
d8184f2
-        FcPatternAddString(pPattern, FC_LANG, pLangAttribUtf8);
5050f39
     }
8076325
 
8076325
     // Add required Unicode characters, if any
d8184f2
@@ -783,11 +917,16 @@ bool PrintFontManager::Substitute( FontSelectPattern &rPattern, rtl::OUString& r
8076325
            // also handle unicode surrogates
8076325
            const sal_uInt32 nCode = rMissingCodes.iterateCodePoints( &nStrIndex );
d8184f2
            FcCharSetAddChar( unicodes, nCode );
8076325
+           if (!pLangAttribUtf8)
8076325
+               pLangAttribUtf8 = (const FcChar8*)pick_sample_language(nCode);
8076325
        }
d8184f2
        FcPatternAddCharSet(pPattern, FC_CHARSET, unicodes);
d8184f2
        FcCharSetDestroy(unicodes);
8076325
     }
8076325
 
8076325
+    if( pLangAttribUtf8 )
d8184f2
+        FcPatternAddString( pPattern, FC_LANG, pLangAttribUtf8 );
8076325
+
d8184f2
     addtopattern(pPattern, rPattern.meItalic, rPattern.meWeight,
d8184f2
         rPattern.meWidthType, rPattern.mePitch);
8076325
 
d8184f2
-- 
d8184f2
1.7.7.3
d8184f2