diff options
-rw-r--r-- | 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 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; } |