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:
parent
60f394d357
commit
2f59eee2bc
@ -1345,13 +1345,16 @@ const QRgba64 *QT_FASTCALL fetchRGBA64ToRGBA64PM_avx2(QRgba64 *buffer, const uch
|
||||
vslo = _mm256_srli_epi32(vslo, 16);
|
||||
vshi = _mm256_srli_epi32(vshi, 16);
|
||||
vs256 = _mm256_packus_epi32(vslo, vshi);
|
||||
vs256 = _mm256_blend_epi16(vs256, va256, 0x88);
|
||||
_mm256_storeu_si256((__m256i *)(buffer + i), vs256);
|
||||
}
|
||||
for (; i < count; ++i) {
|
||||
const auto a = s[i].alpha();
|
||||
__m128i vs = _mm_loadl_epi64((const __m128i *)(s + i));
|
||||
__m128i va = _mm_shufflelo_epi16(vs, _MM_SHUFFLE(3, 3, 3, 3));
|
||||
vs = multiplyAlpha65535(vs, va);
|
||||
_mm_storel_epi64((__m128i *)(buffer + i), vs);
|
||||
buffer[i].setAlpha(a);
|
||||
}
|
||||
return buffer;
|
||||
}
|
||||
|
@ -1187,10 +1187,12 @@ static const QRgba64 *QT_FASTCALL fetchRGBA64ToRGBA64PM(QRgba64 *buffer, const u
|
||||
const QRgba64 *s = reinterpret_cast<const QRgba64 *>(src) + index;
|
||||
#ifdef __SSE2__
|
||||
for (int i = 0; i < count; ++i) {
|
||||
const auto a = s[i].alpha();
|
||||
__m128i vs = _mm_loadl_epi64((const __m128i *)(s + i));
|
||||
__m128i va = _mm_shufflelo_epi16(vs, _MM_SHUFFLE(3, 3, 3, 3));
|
||||
vs = multiplyAlpha65535(vs, va);
|
||||
_mm_storel_epi64((__m128i *)(buffer + i), vs);
|
||||
buffer[i].setAlpha(a);
|
||||
}
|
||||
#else
|
||||
for (int i = 0; i < count; ++i)
|
||||
|
Loading…
x
Reference in New Issue
Block a user