diff options
author | Grigori Goronzy <greg@blackbox> | 2009-10-11 09:07:26 +0200 |
---|---|---|
committer | Grigori Goronzy <greg@blackbox> | 2009-10-11 09:07:26 +0200 |
commit | 4ede45574b3bb83faa705e042ab9e1d8d726f58f (patch) | |
tree | cd4dc57da80abe79eb2c481835fe64502659d4a2 /libass | |
parent | 88d43f79747fb649d730ade5f8c221573be0be7b (diff) | |
download | libass-4ede45574b3bb83faa705e042ab9e1d8d726f58f.tar.bz2 libass-4ede45574b3bb83faa705e042ab9e1d8d726f58f.tar.xz |
Fix libass w/o fontconfig
Make sure that libass does not crash even if no default font is
provided. Additionally, fix crashes related to drawings in this and
possibly other unusual cases.
Document the default_path and default_family parameters of
ass_set_fonts.
Diffstat (limited to 'libass')
-rw-r--r-- | libass/ass.h | 3 | ||||
-rw-r--r-- | libass/ass_drawing.c | 35 | ||||
-rw-r--r-- | libass/ass_fontconfig.c | 2 | ||||
-rw-r--r-- | libass/ass_parse.c | 26 | ||||
-rw-r--r-- | libass/ass_render.c | 3 |
5 files changed, 41 insertions, 28 deletions
diff --git a/libass/ass.h b/libass/ass.h index 3684b445..9abe6da5 100644 --- a/libass/ass.h +++ b/libass/ass.h @@ -195,6 +195,9 @@ void ass_set_line_spacing(ASS_Renderer *priv, double line_spacing); /** * \brief Set font lookup defaults. + * \param default_font path to default font to use. Must be supplied if + * fontconfig is disabled or unavailable. + * \param default_family fallback font family for fontconfig, or NULL * \param fc whether to use fontconfig * \param config path to fontconfig configuration file, or NULL. Only relevant * if fontconfig is used. diff --git a/libass/ass_drawing.c b/libass/ass_drawing.c index 8c5f062b..a3207c7c 100644 --- a/libass/ass_drawing.c +++ b/libass/ass_drawing.c @@ -41,14 +41,15 @@ static void drawing_make_glyph(ASS_Drawing *drawing, void *fontconfig_priv, // This is hacky... glyph = (FT_OutlineGlyph) ass_font_get_glyph(fontconfig_priv, font, (uint32_t) ' ', hint, 0); - - FT_Outline_Done(drawing->ftlibrary, &glyph->outline); - FT_Outline_New(drawing->ftlibrary, GLYPH_INITIAL_POINTS, - GLYPH_INITIAL_CONTOURS, &glyph->outline); - - glyph->outline.n_contours = 0; - glyph->outline.n_points = 0; - glyph->root.advance.x = glyph->root.advance.y = 0; + if (glyph) { + FT_Outline_Done(drawing->ftlibrary, &glyph->outline); + FT_Outline_New(drawing->ftlibrary, GLYPH_INITIAL_POINTS, + GLYPH_INITIAL_CONTOURS, &glyph->outline); + + glyph->outline.n_contours = 0; + glyph->outline.n_points = 0; + glyph->root.advance.x = glyph->root.advance.y = 0; + } drawing->glyph = glyph; } @@ -363,15 +364,17 @@ static void drawing_evaluate_curve(ASS_Drawing *drawing, ASS_Drawing *ass_drawing_new(void *fontconfig_priv, ASS_Font *font, ASS_Hinting hint, FT_Library lib) { - ASS_Drawing* drawing; + ASS_Drawing *drawing; drawing = calloc(1, sizeof(*drawing)); drawing->text = calloc(1, DRAWING_INITIAL_SIZE); drawing->size = DRAWING_INITIAL_SIZE; drawing->ftlibrary = lib; - drawing->library = font->library; - drawing_make_glyph(drawing, fontconfig_priv, font, hint); + if (font) { + drawing->library = font->library; + drawing_make_glyph(drawing, fontconfig_priv, font, hint); + } drawing->scale_x = 1.; drawing->scale_y = 1.; @@ -386,8 +389,11 @@ ASS_Drawing *ass_drawing_new(void *fontconfig_priv, ASS_Font *font, */ void ass_drawing_free(ASS_Drawing* drawing) { - FT_Done_Glyph((FT_Glyph) drawing->glyph); - free(drawing->text); + if (drawing) { + if (drawing->glyph) + FT_Done_Glyph((FT_Glyph) drawing->glyph); + free(drawing->text); + } free(drawing); } @@ -423,6 +429,9 @@ FT_OutlineGlyph *ass_drawing_parse(ASS_Drawing *drawing, int raw_mode) ASS_DrawingToken *token; FT_Vector pen = {0, 0}; + if (!drawing->glyph) + return NULL; + drawing->tokens = drawing_tokenize(drawing->text); drawing_prepare(drawing); diff --git a/libass/ass_fontconfig.c b/libass/ass_fontconfig.c index 15bc5c7a..83cde1cf 100644 --- a/libass/ass_fontconfig.c +++ b/libass/ass_fontconfig.c @@ -551,7 +551,7 @@ FCInstance *fontconfig_init(ASS_Library *library, priv = calloc(1, sizeof(FCInstance)); - priv->path_default = strdup(path); + priv->path_default = path ? strdup(path) : 0; priv->index_default = 0; return priv; } diff --git a/libass/ass_parse.c b/libass/ass_parse.c index fb407bf7..a5b9b59e 100644 --- a/libass/ass_parse.c +++ b/libass/ass_parse.c @@ -233,20 +233,20 @@ static char *parse_vector_clip(ASS_Renderer *render_priv, char *p) while (*p != ')' && *p != '}' && p != 0) ass_drawing_add_char(drawing, *p++); skipopt(')'); - ass_drawing_parse(drawing, 1); - - // We need to translate the clip according to screen borders - if (render_priv->settings.left_margin != 0 || - render_priv->settings.top_margin != 0) { - FT_Vector trans = { - .x = int_to_d6(render_priv->settings.left_margin), - .y = -int_to_d6(render_priv->settings.top_margin), - }; - FT_Outline_Translate(&drawing->glyph->outline, trans.x, trans.y); + if (ass_drawing_parse(drawing, 1)) { + // We need to translate the clip according to screen borders + if (render_priv->settings.left_margin != 0 || + render_priv->settings.top_margin != 0) { + FT_Vector trans = { + .x = int_to_d6(render_priv->settings.left_margin), + .y = -int_to_d6(render_priv->settings.top_margin), + }; + FT_Outline_Translate(&drawing->glyph->outline, trans.x, trans.y); + } + ass_msg(render_priv->library, MSGL_DBG2, + "Parsed vector clip: scale %d, scales (%f, %f) string [%s]\n", + scale, drawing->scale_x, drawing->scale_y, drawing->text); } - ass_msg(render_priv->library, MSGL_DBG2, - "Parsed vector clip: scale %d, scales (%f, %f) string [%s]\n", - scale, drawing->scale_x, drawing->scale_y, drawing->text); return p; } diff --git a/libass/ass_render.c b/libass/ass_render.c index c2756fde..dcecf807 100644 --- a/libass/ass_render.c +++ b/libass/ass_render.c @@ -1132,7 +1132,8 @@ get_outline_glyph(ASS_Renderer *render_priv, int symbol, GlyphInfo *info, } else { GlyphHashValue v; if (drawing->hash) { - ass_drawing_parse(drawing, 0); + if(!ass_drawing_parse(drawing, 0)) + return; FT_Glyph_Copy((FT_Glyph) drawing->glyph, &info->glyph); } else { info->glyph = |