From a0b3294c9dccea84c3c26eb751331bdd5cdb97ec Mon Sep 17 00:00:00 2001 From: Allan Sandfeld Jensen Date: Wed, 15 Feb 2017 13:55:33 +0100 Subject: [PATCH] Fix QRgba64 rgbBlend The subpixel RGB alpha values were not converted from host endian to RGBA order before being used as RGBA ordered. Task-number: QTBUG-58619 Change-Id: I18e1c9df902c7e9001a0e511f06fc953dd7afa3e Reviewed-by: Gabriel de Dietrich Reviewed-by: Eskil Abrahamsen Blomfeldt Reviewed-by: Eirik Aavitsland --- src/gui/painting/qrgba64_p.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/gui/painting/qrgba64_p.h b/src/gui/painting/qrgba64_p.h index 2a17d8a6245..7776a5b08ab 100644 --- a/src/gui/painting/qrgba64_p.h +++ b/src/gui/painting/qrgba64_p.h @@ -256,11 +256,12 @@ Q_ALWAYS_INLINE uint16x4_t addWithSaturation(uint16x4_t a, uint16x4_t b) inline QRgba64 rgbBlend(QRgba64 d, QRgba64 s, uint rgbAlpha) { QRgba64 blend; -#ifdef __SSE2__ +#if defined(__SSE2__) __m128i vd = _mm_loadl_epi64((const __m128i *)&d); __m128i vs = _mm_loadl_epi64((const __m128i *)&s); __m128i va = _mm_cvtsi32_si128(rgbAlpha); va = _mm_unpacklo_epi8(va, va); + va = _mm_shufflelo_epi16(va, _MM_SHUFFLE(3, 0, 1, 2)); __m128i vb = _mm_xor_si128(_mm_set1_epi16(-1), va); vs = _mm_unpacklo_epi16(_mm_mullo_epi16(vs, va), _mm_mulhi_epu16(vs, va)); @@ -275,7 +276,7 @@ inline QRgba64 rgbBlend(QRgba64 d, QRgba64 s, uint rgbAlpha) #elif defined(__ARM_NEON__) uint16x4_t vd = vreinterpret_u16_u64(vmov_n_u64(d)); uint16x4_t vs = vreinterpret_u16_u64(vmov_n_u64(s)); - uint8x8_t va8 = vreinterpret_u8_u32(vmov_n_u32(rgbAlpha)); + uint8x8_t va8 = vreinterpret_u8_u32(vmov_n_u32(ARGB2RGBA(rgbAlpha))); uint16x4_t va = vreinterpret_u16_u8(vzip_u8(va8, va8).val[0]); uint16x4_t vb = vdup_n_u16(0xffff); vb = vsub_u16(vb, va);