From 66d6320b51ed477de8014262aa0e5fa83cb0931a Mon Sep 17 00:00:00 2001 From: eugeni Date: Fri, 3 Aug 2007 14:10:53 +0000 Subject: Factor out common code from ass_font_new and ass_font_reselect. git-svn-id: svn://svn.mplayerhq.hu/mplayer/trunk@24001 b3059339-0415-0410-9bf9-f77b7e298cf2 --- libass/ass_font.c | 104 ++++++++++++++++++++++++------------------------------ libass/ass_font.h | 1 + 2 files changed, 47 insertions(+), 58 deletions(-) (limited to 'libass') diff --git a/libass/ass_font.c b/libass/ass_font.c index a567a2ef30..77a585fcaf 100644 --- a/libass/ass_font.c +++ b/libass/ass_font.c @@ -87,46 +87,65 @@ static int find_font(ass_library_t* library, char* name) return -1; } +static void face_set_size(FT_Face face, double size); + /** - * \brief Create a new ass_font_t according to "desc" argument + * \brief Select a face with the given charcode and add it to ass_font_t + * \return index of the new face in font->faces, -1 if failed */ -ass_font_t* ass_font_new(ass_library_t* library, FT_Library ftlibrary, void* fc_priv, ass_font_desc_t* desc) +static int add_face(void* fc_priv, ass_font_t* font, uint32_t ch) { char* path; int index; FT_Face face; int error; - ass_font_t* fontp; - ass_font_t font; int mem_idx; - - fontp = ass_font_cache_find(desc); - if (fontp) - return fontp; - path = fontconfig_select(fc_priv, desc->family, desc->bold, desc->italic, &index, 0); + if (font->n_faces == ASS_FONT_MAX_FACES) + return -1; - mem_idx = find_font(library, path); + path = fontconfig_select(fc_priv, font->desc.family, font->desc.bold, + font->desc.italic, &index, ch); + + mem_idx = find_font(font->library, path); if (mem_idx >= 0) { - error = FT_New_Memory_Face(ftlibrary, (unsigned char*)library->fontdata[mem_idx].data, - library->fontdata[mem_idx].size, 0, &face); + error = FT_New_Memory_Face(font->ftlibrary, (unsigned char*)font->library->fontdata[mem_idx].data, + font->library->fontdata[mem_idx].size, 0, &face); if (error) { mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_ErrorOpeningMemoryFont, path); - return 0; + return -1; } } else { - error = FT_New_Face(ftlibrary, path, index, &face); + error = FT_New_Face(font->ftlibrary, path, index, &face); if (error) { mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_ErrorOpeningFont, path, index); - return 0; + return -1; } } - charmap_magic(face); + font->faces[font->n_faces++] = face; + update_transform(font); + face_set_size(face, font->size); + return font->n_faces - 1; +} + +/** + * \brief Create a new ass_font_t according to "desc" argument + */ +ass_font_t* ass_font_new(ass_library_t* library, FT_Library ftlibrary, void* fc_priv, ass_font_desc_t* desc) +{ + int error; + ass_font_t* fontp; + ass_font_t font; + + fontp = ass_font_cache_find(desc); + if (fontp) + return fontp; + + font.library = library; font.ftlibrary = ftlibrary; - font.faces[0] = face; - font.n_faces = 1; + font.n_faces = 0; font.desc.family = strdup(desc->family); font.desc.bold = desc->bold; font.desc.italic = desc->italic; @@ -135,7 +154,12 @@ ass_font_t* ass_font_new(ass_library_t* library, FT_Library ftlibrary, void* fc_ font.v.x = font.v.y = 0; font.size = 0.; - return ass_font_cache_add(&font); + error = add_face(fc_priv, &font, 0); + if (error == -1) { + free(font.desc.family); + return 0; + } else + return ass_font_cache_add(&font); } /** @@ -189,43 +213,6 @@ void ass_font_set_size(ass_font_t* font, double size) } } -#ifdef HAVE_FONTCONFIG -/** - * \brief Select a new FT_Face with the given character - * The new face is added to the end of font->faces. - **/ -static void ass_font_reselect(void* fontconfig_priv, ass_font_t* font, uint32_t ch) -{ - char* path; - int index; - FT_Face face; - int error; - - if (font->n_faces == ASS_FONT_MAX_FACES) - return; - - path = fontconfig_select(fontconfig_priv, font->desc.family, font->desc.bold, - font->desc.italic, &index, ch); - - error = FT_New_Face(font->ftlibrary, path, index, &face); - if (error) { - mp_msg(MSGT_ASS, MSGL_WARN, MSGTR_LIBASS_ErrorOpeningFont, path, index); - return; - } - charmap_magic(face); - - error = FT_Get_Char_Index(face, ch); - if (error == 0) { // the new font face is not better then the old one - FT_Done_Face(face); - return; - } - - font->faces[font->n_faces++] = face; - update_transform(font); - FT_Set_Pixel_Sizes(face, 0, (int)font->size); -} -#endif - /** * \brief Get maximal font ascender and descender. * \param ch character code @@ -279,10 +266,11 @@ FT_Glyph ass_font_get_glyph(void* fontconfig_priv, ass_font_t* font, uint32_t ch #ifdef HAVE_FONTCONFIG if (index == 0) { + int face_idx; mp_msg(MSGT_ASS, MSGL_INFO, MSGTR_LIBASS_GlyphNotFoundReselectingFont, ch, font->desc.family, font->desc.bold, font->desc.italic); - ass_font_reselect(fontconfig_priv, font, ch); - face = font->faces[font->n_faces - 1]; + face_idx = add_face(fontconfig_priv, font, ch); + face = font->faces[face_idx]; index = FT_Get_Char_Index(face, ch); if (index == 0) { mp_msg(MSGT_ASS, MSGL_ERR, MSGTR_LIBASS_GlyphNotFound, diff --git a/libass/ass_font.h b/libass/ass_font.h index 5aeaa49c29..838f626361 100644 --- a/libass/ass_font.h +++ b/libass/ass_font.h @@ -31,6 +31,7 @@ typedef struct ass_font_desc_s { typedef struct ass_font_s { ass_font_desc_t desc; + ass_library_t* library; FT_Library ftlibrary; FT_Face faces[ASS_FONT_MAX_FACES]; int n_faces; -- cgit v1.2.3