diff -Nur qt4-x11-4.5.0-orig/src/gui/text/qfontdatabase_x11.cpp qt4-x11-4.5.0/src/gui/text/qfontdatabase_x11.cpp
--- qt4-x11-4.5.0-orig/src/gui/text/qfontdatabase_x11.cpp	2009-04-25 18:19:51.000000000 +0900
+++ qt4-x11-4.5.0/src/gui/text/qfontdatabase_x11.cpp	2009-04-25 20:06:14.000000000 +0900
@@ -781,6 +781,13 @@
                        ? QFont::StyleOblique
                        : QFont::StyleNormal);
 
+    FcBool embolden;
+#ifdef FC_EMBOLDEN
+    if (FcPatternGetBool(pattern, FC_EMBOLDEN, 0, &embolden) != FcResultMatch)
+#endif
+       embolden = false;
+    if(embolden)
+        fontDef.weight=QFont::Bold;
 
     FcBool scalable;
     if (FcPatternGetBool(pattern, FC_SCALABLE, 0, &scalable) != FcResultMatch)
@@ -1327,10 +1334,25 @@
                 if (! enc) continue; // should not happen either
 
                 QtFontStyle::Key key = style->key;
-
+                // does this style have a bold equivalent?
+                key.weight = QFont::Bold;
+                QtFontStyle *equiv = foundry->style(key);
+                if (!equiv) {
+                    // let's fake one...
+                    equiv = foundry->style(key, true);
+                    equiv->smoothScalable = true;
+
+                    QtFontSize *equiv_size = equiv->pixelSize(SMOOTH_SCALABLE, true);
+                    QtFontEncoding *equiv_enc = equiv_size->encodingID(-1, 0, 0, 0, 0, true);
+
+                    // keep the same pitch
+                    equiv_enc->pitch = enc->pitch;
+                    key.weight = QFont::Normal;
+                }
                 // does this style have an italic equivalent?
                 key.style = QFont::StyleItalic;
-                QtFontStyle *equiv = foundry->style(key);
+//                QtFontStyle *equiv = foundry->style(key);
+                equiv = foundry->style( key );
                 if (equiv) continue;
 
                 // does this style have an oblique equivalent?
@@ -1447,7 +1469,10 @@
     else if (request.weight < (QFont::Bold + QFont::Black) / 2)
         weight_value = FC_WEIGHT_BOLD;
     FcPatternAddInteger(pattern, FC_WEIGHT, weight_value);
-
+#ifdef FC_EMBOLDEN
+    if(request.weight == QFont::Bold)
+        FcPatternAddBool(pattern, FC_EMBOLDEN, true);
+#endif
     int slant_value = FC_SLANT_ROMAN;
     if (request.style == QFont::StyleItalic)
         slant_value = FC_SLANT_ITALIC;
diff -Nur qt4-x11-4.5.0-orig/src/gui/text/qfontengine_ft.cpp qt4-x11-4.5.0/src/gui/text/qfontengine_ft.cpp
--- qt4-x11-4.5.0-orig/src/gui/text/qfontengine_ft.cpp	2009-02-26 06:32:37.000000000 +0900
+++ qt4-x11-4.5.0/src/gui/text/qfontengine_ft.cpp	2009-04-25 20:04:29.000000000 +0900
@@ -80,6 +80,11 @@
 #include FT_ERRORS_H
 #endif
 
+#ifdef FT_SYNTHESIS_H
+#define HAVE_FT_GLYPHSLOT_EMBOLDEN 1
+#include FT_SYNTHESIS_H
+#endif
+
 QT_BEGIN_NAMESPACE
 
 /*
@@ -606,7 +611,8 @@
     kerning_pairs_loaded = false;
     transform = false;
     antialias = true;
+    embolden = false;
     freetype = 0;
     default_load_flags = FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH;
     default_hint_style = HintNone;
     subpixelType = Subpixel_None;
@@ -632,11 +638,12 @@
         freeServerGlyphSet(transformedGlyphSets.at(i).id);
 }
 
-bool QFontEngineFT::init(FaceId faceId, bool antialias, GlyphFormat format)
+bool QFontEngineFT::init(FaceId faceId, bool antialias, GlyphFormat format, bool embolden)
 {
     defaultFormat = format;
     this->antialias = antialias;
 
+    this->embolden = embolden;
     if (!antialias)
         glyphFormat = QFontEngineGlyphCache::Raster_Mono;
     else if (format == Format_A8)
@@ -729,7 +736,6 @@
     Glyph *g = set->glyph_data.value(glyph);
     if (g)
         return g;
-
     int load_flags = FT_LOAD_DEFAULT | default_load_flags;
     if (set->outline_drawing)
         load_flags = FT_LOAD_NO_BITMAP;
@@ -768,7 +774,6 @@
         g->uploadedToServer = false;
         g->data = 0;
     }
-
     FT_GlyphSlot slot = face->glyph;
     int left  = slot->metrics.horiBearingX;
     int right = slot->metrics.horiBearingX + slot->metrics.width;
@@ -922,6 +927,52 @@
 
     uchar *glyph_buffer = 0;
     int glyph_buffer_size = 0;
+    if(embolden && (face->style_flags & FT_STYLE_FLAG_BOLD) == 0)
+    {
+        //if not antialias and no bitmap, for example, dongwensong English characters.
+        //for DongWenSong Chinese character, if it not antialias, it will use bitmap output.
+        if(!antialias && slot->format == FT_GLYPH_FORMAT_OUTLINE)
+        {
+            int left  = slot->metrics.horiBearingX;
+            int right = slot->metrics.horiBearingX + slot->metrics.width;
+            int top    = slot->metrics.horiBearingY;
+            int bottom = slot->metrics.horiBearingY - slot->metrics.height;
+            int hpixels = TRUNC(right - left)+4;
+            if (hsubpixel)
+                hpixels = hpixels*3 + 8;
+            int width = hpixels;
+            int height = TRUNC(top - bottom);
+            if (hsubpixel) {
+                width /= 3;
+            }
+            int pitch = (format == Format_Mono ? ((width + 31) & ~31) >> 3 :
+                    (format == Format_A8 ? (width + 3) & ~3 : width * 4));
+            int size = pitch * height;
+            uchar *glyph_buffer = new uchar[size];
+
+            slot->bitmap.rows = height*vfactor;
+            slot->bitmap.width = hpixels;
+            slot->bitmap.pitch = format == Format_Mono ? (((width + 31) & ~31) >> 3) : ((slot->bitmap.width + 3) & ~3);
+            slot->bitmap.buffer = new uchar[slot->bitmap.rows*slot->bitmap.pitch];
+            if (!hsubpixel && vfactor == 1)
+                slot->bitmap.buffer = glyph_buffer;
+            else
+                slot->bitmap.buffer = new uchar[slot->bitmap.rows*slot->bitmap.pitch];
+            memset(slot->bitmap.buffer, 0, slot->bitmap.rows*slot->bitmap.pitch);
+            slot->bitmap.pixel_mode = ft_pixel_mode_mono;
+            FT_Matrix matrix;
+            matrix.xx = (hsubpixel ? 3 : 1) << 16;
+            matrix.yy = vfactor << 16;
+            matrix.yx = matrix.xy = 0;
+            FT_Outline_Transform(&slot->outline, &matrix);
+            FT_Outline_Translate (&slot->outline, (hsubpixel ? -3*left +(4<<6) : -left), -bottom*vfactor);
+            FT_Outline_Get_Bitmap(qt_getFreetype(), &slot->outline, &slot->bitmap);
+            slot->format = FT_GLYPH_FORMAT_BITMAP;
+            FT_GlyphSlot_Embolden(slot);
+        }
+        else
+            FT_GlyphSlot_Embolden(slot);
+    }
 #if defined(QT_USE_FREETYPE_LCDFILTER)
     if (slot->format == FT_GLYPH_FORMAT_OUTLINE && (hsubpixel || vfactor != 1)) {
         FT_Library_SetLcdFilter(library, (FT_LcdFilter)lcdFilterType);
@@ -991,6 +1042,8 @@
     top = CEIL(top);
 
     int hpixels = TRUNC(right - left);
+    if(!antialias && embolden && (face->style_flags & FT_STYLE_FLAG_BOLD) == 0 && transform)
+        hpixels += 4;
     if (hsubpixel)
         hpixels = hpixels*3 + 8;
     info.width = hpixels;
@@ -1492,6 +1545,8 @@
         FT_GlyphSlot g = face->glyph;
         if (g->format != FT_GLYPH_FORMAT_OUTLINE)
             continue;
+        if (embolden && (face->style_flags & FT_STYLE_FLAG_BOLD) == 0)
+            FT_GlyphSlot_Embolden (g);
         QFreetypeFace::addGlyphToPath(face, g, positions[gl], path, xsize, ysize);
     }
     unlockFace();
diff -Nur qt4-x11-4.5.0-orig/src/gui/text/qfontengine_ft_p.h qt4-x11-4.5.0/src/gui/text/qfontengine_ft_p.h
--- qt4-x11-4.5.0-orig/src/gui/text/qfontengine_ft_p.h	2009-02-26 06:32:37.000000000 +0900
+++ qt4-x11-4.5.0/src/gui/text/qfontengine_ft_p.h	2009-04-25 20:04:20.000000000 +0900
@@ -262,7 +262,7 @@
     QFontEngineFT(const QFontDef &fd);
     virtual ~QFontEngineFT();
 
-    bool init(FaceId faceId, bool antiaalias, GlyphFormat defaultFormat = Format_None);
+    bool init(FaceId faceId, bool antiaalias, GlyphFormat defaultFormat = Format_None, bool embolden=false);
 
     virtual HB_Error getPointInOutline(HB_Glyph glyph, int flags, hb_uint32 point, HB_Fixed *xpos, HB_Fixed *ypos, hb_uint32 *nPoints);
 
@@ -287,6 +287,7 @@
     HintStyle default_hint_style;
 
     bool antialias;
+    bool embolden;
     bool transform;
     SubpixelAntialiasingType subpixelType;
     int lcdFilterType;
diff -Nur qt4-x11-4.5.0-orig/src/gui/text/qfontengine_x11.cpp qt4-x11-4.5.0/src/gui/text/qfontengine_x11.cpp
--- qt4-x11-4.5.0-orig/src/gui/text/qfontengine_x11.cpp	2009-02-26 06:32:37.000000000 +0900
+++ qt4-x11-4.5.0/src/gui/text/qfontengine_x11.cpp	2009-04-25 20:06:26.000000000 +0900
@@ -964,7 +964,7 @@
 
 
 
-Q_GUI_EXPORT void qt_x11ft_convert_pattern(FcPattern *pattern, QByteArray *file_name, int *index, bool *antialias)
+static void qt_x11ft_convert_pattern(FcPattern *pattern, QByteArray *file_name, int *index, bool *antialias, bool *embolden)
 {
     FcChar8 *fileName;
     FcPatternGetString(pattern, FC_FILE, 0, &fileName);
@@ -974,6 +974,11 @@
     FcBool b;
     if (FcPatternGetBool(pattern, FC_ANTIALIAS, 0, &b) == FcResultMatch)
         *antialias = b;
+    b = false;
+#ifdef FC_EMBOLDEN
+    if (FcPatternGetBool (pattern,FC_EMBOLDEN, 0, &b) == FcResultMatch)
+#endif
+        *embolden = b;
 }
 
 
@@ -983,9 +988,10 @@
 //     FcPatternPrint(pattern);
 
     bool antialias = X11->fc_antialias;
+    bool embolden = false;
     QByteArray file_name;
     int face_index;
-    qt_x11ft_convert_pattern(pattern, &file_name, &face_index, &antialias);
+    qt_x11ft_convert_pattern(pattern, &file_name, &face_index, &antialias, &embolden);
     QFontEngine::FaceId face_id;
     face_id.filename = file_name;
     face_id.index = face_index;
@@ -1101,8 +1107,7 @@
             defaultFormat = Format_Mono;
     }
 #endif
-
-    if (!init(face_id, antialias, defaultFormat)) {
+    if (!init(face_id, antialias, defaultFormat, embolden)) {
         FcPatternDestroy(pattern);
         return;
     }
