diff options
-rw-r--r-- | libass/ass_font.c | 45 | ||||
-rw-r--r-- | libass/ass_font.h | 8 | ||||
-rw-r--r-- | libass/ass_render.c | 21 |
3 files changed, 29 insertions, 45 deletions
diff --git a/libass/ass_font.c b/libass/ass_font.c index 36c7eaa4..79ab22b3 100644 --- a/libass/ass_font.c +++ b/libass/ass_font.c @@ -461,15 +461,10 @@ int ass_font_get_index(ASS_FontSelector *fontsel, ASS_Font *font, * \brief Get a glyph * \param ch character code **/ -FT_Glyph ass_font_get_glyph(ASS_Font *font, int face_index, int index, - ASS_Hinting hinting) +bool ass_font_get_glyph(ASS_Font *font, int face_index, int index, + ASS_Hinting hinting) { - int error; - FT_Glyph glyph; - FT_Face face = font->faces[face_index]; - int flags = 0; - - flags = FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH + FT_Int32 flags = FT_LOAD_NO_BITMAP | FT_LOAD_IGNORE_GLOBAL_ADVANCE_WIDTH | FT_LOAD_IGNORE_TRANSFORM; switch (hinting) { case ASS_HINTING_NONE: @@ -485,28 +480,18 @@ FT_Glyph ass_font_get_glyph(ASS_Font *font, int face_index, int index, break; } - error = FT_Load_Glyph(face, index, flags); + FT_Face face = font->faces[face_index]; + FT_Error error = FT_Load_Glyph(face, index, flags); if (error) { ass_msg(font->library, MSGL_WARN, "Error loading glyph, index %d", index); - return 0; + return false; } - if (!(face->style_flags & FT_STYLE_FLAG_ITALIC) && - (font->desc.italic > 55)) { + if (!(face->style_flags & FT_STYLE_FLAG_ITALIC) && (font->desc.italic > 55)) FT_GlyphSlot_Oblique(face->glyph); - } - - if (font->desc.bold > ass_face_get_weight(face) + 150) { + if (font->desc.bold > ass_face_get_weight(face) + 150) ass_glyph_embolden(face->glyph); - } - error = FT_Get_Glyph(face->glyph, &glyph); - if (error) { - ass_msg(font->library, MSGL_WARN, "Error loading glyph, index %d", - index); - return 0; - } - - return glyph; + return true; } /** @@ -528,11 +513,13 @@ void ass_font_clear(ASS_Font *font) * \brief Convert glyph into ASS_Outline according to decoration flags **/ bool ass_get_glyph_outline(ASS_Outline *outline, int32_t *advance, - FT_Face face, FT_Glyph glyph, unsigned flags) + FT_Face face, unsigned flags) { int32_t y_scale = face->size->metrics.y_scale; - int32_t adv = flags & DECO_ROTATE ? face->glyph->linearVertAdvance : glyph->advance.x; - *advance = adv = d16_to_d6(adv); + int32_t adv = face->glyph->advance.x; + if (flags & DECO_ROTATE) + adv = d16_to_d6(face->glyph->linearVertAdvance); + *advance = adv; int n_lines = 0; int32_t line_y[2][2]; @@ -563,8 +550,8 @@ bool ass_get_glyph_outline(ASS_Outline *outline, int32_t *advance, } } - assert(glyph->format == FT_GLYPH_FORMAT_OUTLINE); - FT_Outline *source = &((FT_OutlineGlyph) glyph)->outline; + assert(face->glyph->format == FT_GLYPH_FORMAT_OUTLINE); + FT_Outline *source = &face->glyph->outline; if (!source->n_points && !n_lines) { outline_clear(outline); return true; diff --git a/libass/ass_font.h b/libass/ass_font.h index 783d6f90..02d4508a 100644 --- a/libass/ass_font.h +++ b/libass/ass_font.h @@ -21,7 +21,7 @@ #include <stdint.h> #include <ft2build.h> -#include FT_GLYPH_H +#include FT_FREETYPE_H typedef struct ass_font ASS_Font; @@ -59,12 +59,12 @@ void ass_font_get_asc_desc(ASS_Font *font, int face_index, int ass_font_get_index(ASS_FontSelector *fontsel, ASS_Font *font, uint32_t symbol, int *face_index, int *glyph_index); uint32_t ass_font_index_magic(FT_Face face, uint32_t symbol); -FT_Glyph ass_font_get_glyph(ASS_Font *font, int face_index, int index, - ASS_Hinting hinting); +bool ass_font_get_glyph(ASS_Font *font, int face_index, int index, + ASS_Hinting hinting); void ass_font_clear(ASS_Font *font); bool ass_get_glyph_outline(ASS_Outline *outline, int32_t *advance, - FT_Face face, FT_Glyph glyph, unsigned flags); + FT_Face face, unsigned flags); FT_Face ass_face_open(ASS_Library *lib, FT_Library ftlib, const char *path, const char *postscript_name, int index); diff --git a/libass/ass_render.c b/libass/ass_render.c index 5d781069..770bf953 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -1164,18 +1164,15 @@ size_t ass_outline_construct(void *key, void *value, void *priv) { GlyphHashKey *k = &outline_key->u.glyph; ass_face_set_size(k->font->faces[k->face_index], k->size); - FT_Glyph glyph = - ass_font_get_glyph(k->font, k->face_index, k->glyph_index, - render_priv->settings.hinting); - if (glyph != NULL) { - if (!ass_get_glyph_outline(&v->outline[0], &v->advance, - k->font->faces[k->face_index], - glyph, k->flags)) - return 1; - FT_Done_Glyph(glyph); - ass_font_get_asc_desc(k->font, k->face_index, - &v->asc, &v->desc); - } + if (!ass_font_get_glyph(k->font, k->face_index, k->glyph_index, + render_priv->settings.hinting)) + return 1; + if (!ass_get_glyph_outline(&v->outline[0], &v->advance, + k->font->faces[k->face_index], + k->flags)) + return 1; + ass_font_get_asc_desc(k->font, k->face_index, + &v->asc, &v->desc); break; } case OUTLINE_DRAWING: |