From patchwork Wed Sep 14 09:13:54 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Paul B Mahol X-Patchwork-Id: 570 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.140.134 with SMTP id o128csp2561402vsd; Wed, 14 Sep 2016 02:14:14 -0700 (PDT) X-Received: by 10.28.65.84 with SMTP id o81mr1888143wma.83.1473844454739; Wed, 14 Sep 2016 02:14:14 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id a18si3272073wjx.13.2016.09.14.02.14.12; Wed, 14 Sep 2016 02:14:14 -0700 (PDT) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; dkim=neutral (body hash did not verify) header.i=@gmail.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org; dmarc=fail (p=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id DF6B468A0A4; Wed, 14 Sep 2016 12:13:58 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9C507689D6D for ; Wed, 14 Sep 2016 12:13:52 +0300 (EEST) Received: by mail-wm0-f65.google.com with SMTP id c131so1560421wmh.2 for ; Wed, 14 Sep 2016 02:14:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=from:to:subject:date:message-id:in-reply-to:references; bh=3qm1fQ1NoXEf99qu9SKcuzhKSXi7O6KxhhD83dMv11A=; b=tD3Dlg2D7k6ZVn9O19ofsBPfCC0LisKEnfPZR9RAvyf8ZxJFLk9gsQ3IDdk8uZOt4O Tr7ZHamfhJsnwV/PXbkvmN3A/7P1QI/Qh5j9NMnmPdJSKsUDCGUCNt53oe/PCysZI5hc wyoMXtgw98qqg/8B0YnIdEDIYRpPGo9c9G3nngSXfN/Van7M+pIXafZ5t+mZNiBFqhrw soYrXzjvnU5yFg4SPZYDmwhpcK77jKgpTyMICTsj3U2FTXUsEXZHANtp3YBNO9ZGCd9m Ojq0cEZ6fwqjVKRj+yfcr7ZKQQcRzwZg8tfhScfMCN01rqkv55h8Vo/jlZTflo6CVjE2 L3JQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:subject:date:message-id:in-reply-to :references; bh=3qm1fQ1NoXEf99qu9SKcuzhKSXi7O6KxhhD83dMv11A=; b=EBOMO6RGZwWvs8sJfkHhn5Kul3v1PUmgJUxt7ly3sdjn2qddY3cfv5q2A3L93oKknX Dyf9yxZqwAvQmO8iiP0prRMs0X2IYrNLTmKs1/4Ro3nKa7gvgv6jhdD+h5GiAUzSfs5M +1eT6kouRncfvZkj6AaDIlz6hZPIeFni+1t/XwMLlUJAm3+GHXsAoxhXS5ugx0is5Qlb LAIE2uYMSERA2fryl0fabte7lOF2W2NI/r7jcvyc7aC/aa5JFOR7L8TShBSW42JRD0M7 kPp8gv0AloRTE3+dmDRIg2reh+wu+4eEPbcJa8xWLUhiAgtF+xDA7Q5nfM/dN0XBCFBL p6Rw== X-Gm-Message-State: AE9vXwMTmjhEqX5fsJN8go5Vqh1YJd1/YlCmQQHsHJFr8BejzppdTdTanMb9H/HIRdc+5g== X-Received: by 10.28.54.68 with SMTP id d65mr10047660wma.91.1473844444723; Wed, 14 Sep 2016 02:14:04 -0700 (PDT) Received: from computer.gigaset.lan (141-136-220-60.dsl.iskon.hr. [141.136.220.60]) by smtp.gmail.com with ESMTPSA id y2sm3092827wji.42.2016.09.14.02.14.03 for (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 14 Sep 2016 02:14:03 -0700 (PDT) From: Paul B Mahol To: ffmpeg-devel@ffmpeg.org Date: Wed, 14 Sep 2016 11:13:54 +0200 Message-Id: <1473844434-2139-1-git-send-email-onemda@gmail.com> X-Mailer: git-send-email 2.5.0 In-Reply-To: <1473809900-18068-1-git-send-email-onemda@gmail.com> References: <1473809900-18068-1-git-send-email-onemda@gmail.com> Subject: [FFmpeg-devel] [PATCH] avfilter/drawutils: allow drawing opaque text on transparent background X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Paul B Mahol --- 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);