Commit a64a2c5f authored by Michael Niedermayer's avatar Michael Niedermayer

factor draw_glyphs out of drawtext filter

Signed-off-by: 's avatarMichael Niedermayer <michaelni@gmx.at>
parent bccea088
...@@ -475,13 +475,51 @@ static inline void drawbox(AVFilterBufferRef *picref, unsigned int x, unsigned i ...@@ -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, static int draw_text(AVFilterContext *ctx, AVFilterBufferRef *picref,
int width, int height) int width, int height)
{ {
DrawTextContext *dtext = ctx->priv; DrawTextContext *dtext = ctx->priv;
char *text = dtext->text; char *text = dtext->text;
uint32_t code = 0, prev_code = 0; 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; int text_height, baseline;
uint8_t *p; uint8_t *p;
int str_w, str_w_max; int str_w, str_w_max;
...@@ -583,32 +621,8 @@ static int draw_text(AVFilterContext *ctx, AVFilterBufferRef *picref, ...@@ -583,32 +621,8 @@ static int draw_text(AVFilterContext *ctx, AVFilterBufferRef *picref,
dtext->hsub, dtext->vsub, dtext->is_packed_rgb, dtext->rgba_map); dtext->hsub, dtext->vsub, dtext->is_packed_rgb, dtext->rgba_map);
} }
/* draw glyphs */ if((ret=draw_glyphs(dtext, picref, width, height))<0)
for (i = 0, p = text; *p; i++) { return ret;
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; return 0;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment