avfilter/drawutils: allow drawing opaque text on transparent background
authorPaul B Mahol <onemda@gmail.com>
Tue, 13 Sep 2016 23:37:13 +0000 (01:37 +0200)
committerPaul B Mahol <onemda@gmail.com>
Wed, 21 Sep 2016 09:54:00 +0000 (11:54 +0200)
Signed-off-by: Paul B Mahol <onemda@gmail.com>
libavfilter/drawutils.c
libavfilter/drawutils.h
libavfilter/vf_drawtext.c

index f6760be..f19fc5d 100644 (file)
@@ -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];
index 1fb3e4f..cf53635 100644 (file)
@@ -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);
index 214aef0..65d3baa 100644 (file)
@@ -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);