CDXLPlay added with permission from Fredik Wikstrom.
[AROS-Contrib.git] / MultiMedia / cdxlplay / p2c / p2c_4.c
blobaadb3485aedcfa253856e4b8ddd0f968b7175fa9
1 /*
2 ** Planar 2 Chunky routine (C) 2009 Fredrik Wikstrom
3 **/
5 static void p2c_4 (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, *pp3, *pp4;
10 uint32_t cd1, cd2, cd3, cd4;
11 uint32_t pd1, pd2, pd3, pd4;
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 pp3 = (const uint16_t *)((const uint8_t *)pp2 + plane_size);
17 pp4 = (const uint16_t *)((const uint8_t *)pp3 + plane_size);
18 for (y = 0; y < height; y++) {
19 for (x = 0; x < width; x++) {
20 pd1 = *pp1++;
21 pd2 = *pp2++;
22 pd3 = *pp3++;
23 pd4 = *pp4++;
25 #ifdef WORDS_BIGENDIAN
26 cd1 = ((pd1 << 9 ) & 0x01000000)|((pd2 << 10) & 0x02000000);
27 cd1 |= ((pd3 << 11) & 0x04000000)|((pd4 << 12) & 0x08000000);
29 cd2 = ((pd1 << 13) & 0x01000000)|((pd2 << 14) & 0x02000000);
30 cd2 |= ((pd3 << 15) & 0x04000000)|((pd4 << 16) & 0x08000000);
32 cd3 = ((pd1 << 17) & 0x01000000)|((pd2 << 18) & 0x02000000);
33 cd3 |= ((pd3 << 19) & 0x04000000)|((pd4 << 20) & 0x08000000);
35 cd4 = ((pd1 << 21) & 0x01000000)|((pd2 << 22) & 0x02000000);
36 cd4 |= ((pd3 << 23) & 0x04000000)|((pd4 << 24) & 0x08000000);
38 cd1 |= ((pd1 << 2 ) & 0x00010000)|((pd2 << 3 ) & 0x00020000);
39 cd1 |= ((pd3 << 4 ) & 0x00040000)|((pd4 << 5 ) & 0x00080000);
41 cd2 |= ((pd1 << 6 ) & 0x00010000)|((pd2 << 7 ) & 0x00020000);
42 cd2 |= ((pd3 << 8 ) & 0x00040000)|((pd4 << 9 ) & 0x00080000);
44 cd3 |= ((pd1 << 10) & 0x00010000)|((pd2 << 11) & 0x00020000);
45 cd3 |= ((pd3 << 12) & 0x00040000)|((pd4 << 13) & 0x00080000);
47 cd4 |= ((pd1 << 14) & 0x00010000)|((pd2 << 15) & 0x00020000);
48 cd4 |= ((pd3 << 16) & 0x00040000)|((pd4 << 17) & 0x00080000);
50 cd1 |= ((pd1 >> 5 ) & 0x00000100)|((pd2 >> 4 ) & 0x00000200);
51 cd1 |= ((pd3 >> 3 ) & 0x00000400)|((pd4 >> 2 ) & 0x00000800);
53 cd2 |= ((pd1 >> 1 ) & 0x00000100)|((pd2 ) & 0x00000200);
54 cd2 |= ((pd3 << 1 ) & 0x00000400)|((pd4 << 2 ) & 0x00000800);
56 cd3 |= ((pd1 << 3 ) & 0x00000100)|((pd2 << 4 ) & 0x00000200);
57 cd3 |= ((pd3 << 5 ) & 0x00000400)|((pd4 << 6 ) & 0x00000800);
59 cd4 |= ((pd1 << 7 ) & 0x00000100)|((pd2 << 8 ) & 0x00000200);
60 cd4 |= ((pd3 << 9 ) & 0x00000400)|((pd4 << 10) & 0x00000800);
62 cd1 |= ((pd1 >> 12) & 0x00000001)|((pd2 >> 11) & 0x00000002);
63 cd1 |= ((pd3 >> 10) & 0x00000004)|((pd4 >> 9 ) & 0x00000008);
65 cd2 |= ((pd1 >> 8 ) & 0x00000001)|((pd2 >> 7 ) & 0x00000002);
66 cd2 |= ((pd3 >> 6 ) & 0x00000004)|((pd4 >> 5 ) & 0x00000008);
68 cd3 |= ((pd1 >> 4 ) & 0x00000001)|((pd2 >> 3 ) & 0x00000002);
69 cd3 |= ((pd3 >> 2 ) & 0x00000004)|((pd4 >> 1 ) & 0x00000008);
71 cd4 |= ((pd1 ) & 0x00000001)|((pd2 << 1 ) & 0x00000002);
72 cd4 |= ((pd3 << 2 ) & 0x00000004)|((pd4 << 3 ) & 0x00000008);
73 #else
74 cd1 = ((pd1 >> 7 ) & 0x00000001)|((pd2 >> 6 ) & 0x00000002);
75 cd1 |= ((pd3 >> 5 ) & 0x00000004)|((pd4 >> 4 ) & 0x00000008);
77 cd2 = ((pd1 >> 3 ) & 0x00000001)|((pd2 >> 2 ) & 0x00000002);
78 cd2 |= ((pd3 >> 1 ) & 0x00000004)|((pd4 ) & 0x00000008);
80 cd3 = ((pd1 >> 15) & 0x00000001)|((pd2 >> 14) & 0x00000002);
81 cd3 |= ((pd3 >> 13) & 0x00000004)|((pd4 >> 12) & 0x00000008);
83 cd4 = ((pd1 >> 11) & 0x00000001)|((pd2 >> 10) & 0x00000002);
84 cd4 |= ((pd3 >> 9 ) & 0x00000004)|((pd4 >> 8 ) & 0x00000008);
86 cd1 |= ((pd1 << 2 ) & 0x00000100)|((pd2 << 3 ) & 0x00000200);
87 cd1 |= ((pd3 << 4 ) & 0x00000400)|((pd4 << 5 ) & 0x00000800);
89 cd2 |= ((pd1 << 6 ) & 0x00000100)|((pd2 << 7 ) & 0x00000200);
90 cd2 |= ((pd3 << 8 ) & 0x00000400)|((pd4 << 9 ) & 0x00000800);
92 cd3 |= ((pd1 >> 6 ) & 0x00000100)|((pd2 >> 5 ) & 0x00000200);
93 cd3 |= ((pd3 >> 4 ) & 0x00000400)|((pd4 >> 3 ) & 0x00000800);
95 cd4 |= ((pd1 >> 2 ) & 0x00000100)|((pd2 >> 1 ) & 0x00000200);
96 cd4 |= ((pd3 ) & 0x00000400)|((pd4 << 1 ) & 0x00000800);
98 cd1 |= ((pd1 << 11) & 0x00010000)|((pd2 << 12) & 0x00020000);
99 cd1 |= ((pd3 << 13) & 0x00040000)|((pd4 << 14) & 0x00080000);
101 cd2 |= ((pd1 << 15) & 0x00010000)|((pd2 << 16) & 0x00020000);
102 cd2 |= ((pd3 << 17) & 0x00040000)|((pd4 << 18) & 0x00080000);
104 cd3 |= ((pd1 << 3 ) & 0x00010000)|((pd2 << 4 ) & 0x00020000);
105 cd3 |= ((pd3 << 5 ) & 0x00040000)|((pd4 << 6 ) & 0x00080000);
107 cd4 |= ((pd1 << 7 ) & 0x00010000)|((pd2 << 8 ) & 0x00020000);
108 cd4 |= ((pd3 << 9 ) & 0x00040000)|((pd4 << 10) & 0x00080000);
110 cd1 |= ((pd1 << 20) & 0x01000000)|((pd2 << 21) & 0x02000000);
111 cd1 |= ((pd3 << 22) & 0x04000000)|((pd4 << 23) & 0x08000000);
113 cd2 |= ((pd1 << 24) & 0x01000000)|((pd2 << 25) & 0x02000000);
114 cd2 |= ((pd3 << 26) & 0x04000000)|((pd4 << 27) & 0x08000000);
116 cd3 |= ((pd1 << 12) & 0x01000000)|((pd2 << 13) & 0x02000000);
117 cd3 |= ((pd3 << 14) & 0x04000000)|((pd4 << 15) & 0x08000000);
119 cd4 |= ((pd1 << 16) & 0x01000000)|((pd2 << 17) & 0x02000000);
120 cd4 |= ((pd3 << 18) & 0x04000000)|((pd4 << 19) & 0x08000000);
121 #endif
123 *cp++ = cd1;
124 *cp++ = cd2;
125 *cp++ = cd3;
126 *cp++ = cd4;