]> granicus.if.org Git - libass/commitdiff
Fix libass w/o fontconfig
authorGrigori Goronzy <greg@blackbox>
Sun, 11 Oct 2009 07:07:26 +0000 (09:07 +0200)
committerGrigori Goronzy <greg@blackbox>
Sun, 11 Oct 2009 07:07:26 +0000 (09:07 +0200)
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.

libass/ass.h
libass/ass_drawing.c
libass/ass_fontconfig.c
libass/ass_parse.c
libass/ass_render.c

index 3684b4456e114b3cd90843079a1fa0866a9f42ac..9abe6da571635adcbfa535bb33c723152adfd568 100644 (file)
@@ -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.
index 8c5f062bc6e8852023b153512d62b2297f4506fa..a3207c7c3b113e0217a6e399499d04f768845ab0 100644 (file)
@@ -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_Drawingdrawing;
+    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);
 
index 15bc5c7a7471c9439543641a9e246de001d70fd7..83cde1cfc953994bbd560f66807697815faadd49 100644 (file)
@@ -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;
 }
index fb407bf7240ae8c10e369fff50b3d93c31645919..a5b9b59eff606e4760944621b388872433eb5205 100644 (file)
@@ -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;
 }
index c2756fde44b47f3e43a42d9baf97b82cd2c8d8bf..dcecf80705755943e3dd69c789a789babfc77efa 100644 (file)
@@ -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 =