Commit 9d16e46d authored by Paul B Mahol's avatar Paul B Mahol

avfilter/drawutils: allow drawing opaque text on transparent background

Signed-off-by: 's avatarPaul B Mahol <onemda@gmail.com>
parent 6419b4c0
...@@ -211,10 +211,11 @@ int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags) ...@@ -211,10 +211,11 @@ int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags)
draw->desc = desc; draw->desc = desc;
draw->format = format; draw->format = format;
draw->nb_planes = nb_planes; draw->nb_planes = nb_planes;
draw->flags = flags;
memcpy(draw->pixelstep, pixelstep, sizeof(draw->pixelstep)); memcpy(draw->pixelstep, pixelstep, sizeof(draw->pixelstep));
draw->hsub[1] = draw->hsub[2] = draw->hsub_max = desc->log2_chroma_w; draw->hsub[1] = draw->hsub[2] = draw->hsub_max = desc->log2_chroma_w;
draw->vsub[1] = draw->vsub[2] = draw->vsub_max = desc->log2_chroma_h; draw->vsub[1] = draw->vsub[2] = draw->vsub_max = desc->log2_chroma_h;
for (i = 0; i < (desc->nb_components - !!(desc->flags & AV_PIX_FMT_FLAG_ALPHA)); i++) for (i = 0; i < (desc->nb_components - !!(desc->flags & AV_PIX_FMT_FLAG_ALPHA && !(flags & FF_DRAW_PROCESS_ALPHA))); i++)
draw->comp_mask[desc->comp[i].plane] |= draw->comp_mask[desc->comp[i].plane] |=
1 << desc->comp[i].offset; 1 << desc->comp[i].offset;
return 0; return 0;
...@@ -452,7 +453,7 @@ void ff_blend_rectangle(FFDrawContext *draw, FFDrawColor *color, ...@@ -452,7 +453,7 @@ void ff_blend_rectangle(FFDrawContext *draw, FFDrawColor *color,
/* 0x101 * alpha is in the [ 2 ; 0x1001] range */ /* 0x101 * alpha is in the [ 2 ; 0x1001] range */
alpha = 0x101 * color->rgba[3] + 0x2; alpha = 0x101 * color->rgba[3] + 0x2;
} }
nb_planes = draw->nb_planes - !!(draw->desc->flags & AV_PIX_FMT_FLAG_ALPHA); nb_planes = draw->nb_planes - !!(draw->desc->flags & AV_PIX_FMT_FLAG_ALPHA && !(draw->flags & FF_DRAW_PROCESS_ALPHA));
nb_planes += !nb_planes; nb_planes += !nb_planes;
for (plane = 0; plane < nb_planes; plane++) { for (plane = 0; plane < nb_planes; plane++) {
nb_comp = draw->pixelstep[plane]; nb_comp = draw->pixelstep[plane];
...@@ -630,7 +631,7 @@ void ff_blend_mask(FFDrawContext *draw, FFDrawColor *color, ...@@ -630,7 +631,7 @@ void ff_blend_mask(FFDrawContext *draw, FFDrawColor *color,
} else { } else {
alpha = (0x101 * color->rgba[3] + 0x2) >> 8; alpha = (0x101 * color->rgba[3] + 0x2) >> 8;
} }
nb_planes = draw->nb_planes - !!(draw->desc->flags & AV_PIX_FMT_FLAG_ALPHA); nb_planes = draw->nb_planes - !!(draw->desc->flags & AV_PIX_FMT_FLAG_ALPHA && !(draw->flags & FF_DRAW_PROCESS_ALPHA));
nb_planes += !nb_planes; nb_planes += !nb_planes;
for (plane = 0; plane < nb_planes; plane++) { for (plane = 0; plane < nb_planes; plane++) {
nb_comp = draw->pixelstep[plane]; nb_comp = draw->pixelstep[plane];
......
...@@ -55,6 +55,7 @@ typedef struct FFDrawContext { ...@@ -55,6 +55,7 @@ typedef struct FFDrawContext {
uint8_t vsub[MAX_PLANES]; /*< vertical subsampling */ uint8_t vsub[MAX_PLANES]; /*< vertical subsampling */
uint8_t hsub_max; uint8_t hsub_max;
uint8_t vsub_max; uint8_t vsub_max;
unsigned flags;
} FFDrawContext; } FFDrawContext;
typedef struct FFDrawColor { typedef struct FFDrawColor {
...@@ -66,12 +67,17 @@ typedef struct FFDrawColor { ...@@ -66,12 +67,17 @@ typedef struct FFDrawColor {
} comp[MAX_PLANES]; } comp[MAX_PLANES];
} FFDrawColor; } FFDrawColor;
/**
* Process alpha pixel component.
*/
#define FF_DRAW_PROCESS_ALPHA 1
/** /**
* Init a draw context. * Init a draw context.
* *
* Only a limited number of pixel formats are supported, if format is not * Only a limited number of pixel formats are supported, if format is not
* supported the function will return an error. * supported the function will return an error.
* No flags currently defined. * flags is combination of FF_DRAW_* flags.
* @return 0 for success, < 0 for error * @return 0 for success, < 0 for error
*/ */
int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags); int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags);
......
...@@ -730,7 +730,7 @@ static int config_input(AVFilterLink *inlink) ...@@ -730,7 +730,7 @@ static int config_input(AVFilterLink *inlink)
DrawTextContext *s = ctx->priv; DrawTextContext *s = ctx->priv;
int ret; int ret;
ff_draw_init(&s->dc, inlink->format, 0); ff_draw_init(&s->dc, inlink->format, FF_DRAW_PROCESS_ALPHA);
ff_draw_color(&s->dc, &s->fontcolor, s->fontcolor.rgba); ff_draw_color(&s->dc, &s->fontcolor, s->fontcolor.rgba);
ff_draw_color(&s->dc, &s->shadowcolor, s->shadowcolor.rgba); ff_draw_color(&s->dc, &s->shadowcolor, s->shadowcolor.rgba);
ff_draw_color(&s->dc, &s->bordercolor, s->bordercolor.rgba); ff_draw_color(&s->dc, &s->bordercolor, s->bordercolor.rgba);
......
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