]> granicus.if.org Git - libass/commitdiff
Add glyph emboldening fallback
authorGrigori Goronzy <greg@blackbox>
Wed, 12 Aug 2009 03:26:55 +0000 (05:26 +0200)
committerGrigori Goronzy <greg@blackbox>
Wed, 12 Aug 2009 03:29:22 +0000 (05:29 +0200)
Fallback to embolden manually with FreeType in case a bold face was
requested, but no bold variant is available.  The glyphs are slightly
emboldened (much less than FT_GlyphSlot_Embolden would do) and the
metrics are not touched at all.

libass/ass_font.c

index e6da4bcee279e31a25a1750f944ac2b294943c05..b4e40468f0d5d7ba37623612ab59f9907e4c9239 100644 (file)
@@ -26,6 +26,7 @@
 #include FT_SYNTHESIS_H
 #include FT_GLYPH_H
 #include FT_TRUETYPE_TABLES_H
+#include FT_OUTLINE_H
 
 #include "ass.h"
 #include "ass_library.h"
@@ -367,6 +368,22 @@ static int ass_strike_outline_glyph(FT_Face face, ASS_Font *font,
     return 1;
 }
 
+/**
+ * Slightly embold a glyph without touching its metrics
+ */
+static void ass_glyph_embolden(FT_GlyphSlot slot)
+{
+    int str;
+
+    if (slot->format != FT_GLYPH_FORMAT_OUTLINE)
+        return;
+
+    str = FT_MulFix(slot->face->units_per_EM,
+                    slot->face->size->metrics.y_scale) / 64;
+
+    FT_Outline_Embolden(&slot->outline, str);
+}
+
 /**
  * \brief Get a glyph
  * \param ch character code
@@ -443,6 +460,11 @@ FT_Glyph ass_font_get_glyph(void *fontconfig_priv, ASS_Font *font,
         (font->desc.italic > 55)) {
         FT_GlyphSlot_Oblique(face->glyph);
     }
+
+    if (!(face->style_flags & FT_STYLE_FLAG_BOLD) &&
+        (font->desc.bold > 80)) {
+        ass_glyph_embolden(face->glyph);
+    }
 #endif
     error = FT_Get_Glyph(face->glyph, &glyph);
     if (error) {