diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c index 95ee5e8bd0..7802208db9 100644 --- a/libavfilter/vf_drawtext.c +++ b/libavfilter/vf_drawtext.c @@ -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; }