Krita Source Code Documentation
Loading...
Searching...
No Matches
KoRgbaInterleavers< 32 > Struct Reference

#include <KoRgbaInterleavers.h>

Static Public Member Functions

template<typename T , typename A , bool aligned = false>
static void deinterleave (const void *src, batch< T, A > &a, batch< T, A > &b, batch< T, A > &c, batch< T, A > &d)
 
template<typename T , typename A , bool aligned = false, enable_sized_t< T, 4 > = 0, enable_sized_vector_t< T, A, 4 > = 0>
static void deinterleave (const void *src, batch< T, A > &a, batch< T, A > &b, batch< T, A > &c, batch< T, A > &d, kernel::requires_arch< generic >)
 
template<typename T , typename A , bool aligned = false>
static void interleave (void *dst, batch< T, A > const &a, batch< T, A > const &b, batch< T, A > const &c, batch< T, A > const &d)
 
template<typename T , typename A , bool aligned = false, enable_sized_t< T, 4 > = 0, enable_sized_vector_t< T, A, 4 > = 0>
static void interleave (void *dst, batch< T, A > const &a, batch< T, A > const &b, batch< T, A > const &c, batch< T, A > const &d, kernel::requires_arch< generic >)
 

Detailed Description

Definition at line 186 of file KoRgbaInterleavers.h.

Member Function Documentation

◆ deinterleave() [1/2]

template<typename T , typename A , bool aligned = false>
static void KoRgbaInterleavers< 32 >::deinterleave ( const void * src,
batch< T, A > & a,
batch< T, A > & b,
batch< T, A > & c,
batch< T, A > & d )
inlinestatic

Definition at line 310 of file KoRgbaInterleavers.h.

311 {
312 return deinterleave<T, A, aligned>(src, a, b, c, d, A{});
313 }

References A.

◆ deinterleave() [2/2]

template<typename T , typename A , bool aligned = false, enable_sized_t< T, 4 > = 0, enable_sized_vector_t< T, A, 4 > = 0>
static void KoRgbaInterleavers< 32 >::deinterleave ( const void * src,
batch< T, A > & a,
batch< T, A > & b,
batch< T, A > & c,
batch< T, A > & d,
kernel::requires_arch< generic >  )
inlinestatic

Definition at line 242 of file KoRgbaInterleavers.h.

243 {
244 const auto *srcPtr = static_cast<const T *>(src);
245 using U = std::conditional_t<aligned, aligned_mode, unaligned_mode>;
246
247 const auto t1 = batch<T, A>::load(srcPtr, U{});
248 const auto t2 = batch<T, A>::load(srcPtr + batch<T, A>::size, U{});
249 const auto t3 = batch<T, A>::load(srcPtr + batch<T, A>::size * 2, U{});
250 const auto t4 = batch<T, A>::load(srcPtr + batch<T, A>::size * 3, U{});
251 const auto src1 = zip_lo(t1, t3);
252 const auto src2 = zip_hi(t1, t3);
253 const auto src3 = zip_lo(t2, t4);
254 const auto src4 = zip_hi(t2, t4);
255 a = zip_lo(src1, src3);
256 b = zip_hi(src1, src3);
257 c = zip_lo(src2, src4);
258 d = zip_hi(src2, src4);
259 }

◆ interleave() [1/2]

template<typename T , typename A , bool aligned = false>
static void KoRgbaInterleavers< 32 >::interleave ( void * dst,
batch< T, A > const & a,
batch< T, A > const & b,
batch< T, A > const & c,
batch< T, A > const & d )
inlinestatic

Definition at line 236 of file KoRgbaInterleavers.h.

237 {
238 return interleave<T, A, aligned>(dst, a, b, c, d, A{});
239 }

References A.

◆ interleave() [2/2]

template<typename T , typename A , bool aligned = false, enable_sized_t< T, 4 > = 0, enable_sized_vector_t< T, A, 4 > = 0>
static void KoRgbaInterleavers< 32 >::interleave ( void * dst,
batch< T, A > const & a,
batch< T, A > const & b,
batch< T, A > const & c,
batch< T, A > const & d,
kernel::requires_arch< generic >  )
inlinestatic

Definition at line 189 of file KoRgbaInterleavers.h.

190 {
191 auto *dstPtr = static_cast<T *>(dst);
192 using U = std::conditional_t<aligned, aligned_mode, unaligned_mode>;
193
194 const auto t1 = zip_lo(a, c);
195 const auto t2 = zip_hi(a, c);
196 const auto t3 = zip_lo(b, d);
197 const auto t4 = zip_hi(b, d);
198 const auto src1 = zip_lo(t1, t3);
199 const auto src2 = zip_hi(t1, t3);
200 const auto src3 = zip_lo(t2, t4);
201 const auto src4 = zip_hi(t2, t4);
202 src1.store(dstPtr, U{});
203 src2.store(dstPtr + batch<T, A>::size, U{});
204 src3.store(dstPtr + batch<T, A>::size * 2, U{});
205 src4.store(dstPtr + batch<T, A>::size * 3, U{});
206 }

The documentation for this struct was generated from the following file: