diff --git a/QTBUG-19947-fontconfig-1.patch b/QTBUG-19947-fontconfig-1.patch new file mode 100644 index 0000000..43f09ec --- /dev/null +++ b/QTBUG-19947-fontconfig-1.patch @@ -0,0 +1,211 @@ +From d9f1c15f10e1a1d076ea4810e708a4c5419b73d2 Mon Sep 17 00:00:00 2001 +From: Jiang Jiang +Date: Mon, 20 Jun 2011 13:47:01 +0200 +Subject: [PATCH] Fix fontconfig usage in X11 font database + +We should do FcConfigSubstitute(0, pattern, FcMatchFont) on a +FcPattern for query because the family list in it will contain +almost all the families after FcConfigSubstitute(0, pattern, +FcMatchPattern), then the test in will +almost always succeed. In general, FcMatchFont substitute +should only be done on the FcPattern that we got after +FcFontMatch() or FcFontRenderPrepare(). + +Based on the suggestion of fontconfig author Behdad Esfahbod, +this patch reorganized the tryPatternLoad logic so that it only +does the QFontEngine creation part, FcPattern *match is retrieved +outside of that function. In this way, the match pattern we got +can be either from FcFontMatch() or after FcFontRenderPrepare() +on one of the fonts we got from qt_fontSetForPattern(). Then we +don't need to duplicate the pattern and add all criterias back +with qt_addPatternProps(). It not only simplified the code a lot +but also fix the way we apply FcMatchFont substitution. This +substitution will either be done by FcFontMatch() or +FcFontRenderPrepare, both implicitly. + +Task-number: QTBUG-2148, QTBUG-19947 +Reviewed-by: Eskil +--- + src/gui/text/qfontdatabase_x11.cpp | 55 +++++++++++++++--------------------- + src/gui/text/qfontengine_x11.cpp | 22 ++++---------- + 2 files changed, 29 insertions(+), 48 deletions(-) + +diff --git a/src/gui/text/qfontdatabase_x11.cpp b/src/gui/text/qfontdatabase_x11.cpp +index 754334c..958daa2 100644 +--- a/src/gui/text/qfontdatabase_x11.cpp ++++ b/src/gui/text/qfontdatabase_x11.cpp +@@ -1566,9 +1566,8 @@ static FcPattern *getFcPattern(const QFontPrivate *fp, int script, const QFontDe + + qt_addPatternProps(pattern, fp->screen, script, request); + +- FcDefaultSubstitute(pattern); + FcConfigSubstitute(0, pattern, FcMatchPattern); +- FcConfigSubstitute(0, pattern, FcMatchFont); ++ FcDefaultSubstitute(pattern); + + // these should only get added to the pattern _after_ substitution + // append the default fallback font for the specified script +@@ -1606,35 +1605,20 @@ static void FcFontSetRemove(FcFontSet *fs, int at) + memmove(fs->fonts + at, fs->fonts + at + 1, len); + } + +-static QFontEngine *tryPatternLoad(FcPattern *p, int screen, +- const QFontDef &request, int script, FcPattern **matchedPattern = 0) ++static QFontEngine *tryPatternLoad(FcPattern *match, int screen, ++ const QFontDef &request, int script) + { + #ifdef FONT_MATCH_DEBUG + FcChar8 *fam; +- FcPatternGetString(p, FC_FAMILY, 0, &fam); ++ FcPatternGetString(match, FC_FAMILY, 0, &fam); + FM_DEBUG("==== trying %s\n", fam); + #endif + FM_DEBUG("passes charset test\n"); +- FcPattern *pattern = FcPatternDuplicate(p); +- // add properties back in as the font selected from the +- // list doesn't contain them. +- qt_addPatternProps(pattern, screen, script, request); +- +- FcConfigSubstitute(0, pattern, FcMatchPattern); +- FcDefaultSubstitute(pattern); +- FcResult res; +- FcPattern *match = FcFontMatch(0, pattern, &res); +- +- if (matchedPattern) +- *matchedPattern = 0; + + QFontEngineX11FT *engine = 0; + if (!match) // probably no fonts available. + goto done; + +- if (matchedPattern) +- *matchedPattern = FcPatternDuplicate(match); +- + if (script != QUnicodeTables::Common) { + // skip font if it doesn't support the language we want + if (specialChars[script]) { +@@ -1673,11 +1657,6 @@ static QFontEngine *tryPatternLoad(FcPattern *p, int screen, + } + } + done: +- FcPatternDestroy(pattern); +- if (!engine && matchedPattern && *matchedPattern) { +- FcPatternDestroy(*matchedPattern); +- *matchedPattern = 0; +- } + return engine; + } + +@@ -1726,14 +1705,26 @@ static QFontEngine *loadFc(const QFontPrivate *fp, int script, const QFontDef &r + #endif + + QFontEngine *fe = 0; +- FcPattern *matchedPattern = 0; +- fe = tryPatternLoad(pattern, fp->screen, request, script, &matchedPattern); ++ FcResult res; ++ FcPattern *match = FcFontMatch(0, pattern, &res); ++ fe = tryPatternLoad(match, fp->screen, request, script); + if (!fe) { + FcFontSet *fs = qt_fontSetForPattern(pattern, request); + ++ if (match) { ++ FcPatternDestroy(match); ++ match = 0; ++ } ++ + if (fs) { +- for (int i = 0; !fe && i < fs->nfont; ++i) +- fe = tryPatternLoad(fs->fonts[i], fp->screen, request, script, &matchedPattern); ++ for (int i = 0; !fe && i < fs->nfont; ++i) { ++ match = FcFontRenderPrepare(NULL, pattern, fs->fonts[i]); ++ fe = tryPatternLoad(match, fp->screen, request, script); ++ if (fe) ++ break; ++ FcPatternDestroy(match); ++ match = 0; ++ } + FcFontSetDestroy(fs); + } + FM_DEBUG("engine for script %d is %s\n", script, fe ? fe->fontDef.family.toLatin1().data(): "(null)"); +@@ -1741,11 +1732,11 @@ static QFontEngine *loadFc(const QFontPrivate *fp, int script, const QFontDef &r + if (fe + && script == QUnicodeTables::Common + && !(request.styleStrategy & QFont::NoFontMerging) && !fe->symbol) { +- fe = new QFontEngineMultiFT(fe, matchedPattern, pattern, fp->screen, request); ++ fe = new QFontEngineMultiFT(fe, match, pattern, fp->screen, request); + } else { + FcPatternDestroy(pattern); +- if (matchedPattern) +- FcPatternDestroy(matchedPattern); ++ if (match) ++ FcPatternDestroy(match); + } + return fe; + } +diff --git a/src/gui/text/qfontengine_x11.cpp b/src/gui/text/qfontengine_x11.cpp +index e3bfa5d..74c0130 100644 +--- a/src/gui/text/qfontengine_x11.cpp ++++ b/src/gui/text/qfontengine_x11.cpp +@@ -863,11 +863,8 @@ glyph_t QFontEngineXLFD::glyphIndexToFreetypeGlyphIndex(glyph_t g) const + // Multi FT engine + // ------------------------------------------------------------------ + +-static QFontEngine *engineForPattern(FcPattern *pattern, const QFontDef &request, +- int screen) ++static QFontEngine *engineForPattern(FcPattern *match, const QFontDef &request, int screen) + { +- FcResult res; +- FcPattern *match = FcFontMatch(0, pattern, &res); + QFontEngineX11FT *engine = new QFontEngineX11FT(match, request, screen); + if (!engine->invalid()) + return engine; +@@ -879,9 +876,9 @@ static QFontEngine *engineForPattern(FcPattern *pattern, const QFontDef &request + } + + QFontEngineMultiFT::QFontEngineMultiFT(QFontEngine *fe, FcPattern *matchedPattern, FcPattern *p, int s, const QFontDef &req) +- : QFontEngineMulti(2), request(req), pattern(p), firstEnginePattern(matchedPattern), fontSet(0), screen(s) ++ : QFontEngineMulti(2), request(req), pattern(p), fontSet(0), screen(s) + { +- ++ firstEnginePattern = FcPatternDuplicate(matchedPattern); + engines[0] = fe; + engines.at(0)->ref.ref(); + fontDef = engines[0]->fontDef; +@@ -907,8 +904,6 @@ void QFontEngineMultiFT::loadEngine(int at) + extern QMutex *qt_fontdatabase_mutex(); + QMutexLocker locker(qt_fontdatabase_mutex()); + +- extern void qt_addPatternProps(FcPattern *pattern, int screen, int script, +- const QFontDef &request); + extern QFontDef qt_FcPatternToQFontDef(FcPattern *pattern, const QFontDef &); + extern FcFontSet *qt_fontSetForPattern(FcPattern *pattern, const QFontDef &request); + +@@ -940,22 +935,17 @@ void QFontEngineMultiFT::loadEngine(int at) + Q_ASSERT(at < engines.size()); + Q_ASSERT(engines.at(at) == 0); + +- FcPattern *pattern = FcPatternDuplicate(fontSet->fonts[at + firstFontIndex - 1]); +- qt_addPatternProps(pattern, screen, QUnicodeTables::Common, request); +- +- QFontDef fontDef = qt_FcPatternToQFontDef(pattern, this->request); ++ FcPattern *match = FcFontRenderPrepare(NULL, pattern, fontSet->fonts[at + firstFontIndex - 1]); ++ QFontDef fontDef = qt_FcPatternToQFontDef(match, this->request); + + // note: we use -1 for the script to make sure that we keep real + // FT engines separate from Multi engines in the font cache + QFontCache::Key key(fontDef, -1, screen); + QFontEngine *fontEngine = QFontCache::instance()->findEngine(key); + if (!fontEngine) { +- FcConfigSubstitute(0, pattern, FcMatchPattern); +- FcDefaultSubstitute(pattern); +- fontEngine = engineForPattern(pattern, request, screen); ++ fontEngine = engineForPattern(match, request, screen); + QFontCache::instance()->insertEngine(key, fontEngine); + } +- FcPatternDestroy(pattern); + fontEngine->ref.ref(); + engines[at] = fontEngine; + } +-- +1.7.4.1 + diff --git a/qt-everywhere-opensource-src-4.7.x-bz#705348-fontrendering.patch b/qt-everywhere-opensource-src-4.7.x-bz#705348-fontrendering.patch deleted file mode 100644 index 3ba8bfe..0000000 --- a/qt-everywhere-opensource-src-4.7.x-bz#705348-fontrendering.patch +++ /dev/null @@ -1,207 +0,0 @@ ---- a/src/gui/text/qfontdatabase_x11.cpp -+++ a/src/gui/text/qfontdatabase_x11.cpp -@@ -1547,7 +1547,6 @@ static FcPattern *getFcPattern(const QFontPrivate *fp, int script, const QFontDe - - FcDefaultSubstitute(pattern); - FcConfigSubstitute(0, pattern, FcMatchPattern); -- FcConfigSubstitute(0, pattern, FcMatchFont); - - // these should only get added to the pattern _after_ substitution - // append the default fallback font for the specified script -@@ -1585,35 +1584,20 @@ static void FcFontSetRemove(FcFontSet *fs, int at) - memmove(fs->fonts + at, fs->fonts + at + 1, len); - } - --static QFontEngine *tryPatternLoad(FcPattern *p, int screen, -- const QFontDef &request, int script, FcPattern **matchedPattern = 0) -+static QFontEngine *tryPatternLoad(FcPattern *match, int screen, -+ const QFontDef &request, int script) - { - #ifdef FONT_MATCH_DEBUG - FcChar8 *fam; -- FcPatternGetString(p, FC_FAMILY, 0, &fam); -+ FcPatternGetString(match, FC_FAMILY, 0, &fam); - FM_DEBUG("==== trying %s\n", fam); - #endif - FM_DEBUG("passes charset test\n"); -- FcPattern *pattern = FcPatternDuplicate(p); -- // add properties back in as the font selected from the -- // list doesn't contain them. -- qt_addPatternProps(pattern, screen, script, request); -- -- FcConfigSubstitute(0, pattern, FcMatchPattern); -- FcDefaultSubstitute(pattern); -- FcResult res; -- FcPattern *match = FcFontMatch(0, pattern, &res); -- -- if (matchedPattern) -- *matchedPattern = 0; - - QFontEngineX11FT *engine = 0; - if (!match) // probably no fonts available. - goto done; - -- if (matchedPattern) -- *matchedPattern = FcPatternDuplicate(match); -- - if (script != QUnicodeTables::Common) { - // skip font if it doesn't support the language we want - if (specialChars[script]) { -@@ -1652,11 +1636,6 @@ static QFontEngine *tryPatternLoad(FcPattern *p, int screen, - } - } - done: -- FcPatternDestroy(pattern); -- if (!engine && matchedPattern && *matchedPattern) { -- FcPatternDestroy(*matchedPattern); -- *matchedPattern = 0; -- } - return engine; - } - -@@ -1705,14 +1684,22 @@ static QFontEngine *loadFc(const QFontPrivate *fp, int script, const QFontDef &r - #endif - - QFontEngine *fe = 0; -- FcPattern *matchedPattern = 0; -- fe = tryPatternLoad(pattern, fp->screen, request, script, &matchedPattern); -+ FcResult res; -+ FcPattern *match = FcFontMatch(0, pattern, &res); -+ fe = tryPatternLoad(match, fp->screen, request, script); - if (!fe) { - FcFontSet *fs = qt_fontSetForPattern(pattern, request); - -+ match = 0; - if (fs) { -- for (int i = 0; !fe && i < fs->nfont; ++i) -- fe = tryPatternLoad(fs->fonts[i], fp->screen, request, script, &matchedPattern); -+ for (int i = 0; i < fs->nfont; ++i) { -+ match = FcFontRenderPrepare (NULL, pattern, fs->fonts[i]); -+ fe = tryPatternLoad(match, fp->screen, request, script); -+ if (fe) -+ break; -+ FcPatternDestroy (match); -+ match = 0; -+ } - FcFontSetDestroy(fs); - } - FM_DEBUG("engine for script %d is %s\n", script, fe ? fe->fontDef.family.toLatin1().data(): "(null)"); -@@ -1720,11 +1707,11 @@ static QFontEngine *loadFc(const QFontPrivate *fp, int script, const QFontDef &r - if (fe - && script == QUnicodeTables::Common - && !(request.styleStrategy & QFont::NoFontMerging) && !fe->symbol) { -- fe = new QFontEngineMultiFT(fe, matchedPattern, pattern, fp->screen, request); -+ fe = new QFontEngineMultiFT(fe, pattern, fp->screen, request); - } else { - FcPatternDestroy(pattern); -- if (matchedPattern) -- FcPatternDestroy(matchedPattern); -+ if (match) -+ FcPatternDestroy(match); - } - return fe; - } ---- a/src/gui/text/qfontengine_x11.cpp -+++ a/src/gui/text/qfontengine_x11.cpp -@@ -863,11 +863,9 @@ glyph_t QFontEngineXLFD::glyphIndexToFreetypeGlyphIndex(glyph_t g) const - // Multi FT engine - // ------------------------------------------------------------------ - --static QFontEngine *engineForPattern(FcPattern *pattern, const QFontDef &request, -+static QFontEngine *engineForPattern(FcPattern *match, const QFontDef &request, - int screen) - { -- FcResult res; -- FcPattern *match = FcFontMatch(0, pattern, &res); - QFontEngineX11FT *engine = new QFontEngineX11FT(match, request, screen); - if (!engine->invalid()) - return engine; -@@ -878,8 +876,8 @@ static QFontEngine *engineForPattern(FcPattern *pattern, const QFontDef &request - return fe; - } - --QFontEngineMultiFT::QFontEngineMultiFT(QFontEngine *fe, FcPattern *matchedPattern, FcPattern *p, int s, const QFontDef &req) -- : QFontEngineMulti(2), request(req), pattern(p), firstEnginePattern(matchedPattern), fontSet(0), screen(s) -+QFontEngineMultiFT::QFontEngineMultiFT(QFontEngine *fe, FcPattern *p, int s, const QFontDef &req) -+ : QFontEngineMulti(2), request(req), pattern(p), fontSet(0), screen(s) - { - - engines[0] = fe; -@@ -895,8 +893,6 @@ QFontEngineMultiFT::~QFontEngineMultiFT() - QMutexLocker locker(qt_fontdatabase_mutex()); - - FcPatternDestroy(pattern); -- if (firstEnginePattern) -- FcPatternDestroy(firstEnginePattern); - if (fontSet) - FcFontSetDestroy(fontSet); - } -@@ -907,8 +903,6 @@ void QFontEngineMultiFT::loadEngine(int at) - extern QMutex *qt_fontdatabase_mutex(); - QMutexLocker locker(qt_fontdatabase_mutex()); - -- extern void qt_addPatternProps(FcPattern *pattern, int screen, int script, -- const QFontDef &request); - extern QFontDef qt_FcPatternToQFontDef(FcPattern *pattern, const QFontDef &); - extern FcFontSet *qt_fontSetForPattern(FcPattern *pattern, const QFontDef &request); - -@@ -926,36 +920,24 @@ void QFontEngineMultiFT::loadEngine(int at) - return; - } - -- if (firstEnginePattern) { -- -- if (!FcPatternEqual(firstEnginePattern, fontSet->fonts[0])) -- firstFontIndex = 0; -- -- FcPatternDestroy(firstEnginePattern); -- firstEnginePattern = 0; -- } -- - engines.resize(fontSet->nfont + 1 - firstFontIndex); - } - Q_ASSERT(at < engines.size()); - Q_ASSERT(engines.at(at) == 0); - -- FcPattern *pattern = FcPatternDuplicate(fontSet->fonts[at + firstFontIndex - 1]); -- qt_addPatternProps(pattern, screen, QUnicodeTables::Common, request); -+ FcPattern *match = FcFontRenderPrepare (NULL, pattern, fontSet->fonts[at + firstFontIndex - 1]); - -- QFontDef fontDef = qt_FcPatternToQFontDef(pattern, this->request); -+ QFontDef fontDef = qt_FcPatternToQFontDef(match, this->request); - - // note: we use -1 for the script to make sure that we keep real - // FT engines separate from Multi engines in the font cache - QFontCache::Key key(fontDef, -1, screen); - QFontEngine *fontEngine = QFontCache::instance()->findEngine(key); - if (!fontEngine) { -- FcConfigSubstitute(0, pattern, FcMatchPattern); -- FcDefaultSubstitute(pattern); -- fontEngine = engineForPattern(pattern, request, screen); -+ fontEngine = engineForPattern(match, request, screen); - QFontCache::instance()->insertEngine(key, fontEngine); - } -- FcPatternDestroy(pattern); -+ FcPatternDestroy(match); - fontEngine->ref.ref(); - engines[at] = fontEngine; - } ---- a/src/gui/text/qfontengine_x11_p.h -+++ a/src/gui/text/qfontengine_x11_p.h -@@ -140,7 +140,7 @@ private: - class Q_GUI_EXPORT QFontEngineMultiFT : public QFontEngineMulti - { - public: -- QFontEngineMultiFT(QFontEngine *fe, FcPattern *firstEnginePattern, FcPattern *p, int s, const QFontDef &request); -+ QFontEngineMultiFT(QFontEngine *fe, FcPattern *p, int s, const QFontDef &request); - ~QFontEngineMultiFT(); - - void loadEngine(int at); -@@ -148,7 +148,6 @@ public: - private: - QFontDef request; - FcPattern *pattern; -- FcPattern *firstEnginePattern; - FcFontSet *fontSet; - int screen; - int firstFontIndex; // first font in fontset diff --git a/qt.spec b/qt.spec index 9bb2009..d61e2d7 100644 --- a/qt.spec +++ b/qt.spec @@ -18,7 +18,7 @@ Summary: Qt toolkit Name: qt Epoch: 1 Version: 4.7.3 -Release: 4%{?dist} +Release: 5%{?dist} # See LGPL_EXCEPTIONS.txt, LICENSE.GPL3, respectively, for exception details License: (LGPLv2 with exceptions or GPLv3 with exceptions) and ASL 2.0 and BSD and FTL and MIT @@ -91,15 +91,14 @@ Patch64: qt-everywhere-opensource-src-4.7.1-QTBUG-14467.patch # fix QTreeView crash triggered by KPackageKit (patch by David Faure) Patch65: qt-everywhere-opensource-src-4.7.1-qtreeview-kpackagekit-crash.patch -# # bz#705348, Lohit fonts accidentally disable the bytecode interpreter for Qt -Patch66: qt-everywhere-opensource-src-4.7.x-bz#705348-fontrendering.patch - # upstream patches # adds debug support to webkit/JavaScriptCore # UPSTREAM ME Patch105: qt-everywhere-opensource-src-4.7.1-webkit_debug_javascriptcore.patch # Fix QNetworkConfigurationManager crash due to null private pointer. (QTBUG-17305, rhbz#682656) Patch106: http://qt.gitorious.org/qt/qt/commit/4d3b9aa83cf7f6d9f9b88d9936e5980629daac2a.patch +# bz#705348, per-font autohint fontconfig directives globally disable the bytecode interpreter +Patch107: QTBUG-19947-fontconfig-1.patch # kde-qt git patches Patch202: 0002-This-patch-makes-override-redirect-windows-popup-men.patch @@ -513,11 +512,12 @@ Qt libraries used for drawing widgets and OpenGL items. %patch63 -p1 -b .bpp24 %patch64 -p1 -b .QTBUG-14467 %patch65 -p1 -b .qtreeview-kpackagekit-crash -%patch66 -p1 -b .bz#705348-fontrendering # upstream patches %patch105 -p1 -b .webkit_debug_javascriptcore %patch106 -p1 -b .QNetworkConfigurationManager-null-pointer +%patch107 -p1 -b .QTBUG-19947-fontconfig-1 + # kde-qt branch %if 0%{?kde_qt} @@ -1246,6 +1246,9 @@ fi %changelog +* Mon Jun 20 2011 Rex Dieter 1:4.7.3-5 +- updated fontconfig patch (#705347, QTBUG-19947) + * Tue Jun 07 2011 Than Ngo - 1:4.7.3-4 - bz#705348, Lohit fonts accidentally disable the bytecode interpreter for Qt