diff options
author | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-01-31 16:13:16 +0100 |
---|---|---|
committer | Allan Sandfeld Jensen <allan.jensen@qt.io> | 2019-02-07 14:27:47 +0000 |
commit | 60addee9384cb8c589f7abf9020f7d6d7a6f4d63 (patch) | |
tree | 2a55252db920f78421c03e9130a2080cba7793c3 /src/gui/painting/qdrawhelper_avx2.cpp | |
parent | 928cab5ff1d931d00074d8930c41537109814371 (diff) |
Improve ARGB32ToRGBA64 conversions
Improves the precision so 255 values map to 65535 exactly.
Change-Id: I366f408e8c6047d52acbed35e9d665249bbaba2b
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Diffstat (limited to 'src/gui/painting/qdrawhelper_avx2.cpp')
-rw-r--r-- | src/gui/painting/qdrawhelper_avx2.cpp | 28 |
1 files changed, 12 insertions, 16 deletions
diff --git a/src/gui/painting/qdrawhelper_avx2.cpp b/src/gui/painting/qdrawhelper_avx2.cpp index f05cc0926e..2b3cc9b226 100644 --- a/src/gui/painting/qdrawhelper_avx2.cpp +++ b/src/gui/painting/qdrawhelper_avx2.cpp @@ -1135,14 +1135,12 @@ static void convertARGBToRGBA64PM_avx2(QRgba64 *buffer, const uint *src, qsizety const __m256i src1 = _mm256_unpacklo_epi8(srcVector, srcVector); const __m256i src2 = _mm256_unpackhi_epi8(srcVector, srcVector); if (!cf) { - dst1 = _mm256_unpacklo_epi8(srcVector, zero); - dst2 = _mm256_unpackhi_epi8(srcVector, zero); - const __m256i alpha1 = _mm256_shuffle_epi8(dst1, shuffleMask); - const __m256i alpha2 = _mm256_shuffle_epi8(dst2, shuffleMask); - dst1 = _mm256_mullo_epi16(dst1, alpha1); - dst2 = _mm256_mullo_epi16(dst2, alpha2); - dst1 = _mm256_add_epi16(dst1, _mm256_srli_epi16(dst1, 7)); - dst2 = _mm256_add_epi16(dst2, _mm256_srli_epi16(dst2, 7)); + const __m256i alpha1 = _mm256_shuffle_epi8(src1, shuffleMask); + const __m256i alpha2 = _mm256_shuffle_epi8(src2, shuffleMask); + dst1 = _mm256_mulhi_epu16(src1, alpha1); + dst2 = _mm256_mulhi_epu16(src2, alpha2); + dst1 = _mm256_add_epi16(dst1, _mm256_srli_epi16(dst1, 15)); + dst2 = _mm256_add_epi16(dst2, _mm256_srli_epi16(dst2, 15)); dst1 = _mm256_blend_epi16(dst1, src1, 0x88); dst2 = _mm256_blend_epi16(dst2, src2, 0x88); } else { @@ -1171,14 +1169,12 @@ static void convertARGBToRGBA64PM_avx2(QRgba64 *buffer, const uint *src, qsizety const __m256i src1 = _mm256_unpacklo_epi8(srcVector, srcVector); const __m256i src2 = _mm256_unpackhi_epi8(srcVector, srcVector); if (!cf) { - dst1 = _mm256_unpacklo_epi8(srcVector, zero); - dst2 = _mm256_unpackhi_epi8(srcVector, zero); - const __m256i alpha1 = _mm256_shuffle_epi8(dst1, shuffleMask); - const __m256i alpha2 = _mm256_shuffle_epi8(dst2, shuffleMask); - dst1 = _mm256_mullo_epi16(dst1, alpha1); - dst2 = _mm256_mullo_epi16(dst2, alpha2); - dst1 = _mm256_add_epi16(dst1, _mm256_srli_epi16(dst1, 7)); - dst2 = _mm256_add_epi16(dst2, _mm256_srli_epi16(dst2, 7)); + const __m256i alpha1 = _mm256_shuffle_epi8(src1, shuffleMask); + const __m256i alpha2 = _mm256_shuffle_epi8(src2, shuffleMask); + dst1 = _mm256_mulhi_epu16(src1, alpha1); + dst2 = _mm256_mulhi_epu16(src2, alpha2); + dst1 = _mm256_add_epi16(dst1, _mm256_srli_epi16(dst1, 15)); + dst2 = _mm256_add_epi16(dst2, _mm256_srli_epi16(dst2, 15)); dst1 = _mm256_blend_epi16(dst1, src1, 0x88); dst2 = _mm256_blend_epi16(dst2, src2, 0x88); } else { |