b68a9b3
diff --git a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
b68a9b3
index dd715b73..3d88af3a 100644
b68a9b3
--- a/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
b68a9b3
+++ b/src/platformsupport/fontdatabases/fontconfig/qfontconfigdatabase.cpp
b68a9b3
@@ -954,6 +954,7 @@ void QFontconfigDatabase::setupFontEngine(QFontEngineFT *engine, const QFontDef
5df6fdd
     QFontEngine::GlyphFormat format;
5df6fdd
     // try and get the pattern
5df6fdd
     FcPattern *pattern = FcPatternCreate();
5df6fdd
+    FcPattern *match = NULL;
b68a9b3
5df6fdd
     FcValue value;
5df6fdd
     value.type = FcTypeString;
b68a9b3
@@ -980,7 +981,41 @@ void QFontconfigDatabase::setupFontEngine(QFontEngineFT *engine, const QFontDef
5df6fdd
     FcConfigSubstitute(nullptr, pattern, FcMatchPattern);
5df6fdd
     FcDefaultSubstitute(pattern);
b68a9b3
5df6fdd
-    FcPattern *match = FcFontMatch(nullptr, pattern, &result);
5df6fdd
+    if (!fid.filename.isEmpty()) {
5df6fdd
+        // FC_INDEX is ignored during processing in FcFontMatch.
5df6fdd
+        // So iterate FcPatterns directly and find it out.
5df6fdd
+        FcFontSet *fcsets[2], *fcfs;
5df6fdd
+
5df6fdd
+        fcsets[0] = FcConfigGetFonts(nullptr, FcSetSystem);
5df6fdd
+        fcsets[1] = FcConfigGetFonts(nullptr, FcSetApplication);
5df6fdd
+        for (int nset = 0; nset < 2; nset++) {
5df6fdd
+            fcfs = fcsets[nset];
5df6fdd
+            for (int fnum = 0; fnum < fcfs->nfont; fnum++) {
5df6fdd
+                FcPattern *fcpat = fcfs->fonts[fnum];
5df6fdd
+                FcChar8 *fcfile;
5df6fdd
+                FcBool variable;
5df6fdd
+                int fcindex;
5df6fdd
+
5df6fdd
+                // FIXME: Ignore a FcPattern which has variable=true at this point.
5df6fdd
+                if (FcPatternGetBool(fcpat, FC_VARIABLE, 0, &variable) == FcResultMatch &&
5df6fdd
+                    variable == FcTrue)
5df6fdd
+                    continue;
5df6fdd
+                if (FcPatternGetString(fcpat, FC_FILE, 0, &fcfile) == FcResultMatch &&
5df6fdd
+                    FcPatternGetInteger(fcpat, FC_INDEX, 0, &fcindex) == FcResultMatch) {
5df6fdd
+                    QByteArray f = QByteArray::fromRawData((const char *)fcfile,
5df6fdd
+                                                           strlen((const char *)fcfile));
5df6fdd
+                    if (f == fid.filename && fcindex == fid.index) {
5df6fdd
+                        // We found it.
5df6fdd
+                        match = FcFontRenderPrepare(nullptr, pattern, fcpat);
5df6fdd
+                        goto bail;
5df6fdd
+                    }
5df6fdd
+                }
5df6fdd
+            }
5df6fdd
+        }
5df6fdd
+    }
5df6fdd
+bail:
5df6fdd
+    if (!match)
5df6fdd
+        match = FcFontMatch(nullptr, pattern, &result);
5df6fdd
     if (match) {
5df6fdd
         engine->setDefaultHintStyle(defaultHintStyleFromMatch((QFont::HintingPreference)fontDef.hintingPreference, match, useXftConf));
b68a9b3
b68a9b3
@@ -1000,6 +1035,11 @@ void QFontconfigDatabase::setupFontEngine(QFontEngineFT *engine, const QFontDef
c90eb37
                 antialias = fc_antialias;
c90eb37
         }
b68a9b3
c90eb37
+        FcBool embolden;
c90eb37
+        engine->auto_embolden = true;
c90eb37
+        if (FcPatternGetBool(match, FC_EMBOLDEN, 0, &embolden) == FcResultMatch)
c90eb37
+            engine->embolden = embolden;
5df6fdd
+
c90eb37
         if (antialias) {
c90eb37
             QFontEngine::SubpixelAntialiasingType subpixelType = QFontEngine::Subpixel_None;
c90eb37
             if (!(fontDef.styleStrategy & QFont::NoSubpixelAntialias))
b68a9b3
diff --git a/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp b/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp
b68a9b3
index 52ce36b0..9626490b 100644
b68a9b3
--- a/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp
b68a9b3
+++ b/src/platformsupport/fontdatabases/freetype/qfontengine_ft.cpp
b68a9b3
@@ -681,6 +681,7 @@ QFontEngineFT::QFontEngineFT(const QFontDef &fd)
c90eb37
     kerning_pairs_loaded = false;
c90eb37
     transform = false;
c90eb37
     embolden = false;
c90eb37
+    auto_embolden = false;
c90eb37
     obliquen = false;
c90eb37
     antialias = true;
c90eb37
     freetype = nullptr;
b68a9b3
@@ -748,7 +749,7 @@ bool QFontEngineFT::init(FaceId faceId, bool antialias, GlyphFormat format,
c90eb37
         FT_Set_Transform(face, &matrix, nullptr);
c90eb37
         freetype->matrix = matrix;
5df6fdd
         // fake bold
c90eb37
-        if ((fontDef.weight >= QFont::Bold) && !(face->style_flags & FT_STYLE_FLAG_BOLD) && !FT_IS_FIXED_WIDTH(face) && !qEnvironmentVariableIsSet("QT_NO_SYNTHESIZED_BOLD")) {
c90eb37
+        if (!auto_embolden && (fontDef.weight >= QFont::Bold) && !(face->style_flags & FT_STYLE_FLAG_BOLD) && !FT_IS_FIXED_WIDTH(face) && !qEnvironmentVariableIsSet("QT_NO_SYNTHESIZED_BOLD")) {
5df6fdd
             if (const TT_OS2 *os2 = reinterpret_cast<const TT_OS2 *>(FT_Get_Sfnt_Table(face, ft_sfnt_os2))) {
b68a9b3
                 if (os2->usWeightClass < 700 &&
b68a9b3
                     (fontDef.pixelSize < 64 || qEnvironmentVariableIsSet("QT_NO_SYNTHESIZED_BOLD_LIMIT"))) {
b68a9b3
@@ -2104,6 +2105,7 @@ bool QFontEngineFT::initFromFontEngine(const QFontEngineFT *fe)
c90eb37
     antialias = fe->antialias;
c90eb37
     transform = fe->transform;
c90eb37
     embolden = fe->embolden;
c90eb37
+    auto_embolden = fe->auto_embolden;
c90eb37
     obliquen = fe->obliquen;
c90eb37
     subpixelType = fe->subpixelType;
c90eb37
     lcdFilterType = fe->lcdFilterType;
b68a9b3
diff --git a/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h b/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h
b68a9b3
index 2e3aef69..4372f913 100644
b68a9b3
--- a/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h
b68a9b3
+++ b/src/platformsupport/fontdatabases/freetype/qfontengine_ft_p.h
c90eb37
@@ -295,6 +295,7 @@ protected:
c90eb37
     bool cacheEnabled;
c90eb37
     bool forceAutoHint;
c90eb37
     bool stemDarkeningDriver;
c90eb37
+    bool auto_embolden;        // a flag to decide if embolden is set by fontconfig
b68a9b3
c90eb37
 private:
c90eb37
     friend class QFontEngineFTRawFont;