[vlc-devel] [PATCH] blend: Handle alpha when blending in RGBA buffers
Felix Abecassis
felix.abecassis at gmail.com
Thu Jan 16 14:39:32 CET 2014
I think we should also enable RGBA blending with this patch:
RGB(VLC_CODEC_RGB16, CPictureRGB16, convertRgbToRgbSmall),
RGB(VLC_CODEC_RGB24, CPictureRGB24, convertNone),
RGB(VLC_CODEC_RGB32, CPictureRGB32, convertNone),
+ RGB(VLC_CODEC_RGBA, CPictureRGBA, convertNone),
2014/1/16 Martin Storsjö <martin at martin.st>:
> Previously the alpha channel wasn't set at all, and the RGB
> components were blended without regard to the existing alpha
> value.
> ---
> modules/video_filter/blend.cpp | 26 +++++++++++++++++++++++---
> 1 file changed, 23 insertions(+), 3 deletions(-)
>
> diff --git a/modules/video_filter/blend.cpp b/modules/video_filter/blend.cpp
> index 1f403fe..6552899 100644
> --- a/modules/video_filter/blend.cpp
> +++ b/modules/video_filter/blend.cpp
> @@ -297,9 +297,29 @@ public:
> void merge(unsigned dx, const CPixel &spx, unsigned a, bool)
> {
> uint8_t *dst = getPointer(dx);
> - ::merge(&dst[offset_r], spx.i, a);
> - ::merge(&dst[offset_g], spx.j, a);
> - ::merge(&dst[offset_b], spx.k, a);
> + if (has_alpha) {
> + // Handle different cases of existing alpha in the
> + // destination buffer. If the existing alpha is 0,
> + // the RGB components should be copied as is and
> + // alpha set to 'a'. If the existing alpha is 255,
> + // this should behave just as the non-alpha case below.
> +
> + // First blend the existing color based on its
> + // alpha with the incoming color.
> + ::merge(&dst[offset_r], spx.i, 255 - dst[offset_a]);
> + ::merge(&dst[offset_g], spx.j, 255 - dst[offset_a]);
> + ::merge(&dst[offset_b], spx.k, 255 - dst[offset_a]);
> + // Now blend in the new color on top with the normal formulas.
> + ::merge(&dst[offset_r], spx.i, a);
> + ::merge(&dst[offset_g], spx.j, a);
> + ::merge(&dst[offset_b], spx.k, a);
> + // Finally set dst_a = (255 * src_a + prev_a * (255 - src_a))/255.
> + ::merge(&dst[offset_a], 255, a);
> + } else {
> + ::merge(&dst[offset_r], spx.i, a);
> + ::merge(&dst[offset_g], spx.j, a);
> + ::merge(&dst[offset_b], spx.k, a);
> + }
> }
> void nextLine()
> {
> --
> 1.7.9.4
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
--
Félix Abecassis
http://felix.abecassis.me
More information about the vlc-devel
mailing list