Blame SOURCES/0001-Related-rhbz-968892-discard-impossible-languages-for.patch

2135ec
From b5bd2d1d8d09a44af354584ff187d9e935ffd973 Mon Sep 17 00:00:00 2001
2135ec
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
2135ec
Date: Tue, 4 Jun 2013 17:13:13 +0100
2135ec
Subject: [PATCH] Related: rhbz#968892 discard impossible languages for glyph
2135ec
 fallback
2135ec
2135ec
Change-Id: I14f1bab09eb0be9c2c896a1dde45913b99aab6df
2135ec
---
2135ec
 vcl/generic/fontmanager/fontconfig.cxx | 39 ++++++++++++++++++++++++++++++++++
2135ec
 1 file changed, 39 insertions(+)
2135ec
2135ec
diff --git a/vcl/generic/fontmanager/fontconfig.cxx b/vcl/generic/fontmanager/fontconfig.cxx
2135ec
index 1b36980..ff471fa 100644
2135ec
--- a/vcl/generic/fontmanager/fontconfig.cxx
2135ec
+++ b/vcl/generic/fontmanager/fontconfig.cxx
2135ec
@@ -847,6 +847,41 @@
2135ec
 #endif
2135ec
     }
2135ec
 
2135ec
+    //returns true if the given code-point couldn't possibly be in rLangTag.
2135ec
+    bool isImpossibleCodePointForLang(const LanguageTag &rLangTag, sal_uInt32 currentChar)
2135ec
+    {
2135ec
+        //a non-default script is set, lets believe it
2135ec
+        if (rLangTag.hasScript())
2135ec
+            return false;
2135ec
+
2135ec
+        int32_t script = u_getIntPropertyValue(currentChar, UCHAR_SCRIPT);
2135ec
+        UScriptCode eScript = static_cast<UScriptCode>(script);
2135ec
+        bool bIsImpossible = false;
2135ec
+        OUString sLang = rLangTag.getLanguage();
2135ec
+        switch (eScript)
2135ec
+        {
2135ec
+            case USCRIPT_TELUGU:
2135ec
+                bIsImpossible = sLang != "te";
2135ec
+                break;
2135ec
+            case USCRIPT_BENGALI:
2135ec
+                bIsImpossible = sLang != "bn" &&
2135ec
+                    sLang != "as" && sLang != "mkb" &&
2135ec
+                    sLang != "kfv" && sLang != "ccp" &&
2135ec
+                    sLang != "tnv" && sLang != "ctg" &&
2135ec
+                    sLang != "haj" && sLang != "ksy" &&
2135ec
+                    sLang != "rkt" && sLang != "rjs" &&
2135ec
+                    sLang != "rhg" && sLang != "syl" &&
2135ec
+                    sLang != "kyv" && sLang != "zrg" &&
2135ec
+                    sLang != "nhh";
2135ec
+                break;
2135ec
+            default:
2135ec
+                break;
2135ec
+        }
2135ec
+        SAL_WARN_IF(bIsImpossible, "vcl", "Throwing away user set language of "
2135ec
+            << sLang << " for finding a font for glyph fallback and autodetecting instead");
2135ec
+        return bIsImpossible;
2135ec
+    }
2135ec
+
2135ec
     LanguageTag getExemplerLangTagForCodePoint(sal_uInt32 currentChar)
2135ec
     {
2135ec
         int32_t script = u_getIntPropertyValue(currentChar, UCHAR_SCRIPT);
2135ec
@@ -954,6 +989,10 @@
2135ec
             // also handle unicode surrogates
2135ec
             const sal_uInt32 nCode = rMissingCodes.iterateCodePoints( &nStrIndex );
2135ec
             FcCharSetAddChar( unicodes, nCode );
2135ec
+            //if the codepoint is impossible for this lang tag, then clear it
2135ec
+            //and autodetect something useful
2135ec
+            if (!aLangAttrib.isEmpty() && isImpossibleCodePointForLang(aLangTag, nCode))
2135ec
+                aLangAttrib = OString();
2135ec
             //#i105784#/rhbz#527719  improve selection of fallback font
2135ec
             if (aLangAttrib.isEmpty())
2135ec
             {