Fix premultiply of RGB64 formats

Alpha was also multiplied, leading to wrong alpha values.

Change-Id: Ic452b21f5f02898074552afd68440193b60799c1
Pick-to: 6.6 6.5 6.2
Fixes: QTBUG-120614
Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org>
Reviewed-by: Eirik Aavitsland <eirik.aavitsland@qt.io>
(cherry picked from commit c0a448d5c38557adac915342034263ae8a4908e1)
Reviewed-by: Qt Cherry-pick Bot <cherrypick_bot@qt-project.org>
This commit is contained in:
Allan Sandfeld Jensen 2024-01-09 12:29:49 +01:00 committed by Qt Cherry-pick Bot
parent 60f394d357
commit 2f59eee2bc
2 changed files with 5 additions and 0 deletions

View File

@ -1345,13 +1345,16 @@ const QRgba64 *QT_FASTCALL fetchRGBA64ToRGBA64PM_avx2(QRgba64 *buffer, const uch
vslo = _mm256_srli_epi32(vslo, 16); vslo = _mm256_srli_epi32(vslo, 16);
vshi = _mm256_srli_epi32(vshi, 16); vshi = _mm256_srli_epi32(vshi, 16);
vs256 = _mm256_packus_epi32(vslo, vshi); vs256 = _mm256_packus_epi32(vslo, vshi);
vs256 = _mm256_blend_epi16(vs256, va256, 0x88);
_mm256_storeu_si256((__m256i *)(buffer + i), vs256); _mm256_storeu_si256((__m256i *)(buffer + i), vs256);
} }
for (; i < count; ++i) { for (; i < count; ++i) {
const auto a = s[i].alpha();
__m128i vs = _mm_loadl_epi64((const __m128i *)(s + i)); __m128i vs = _mm_loadl_epi64((const __m128i *)(s + i));
__m128i va = _mm_shufflelo_epi16(vs, _MM_SHUFFLE(3, 3, 3, 3)); __m128i va = _mm_shufflelo_epi16(vs, _MM_SHUFFLE(3, 3, 3, 3));
vs = multiplyAlpha65535(vs, va); vs = multiplyAlpha65535(vs, va);
_mm_storel_epi64((__m128i *)(buffer + i), vs); _mm_storel_epi64((__m128i *)(buffer + i), vs);
buffer[i].setAlpha(a);
} }
return buffer; return buffer;
} }

View File

@ -1187,10 +1187,12 @@ static const QRgba64 *QT_FASTCALL fetchRGBA64ToRGBA64PM(QRgba64 *buffer, const u
const QRgba64 *s = reinterpret_cast<const QRgba64 *>(src) + index; const QRgba64 *s = reinterpret_cast<const QRgba64 *>(src) + index;
#ifdef __SSE2__ #ifdef __SSE2__
for (int i = 0; i < count; ++i) { for (int i = 0; i < count; ++i) {
const auto a = s[i].alpha();
__m128i vs = _mm_loadl_epi64((const __m128i *)(s + i)); __m128i vs = _mm_loadl_epi64((const __m128i *)(s + i));
__m128i va = _mm_shufflelo_epi16(vs, _MM_SHUFFLE(3, 3, 3, 3)); __m128i va = _mm_shufflelo_epi16(vs, _MM_SHUFFLE(3, 3, 3, 3));
vs = multiplyAlpha65535(vs, va); vs = multiplyAlpha65535(vs, va);
_mm_storel_epi64((__m128i *)(buffer + i), vs); _mm_storel_epi64((__m128i *)(buffer + i), vs);
buffer[i].setAlpha(a);
} }
#else #else
for (int i = 0; i < count; ++i) for (int i = 0; i < count; ++i)