]> granicus.if.org Git - libass/commitdiff
Add -ass-hinting option for setting font hinting method.
authoreugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>
Fri, 27 Apr 2007 14:25:36 +0000 (14:25 +0000)
committereugeni <eugeni@b3059339-0415-0410-9bf9-f77b7e298cf2>
Fri, 27 Apr 2007 14:25:36 +0000 (14:25 +0000)
It is possible to separately configure hinting for scaled and unscaled osd.
The default is native hinter for unscaled osd (only vo_gl at this point),
no hinting for vf_ass.

git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@23152 b3059339-0415-0410-9bf9-f77b7e298cf2

libass/ass.h
libass/ass_font.c
libass/ass_font.h
libass/ass_mp.c
libass/ass_mp.h
libass/ass_render.c

index 7cba671ffd4d860d438816833162554c17c469f9..2e1aa1ab96ebbae491f607bffb963a430e1566d6 100644 (file)
@@ -37,6 +37,13 @@ typedef struct ass_image_s {
        struct ass_image_s* next; // linked list
 } ass_image_t;
 
+/// Hinting type
+typedef enum {ASS_HINTING_NONE = 0,
+             ASS_HINTING_LIGHT,
+             ASS_HINTING_NORMAL,
+             ASS_HINTING_NATIVE
+} ass_hinting_t;
+
 /**
  * \brief initialize the library
  * \return library handle or NULL if failed
@@ -77,6 +84,7 @@ void ass_set_margins(ass_renderer_t* priv, int t, int b, int l, int r);
 void ass_set_use_margins(ass_renderer_t* priv, int use);
 void ass_set_aspect_ratio(ass_renderer_t* priv, double ar);
 void ass_set_font_scale(ass_renderer_t* priv, double font_scale);
+void ass_set_hinting(ass_renderer_t* priv, ass_hinting_t ht);
 
 /**
  * \brief set font lookup defaults
index 285ecde63a92212538cba304febbd829e758a6cc..57423d1dd7ebdf320e3b8f9ce4d98fdb5b68a667 100644 (file)
@@ -229,13 +229,14 @@ void ass_font_get_asc_desc(ass_font_t* font, uint32_t ch, int* asc, int* desc)
  * \brief Get a glyph
  * \param ch character code
  **/
-FT_Glyph ass_font_get_glyph(void* fontconfig_priv, ass_font_t* font, uint32_t ch)
+FT_Glyph ass_font_get_glyph(void* fontconfig_priv, ass_font_t* font, uint32_t ch, ass_hinting_t hinting)
 {
        int error;
        int index = 0;
        int i;
        FT_Glyph glyph;
        FT_Face face = 0;
+       int flags = 0;
 
        if (ch < 0x20)
                return 0;
@@ -264,7 +265,14 @@ FT_Glyph ass_font_get_glyph(void* fontconfig_priv, ass_font_t* font, uint32_t ch
        }
 #endif
 
-       error = FT_Load_Glyph(face, index, FT_LOAD_NO_BITMAP );
+       switch (hinting) {
+       case ASS_HINTING_NONE: flags = FT_LOAD_NO_HINTING; break;
+       case ASS_HINTING_LIGHT: flags = FT_LOAD_FORCE_AUTOHINT | FT_LOAD_TARGET_LIGHT; break;
+       case ASS_HINTING_NORMAL: flags = FT_LOAD_FORCE_AUTOHINT; break;
+       case ASS_HINTING_NATIVE: flags = 0; break;
+       }
+       
+       error = FT_Load_Glyph(face, index, FT_LOAD_NO_BITMAP | flags);
        if (error) {
                mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_ErrorLoadingGlyph);
                return 0;
index 5d986e9f0b287faec8bc7857d8a576432b07b2b7..e7793849fefbf31c912382f0bb64b663451b6d0e 100644 (file)
@@ -50,7 +50,7 @@ ass_font_t* ass_font_new(ass_library_t* library, FT_Library ftlibrary, void* fc_
 void ass_font_set_transform(ass_font_t* font, FT_Matrix* m, FT_Vector* v);
 void ass_font_set_size(ass_font_t* font, int size);
 void ass_font_get_asc_desc(ass_font_t* font, uint32_t ch, int* asc, int* desc);
-FT_Glyph ass_font_get_glyph(void* fontconfig_priv, ass_font_t* font, uint32_t ch);
+FT_Glyph ass_font_get_glyph(void* fontconfig_priv, ass_font_t* font, uint32_t ch, ass_hinting_t hinting);
 FT_Vector ass_font_get_kerning(ass_font_t* font, uint32_t c1, uint32_t c2);
 void ass_font_free(ass_font_t* font);
 
index e2c1092bcad7d01e99660d90b32c64fa4207f6f2..02f81e4c7f3f6257489c1024cd52922d7b80e3a9 100644 (file)
@@ -50,6 +50,7 @@ int ass_use_margins = 0;
 char* ass_color = NULL;
 char* ass_border_color = NULL;
 char* ass_styles_file = NULL;
+int ass_hinting = ASS_HINTING_NATIVE + 4; // native hinting for unscaled osd
 
 #ifdef HAVE_FONTCONFIG
 extern int font_fontconfig;
@@ -218,11 +219,17 @@ ass_track_t* ass_read_subdata(ass_library_t* library, sub_data* subdata, double
 
 char *get_path(char *);
 
-void ass_configure(ass_renderer_t* priv, int w, int h) {
+void ass_configure(ass_renderer_t* priv, int w, int h, int unscaled) {
+       int hinting;
        ass_set_frame_size(priv, w, h);
        ass_set_margins(priv, ass_top_margin, ass_bottom_margin, 0, 0);
        ass_set_use_margins(priv, ass_use_margins);
        ass_set_font_scale(priv, ass_font_scale);
+       if (!unscaled && (ass_hinting & 4))
+               hinting = 0;
+       else
+               hinting = ass_hinting & 3;
+       ass_set_hinting(priv, hinting);
 }
 
 void ass_configure_fonts(ass_renderer_t* priv) {
index 5d8b722c289c65ef47fccf5ea3925dc15e2188a7..7f98840d584af34cbcb80691ca81b1d437b9293b 100644 (file)
@@ -35,12 +35,13 @@ extern int ass_use_margins;
 extern char* ass_color;
 extern char* ass_border_color;
 extern char* ass_styles_file;
+extern int ass_hinting;
 
 ass_track_t* ass_default_track(ass_library_t* library);
 int ass_process_subtitle(ass_track_t* track, subtitle* sub);
 ass_track_t* ass_read_subdata(ass_library_t* library, sub_data* subdata, double fps);
 
-void ass_configure(ass_renderer_t* priv, int w, int h);
+void ass_configure(ass_renderer_t* priv, int w, int h, int hinting);
 void ass_configure_fonts(ass_renderer_t* priv);
 ass_library_t* ass_init(void);
 
index f69c0c95185f38adc853968dbc2bbd92e72e97dd..da4d98ae9e6660bf49bb47eeb48d2a75ff4370d4 100644 (file)
@@ -56,6 +56,7 @@ typedef struct ass_settings_s {
        int use_margins; // 0 - place all subtitles inside original frame
                         // 1 - use margins for placing toptitles and subtitles
        double aspect; // frame aspect ratio, d_width / d_height.
+       ass_hinting_t hinting;
 
        char* default_font;
        char* default_family;
@@ -1249,7 +1250,7 @@ static void get_outline_glyph(int symbol, glyph_info_t* info, FT_Vector* advance
                info->advance.y = val->advance.y;
        } else {
                glyph_hash_val_t v;
-               info->glyph = ass_font_get_glyph(frame_context.ass_priv->fontconfig_priv, render_context.font, symbol);
+               info->glyph = ass_font_get_glyph(frame_context.ass_priv->fontconfig_priv, render_context.font, symbol, global_settings->hinting);
                if (!info->glyph)
                        return;
                info->advance.x = d16_to_d6(info->glyph->advance.x);
@@ -2049,6 +2050,14 @@ void ass_set_font_scale(ass_renderer_t* priv, double font_scale)
        }
 }
 
+void ass_set_hinting(ass_renderer_t* priv, ass_hinting_t ht)
+{
+       if (priv->settings.hinting != ht) {
+               priv->settings.hinting = ht;
+               ass_reconfigure(priv);
+       }
+}
+
 int ass_set_fonts(ass_renderer_t* priv, const char* default_font, const char* default_family)
 {
        if (priv->settings.default_font)