mirror of
https://git.ffmpeg.org/ffmpeg.git
synced 2025-02-17 04:17:05 +00:00
avfilter/drawutils: allow drawing opaque text on transparent background
Signed-off-by: Paul B Mahol <onemda@gmail.com>
This commit is contained in:
parent
6419b4c0cb
commit
9d16e46d9e
@ -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,
|
|||||||
/* 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,
|
|||||||
} 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 {
|
|||||||
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 {
|
|||||||
} 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)
|
|||||||
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);
|
||||||
|
Loading…
Reference in New Issue
Block a user