21#include <QtCore/private/qsimd_p.h>
22#include <QtGui/private/qtguiglobal_p.h>
35 vs = _mm_unpacklo_epi16(_mm_mullo_epi16(vs, va), _mm_mulhi_epu16(vs, va));
36 vs = _mm_add_epi32(vs, _mm_srli_epi32(vs, 16));
37 vs = _mm_add_epi32(vs, _mm_set1_epi32(0x8000));
38 vs = _mm_srai_epi32(vs, 16);
39 vs = _mm_packs_epi32(vs, vs);
44 const __m128i va = _mm_shufflelo_epi16(_mm_cvtsi32_si128(alpha65535), _MM_SHUFFLE(0, 0, 0, 0));
47#elif defined(__ARM_NEON__)
50 uint32x4_t vs32 = vmull_u16(rgba64, alpha65535);
51 vs32 = vsraq_n_u32(vs32, vs32, 16);
52 return vrshrn_n_u32(vs32, 16);
56 uint32x4_t vs32 = vmull_n_u16(rgba64, alpha65535);
57 vs32 = vsraq_n_u32(vs32, vs32, 16);
58 return vrshrn_n_u32(vs32, 16);
65 const __m128i
v = _mm_loadl_epi64(
reinterpret_cast<const __m128i *
>(&rgba64));
68 _mm_storel_epi64(
reinterpret_cast<__m128i *
>(&
r), vr);
70#elif defined(__ARM_NEON__)
71 const uint16x4_t
v = vreinterpret_u16_u64(vld1_u64(
reinterpret_cast<const uint64_t *
>(&rgba64)));
74 vst1_u64(
reinterpret_cast<uint64_t *
>(&
r), vreinterpret_u64_u16(vr));
84#if defined(__SSE2__) || defined(__ARM_NEON__)
108#if defined __ARM_NEON__
118 const __m128i vx = _mm_loadl_epi64(
reinterpret_cast<const __m128i *
>(&
x));
119 const __m128i vy = _mm_loadl_epi64(
reinterpret_cast<const __m128i *
>(&
y));
122 _mm_storel_epi64(
reinterpret_cast<__m128i *
>(&
r), vr);
124#elif defined(__ARM_NEON__)
125 const uint16x4_t vx = vreinterpret_u16_u64(vld1_u64(
reinterpret_cast<const uint64_t *
>(&
x)));
126 const uint16x4_t vy = vreinterpret_u16_u64(vld1_u64(
reinterpret_cast<const uint64_t *
>(&
y)));
129 vst1_u64(
reinterpret_cast<uint64_t *
>(&
r), vreinterpret_u64_u16(vr));
148#if defined __ARM_NEON__
153inline uint16x4_t
interpolate65535(uint16x4_t
x, uint16x4_t alpha1, uint16x4_t
y, uint16x4_t alpha2)
162 const __m128i vx = _mm_loadl_epi64(
reinterpret_cast<const __m128i *
>(&
x));
163 const __m128i vy = _mm_loadl_epi64(
reinterpret_cast<const __m128i *
>(&
y));
166 _mm_storel_epi64(
reinterpret_cast<__m128i *
>(&
r), vr);
168#elif defined(__ARM_NEON__)
169 const uint16x4_t vx = vreinterpret_u16_u64(vld1_u64(
reinterpret_cast<const uint64_t *
>(&
x)));
170 const uint16x4_t vy = vreinterpret_u16_u64(vld1_u64(
reinterpret_cast<const uint64_t *
>(&
y)));
173 vst1_u64(
reinterpret_cast<uint64_t *
>(&
r), vreinterpret_u64_u16(vr));
183 const __m128i va = _mm_loadl_epi64(
reinterpret_cast<const __m128i *
>(&
a));
184 const __m128i vb = _mm_loadl_epi64(
reinterpret_cast<const __m128i *
>(&
b));
185 const __m128i vr = _mm_adds_epu16(va, vb);
187 _mm_storel_epi64(
reinterpret_cast<__m128i *
>(&
r), vr);
191 qMin(
a.green() +
b.green(), 65535),
192 qMin(
a.blue() +
b.blue(), 65535),
193 qMin(
a.alpha() +
b.alpha(), 65535));
197#if QT_COMPILER_SUPPORTS_HERE(SSE2)
201 v = _mm_unpacklo_epi16(
v, _mm_setzero_si128());
202 v = _mm_add_epi32(
v, _mm_set1_epi32(128));
203 v = _mm_sub_epi32(
v, _mm_srli_epi32(
v, 8));
204 v = _mm_srli_epi32(
v, 8);
205 v = _mm_packs_epi32(
v,
v);
206 v = _mm_packus_epi16(
v,
v);
207 return _mm_cvtsi128_si32(
v);
209#elif defined __ARM_NEON__
212 v = vsub_u16(
v, vrshr_n_u16(
v, 8));
213 v = vrshr_n_u16(
v, 8);
214 uint8x8_t v8 = vmovn_u16(vcombine_u16(
v,
v));
215 return vget_lane_u32(vreinterpret_u32_u8(v8), 0);
222 __m128i
v = _mm_loadl_epi64(
reinterpret_cast<const __m128i *
>(&rgba64));
223 v = _mm_shufflelo_epi16(
v, _MM_SHUFFLE(3, 0, 1, 2));
225#elif defined __ARM_NEON__
226 uint16x4_t
v = vreinterpret_u16_u64(vld1_u64(
reinterpret_cast<const uint64_t *
>(&rgba64)));
227#if Q_BYTE_ORDER == Q_LITTLE_ENDIAN
228 const uint8x8_t shuffleMask = { 4, 5, 2, 3, 0, 1, 6, 7 };
229 v = vreinterpret_u16_u8(vtbl1_u8(vreinterpret_u8_u16(
v), shuffleMask));
231 v = vext_u16(
v,
v, 3);
242 __m128i
v = _mm_loadl_epi64(
reinterpret_cast<const __m128i *
>(&rgba64));
244#elif defined __ARM_NEON__
245 uint16x4_t
v = vreinterpret_u16_u64(vld1_u64(
reinterpret_cast<const uint64_t *
>(&rgba64)));
256 __m128i vd = _mm_loadl_epi64(
reinterpret_cast<const __m128i *
>(&
d));
257 __m128i vs = _mm_loadl_epi64(
reinterpret_cast<const __m128i *
>(&
s));
258 __m128i va = _mm_cvtsi32_si128(rgbAlpha);
259 va = _mm_unpacklo_epi8(va, va);
260 va = _mm_shufflelo_epi16(va, _MM_SHUFFLE(3, 0, 1, 2));
261 __m128i vb = _mm_xor_si128(_mm_set1_epi16(-1), va);
263 vs = _mm_unpacklo_epi16(_mm_mullo_epi16(vs, va), _mm_mulhi_epu16(vs, va));
264 vd = _mm_unpacklo_epi16(_mm_mullo_epi16(vd, vb), _mm_mulhi_epu16(vd, vb));
265 vd = _mm_add_epi32(vd, vs);
266 vd = _mm_add_epi32(vd, _mm_srli_epi32(vd, 16));
267 vd = _mm_add_epi32(vd, _mm_set1_epi32(0x8000));
268 vd = _mm_srai_epi32(vd, 16);
269 vd = _mm_packs_epi32(vd, vd);
271 _mm_storel_epi64(
reinterpret_cast<__m128i *
>(&blend), vd);
272#elif defined(__ARM_NEON__)
273 uint16x4_t vd = vreinterpret_u16_u64(vmov_n_u64(
d));
274 uint16x4_t vs = vreinterpret_u16_u64(vmov_n_u64(
s));
275 uint8x8_t va8 = vreinterpret_u8_u32(vmov_n_u32(
ARGB2RGBA(rgbAlpha)));
276 uint16x4_t va = vreinterpret_u16_u8(vzip_u8(va8, va8).
val[0]);
277 uint16x4_t vb = vdup_n_u16(0xffff);
278 vb = vsub_u16(vb, va);
280 uint32x4_t vs32 = vmull_u16(vs, va);
281 uint32x4_t vd32 = vmull_u16(vd, vb);
282 vd32 = vaddq_u32(vd32, vs32);
283 vd32 = vsraq_n_u32(vd32, vd32, 16);
284 vd = vrshrn_n_u32(vd32, 16);
285 vst1_u64(
reinterpret_cast<uint64_t *
>(&blend), vreinterpret_u64_u16(vd));
287 const int mr =
qRed(rgbAlpha);
288 const int mg =
qGreen(rgbAlpha);
289 const int mb =
qBlue(rgbAlpha);
302 else if (!
src.isTransparent()) {
304 const __m128i vd = _mm_loadl_epi64(
reinterpret_cast<const __m128i *
>(&
dst));
305 const __m128i vs = _mm_loadl_epi64(
reinterpret_cast<const __m128i *
>(&
src));
306 const __m128i via = _mm_xor_si128(_mm_set1_epi16(-1), _mm_shufflelo_epi16(vs, _MM_SHUFFLE(3, 3, 3, 3)));
308 _mm_storel_epi64(
reinterpret_cast<__m128i *
>(&
dst), vr);
317 if (const_alpha == 255)
319 if (!
src.isTransparent()) {
321 const __m128i vd = _mm_loadl_epi64(
reinterpret_cast<const __m128i *
>(&
dst));
322 __m128i vs = _mm_loadl_epi64(
reinterpret_cast<const __m128i *
>(&
src));
324 const __m128i via = _mm_xor_si128(_mm_set1_epi16(-1), _mm_shufflelo_epi16(vs, _MM_SHUFFLE(3, 3, 3, 3)));
326 _mm_storel_epi64(
reinterpret_cast<__m128i *
>(&
dst), vr);
constexpr quint16 red() const
constexpr quint16 alpha() const
constexpr quint16 green() const
constexpr quint16 blue() const
static constexpr QRgba64 fromRgba64(quint64 c)
constexpr uint toArgb32() const
Combined button and popup list for selecting options.
static constexpr uint qt_div_65535(uint x)
static constexpr int qt_div_255(int x)
#define Q_DECL_VECTORCALL
constexpr const T & qMin(const T &a, const T &b)
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLint GLint GLint GLint GLint x
[0]
GLboolean GLboolean GLboolean GLboolean a
[7]
static quint32 ARGB2RGBA(quint32 x)
constexpr int qRed(QRgb rgb)
constexpr int qGreen(QRgb rgb)
constexpr int qBlue(QRgb rgb)
constexpr QRgba64 qRgba64(quint16 r, quint16 g, quint16 b, quint16 a)
static QRgba64 multiplyAlpha65535(QRgba64 rgba64, uint alpha65535)
QT_BEGIN_NAMESPACE QRgba64 combineAlpha256(QRgba64 rgba64, uint alpha256)
static uint toArgb32(QRgba64 rgba64)
static QRgba64 interpolate65535(QRgba64 x, uint alpha1, QRgba64 y, uint alpha2)
static QRgba64 interpolate255(QRgba64 x, uint alpha1, QRgba64 y, uint alpha2)
static T multiplyAlpha255(T rgba64, uint alpha255)
static QRgba64 addWithSaturation(QRgba64 a, QRgba64 b)
static void blend_pixel(QRgba64 &dst, QRgba64 src)
static uint toRgba8888(QRgba64 rgba64)
static QRgba64 rgbBlend(QRgba64 d, QRgba64 s, uint rgbAlpha)
#define QT_FUNCTION_TARGET(x)