diff options
author | Qt Continuous Integration System <qt-info@nokia.com> | 2010-07-21 19:19:36 (GMT) |
---|---|---|
committer | Qt Continuous Integration System <qt-info@nokia.com> | 2010-07-21 19:19:36 (GMT) |
commit | 07f131927faa09402589da7b4bfb516482f59e46 (patch) | |
tree | 9b1c7fdec802bbcb9b183d5644d02d8cc4435da2 /src/gui/painting/qdrawhelper_sse2.cpp | |
parent | 19924c1373e6acdf4ebf8cf61c51f3cdf32978b3 (diff) | |
parent | d00d1bd5423d0bbfea7c85a0411d2b22d97fbe0f (diff) | |
download | Qt-07f131927faa09402589da7b4bfb516482f59e46.zip Qt-07f131927faa09402589da7b4bfb516482f59e46.tar.gz Qt-07f131927faa09402589da7b4bfb516482f59e46.tar.bz2 |
Merge branch '4.7' of scm.dev.nokia.troll.no:qt/oslo-staging-2 into 4.7-integration
* '4.7' of scm.dev.nokia.troll.no:qt/oslo-staging-2:
Use aligned load for the blending of RGB32 over RGB32
tst_moc: workaround gcc bug.
Some more change to the changelog
Fix compilation with QT_NO_GRAPHICSVIEW
Updates changes-4.7.0
Fixes the Oracle nchar bug when NLS_CHARSET is different with NLS_NCHAR_CHARSET.
Add a missing file in the config.test for SSE 4.2
Remove the masking when computing qAlpha()
Add support for more vector instructions on x86
Workaround gcc bug, disable test with old version of gcc
Do not crash due to a infinite recursion when using voiceover on MacOS
doc: Fix qdoc errors for text related files
QGraphicsItem: Animation leaves drawing artifacts when clipping is used.
moc: Slot with complex template default value does not compile
Diffstat (limited to 'src/gui/painting/qdrawhelper_sse2.cpp')
-rw-r--r-- | src/gui/painting/qdrawhelper_sse2.cpp | 14 |
1 files changed, 12 insertions, 2 deletions
diff --git a/src/gui/painting/qdrawhelper_sse2.cpp b/src/gui/painting/qdrawhelper_sse2.cpp index 346e177..279f685 100644 --- a/src/gui/painting/qdrawhelper_sse2.cpp +++ b/src/gui/painting/qdrawhelper_sse2.cpp @@ -110,13 +110,23 @@ void qt_blend_rgb32_on_rgb32_sse2(uchar *destPixels, int dbpl, const __m128i oneMinusConstAlpha = _mm_set1_epi16(one_minus_const_alpha); for (int y = 0; y < h; ++y) { int x = 0; + + // First, align dest to 16 bytes: + const int offsetToAlignOn16Bytes = (4 - ((reinterpret_cast<quintptr>(dst) >> 2) & 0x3)) & 0x3; + const int prologLength = qMin(w, offsetToAlignOn16Bytes); + for (; x < prologLength; ++x) { + quint32 s = src[x]; + s = BYTE_MUL(s, const_alpha); + dst[x] = INTERPOLATE_PIXEL_255(src[x], const_alpha, dst[x], one_minus_const_alpha); + } + for (; x < w-3; x += 4) { __m128i srcVector = _mm_loadu_si128((__m128i *)&src[x]); if (_mm_movemask_epi8(_mm_cmpeq_epi32(srcVector, nullVector)) != 0xffff) { - const __m128i dstVector = _mm_loadu_si128((__m128i *)&dst[x]); + const __m128i dstVector = _mm_load_si128((__m128i *)&dst[x]); __m128i result; INTERPOLATE_PIXEL_255_SSE2(result, srcVector, dstVector, constAlphaVector, oneMinusConstAlpha, colorMask, half); - _mm_storeu_si128((__m128i *)&dst[x], result); + _mm_store_si128((__m128i *)&dst[x], result); } } for (; x<w; ++x) { |