factor draw_glyphs out of drawtext filter
authorMichael Niedermayer <michaelni@gmx.at>
Tue, 22 Feb 2011 00:11:35 +0000 (01:11 +0100)
committerMichael Niedermayer <michaelni@gmx.at>
Tue, 22 Feb 2011 00:49:54 +0000 (01:49 +0100)
Signed-off-by: Michael Niedermayer <michaelni@gmx.at>
libavfilter/vf_drawtext.c

index 95ee5e8..7802208 100644 (file)
@@ -475,13 +475,51 @@ static inline void drawbox(AVFilterBufferRef *picref, unsigned int x, unsigned i
     }
 }
 
+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;
     char *text = dtext->text;
     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, str_w_max;
@@ -583,32 +621,8 @@ static int draw_text(AVFilterContext *ctx, AVFilterBufferRef *picref,
                 dtext->hsub, dtext->vsub, dtext->is_packed_rgb, dtext->rgba_map);
     }
 
-    /* draw glyphs */
-    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);
-        }
-    }
+    if((ret=draw_glyphs(dtext, picref, width, height))<0)
+        return ret;
 
     return 0;
 }