summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGrigori Goronzy <greg@blackbox>2009-10-11 09:07:26 +0200
committerGrigori Goronzy <greg@blackbox>2009-10-11 09:07:26 +0200
commit4ede45574b3bb83faa705e042ab9e1d8d726f58f (patch)
treecd4dc57da80abe79eb2c481835fe64502659d4a2
parent88d43f79747fb649d730ade5f8c221573be0be7b (diff)
downloadlibass-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.h3
-rw-r--r--libass/ass_drawing.c35
-rw-r--r--libass/ass_fontconfig.c2
-rw-r--r--libass/ass_parse.c26
-rw-r--r--libass/ass_render.c3
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 =