diff options
author | Michael Stahl <mstahl@redhat.com> | 2013-07-30 16:11:54 +0200 |
---|---|---|
committer | Fridrich Strba <fridrich@documentfoundation.org> | 2013-07-31 15:39:25 +0000 |
commit | ff8a6b661dc304cb3a858facbd0dbda66ff01641 (patch) | |
tree | 3f9c48a6a6510f1ce60cbeb1a3d3ae2dc754a133 | |
parent | 6a3c26a46c28ca1bcc26f4cc546b9facafe7030a (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>
-rw-r--r-- | vcl/generic/fontmanager/fontconfig.cxx | 35 |
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; |