From 1762cbe986d0c84eede2ddd9318c501d24dcbfa7 Mon Sep 17 00:00:00 2001 From: eugeni Date: Sat, 19 May 2007 14:11:41 +0000 Subject: Correct font size in libass. Values from TrueType OS/2 table are used to reproduce VSFilter behaviour. Magic 0.8 multiplier and scaling for the fractional part of font size are not needed anymore. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@23346 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libass/ass_font.c | 31 ++++++++++++++++++++++++++----- libass/ass_mp.c | 3 +-- libass/ass_render.c | 4 +--- 3 files changed, 28 insertions(+), 10 deletions(-) (limited to 'libass') diff --git a/libass/ass_font.c b/libass/ass_font.c index 40060876e6..0d38a7604c 100644 --- a/libass/ass_font.c +++ b/libass/ass_font.c @@ -25,6 +25,7 @@ #include FT_FREETYPE_H #include FT_SYNTHESIS_H #include FT_GLYPH_H +#include FT_TRUETYPE_TABLES_H #include "ass.h" #include "ass_library.h" @@ -67,9 +68,8 @@ static void update_transform(ass_font_t* font) { int i; FT_Matrix m; - double size_scale = font->size / (int)font->size; - m.xx = double_to_d16(font->scale_x * size_scale); - m.yy = double_to_d16(font->scale_y * size_scale); + m.xx = double_to_d16(font->scale_x); + m.yy = double_to_d16(font->scale_y); m.xy = m.yx = 0; for (i = 0; i < font->n_faces; ++i) FT_Set_Transform(font->faces[i], &m, &font->v); @@ -154,6 +154,28 @@ void ass_font_set_transform(ass_font_t* font, double scale_x, double scale_y, FT update_transform(font); } +static void face_set_size(FT_Face face, double size) +{ + TT_HoriHeader *hori = FT_Get_Sfnt_Table(face, ft_sfnt_hhea); + TT_OS2 *os2 = FT_Get_Sfnt_Table(face, ft_sfnt_os2); + double mscale = 1.; + FT_Size_RequestRec rq; + FT_Size_Metrics *m = &face->size->metrics; + // VSFilter uses metrics from TrueType OS/2 table + // The idea was borrowed from asa (http://asa.diac24.net) + if (hori && os2) + mscale = ((double)(hori->Ascender - hori->Descender)) / (os2->usWinAscent + os2->usWinDescent); + memset(&rq, 0, sizeof(rq)); + rq.type = FT_SIZE_REQUEST_TYPE_REAL_DIM; + rq.width = 0; + rq.height = double_to_d6(size * mscale); + rq.horiResolution = rq.vertResolution = 0; + FT_Request_Size(face, &rq); + m->ascender /= mscale; + m->descender /= mscale; + m->height /= mscale; +} + /** * \brief Set font size **/ @@ -163,8 +185,7 @@ void ass_font_set_size(ass_font_t* font, double size) if (font->size != size) { font->size = size; for (i = 0; i < font->n_faces; ++i) - FT_Set_Pixel_Sizes(font->faces[i], 0, (int)size); - update_transform(font); + face_set_size(font->faces[i], size); } } diff --git a/libass/ass_mp.c b/libass/ass_mp.c index 02f81e4c7f..174e4ae3b9 100644 --- a/libass/ass_mp.c +++ b/libass/ass_mp.c @@ -67,7 +67,6 @@ extern char* sub_cp; static char* sub_cp = 0; #endif -extern double ass_internal_font_size_coeff; extern void process_force_style(ass_track_t* track); ass_track_t* ass_default_track(ass_library_t* library) { @@ -92,7 +91,7 @@ ass_track_t* ass_default_track(ass_library_t* library) { style->Name = strdup("Default"); style->FontName = (font_fontconfig && font_name) ? strdup(font_name) : strdup("Sans"); - fs = track->PlayResY * text_font_scale_factor / 100. / ass_internal_font_size_coeff; + fs = track->PlayResY * text_font_scale_factor / 100.; // approximate autoscale coefficients if (subtitle_autoscale == 2) fs *= 1.3; diff --git a/libass/ass_render.c b/libass/ass_render.c index 5f235068a5..769a35f9e1 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -506,8 +506,6 @@ static inline int mystrcmp(char** p, const char* sample) { return 0; } -double ass_internal_font_size_coeff = 0.8; - static void change_font_size(double sz) { double size = sz * frame_context.font_scale; @@ -2103,7 +2101,7 @@ static int ass_start_frame(ass_renderer_t *priv, ass_track_t* track, long long n ass_lazy_track_init(); - frame_context.font_scale = global_settings->font_size_coeff * ass_internal_font_size_coeff * + frame_context.font_scale = global_settings->font_size_coeff * frame_context.orig_height / frame_context.track->PlayResY; frame_context.border_scale = ((double)frame_context.orig_height) / frame_context.track->PlayResY; -- cgit v1.2.3