FastLED 3.9.15
Loading...
Searching...
No Matches

◆ transpose8()

template<int m, int n>
FASTLED_FORCE_INLINE void transpose8 ( unsigned char * A,
unsigned char * B )

Templated bit-rotating function.

Based on code found here: https://web.archive.org/web/20190108225554/http://www.hackersdelight.org/hdcodetxt/transpose8.c.txt

Definition at line 251 of file bitswap.h.

251 {
252 uint32_t x, y, t;
253
254 // Load the array and pack it into x and y.
255 if(m == 1) {
256 y = *(unsigned int*)(A);
257 x = *(unsigned int*)(A+4);
258 } else {
259 x = (A[0]<<24) | (A[m]<<16) | (A[2*m]<<8) | A[3*m];
260 y = (A[4*m]<<24) | (A[5*m]<<16) | (A[6*m]<<8) | A[7*m];
261 }
262
263 // pre-transform x
264 t = (x ^ (x >> 7)) & 0x00AA00AA; x = x ^ t ^ (t << 7);
265 t = (x ^ (x >>14)) & 0x0000CCCC; x = x ^ t ^ (t <<14);
266
267 // pre-transform y
268 t = (y ^ (y >> 7)) & 0x00AA00AA; y = y ^ t ^ (t << 7);
269 t = (y ^ (y >>14)) & 0x0000CCCC; y = y ^ t ^ (t <<14);
270
271 // final transform
272 t = (x & 0xF0F0F0F0) | ((y >> 4) & 0x0F0F0F0F);
273 y = ((x << 4) & 0xF0F0F0F0) | (y & 0x0F0F0F0F);
274 x = t;
275
276 B[7*n] = y; y >>= 8;
277 B[6*n] = y; y >>= 8;
278 B[5*n] = y; y >>= 8;
279 B[4*n] = y;
280
281 B[3*n] = x; x >>= 8;
282 B[2*n] = x; x >>= 8;
283 B[n] = x; x >>= 8;
284 B[0] = x;
285 // B[0]=x>>24; B[n]=x>>16; B[2*n]=x>>8; B[3*n]=x>>0;
286 // B[4*n]=y>>24; B[5*n]=y>>16; B[6*n]=y>>8; B[7*n]=y>>0;
287}
uint32_t x[NUM_LAYERS]
Definition Fire2023.ino:80
uint32_t y[NUM_LAYERS]
Definition Fire2023.ino:81

References FASTLED_FORCE_INLINE, x, and y.