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 | |
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.
-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 3684b44..9abe6da 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 8c5f062..a3207c7 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 15bc5c7..83cde1c 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 fb407bf..a5b9b59 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 c2756fd..dcecf80 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 = |