12#include <QtCore/qatomic.h>
13#include <QtCore/qmath.h>
14#include <QtGui/qcolor.h>
15#include <QtGui/qimage.h>
16#include <QtGui/qtransform.h>
17#include <QtCore/private/qsimd_p.h>
25 if (trc.
m_type == QColorTrc::Type::Table)
27 if (trc.
m_type == QColorTrc::Type::Function)
41 for (
int i = 0;
i < 3; ++
i) {
51 for (
int i = 0;
i < 3; ++
i)
65 for (
int i = 0;
i < 3; ++
i) {
75 for (
int i = 0;
i < 3; ++
i)
113 return !
d ||
d->isIdentity();
134 if (
bool(d) !=
bool(
other.d))
142 for (
int i = 0;
i < 3; ++
i) {
160 constexpr float f = 1.0f / 255.0f;
172 c.
x = std::max(0.0f, std::min(1.0f,
c.x));
173 c.y = std::max(0.0f, std::min(1.0f,
c.y));
174 c.z = std::max(0.0f, std::min(1.0f,
c.z));
185 return qRgba(
c.x * 255 + 0.5f,
c.y * 255 + 0.5f,
c.z * 255 + 0.5f,
qAlpha(argb));
197 constexpr float f = 1.0f / 65535.0f;
209 c.
x = std::max(0.0f, std::min(1.0f,
c.x));
210 c.y = std::max(0.0f, std::min(1.0f,
c.y));
211 c.z = std::max(0.0f, std::min(1.0f,
c.z));
290 bool inGamut =
c.
x >= 0.0f &&
c.x <= 1.0f &&
c.y >= 0.0f &&
c.y <= 1.0f &&
c.z >= 0.0f &&
c.z <= 1.0f;
313template<
bool DoClamp = true>
317 const __m128 minV = _mm_set1_ps(0.0f);
318 const __m128 maxV = _mm_set1_ps(1.0f);
319 const __m128 xMat = _mm_loadu_ps(&colorMatrix.
r.
x);
320 const __m128 yMat = _mm_loadu_ps(&colorMatrix.
g.
x);
321 const __m128 zMat = _mm_loadu_ps(&colorMatrix.
b.
x);
324 __m128 cx = _mm_shuffle_ps(
c,
c, _MM_SHUFFLE(0, 0, 0, 0));
325 __m128 cy = _mm_shuffle_ps(
c,
c, _MM_SHUFFLE(1, 1, 1, 1));
326 __m128 cz = _mm_shuffle_ps(
c,
c, _MM_SHUFFLE(2, 2, 2, 2));
327 cx = _mm_mul_ps(cx, xMat);
328 cy = _mm_mul_ps(cy, yMat);
329 cz = _mm_mul_ps(cz, zMat);
330 cx = _mm_add_ps(cx, cy);
331 cx = _mm_add_ps(cx, cz);
334 cx = _mm_min_ps(cx, maxV);
335 cx = _mm_max_ps(cx, minV);
339#elif defined(__ARM_NEON__)
340 const float32x4_t minV = vdupq_n_f32(0.0f);
341 const float32x4_t maxV = vdupq_n_f32(1.0f);
342 const float32x4_t xMat = vld1q_f32(&colorMatrix.
r.
x);
343 const float32x4_t yMat = vld1q_f32(&colorMatrix.
g.
x);
344 const float32x4_t zMat = vld1q_f32(&colorMatrix.
b.
x);
347 float32x4_t cx = vmulq_n_f32(xMat, vgetq_lane_f32(
c, 0));
348 float32x4_t cy = vmulq_n_f32(yMat, vgetq_lane_f32(
c, 1));
349 float32x4_t cz = vmulq_n_f32(zMat, vgetq_lane_f32(
c, 2));
350 cx = vaddq_f32(cx, cy);
351 cx = vaddq_f32(cx, cz);
354 cx = vminq_f32(cx, maxV);
355 cx = vmaxq_f32(cx, minV);
360 for (
int j = 0;
j <
len; ++
j) {
363 buffer[
j].
x = std::max(0.0f, std::min(1.0f, cv.
x));
364 buffer[
j].y = std::max(0.0f, std::min(1.0f, cv.
y));
365 buffer[
j].z = std::max(0.0f, std::min(1.0f, cv.
z));
373#if defined(__SSE2__) || defined(__ARM_NEON__)
375static constexpr inline bool isArgb();
377constexpr inline bool isArgb<QRgb>() {
return true; }
379constexpr inline bool isArgb<QRgba64>() {
return false; }
382static inline int getAlpha(
const T &
p);
384inline int getAlpha<QRgb>(
const QRgb &
p)
387inline int getAlpha<QRgba64>(
const QRgba64 &
p)
399static inline void loadP(
const T &
p, __m128i &
v);
402inline void loadP<QRgb>(
const QRgb &
p, __m128i &
v)
404 v = _mm_cvtsi32_si128(
p);
405#if defined(__SSE4_1__)
406 v = _mm_cvtepu8_epi32(
v);
408 v = _mm_unpacklo_epi8(
v, _mm_setzero_si128());
409 v = _mm_unpacklo_epi16(
v, _mm_setzero_si128());
414inline void loadP<QRgba64>(
const QRgba64 &
p, __m128i &
v)
416 v = _mm_loadl_epi64((
const __m128i *)&
p);
417#if defined(__SSE4_1__)
418 v = _mm_cvtepu16_epi32(
v);
420 v = _mm_unpacklo_epi16(
v, _mm_setzero_si128());
427 const __m128 v4080 = _mm_set1_ps(4080.f);
428 const __m128 iFF00 = _mm_set1_ps(1.0f / (255 * 256));
429 constexpr bool isARGB = isArgb<T>();
433 __m128 vf = _mm_cvtepi32_ps(
v);
435 __m128 va = _mm_shuffle_ps(vf, vf, _MM_SHUFFLE(3, 3, 3, 3));
436 __m128 via = _mm_rcp_ps(va);
437 via = _mm_sub_ps(_mm_add_ps(via, via), _mm_mul_ps(via, _mm_mul_ps(via, va)));
439 vf = _mm_mul_ps(vf, via);
442 __m128 vAlphaMask = _mm_cmpeq_ps(va, _mm_set1_ps(0.0f));
443 vf = _mm_andnot_ps(vAlphaMask, vf);
446 v = _mm_cvtps_epi32(_mm_mul_ps(vf, v4080));
447 const int ridx = isARGB ? _mm_extract_epi16(
v, 4) : _mm_extract_epi16(
v, 0);
448 const int gidx = _mm_extract_epi16(
v, 2);
449 const int bidx = isARGB ? _mm_extract_epi16(
v, 0) : _mm_extract_epi16(
v, 4);
453 vf = _mm_mul_ps(_mm_cvtepi32_ps(
v), iFF00);
462 const __m128 v4080 = _mm_set1_ps(4080.f);
463 const __m128 viFF00 = _mm_set1_ps(1.0f / (255 * 256));
464 const __m128 vZero = _mm_set1_ps(0.0f);
465 const __m128 vOne = _mm_set1_ps(1.0f);
467 __m128 vf = _mm_loadu_ps(&
src[
i].
r);
469 __m128 va = _mm_shuffle_ps(vf, vf, _MM_SHUFFLE(3, 3, 3, 3));
470 __m128 via = _mm_rcp_ps(va);
471 via = _mm_sub_ps(_mm_add_ps(via, via), _mm_mul_ps(via, _mm_mul_ps(via, va)));
473 vf = _mm_mul_ps(vf, via);
476 __m128 vAlphaMask = _mm_cmpeq_ps(va, vZero);
477 vf = _mm_andnot_ps(vAlphaMask, vf);
480 const __m128 under = _mm_cmplt_ps(vf, vZero);
481 const __m128 over = _mm_cmpgt_ps(vf, vOne);
482 if (_mm_movemask_ps(_mm_or_ps(under, over)) == 0) {
484 __m128i
v = _mm_cvtps_epi32(_mm_mul_ps(vf, v4080));
485 const int ridx = _mm_extract_epi16(
v, 0);
486 const int gidx = _mm_extract_epi16(
v, 2);
487 const int bidx = _mm_extract_epi16(
v, 4);
491 vf = _mm_mul_ps(_mm_cvtepi32_ps(
v), viFF00);
505static inline void loadPU(
const T &
p, __m128i &
v);
508inline void loadPU<QRgb>(
const QRgb &
p, __m128i &
v)
510 v = _mm_cvtsi32_si128(
p);
511#if defined(__SSE4_1__)
512 v = _mm_cvtepu8_epi32(
v);
514 v = _mm_unpacklo_epi8(
v, _mm_setzero_si128());
515 v = _mm_unpacklo_epi16(
v, _mm_setzero_si128());
517 v = _mm_slli_epi32(
v, 4);
521inline void loadPU<QRgba64>(
const QRgba64 &
p, __m128i &
v)
523 v = _mm_loadl_epi64((
const __m128i *)&
p);
524 v = _mm_sub_epi16(
v, _mm_srli_epi16(
v, 8));
525#if defined(__SSE4_1__)
526 v = _mm_cvtepu16_epi32(
v);
528 v = _mm_unpacklo_epi16(
v, _mm_setzero_si128());
530 v = _mm_srli_epi32(
v, 4);
536 constexpr bool isARGB = isArgb<T>();
537 const __m128 iFF00 = _mm_set1_ps(1.0f / (255 * 256));
540 loadPU<T>(
src[
i],
v);
541 const int ridx = isARGB ? _mm_extract_epi16(
v, 4) : _mm_extract_epi16(
v, 0);
542 const int gidx = _mm_extract_epi16(
v, 2);
543 const int bidx = isARGB ? _mm_extract_epi16(
v, 0) : _mm_extract_epi16(
v, 4);
547 __m128 vf = _mm_mul_ps(_mm_cvtepi32_ps(
v), iFF00);
555 const __m128 v4080 = _mm_set1_ps(4080.f);
556 const __m128 iFF00 = _mm_set1_ps(1.0f / (255 * 256));
557 const __m128 vZero = _mm_set1_ps(0.0f);
558 const __m128 vOne = _mm_set1_ps(1.0f);
560 __m128 vf = _mm_loadu_ps(&
src[
i].
r);
561 const __m128 under = _mm_cmplt_ps(vf, vZero);
562 const __m128 over = _mm_cmpgt_ps(vf, vOne);
563 if (_mm_movemask_ps(_mm_or_ps(under, over)) == 0) {
565 __m128i
v = _mm_cvtps_epi32(_mm_mul_ps(vf, v4080));
566 const int ridx = _mm_extract_epi16(
v, 0);
567 const int gidx = _mm_extract_epi16(
v, 2);
568 const int bidx = _mm_extract_epi16(
v, 4);
572 vf = _mm_mul_ps(_mm_cvtepi32_ps(
v), iFF00);
583#elif defined(__ARM_NEON__)
586static inline void loadP(
const T &
p, uint32x4_t &
v);
589inline void loadP<QRgb>(
const QRgb &
p, uint32x4_t &
v)
591 v = vmovl_u16(vget_low_u16(vmovl_u8(vreinterpret_u8_u32(vmov_n_u32(
p)))));
595inline void loadP<QRgba64>(
const QRgba64 &
p, uint32x4_t &
v)
597 v = vmovl_u16(vreinterpret_u16_u64(vld1_u64(
reinterpret_cast<const uint64_t *
>(&
p))));
603 constexpr bool isARGB = isArgb<T>();
604 const float iFF00 = 1.0f / (255 * 256);
608 float32x4_t vf = vcvtq_f32_u32(
v);
610 float32x4_t va = vdupq_n_f32(vgetq_lane_f32(vf, 3));
611 float32x4_t via = vrecpeq_f32(va);
612 via = vmulq_f32(vrecpsq_f32(va, via), via);
615 vf = vmulq_f32(vf, via);
618#if defined(Q_PROCESSOR_ARM_64)
619 uint32x4_t vAlphaMask = vceqzq_f32(va);
621 uint32x4_t vAlphaMask = vceqq_f32(va, vdupq_n_f32(0.0));
623 vf = vreinterpretq_f32_u32(vbicq_u32(vreinterpretq_u32_f32(vf), vAlphaMask));
626 v = vcvtq_u32_f32(vaddq_f32(vmulq_n_f32(vf, 4080.f), vdupq_n_f32(0.5f)));
627 const int ridx = isARGB ? vgetq_lane_u32(
v, 2) : vgetq_lane_u32(
v, 0);
628 const int gidx = vgetq_lane_u32(
v, 1);
629 const int bidx = isARGB ? vgetq_lane_u32(
v, 0) : vgetq_lane_u32(
v, 2);
633 vf = vmulq_n_f32(vcvtq_f32_u32(
v), iFF00);
641static inline void loadPU(
const T &
p, uint32x4_t &
v);
644inline void loadPU<QRgb>(
const QRgb &
p, uint32x4_t &
v)
646 v = vmovl_u16(vget_low_u16(vmovl_u8(vreinterpret_u8_u32(vmov_n_u32(
p)))));
647 v = vshlq_n_u32(
v, 4);
651inline void loadPU<QRgba64>(
const QRgba64 &
p, uint32x4_t &
v)
653 uint16x4_t v16 = vreinterpret_u16_u64(vld1_u64(
reinterpret_cast<const uint64_t *
>(&
p)));
654 v16 = vsub_u16(v16, vshr_n_u16(v16, 8));
656 v = vshrq_n_u32(
v, 4);
662 constexpr bool isARGB = isArgb<T>();
663 const float iFF00 = 1.0f / (255 * 256);
666 loadPU<T>(
src[
i],
v);
667 const int ridx = isARGB ? vgetq_lane_u32(
v, 2) : vgetq_lane_u32(
v, 0);
668 const int gidx = vgetq_lane_u32(
v, 1);
669 const int bidx = isARGB ? vgetq_lane_u32(
v, 0) : vgetq_lane_u32(
v, 2);
673 float32x4_t vf = vmulq_n_f32(vcvtq_f32_u32(
v), iFF00);
685 const float ia = 4080.0f /
a;
686 const int ridx = int(
qRed(
p) * ia + 0.5f);
687 const int gidx = int(
qGreen(
p) * ia + 0.5f);
688 const int bidx = int(
qBlue(
p) * ia + 0.5f);
705 const float ia = 4080.0f /
a;
706 const int ridx = int(
p.red() * ia + 0.5f);
707 const int gidx = int(
p.green() * ia + 0.5f);
708 const int bidx = int(
p.blue() * ia + 0.5f);
740#if !defined(__SSE2__)
748 const float ia = 1.0f /
a;
772static inline void storeP(T &
p, __m128i &
v,
int a);
774inline void storeP<QRgb>(
QRgb &
p, __m128i &
v,
int a)
776 v = _mm_packs_epi32(
v,
v);
777 v = _mm_insert_epi16(
v,
a, 3);
778 p = _mm_cvtsi128_si32(_mm_packus_epi16(
v,
v));
781inline void storeP<QRgba64>(
QRgba64 &
p, __m128i &
v,
int a)
783#if defined(__SSE4_1__)
784 v = _mm_packus_epi32(
v,
v);
785 v = _mm_insert_epi16(
v,
a, 3);
786 _mm_storel_epi64((__m128i *)&
p,
v);
788 const int r = _mm_extract_epi16(
v, 0);
789 const int g = _mm_extract_epi16(
v, 2);
790 const int b = _mm_extract_epi16(
v, 4);
799 const __m128 v4080 = _mm_set1_ps(4080.f);
800 const __m128 iFF00 = _mm_set1_ps(1.0f / (255 * 256));
801 constexpr bool isARGB = isArgb<T>();
803 const int a = getAlpha<T>(
src[
i]);
804 __m128 vf = _mm_loadu_ps(&
buffer[
i].
x);
805 __m128i
v = _mm_cvtps_epi32(_mm_mul_ps(vf, v4080));
806 __m128 va = _mm_mul_ps(_mm_set1_ps(
a), iFF00);
807 const int ridx = _mm_extract_epi16(
v, 0);
808 const int gidx = _mm_extract_epi16(
v, 2);
809 const int bidx = _mm_extract_epi16(
v, 4);
810 v = _mm_insert_epi16(
v, d_ptr->
colorSpaceOut->
lut[0]->m_fromLinear[ridx], isARGB ? 4 : 0);
812 v = _mm_insert_epi16(
v, d_ptr->
colorSpaceOut->
lut[2]->m_fromLinear[bidx], isARGB ? 0 : 4);
813 vf = _mm_cvtepi32_ps(
v);
814 vf = _mm_mul_ps(vf, va);
815 v = _mm_cvtps_epi32(vf);
825 const __m128 v4080 = _mm_set1_ps(4080.f);
826 const __m128 vZero = _mm_set1_ps(0.0f);
827 const __m128 vOne = _mm_set1_ps(1.0f);
828 const __m128 viFF00 = _mm_set1_ps(1.0f / (255 * 256));
830 const float a =
src[
i].a;
831 __m128 va = _mm_set1_ps(
a);
832 __m128 vf = _mm_loadu_ps(&
buffer[
i].
x);
833 const __m128 under = _mm_cmplt_ps(vf, vZero);
834 const __m128 over = _mm_cmpgt_ps(vf, vOne);
835 if (_mm_movemask_ps(_mm_or_ps(under, over)) == 0) {
837 va = _mm_mul_ps(va, viFF00);
838 __m128i
v = _mm_cvtps_epi32(_mm_mul_ps(vf, v4080));
839 const int ridx = _mm_extract_epi16(
v, 0);
840 const int gidx = _mm_extract_epi16(
v, 2);
841 const int bidx = _mm_extract_epi16(
v, 4);
842 v = _mm_setzero_si128();
846 vf = _mm_mul_ps(_mm_cvtepi32_ps(
v), va);
847 _mm_store_ps(&
dst[
i].
r, vf);
852 vf = _mm_mul_ps(_mm_load_ps(&
dst[
i].
r), va);
853 _mm_store_ps(&
dst[
i].
r, vf);
860static inline void storePU(T &
p, __m128i &
v,
int a);
862inline void storePU<QRgb>(
QRgb &
p, __m128i &
v,
int a)
864 v = _mm_add_epi16(
v, _mm_set1_epi16(0x80));
865 v = _mm_srli_epi16(
v, 8);
866 v = _mm_insert_epi16(
v,
a, 3);
867 p = _mm_cvtsi128_si32(_mm_packus_epi16(
v,
v));
870inline void storePU<QRgba64>(
QRgba64 &
p, __m128i &
v,
int a)
872 v = _mm_add_epi16(
v, _mm_srli_epi16(
v, 8));
873 v = _mm_insert_epi16(
v,
a, 3);
874 _mm_storel_epi64((__m128i *)&
p,
v);
881 const __m128 v4080 = _mm_set1_ps(4080.f);
882 constexpr bool isARGB = isArgb<T>();
884 const int a = getAlpha<T>(
src[
i]);
885 __m128 vf = _mm_loadu_ps(&
buffer[
i].
x);
886 __m128i
v = _mm_cvtps_epi32(_mm_mul_ps(vf, v4080));
887 const int ridx = _mm_extract_epi16(
v, 0);
888 const int gidx = _mm_extract_epi16(
v, 2);
889 const int bidx = _mm_extract_epi16(
v, 4);
890 v = _mm_setzero_si128();
891 v = _mm_insert_epi16(
v, d_ptr->
colorSpaceOut->
lut[0]->m_fromLinear[ridx], isARGB ? 2 : 0);
893 v = _mm_insert_epi16(
v, d_ptr->
colorSpaceOut->
lut[2]->m_fromLinear[bidx], isARGB ? 0 : 2);
903 const __m128 v4080 = _mm_set1_ps(4080.f);
904 const __m128 vZero = _mm_set1_ps(0.0f);
905 const __m128 vOne = _mm_set1_ps(1.0f);
906 const __m128 viFF00 = _mm_set1_ps(1.0f / (255 * 256));
908 const float a =
src[
i].a;
909 __m128 vf = _mm_loadu_ps(&
buffer[
i].
x);
910 const __m128 under = _mm_cmplt_ps(vf, vZero);
911 const __m128 over = _mm_cmpgt_ps(vf, vOne);
912 if (_mm_movemask_ps(_mm_or_ps(under, over)) == 0) {
914 __m128i
v = _mm_cvtps_epi32(_mm_mul_ps(vf, v4080));
915 const int ridx = _mm_extract_epi16(
v, 0);
916 const int gidx = _mm_extract_epi16(
v, 2);
917 const int bidx = _mm_extract_epi16(
v, 4);
918 v = _mm_setzero_si128();
922 vf = _mm_mul_ps(_mm_cvtepi32_ps(
v), viFF00);
923 _mm_storeu_ps(&
dst[
i].
r, vf);
938 const __m128 v4080 = _mm_set1_ps(4080.f);
939 constexpr bool isARGB = isArgb<T>();
941 __m128 vf = _mm_loadu_ps(&
buffer[
i].
x);
942 __m128i
v = _mm_cvtps_epi32(_mm_mul_ps(vf, v4080));
943 const int ridx = _mm_extract_epi16(
v, 0);
944 const int gidx = _mm_extract_epi16(
v, 2);
945 const int bidx = _mm_extract_epi16(
v, 4);
946 v = _mm_setzero_si128();
947 v = _mm_insert_epi16(
v, d_ptr->
colorSpaceOut->
lut[0]->m_fromLinear[ridx], isARGB ? 2 : 0);
949 v = _mm_insert_epi16(
v, d_ptr->
colorSpaceOut->
lut[2]->m_fromLinear[bidx], isARGB ? 0 : 2);
950 storePU<T>(
dst[
i],
v, isARGB ? 255 : 0xffff);
960 const __m128 v4080 = _mm_set1_ps(4080.f);
961 const __m128 vZero = _mm_set1_ps(0.0f);
962 const __m128 vOne = _mm_set1_ps(1.0f);
963 const __m128 viFF00 = _mm_set1_ps(1.0f / (255 * 256));
965 __m128 vf = _mm_loadu_ps(&
buffer[
i].
x);
966 const __m128 under = _mm_cmplt_ps(vf, vZero);
967 const __m128 over = _mm_cmpgt_ps(vf, vOne);
968 if (_mm_movemask_ps(_mm_or_ps(under, over)) == 0) {
970 __m128i
v = _mm_cvtps_epi32(_mm_mul_ps(vf, v4080));
971 const int ridx = _mm_extract_epi16(
v, 0);
972 const int gidx = _mm_extract_epi16(
v, 2);
973 const int bidx = _mm_extract_epi16(
v, 4);
974 v = _mm_setzero_si128();
978 vf = _mm_mul_ps(_mm_cvtepi32_ps(
v), viFF00);
979 _mm_store_ps(&
dst[
i].
r, vf);
989#elif defined(__ARM_NEON__)
991static inline void storeP(T &
p,
const uint16x4_t &
v);
993inline void storeP<QRgb>(
QRgb &
p,
const uint16x4_t &
v)
995 p = vget_lane_u32(vreinterpret_u32_u8(vmovn_u16(vcombine_u16(
v,
v))), 0);
998inline void storeP<QRgba64>(
QRgba64 &
p,
const uint16x4_t &
v)
1000 vst1_u16((uint16_t *)&
p,
v);
1007 const float iFF00 = 1.0f / (255 * 256);
1008 constexpr bool isARGB = isArgb<T>();
1010 const int a = getAlpha<T>(
src[
i]);
1011 float32x4_t vf = vld1q_f32(&
buffer[
i].
x);
1012 uint32x4_t
v = vcvtq_u32_f32(vaddq_f32(vmulq_n_f32(vf, 4080.f), vdupq_n_f32(0.5f)));
1013 const int ridx = vgetq_lane_u32(
v, 0);
1014 const int gidx = vgetq_lane_u32(
v, 1);
1015 const int bidx = vgetq_lane_u32(
v, 2);
1016 v = vsetq_lane_u32(d_ptr->
colorSpaceOut->
lut[0]->m_fromLinear[ridx],
v, isARGB ? 2 : 0);
1018 v = vsetq_lane_u32(d_ptr->
colorSpaceOut->
lut[2]->m_fromLinear[bidx],
v, isARGB ? 0 : 2);
1019 vf = vcvtq_f32_u32(
v);
1020 vf = vmulq_n_f32(vf,
a * iFF00);
1021 vf = vaddq_f32(vf, vdupq_n_f32(0.5f));
1022 v = vcvtq_u32_f32(vf);
1023 uint16x4_t v16 = vmovn_u32(
v);
1024 v16 = vset_lane_u16(
a, v16, 3);
1025 storeP<T>(
dst[
i], v16);
1030static inline void storePU(T &
p, uint16x4_t &
v,
int a);
1032inline void storePU<QRgb>(
QRgb &
p, uint16x4_t &
v,
int a)
1034 v = vadd_u16(
v, vdup_n_u16(0x80));
1035 v = vshr_n_u16(
v, 8);
1036 v = vset_lane_u16(
a,
v, 3);
1037 p = vget_lane_u32(vreinterpret_u32_u8(vmovn_u16(vcombine_u16(
v,
v))), 0);
1040inline void storePU<QRgba64>(
QRgba64 &
p, uint16x4_t &
v,
int a)
1042 v = vadd_u16(
v, vshr_n_u16(
v, 8));
1043 v = vset_lane_u16(
a,
v, 3);
1044 vst1_u16((uint16_t *)&
p,
v);
1051 constexpr bool isARGB = isArgb<T>();
1053 const int a = getAlpha<T>(
src[
i]);
1054 float32x4_t vf = vld1q_f32(&
buffer[
i].
x);
1055 uint16x4_t
v = vmovn_u32(vcvtq_u32_f32(vaddq_f32(vmulq_n_f32(vf, 4080.f), vdupq_n_f32(0.5f))));
1056 const int ridx = vget_lane_u16(
v, 0);
1057 const int gidx = vget_lane_u16(
v, 1);
1058 const int bidx = vget_lane_u16(
v, 2);
1059 v = vset_lane_u16(d_ptr->
colorSpaceOut->
lut[0]->m_fromLinear[ridx],
v, isARGB ? 2 : 0);
1061 v = vset_lane_u16(d_ptr->
colorSpaceOut->
lut[2]->m_fromLinear[bidx],
v, isARGB ? 0 : 2);
1062 storePU<T>(
dst[
i],
v,
a);
1071 constexpr bool isARGB = isArgb<T>();
1073 float32x4_t vf = vld1q_f32(&
buffer[
i].
x);
1074 uint16x4_t
v = vmovn_u32(vcvtq_u32_f32(vaddq_f32(vmulq_n_f32(vf, 4080.f), vdupq_n_f32(0.5f))));
1075 const int ridx = vget_lane_u16(
v, 0);
1076 const int gidx = vget_lane_u16(
v, 1);
1077 const int bidx = vget_lane_u16(
v, 2);
1078 v = vset_lane_u16(d_ptr->
colorSpaceOut->
lut[0]->m_fromLinear[ridx],
v, isARGB ? 2 : 0);
1080 v = vset_lane_u16(d_ptr->
colorSpaceOut->
lut[2]->m_fromLinear[bidx],
v, isARGB ? 0 : 2);
1081 storePU<T>(
dst[
i],
v, isARGB ? 255 : 0xffff);
1090 const float fa =
a / (255.0f * 256.0f);
1094 dst[
i] =
qRgba(
r * fa + 0.5f,
g * fa + 0.5f,
b * fa + 0.5f,
a);
1105 dst[
i] = (
src[
i] & 0xff000000) | (
r << 16) | (
g << 8) | (
b << 0);
1117 dst[
i] = 0xff000000 | (
r << 16) | (
g << 8) | (
b << 0);
1125 const int a =
src[
i].alpha();
1126 const float fa =
a / (255.0f * 256.0f);
1157#if !defined(__SSE2__)
1162 const float a =
src[
i].a;
1174 const float a =
src[
i].a;
1212template <
typename T,
int Count = 1>
1216 operator T*() {
return reinterpret_cast<T *
>(
this); }
1218 alignas(T)
char data[
sizeof(T) * Count];
1231 constexpr bool DoClip = !std::is_same_v<T, QRgbaFloat16> && !std::is_same_v<T, QRgbaFloat32>;
1257template<
typename D,
typename S>
1356 TransformFlags
flags)
const
T loadAcquire() const noexcept
void storeRelease(T newValue) noexcept
T loadRelaxed() const noexcept
bool isIdentity() const noexcept
QColorVector map(const QColorVector &c) const
static Q_CONSTINIT QBasicMutex s_lutWriteLock
struct QColorSpacePrivate::LUT lut
QColorSpace::TransferFunction transferFunction
static std::shared_ptr< QColorTrcLut > fromTransferTable(const QColorTransferTable &transTable)
static std::shared_ptr< QColorTrcLut > fromTransferFunction(const QColorTransferFunction &transfn)
QColorTransferFunction m_fun
float applyInverseExtended(float x) const
float applyExtended(float x) const
float apply(float x) const
float applyInverse(float x) const
QColorTransferTable m_table
The QColor class provides colors based on RGB, HSV or CMYK values.
QColor toRgb() const noexcept
Create and returns an RGB QColor based on this color.
float greenF() const noexcept
Returns the green color component of this color.
Spec spec() const noexcept
Returns how the color was specified.
float redF() const noexcept
Returns the red color component of this color.
float blueF() const noexcept
Returns the blue color component of this color.
constexpr quint16 red() const
constexpr quint16 alpha() const
constexpr quint16 green() const
constexpr quint16 blue() const
static constexpr QRgba64 fromRgba64(quint64 c)
\keyword 16-bit Floating Point Support\inmodule QtCore \inheaderfile QFloat16
Combined button and popup list for selecting options.
constexpr const T & qMin(const T &a, const T &b)
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat z
GLint GLint GLint GLint GLint x
[0]
GLboolean GLboolean GLboolean GLboolean a
[7]
GLenum GLenum GLsizei count
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLfloat GLfloat GLfloat alpha
QT_BEGIN_NAMESPACE typedef unsigned int QRgb
constexpr int qRed(QRgb rgb)
constexpr int qGreen(QRgb rgb)
constexpr QRgb qRgba(int r, int g, int b, int a)
constexpr int qBlue(QRgb rgb)
constexpr int qAlpha(QRgb rgb)
constexpr QRgba64 qRgba64(quint16 r, quint16 g, quint16 b, quint16 a)
#define QT_DEFINE_QESDP_SPECIALIZATION_DTOR(Class)
QTextStream out(stdout)
[7]