|
|
|
@@ -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; |
|
|
|
} |
|
|
|
|