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/ass_drawing.c | |
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/ass_drawing.c')
-rw-r--r-- | libass/ass_drawing.c | 35 |
1 files changed, 22 insertions, 13 deletions
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); |