drawtext: factor draw_glyphs.
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 22 Feb 2011 00:11:35 +0000 (01:11 +0100)
committerAnton Khirnov <anton@khirnov.net>
Sat, 7 May 2011 08:21:56 +0000 (10:21 +0200)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
Signed-off-by: Anton Khirnov <anton@khirnov.net>
libavfilter/vf_drawtext.c

index 4a0d9dc..cb598f5 100644 (file)
@@ -494,12 +494,50 @@ static inline int is_newline(uint32_t c)
     return (c == '\n' || c == '\r' || c == '\f' || c == '\v');
 }
 
+static int draw_glyphs(DrawTextContext *dtext, AVFilterBufferRef *picref,
+                        int width, int height)
+{
+    char *text = dtext->text;
+    uint32_t code = 0;
+    int i;
+    uint8_t *p;
+    Glyph *glyph = NULL;
+
+    for (i = 0, p = text; *p; i++) {
+        Glyph dummy = { 0 };
+        GET_UTF8(code, *p++, continue;);
+
+        /* skip new line chars, just go to new line */
+        if (code == '\n' || code == '\r' || code == '\t')
+            continue;
+
+        dummy.code = code;
+        glyph = av_tree_find(dtext->glyphs, &dummy, (void *)glyph_cmp, NULL);
+
+        if (glyph->bitmap.pixel_mode != FT_PIXEL_MODE_MONO &&
+            glyph->bitmap.pixel_mode != FT_PIXEL_MODE_GRAY)
+            return AVERROR(EINVAL);
+
+        if (dtext->is_packed_rgb) {
+            draw_glyph_rgb(picref, &glyph->bitmap,
+                           dtext->positions[i].x, dtext->positions[i].y, width, height,
+                           dtext->pixel_step[0], dtext->fontcolor_rgba, dtext->rgba_map);
+        } else {
+            draw_glyph_yuv(picref, &glyph->bitmap,
+                           dtext->positions[i].x, dtext->positions[i].y, width, height,
+                           dtext->fontcolor, dtext->hsub, dtext->vsub);
+        }
+    }
+
+    return 0;
+}
+
 static int draw_text(AVFilterContext *ctx, AVFilterBufferRef *picref,
                      int width, int height)
 {
     DrawTextContext *dtext = ctx->priv;
     uint32_t code = 0, prev_code = 0;
-    int x = 0, y = 0, i = 0;
+    int x = 0, y = 0, i = 0, ret;
     int text_height, baseline;
     uint8_t *p;
     int str_w = 0;
@@ -605,32 +643,8 @@ static int draw_text(AVFilterContext *ctx, AVFilterBufferRef *picref,
                 dtext->box_line, dtext->pixel_step, dtext->boxcolor,
                 dtext->hsub, dtext->vsub, dtext->is_packed_rgb, dtext->rgba_map);
 
-    /* draw glyphs */
-    for (i = 0, p = dtext->text; *p; i++) {
-        Glyph dummy = { 0 };
-        GET_UTF8(code, *p++, continue;);
-
-        /* skip new line chars, just go to new line */
-        if (is_newline(code) || code == ' ' || code == '\t')
-            continue;
-
-        dummy.code = code;
-        glyph = av_tree_find(dtext->glyphs, &dummy, glyph_cmp, NULL);
-
-        if (glyph->bitmap.pixel_mode != FT_PIXEL_MODE_MONO &&
-            glyph->bitmap.pixel_mode != FT_PIXEL_MODE_GRAY)
-            return AVERROR(EINVAL);
-
-        if (dtext->is_packed_rgb) {
-            draw_glyph_rgb(picref, &glyph->bitmap,
-                           dtext->positions[i].x, dtext->positions[i].y, width, height,
-                           dtext->pixel_step[0], dtext->fontcolor_rgba, dtext->rgba_map);
-        } else {
-            draw_glyph_yuv(picref, &glyph->bitmap,
-                           dtext->positions[i].x, dtext->positions[i].y, width, height,
-                           dtext->fontcolor, dtext->hsub, dtext->vsub);
-        }
-    }
+    if ((ret = draw_glyphs(dtext, picref, width, height)) < 0)
+        return ret;
 
     return 0;
 }