61 __m128i
v = _mm_cvtsi32_si128(rgb32);
62 v = _mm_unpacklo_epi8(
v, _mm_setzero_si128());
63 const __m128i vidx = _mm_slli_epi16(
v, ShiftUp);
64 const int ridx = _mm_extract_epi16(vidx, 2);
65 const int gidx = _mm_extract_epi16(vidx, 1);
66 const int bidx = _mm_extract_epi16(vidx, 0);
67 v = _mm_slli_epi16(
v, 8);
68 v = _mm_insert_epi16(
v, m_toLinear[ridx], 0);
69 v = _mm_insert_epi16(
v, m_toLinear[gidx], 1);
70 v = _mm_insert_epi16(
v, m_toLinear[bidx], 2);
71 v = _mm_add_epi16(
v, _mm_srli_epi16(
v, 8));
73 _mm_storel_epi64(
reinterpret_cast<__m128i *
>(&rgba64),
v);
75#elif (defined(__ARM_NEON__) || defined(__ARM_NEON)) && Q_BYTE_ORDER == Q_LITTLE_ENDIAN
76 uint8x8_t v8 = vreinterpret_u8_u32(vmov_n_u32(rgb32));
77 uint16x4_t v16 = vget_low_u16(vmovl_u8(v8));
78 const uint16x4_t vidx = vshl_n_u16(v16, ShiftUp);
79 const int ridx = vget_lane_u16(vidx, 2);
80 const int gidx = vget_lane_u16(vidx, 1);
81 const int bidx = vget_lane_u16(vidx, 0);
82 v16 = vshl_n_u16(v16, 8);
83 v16 = vset_lane_u16(m_toLinear[ridx], v16, 0);
84 v16 = vset_lane_u16(m_toLinear[gidx], v16, 1);
85 v16 = vset_lane_u16(m_toLinear[bidx], v16, 2);
86 v16 = vadd_u16(v16, vshr_n_u16(v16, 8));
89 uint r = m_toLinear[
qRed(rgb32) << ShiftUp];
132 __m128i
v = _mm_loadl_epi64(
reinterpret_cast<const __m128i *
>(&rgb64));
133 v = _mm_sub_epi16(
v, _mm_srli_epi16(
v, 8));
134 const __m128i vidx = _mm_srli_epi16(
v, ShiftDown);
135 const int ridx = _mm_extract_epi16(vidx, 0);
136 const int gidx = _mm_extract_epi16(vidx, 1);
137 const int bidx = _mm_extract_epi16(vidx, 2);
138 v = _mm_insert_epi16(
v, m_fromLinear[ridx], 2);
139 v = _mm_insert_epi16(
v, m_fromLinear[gidx], 1);
140 v = _mm_insert_epi16(
v, m_fromLinear[bidx], 0);
141 v = _mm_add_epi16(
v, _mm_set1_epi16(0x80));
142 v = _mm_srli_epi16(
v, 8);
143 v = _mm_packus_epi16(
v,
v);
144 return _mm_cvtsi128_si32(
v);
145#elif (defined(__ARM_NEON__) || defined(__ARM_NEON)) && Q_BYTE_ORDER == Q_LITTLE_ENDIAN
146 uint16x4_t
v = vreinterpret_u16_u64(vmov_n_u64(rgb64));
147 v = vsub_u16(
v, vshr_n_u16(
v, 8));
148 const uint16x4_t vidx = vshr_n_u16(
v, ShiftDown);
149 const int ridx = vget_lane_u16(vidx, 0);
150 const int gidx = vget_lane_u16(vidx, 1);
151 const int bidx = vget_lane_u16(vidx, 2);
152 v = vset_lane_u16(m_fromLinear[ridx],
v, 2);
153 v = vset_lane_u16(m_fromLinear[gidx],
v, 1);
154 v = vset_lane_u16(m_fromLinear[bidx],
v, 0);
155 uint8x8_t v8 = vrshrn_n_u16(vcombine_u16(
v,
v), 8);
156 return vget_lane_u32(vreinterpret_u32_u8(v8), 0);
158 uint a = rgb64.alpha();
159 uint r = rgb64.red();
160 uint g = rgb64.green();
161 uint b = rgb64.blue();
167 r = (m_fromLinear[
r >> ShiftDown] + 0x80) >> 8;
168 g = (m_fromLinear[
g >> ShiftDown] + 0x80) >> 8;
169 b = (m_fromLinear[
b >> ShiftDown] + 0x80) >> 8;
170 return (
a << 24) | (
r << 16) | (
g << 8) |
b;