diff options
-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 = |