[Libreoffice-commits] core.git: Branch 'libreoffice-4-1' - vcl/generic

Michael Stahl mstahl at redhat.com
Wed Jul 31 08:39:46 PDT 2013


 vcl/generic/fontmanager/fontconfig.cxx |   35 +++++++++++++++++++--------------
 1 file changed, 21 insertions(+), 14 deletions(-)

New commits:
commit ff8a6b661dc304cb3a858facbd0dbda66ff01641
Author: Michael Stahl <mstahl at redhat.com>
Date:   Tue Jul 30 16:11:54 2013 +0200

    fdo#66715: fontconfig: try harder to ignore duplicate fonts
    
    The thin space not being displayed correctly is caused by using the
    wrong font, namely
    /usr/share/fonts/liberation/LiberationSerif-Regular.ttf,
    which (on Fedora 18) is version 1 and does not contain u2006 etc.
    glyphs, whereas the LiberationSerif-Regular.ttf bundled with LO
    is version 2 and does contain these.
    
    There is already isPreviouslyDuplicateOrObsoleted() function to ignore
    older fonts but it does not work for this case because:
    
    1) Only the previous element was looked at, but there may be several
       fonts with different weight/slant that need to be checked.
    
    2) The LiberationSerif-Regular.ttf differ in the "lang" entry.
    
    Change-Id: I2f9e8d50a1f8155b65f8f07c9259dd988c32992a
    (cherry picked from commit 1c48e4efa2369e5708798bdefb46b74a86415d00)
    Reviewed-on: https://gerrit.libreoffice.org/5203
    Reviewed-by: Fridrich Strba <fridrich at documentfoundation.org>
    Tested-by: Fridrich Strba <fridrich at documentfoundation.org>

diff --git a/vcl/generic/fontmanager/fontconfig.cxx b/vcl/generic/fontmanager/fontconfig.cxx
index 1b36980..fb3bae2 100644
--- a/vcl/generic/fontmanager/fontconfig.cxx
+++ b/vcl/generic/fontmanager/fontconfig.cxx
@@ -209,30 +209,37 @@ namespace
     //on being sorted with SortFont
     bool isPreviouslyDuplicateOrObsoleted(FcFontSet *pFSet, int i)
     {
-        if (i == 0)
-            return false;
-
         const FcPattern *a = pFSet->fonts[i];
-        const FcPattern *b = pFSet->fonts[i-1];
-
-        if (compareFontNames(a, b) != 0)
-            return false;
 
         FcPattern* pTestPatternA = FcPatternDuplicate(a);
         FcPatternDel(pTestPatternA, FC_FILE);
         FcPatternDel(pTestPatternA, FC_CHARSET);
         FcPatternDel(pTestPatternA, FC_CAPABILITY);
         FcPatternDel(pTestPatternA, FC_FONTVERSION);
+        FcPatternDel(pTestPatternA, FC_LANG);
 
-        FcPattern* pTestPatternB = FcPatternDuplicate(b);
-        FcPatternDel(pTestPatternB, FC_FILE);
-        FcPatternDel(pTestPatternB, FC_CHARSET);
-        FcPatternDel(pTestPatternB, FC_CAPABILITY);
-        FcPatternDel(pTestPatternB, FC_FONTVERSION);
+        bool bIsDup(false);
 
-        bool bIsDup = FcPatternEqual(pTestPatternA, pTestPatternB);
+        // fdo#66715: loop for case of several font files for same font
+        for (int j = i - 1; 0 <= j && !bIsDup; --j)
+        {
+            const FcPattern *b = pFSet->fonts[j];
+
+            if (compareFontNames(a, b) != 0)
+                break;
+
+            FcPattern* pTestPatternB = FcPatternDuplicate(b);
+            FcPatternDel(pTestPatternB, FC_FILE);
+            FcPatternDel(pTestPatternB, FC_CHARSET);
+            FcPatternDel(pTestPatternB, FC_CAPABILITY);
+            FcPatternDel(pTestPatternB, FC_FONTVERSION);
+            FcPatternDel(pTestPatternB, FC_LANG);
+
+            bIsDup = FcPatternEqual(pTestPatternA, pTestPatternB);
+
+            FcPatternDestroy(pTestPatternB);
+        }
 
-        FcPatternDestroy(pTestPatternB);
         FcPatternDestroy(pTestPatternA);
 
         return bIsDup;


More information about the Libreoffice-commits mailing list