[FFmpeg-cvslog] avfilter/drawutils: allow drawing opaque text on transparent background
Paul B Mahol
git at videolan.org
Wed Sep 21 12:57:36 EEST 2016
ffmpeg | branch: master | Paul B Mahol <onemda at gmail.com> | Wed Sep 14 01:37:13 2016 +0200| [9d16e46d9eb4643ce119e26ed5c3975cb6cb7aa1] | committer: Paul B Mahol
avfilter/drawutils: allow drawing opaque text on transparent background
Signed-off-by: Paul B Mahol <onemda at gmail.com>
> http://git.videolan.org/gitweb.cgi/ffmpeg.git/?a=commit;h=9d16e46d9eb4643ce119e26ed5c3975cb6cb7aa1
---
libavfilter/drawutils.c | 7 ++++---
libavfilter/drawutils.h | 8 +++++++-
libavfilter/vf_drawtext.c | 2 +-
3 files changed, 12 insertions(+), 5 deletions(-)
diff --git a/libavfilter/drawutils.c b/libavfilter/drawutils.c
index f6760be..f19fc5d 100644
--- a/libavfilter/drawutils.c
+++ b/libavfilter/drawutils.c
@@ -211,10 +211,11 @@ int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags)
draw->desc = desc;
draw->format = format;
draw->nb_planes = nb_planes;
+ draw->flags = flags;
memcpy(draw->pixelstep, pixelstep, sizeof(draw->pixelstep));
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;
- 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] |=
1 << desc->comp[i].offset;
return 0;
@@ -452,7 +453,7 @@ void ff_blend_rectangle(FFDrawContext *draw, FFDrawColor *color,
/* 0x101 * alpha is in the [ 2 ; 0x1001] range */
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;
for (plane = 0; plane < nb_planes; plane++) {
nb_comp = draw->pixelstep[plane];
@@ -630,7 +631,7 @@ void ff_blend_mask(FFDrawContext *draw, FFDrawColor *color,
} else {
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;
for (plane = 0; plane < nb_planes; plane++) {
nb_comp = draw->pixelstep[plane];
diff --git a/libavfilter/drawutils.h b/libavfilter/drawutils.h
index 1fb3e4f..cf53635 100644
--- a/libavfilter/drawutils.h
+++ b/libavfilter/drawutils.h
@@ -55,6 +55,7 @@ typedef struct FFDrawContext {
uint8_t vsub[MAX_PLANES]; /*< vertical subsampling */
uint8_t hsub_max;
uint8_t vsub_max;
+ unsigned flags;
} FFDrawContext;
typedef struct FFDrawColor {
@@ -67,11 +68,16 @@ typedef struct FFDrawColor {
} FFDrawColor;
/**
+ * Process alpha pixel component.
+ */
+#define FF_DRAW_PROCESS_ALPHA 1
+
+/**
* Init a draw context.
*
* Only a limited number of pixel formats are supported, if format is not
* 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
*/
int ff_draw_init(FFDrawContext *draw, enum AVPixelFormat format, unsigned flags);
diff --git a/libavfilter/vf_drawtext.c b/libavfilter/vf_drawtext.c
index 214aef0..65d3baa 100644
--- a/libavfilter/vf_drawtext.c
+++ b/libavfilter/vf_drawtext.c
@@ -730,7 +730,7 @@ static int config_input(AVFilterLink *inlink)
DrawTextContext *s = ctx->priv;
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->shadowcolor, s->shadowcolor.rgba);
ff_draw_color(&s->dc, &s->bordercolor, s->bordercolor.rgba);
More information about the ffmpeg-cvslog
mailing list