Index: configure.in =================================================================== RCS file: /cvs/cairo/cairo/configure.in,v retrieving revision 1.130 diff -u -r1.130 configure.in --- configure.in 19 Aug 2005 00:22:23 -0000 1.130 +++ configure.in 20 Aug 2005 14:21:39 -0000 @@ -339,6 +339,7 @@ #include FT_FREETYPE_H]) AC_DEFINE_UNQUOTED(HAVE_FT_BITMAP_SIZE_Y_PPEM,$HAVE_FT_BITMAP_SIZE_Y_PPEM, [FT_Bitmap_Size structure includes y_ppem field]) + AC_CHECK_FUNCS(FT_GlyphSlot_Embolden) LIBS="$temp_save_libs" CFLAGS="$temp_save_cflags" fi Index: src/cairo-ft-font.c =================================================================== RCS file: /cvs/cairo/cairo/src/cairo-ft-font.c,v retrieving revision 1.103 diff -u -r1.103 cairo-ft-font.c --- src/cairo-ft-font.c 18 Aug 2005 22:50:36 -0000 1.103 +++ src/cairo-ft-font.c 20 Aug 2005 14:21:55 -0000 @@ -48,6 +48,9 @@ #include FT_FREETYPE_H #include FT_OUTLINE_H #include FT_IMAGE_H +#if HAVE_FT_GLYPHSLOT_EMBOLDEN +#include FT_SYNTHESIS_H +#endif #define DOUBLE_TO_26_6(d) ((FT_F26Dot6)((d) * 64.0)) #define DOUBLE_FROM_26_6(t) ((double)(t) / 64.0) @@ -61,8 +64,11 @@ * then convert into FreeType terms. */ #define PRIVATE_FLAG_HINT_METRICS (0x01 << 24) +#define PRIVATE_FLAG_EMBOLDEN (0x02 << 24) #define PRIVATE_FLAGS_MASK (0xff << 24) +#define LOAD_FLAGS(flags) (flags & ~PRIVATE_FLAGS_MASK) + /* This is the max number of FT_face objects we keep open at once */ #define MAX_OPEN_FACES 10 @@ -1191,11 +1197,18 @@ _cairo_ft_unscaled_font_set_scale (unscaled, &val->key.scale); - if (FT_Load_Glyph (face, val->key.index, val->key.flags & ~PRIVATE_FLAGS_MASK) != 0) { + if (FT_Load_Glyph (face, val->key.index, LOAD_FLAGS(val->key.flags)) != 0) { status = CAIRO_STATUS_NO_MEMORY; goto FAIL; } +#if HAVE_FT_GLYPHSLOT_EMBOLDEN + if (val->key.flags & PRIVATE_FLAG_EMBOLDEN && + ((face->style_flags & FT_STYLE_FLAG_BOLD) == 0)) { + FT_GlyphSlot_Embolden(glyphslot); + } +#endif + if (unscaled->x_scale == 0) x_factor = 0; else @@ -1295,6 +1308,7 @@ _get_pattern_load_flags (FcPattern *pattern) { FcBool antialias, vertical_layout, hinting, autohint; + FcBool global_advance, embolden; int rgba; #ifdef FC_HINT_STYLE int hintstyle; @@ -1376,10 +1390,23 @@ if (FcPatternGetBool (pattern, FC_VERTICAL_LAYOUT, 0, &vertical_layout) != FcResultMatch) vertical_layout = FcFalse; - + if (vertical_layout) load_flags |= FT_LOAD_VERTICAL_LAYOUT; - + + if (FcPatternGetBool (pattern, + FC_GLOBAL_ADVANCE, 0, &global_advance) != FcResultMatch) + global_advance = FcTrue; + + if (!global_advance) + load_flags |= FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH; + + if (FcPatternGetBool (pattern, FC_EMBOLDEN, 0, &embolden) != FcResultMatch) + embolden = FcFalse; + + if (embolden) + load_flags |= PRIVATE_FLAG_EMBOLDEN; + return load_flags; } @@ -1540,7 +1567,7 @@ if (!unscaled) goto FREE_RESOLVED; - load_flags = _get_pattern_load_flags (pattern); + load_flags = _get_pattern_load_flags (resolved); new_font = _cairo_ft_scaled_font_create (unscaled, &toy_face->base, @@ -2139,7 +2166,7 @@ 0, DOUBLE_TO_16_16 (-1.0), }; - error = FT_Load_Glyph (scaled_font->unscaled->face, glyphs[i].index, scaled_font->load_flags | FT_LOAD_NO_BITMAP); + error = FT_Load_Glyph (scaled_font->unscaled->face, glyphs[i].index, LOAD_FLAGS(scaled_font->load_flags) | FT_LOAD_NO_BITMAP); /* XXX: What to do in this error case? */ if (error) continue; @@ -2147,6 +2174,12 @@ if (glyph->format == ft_glyph_format_bitmap) continue; +#if HAVE_FT_GLYPHSLOT_EMBOLDEN + if (scaled_font->load_flags & PRIVATE_FLAG_EMBOLDEN && + ((face->style_flags & FT_STYLE_FLAG_BOLD) == 0)) { + FT_GlyphSlot_Embolden(glyph); + } +#endif /* Font glyphs have an inverted Y axis compared to cairo. */ FT_Outline_Transform (&glyph->outline, &invert_y); FT_Outline_Translate (&glyph->outline,