From 806b45e7c76f6825e32fde10824beb62eecc40ab Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Tue, 6 Sep 2016 11:03:33 +0200 Subject: Make blendPixel function general Moves the blendPixel function from the SSSE3 file and use it more generally, also adds a const_alpha version. Change-Id: Ia29d1ab3879a845d5b65e0610b7836507e33c7ed Reviewed-by: Thiago Macieira --- src/gui/painting/qdrawhelper_p.h | 16 ++++++++++++++++ src/gui/painting/qdrawhelper_ssse3.cpp | 9 --------- src/gui/painting/qdrawingprimitive_sse2_p.h | 24 ++++-------------------- 3 files changed, 20 insertions(+), 29 deletions(-) (limited to 'src') diff --git a/src/gui/painting/qdrawhelper_p.h b/src/gui/painting/qdrawhelper_p.h index 664117a730..45a3174734 100644 --- a/src/gui/painting/qdrawhelper_p.h +++ b/src/gui/painting/qdrawhelper_p.h @@ -636,6 +636,22 @@ static Q_ALWAYS_INLINE uint BYTE_MUL(uint x, uint a) { } #endif +static Q_ALWAYS_INLINE void blend_pixel(quint32 &dst, const quint32 src) +{ + if (src >= 0xff000000) + dst = src; + else if (src != 0) + dst = src + BYTE_MUL(dst, qAlpha(~src)); +} + +static Q_ALWAYS_INLINE void blend_pixel(quint32 &dst, const quint32 src, const int const_alpha) +{ + if (src != 0) { + const quint32 s = BYTE_MUL(src, const_alpha); + dst = s + BYTE_MUL(dst, qAlpha(~s)); + } +} + #if defined(__SSE2__) static Q_ALWAYS_INLINE uint interpolate_4_pixels_sse2(__m128i vt, __m128i vb, uint distx, uint disty) { diff --git a/src/gui/painting/qdrawhelper_ssse3.cpp b/src/gui/painting/qdrawhelper_ssse3.cpp index 7cd3e9ca1b..2026a4e656 100644 --- a/src/gui/painting/qdrawhelper_ssse3.cpp +++ b/src/gui/painting/qdrawhelper_ssse3.cpp @@ -45,15 +45,6 @@ QT_BEGIN_NAMESPACE -inline static void blend_pixel(quint32 &dst, const quint32 src) -{ - if (src >= 0xff000000) - dst = src; - else if (src != 0) - dst = src + BYTE_MUL(dst, qAlpha(~src)); -} - - /* The instruction palignr uses direct arguments, so we have to generate the code fo the different shift (4, 8, 12). Checking the alignment inside the loop is unfortunatelly way too slow. */ diff --git a/src/gui/painting/qdrawingprimitive_sse2_p.h b/src/gui/painting/qdrawingprimitive_sse2_p.h index 8799dff92a..7affc63b32 100644 --- a/src/gui/painting/qdrawingprimitive_sse2_p.h +++ b/src/gui/painting/qdrawingprimitive_sse2_p.h @@ -171,11 +171,7 @@ QT_BEGIN_NAMESPACE \ /* First, get dst aligned. */ \ ALIGNMENT_PROLOGUE_16BYTES(dst, x, length) { \ - uint s = src[x]; \ - if (s >= 0xff000000) \ - dst[x] = s; \ - else if (s != 0) \ - dst[x] = s + BYTE_MUL(dst[x], qAlpha(~s)); \ + blend_pixel(dst[x], src[x]); \ } \ \ for (; x < length-3; x += 4) { \ @@ -183,11 +179,7 @@ QT_BEGIN_NAMESPACE BLEND_SOURCE_OVER_ARGB32_SSE2_helper(dst, srcVector, nullVector, half, one, colorMask, alphaMask) \ } \ for (; x < length; ++x) { \ - uint s = src[x]; \ - if (s >= 0xff000000) \ - dst[x] = s; \ - else if (s != 0) \ - dst[x] = s + BYTE_MUL(dst[x], qAlpha(~s)); \ + blend_pixel(dst[x], src[x]); \ } \ } @@ -207,11 +199,7 @@ QT_BEGIN_NAMESPACE int x = 0; \ \ ALIGNMENT_PROLOGUE_16BYTES(dst, x, length) { \ - quint32 s = src[x]; \ - if (s != 0) { \ - s = BYTE_MUL(s, const_alpha); \ - dst[x] = s + BYTE_MUL(dst[x], qAlpha(~s)); \ - } \ + blend_pixel(dst[x], src[x], const_alpha); \ } \ \ for (; x < length-3; x += 4) { \ @@ -232,11 +220,7 @@ QT_BEGIN_NAMESPACE } \ } \ for (; x < length; ++x) { \ - quint32 s = src[x]; \ - if (s != 0) { \ - s = BYTE_MUL(s, const_alpha); \ - dst[x] = s + BYTE_MUL(dst[x], qAlpha(~s)); \ - } \ + blend_pixel(dst[x], src[x], const_alpha); \ } \ } -- cgit v1.2.3