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);
|
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;
|
||||||
}
|
}
|
||||||
|
@ -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)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user