summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2013-07-30 16:11:54 +0200
committerFridrich Strba <fridrich@documentfoundation.org>2013-07-31 15:39:25 +0000
commitff8a6b661dc304cb3a858facbd0dbda66ff01641 (patch)
tree3f9c48a6a6510f1ce60cbeb1a3d3ae2dc754a133 /vcl
parent6a3c26a46c28ca1bcc26f4cc546b9facafe7030a (diff)
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@documentfoundation.org> Tested-by: Fridrich Strba <fridrich@documentfoundation.org>
Diffstat (limited to 'vcl')
-rw-r--r--vcl/generic/fontmanager/fontconfig.cxx35
1 files changed, 21 insertions, 14 deletions
diff --git a/vcl/generic/fontmanager/fontconfig.cxx b/vcl/generic/fontmanager/fontconfig.cxx
index 1b36980b9c46..fb3bae215270 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;