CDXLPlay added with permission from Fredik Wikstrom.
[AROS-Contrib.git] / MultiMedia / cdxlplay / p2c / p2c_2.c
blobc9349efdbc3199b5559f274788efd0233074fbcc
1 /*
2 ** Planar 2 Chunky routine (C) 2009 Fredrik Wikstrom
3 **/
5 static void p2c_2 (const uint16_t *planar, uint32_t plane_size, uint8_t *chunky,
6 uint32_t width, uint32_t height)
8 uint32_t *cp;
9 const uint16_t *pp1, *pp2;
10 uint32_t cd1, cd2, cd3, cd4;
11 uint32_t pd1, pd2;
12 uint32_t x, y;
13 cp = (uint32_t *)chunky;
14 pp1 = planar;
15 pp2 = (const uint16_t *)((const uint8_t *)pp1 + plane_size);
16 for (y = 0; y < height; y++) {
17 for (x = 0; x < width; x++) {
18 pd1 = *pp1++;
19 pd2 = *pp2++;
21 #ifdef WORDS_BIGENDIAN
22 cd1 = ((pd1 << 9 ) & 0x01000000)|((pd2 << 10) & 0x02000000);
24 cd2 = ((pd1 << 13) & 0x01000000)|((pd2 << 14) & 0x02000000);
26 cd3 = ((pd1 << 17) & 0x01000000)|((pd2 << 18) & 0x02000000);
28 cd4 = ((pd1 << 21) & 0x01000000)|((pd2 << 22) & 0x02000000);
30 cd1 |= ((pd1 << 2 ) & 0x00010000)|((pd2 << 3 ) & 0x00020000);
32 cd2 |= ((pd1 << 6 ) & 0x00010000)|((pd2 << 7 ) & 0x00020000);
34 cd3 |= ((pd1 << 10) & 0x00010000)|((pd2 << 11) & 0x00020000);
36 cd4 |= ((pd1 << 14) & 0x00010000)|((pd2 << 15) & 0x00020000);
38 cd1 |= ((pd1 >> 5 ) & 0x00000100)|((pd2 >> 4 ) & 0x00000200);
40 cd2 |= ((pd1 >> 1 ) & 0x00000100)|((pd2 ) & 0x00000200);
42 cd3 |= ((pd1 << 3 ) & 0x00000100)|((pd2 << 4 ) & 0x00000200);
44 cd4 |= ((pd1 << 7 ) & 0x00000100)|((pd2 << 8 ) & 0x00000200);
46 cd1 |= ((pd1 >> 12) & 0x00000001)|((pd2 >> 11) & 0x00000002);
48 cd2 |= ((pd1 >> 8 ) & 0x00000001)|((pd2 >> 7 ) & 0x00000002);
50 cd3 |= ((pd1 >> 4 ) & 0x00000001)|((pd2 >> 3 ) & 0x00000002);
52 cd4 |= ((pd1 ) & 0x00000001)|((pd2 << 1 ) & 0x00000002);
53 #else
54 cd1 = ((pd1 >> 7 ) & 0x00000001)|((pd2 >> 6 ) & 0x00000002);
56 cd2 = ((pd1 >> 3 ) & 0x00000001)|((pd2 >> 2 ) & 0x00000002);
58 cd3 = ((pd1 >> 15) & 0x00000001)|((pd2 >> 14) & 0x00000002);
60 cd4 = ((pd1 >> 11) & 0x00000001)|((pd2 >> 10) & 0x00000002);
62 cd1 |= ((pd1 << 2 ) & 0x00000100)|((pd2 << 3 ) & 0x00000200);
64 cd2 |= ((pd1 << 6 ) & 0x00000100)|((pd2 << 7 ) & 0x00000200);
66 cd3 |= ((pd1 >> 6 ) & 0x00000100)|((pd2 >> 5 ) & 0x00000200);
68 cd4 |= ((pd1 >> 2 ) & 0x00000100)|((pd2 >> 1 ) & 0x00000200);
70 cd1 |= ((pd1 << 11) & 0x00010000)|((pd2 << 12) & 0x00020000);
72 cd2 |= ((pd1 << 15) & 0x00010000)|((pd2 << 16) & 0x00020000);
74 cd3 |= ((pd1 << 3 ) & 0x00010000)|((pd2 << 4 ) & 0x00020000);
76 cd4 |= ((pd1 << 7 ) & 0x00010000)|((pd2 << 8 ) & 0x00020000);
78 cd1 |= ((pd1 << 20) & 0x01000000)|((pd2 << 21) & 0x02000000);
80 cd2 |= ((pd1 << 24) & 0x01000000)|((pd2 << 25) & 0x02000000);
82 cd3 |= ((pd1 << 12) & 0x01000000)|((pd2 << 13) & 0x02000000);
84 cd4 |= ((pd1 << 16) & 0x01000000)|((pd2 << 17) & 0x02000000);
85 #endif
87 *cp++ = cd1;
88 *cp++ = cd2;
89 *cp++ = cd3;
90 *cp++ = cd4;