summaryrefslogtreecommitdiff
path: root/libavfilter/vf_drawtext.c
diff options
context:
space:
mode:
authorMichael Niedermayer <michaelni@gmx.at>2011-02-22 01:11:35 +0100
committerAnton Khirnov <anton@khirnov.net>2011-05-07 10:21:56 +0200
commite73127a44399d4e90a4fbda800ad5b4bcb286073 (patch)
treedd28cbc17d03a139578ca71aa972afdc2546d1fa /libavfilter/vf_drawtext.c
parenta5b81c317e7db9015ebbf838bc065e4d183bf61a (diff)
drawtext: factor draw_glyphs.
Signed-off-by: Michael Niedermayer <michaelni@gmx.at> Signed-off-by: Anton Khirnov <anton@khirnov.net>
Diffstat (limited to 'libavfilter/vf_drawtext.c')
-rw-r--r--libavfilter/vf_drawtext.c68
1 files changed, 41 insertions, 27 deletions
diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c
index 4a0d9dcb94..cb598f5469 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;
}