[FFmpeg-cvslog] drawtext: factor draw_glyphs.

Michael Niedermayer git at videolan.org
Sun May 8 03:38:47 CEST 2011


ffmpeg | branch: master | Michael Niedermayer <michaelni at gmx.at> | Tue Feb 22 01:11:35 2011 +0100| [e73127a44399d4e90a4fbda800ad5b4bcb286073] | committer: Anton Khirnov

drawtext: factor draw_glyphs.

Signed-off-by: Michael Niedermayer <michaelni at gmx.at>
Signed-off-by: Anton Khirnov <anton at khirnov.net>

> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=e73127a44399d4e90a4fbda800ad5b4bcb286073
---

 libavfilter/vf_drawtext.c |   68 +++++++++++++++++++++++++++------------------
 1 files changed, 41 insertions(+), 27 deletions(-)

diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c
index 4a0d9dc..cb598f5 100644
--- a/libavfilter/vf_drawtext.c
+++ b/libavfilter/vf_drawtext.c
@@ -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;
 }



More information about the ffmpeg-cvslog mailing list