summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-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 =