hw/display/pxa2xx: Remove use of BITS in pxa2xx_template.h
[qemu/ar7.git] / hw / display / pxa2xx_template.h
blob711fd9994e272d040dd30301a8510535e38f5459
1 /*
2 * Intel XScale PXA255/270 LCDC emulation.
4 * Copyright (c) 2006 Openedhand Ltd.
5 * Written by Andrzej Zaborowski <balrog@zabor.org>
7 * This code is licensed under the GPLv2.
9 * Framebuffer format conversion routines.
12 # define SKIP_PIXEL(to) to += deststep
13 # define COPY_PIXEL(to, from) \
14 do { \
15 *(uint32_t *) to = from; \
16 SKIP_PIXEL(to); \
17 } while (0)
19 #ifdef HOST_WORDS_BIGENDIAN
20 # define SWAP_WORDS 1
21 #endif
23 #define FN_2(x) FN(x + 1) FN(x)
24 #define FN_4(x) FN_2(x + 2) FN_2(x)
26 static void pxa2xx_draw_line2(void *opaque,
27 uint8_t *dest, const uint8_t *src, int width, int deststep)
29 uint32_t *palette = opaque;
30 uint32_t data;
31 while (width > 0) {
32 data = *(uint32_t *) src;
33 #define FN(x) COPY_PIXEL(dest, palette[(data >> ((x) * 2)) & 3]);
34 #ifdef SWAP_WORDS
35 FN_4(12)
36 FN_4(8)
37 FN_4(4)
38 FN_4(0)
39 #else
40 FN_4(0)
41 FN_4(4)
42 FN_4(8)
43 FN_4(12)
44 #endif
45 #undef FN
46 width -= 16;
47 src += 4;
51 static void pxa2xx_draw_line4(void *opaque,
52 uint8_t *dest, const uint8_t *src, int width, int deststep)
54 uint32_t *palette = opaque;
55 uint32_t data;
56 while (width > 0) {
57 data = *(uint32_t *) src;
58 #define FN(x) COPY_PIXEL(dest, palette[(data >> ((x) * 4)) & 0xf]);
59 #ifdef SWAP_WORDS
60 FN_2(6)
61 FN_2(4)
62 FN_2(2)
63 FN_2(0)
64 #else
65 FN_2(0)
66 FN_2(2)
67 FN_2(4)
68 FN_2(6)
69 #endif
70 #undef FN
71 width -= 8;
72 src += 4;
76 static void pxa2xx_draw_line8(void *opaque,
77 uint8_t *dest, const uint8_t *src, int width, int deststep)
79 uint32_t *palette = opaque;
80 uint32_t data;
81 while (width > 0) {
82 data = *(uint32_t *) src;
83 #define FN(x) COPY_PIXEL(dest, palette[(data >> (x)) & 0xff]);
84 #ifdef SWAP_WORDS
85 FN(24)
86 FN(16)
87 FN(8)
88 FN(0)
89 #else
90 FN(0)
91 FN(8)
92 FN(16)
93 FN(24)
94 #endif
95 #undef FN
96 width -= 4;
97 src += 4;
101 static void pxa2xx_draw_line16(void *opaque,
102 uint8_t *dest, const uint8_t *src, int width, int deststep)
104 uint32_t data;
105 unsigned int r, g, b;
106 while (width > 0) {
107 data = *(uint32_t *) src;
108 #ifdef SWAP_WORDS
109 data = bswap32(data);
110 #endif
111 b = (data & 0x1f) << 3;
112 data >>= 5;
113 g = (data & 0x3f) << 2;
114 data >>= 6;
115 r = (data & 0x1f) << 3;
116 data >>= 5;
117 COPY_PIXEL(dest, rgb_to_pixel32(r, g, b));
118 b = (data & 0x1f) << 3;
119 data >>= 5;
120 g = (data & 0x3f) << 2;
121 data >>= 6;
122 r = (data & 0x1f) << 3;
123 COPY_PIXEL(dest, rgb_to_pixel32(r, g, b));
124 width -= 2;
125 src += 4;
129 static void pxa2xx_draw_line16t(void *opaque,
130 uint8_t *dest, const uint8_t *src, int width, int deststep)
132 uint32_t data;
133 unsigned int r, g, b;
134 while (width > 0) {
135 data = *(uint32_t *) src;
136 #ifdef SWAP_WORDS
137 data = bswap32(data);
138 #endif
139 b = (data & 0x1f) << 3;
140 data >>= 5;
141 g = (data & 0x1f) << 3;
142 data >>= 5;
143 r = (data & 0x1f) << 3;
144 data >>= 5;
145 if (data & 1)
146 SKIP_PIXEL(dest);
147 else
148 COPY_PIXEL(dest, rgb_to_pixel32(r, g, b));
149 data >>= 1;
150 b = (data & 0x1f) << 3;
151 data >>= 5;
152 g = (data & 0x1f) << 3;
153 data >>= 5;
154 r = (data & 0x1f) << 3;
155 data >>= 5;
156 if (data & 1)
157 SKIP_PIXEL(dest);
158 else
159 COPY_PIXEL(dest, rgb_to_pixel32(r, g, b));
160 width -= 2;
161 src += 4;
165 static void pxa2xx_draw_line18(void *opaque,
166 uint8_t *dest, const uint8_t *src, int width, int deststep)
168 uint32_t data;
169 unsigned int r, g, b;
170 while (width > 0) {
171 data = *(uint32_t *) src;
172 #ifdef SWAP_WORDS
173 data = bswap32(data);
174 #endif
175 b = (data & 0x3f) << 2;
176 data >>= 6;
177 g = (data & 0x3f) << 2;
178 data >>= 6;
179 r = (data & 0x3f) << 2;
180 COPY_PIXEL(dest, rgb_to_pixel32(r, g, b));
181 width -= 1;
182 src += 4;
186 /* The wicked packed format */
187 static void pxa2xx_draw_line18p(void *opaque,
188 uint8_t *dest, const uint8_t *src, int width, int deststep)
190 uint32_t data[3];
191 unsigned int r, g, b;
192 while (width > 0) {
193 data[0] = *(uint32_t *) src;
194 src += 4;
195 data[1] = *(uint32_t *) src;
196 src += 4;
197 data[2] = *(uint32_t *) src;
198 src += 4;
199 #ifdef SWAP_WORDS
200 data[0] = bswap32(data[0]);
201 data[1] = bswap32(data[1]);
202 data[2] = bswap32(data[2]);
203 #endif
204 b = (data[0] & 0x3f) << 2;
205 data[0] >>= 6;
206 g = (data[0] & 0x3f) << 2;
207 data[0] >>= 6;
208 r = (data[0] & 0x3f) << 2;
209 data[0] >>= 12;
210 COPY_PIXEL(dest, rgb_to_pixel32(r, g, b));
211 b = (data[0] & 0x3f) << 2;
212 data[0] >>= 6;
213 g = ((data[1] & 0xf) << 4) | (data[0] << 2);
214 data[1] >>= 4;
215 r = (data[1] & 0x3f) << 2;
216 data[1] >>= 12;
217 COPY_PIXEL(dest, rgb_to_pixel32(r, g, b));
218 b = (data[1] & 0x3f) << 2;
219 data[1] >>= 6;
220 g = (data[1] & 0x3f) << 2;
221 data[1] >>= 6;
222 r = ((data[2] & 0x3) << 6) | (data[1] << 2);
223 data[2] >>= 8;
224 COPY_PIXEL(dest, rgb_to_pixel32(r, g, b));
225 b = (data[2] & 0x3f) << 2;
226 data[2] >>= 6;
227 g = (data[2] & 0x3f) << 2;
228 data[2] >>= 6;
229 r = data[2] << 2;
230 COPY_PIXEL(dest, rgb_to_pixel32(r, g, b));
231 width -= 4;
235 static void pxa2xx_draw_line19(void *opaque,
236 uint8_t *dest, const uint8_t *src, int width, int deststep)
238 uint32_t data;
239 unsigned int r, g, b;
240 while (width > 0) {
241 data = *(uint32_t *) src;
242 #ifdef SWAP_WORDS
243 data = bswap32(data);
244 #endif
245 b = (data & 0x3f) << 2;
246 data >>= 6;
247 g = (data & 0x3f) << 2;
248 data >>= 6;
249 r = (data & 0x3f) << 2;
250 data >>= 6;
251 if (data & 1)
252 SKIP_PIXEL(dest);
253 else
254 COPY_PIXEL(dest, rgb_to_pixel32(r, g, b));
255 width -= 1;
256 src += 4;
260 /* The wicked packed format */
261 static void pxa2xx_draw_line19p(void *opaque,
262 uint8_t *dest, const uint8_t *src, int width, int deststep)
264 uint32_t data[3];
265 unsigned int r, g, b;
266 while (width > 0) {
267 data[0] = *(uint32_t *) src;
268 src += 4;
269 data[1] = *(uint32_t *) src;
270 src += 4;
271 data[2] = *(uint32_t *) src;
272 src += 4;
273 # ifdef SWAP_WORDS
274 data[0] = bswap32(data[0]);
275 data[1] = bswap32(data[1]);
276 data[2] = bswap32(data[2]);
277 # endif
278 b = (data[0] & 0x3f) << 2;
279 data[0] >>= 6;
280 g = (data[0] & 0x3f) << 2;
281 data[0] >>= 6;
282 r = (data[0] & 0x3f) << 2;
283 data[0] >>= 6;
284 if (data[0] & 1)
285 SKIP_PIXEL(dest);
286 else
287 COPY_PIXEL(dest, rgb_to_pixel32(r, g, b));
288 data[0] >>= 6;
289 b = (data[0] & 0x3f) << 2;
290 data[0] >>= 6;
291 g = ((data[1] & 0xf) << 4) | (data[0] << 2);
292 data[1] >>= 4;
293 r = (data[1] & 0x3f) << 2;
294 data[1] >>= 6;
295 if (data[1] & 1)
296 SKIP_PIXEL(dest);
297 else
298 COPY_PIXEL(dest, rgb_to_pixel32(r, g, b));
299 data[1] >>= 6;
300 b = (data[1] & 0x3f) << 2;
301 data[1] >>= 6;
302 g = (data[1] & 0x3f) << 2;
303 data[1] >>= 6;
304 r = ((data[2] & 0x3) << 6) | (data[1] << 2);
305 data[2] >>= 2;
306 if (data[2] & 1)
307 SKIP_PIXEL(dest);
308 else
309 COPY_PIXEL(dest, rgb_to_pixel32(r, g, b));
310 data[2] >>= 6;
311 b = (data[2] & 0x3f) << 2;
312 data[2] >>= 6;
313 g = (data[2] & 0x3f) << 2;
314 data[2] >>= 6;
315 r = data[2] << 2;
316 data[2] >>= 6;
317 if (data[2] & 1)
318 SKIP_PIXEL(dest);
319 else
320 COPY_PIXEL(dest, rgb_to_pixel32(r, g, b));
321 width -= 4;
325 static void pxa2xx_draw_line24(void *opaque,
326 uint8_t *dest, const uint8_t *src, int width, int deststep)
328 uint32_t data;
329 unsigned int r, g, b;
330 while (width > 0) {
331 data = *(uint32_t *) src;
332 #ifdef SWAP_WORDS
333 data = bswap32(data);
334 #endif
335 b = data & 0xff;
336 data >>= 8;
337 g = data & 0xff;
338 data >>= 8;
339 r = data & 0xff;
340 COPY_PIXEL(dest, rgb_to_pixel32(r, g, b));
341 width -= 1;
342 src += 4;
346 static void pxa2xx_draw_line24t(void *opaque,
347 uint8_t *dest, const uint8_t *src, int width, int deststep)
349 uint32_t data;
350 unsigned int r, g, b;
351 while (width > 0) {
352 data = *(uint32_t *) src;
353 #ifdef SWAP_WORDS
354 data = bswap32(data);
355 #endif
356 b = (data & 0x7f) << 1;
357 data >>= 7;
358 g = data & 0xff;
359 data >>= 8;
360 r = data & 0xff;
361 data >>= 8;
362 if (data & 1)
363 SKIP_PIXEL(dest);
364 else
365 COPY_PIXEL(dest, rgb_to_pixel32(r, g, b));
366 width -= 1;
367 src += 4;
371 static void pxa2xx_draw_line25(void *opaque,
372 uint8_t *dest, const uint8_t *src, int width, int deststep)
374 uint32_t data;
375 unsigned int r, g, b;
376 while (width > 0) {
377 data = *(uint32_t *) src;
378 #ifdef SWAP_WORDS
379 data = bswap32(data);
380 #endif
381 b = data & 0xff;
382 data >>= 8;
383 g = data & 0xff;
384 data >>= 8;
385 r = data & 0xff;
386 data >>= 8;
387 if (data & 1)
388 SKIP_PIXEL(dest);
389 else
390 COPY_PIXEL(dest, rgb_to_pixel32(r, g, b));
391 width -= 1;
392 src += 4;
396 /* Overlay planes disabled, no transparency */
397 static drawfn pxa2xx_draw_fn_32[16] =
399 [0 ... 0xf] = NULL,
400 [pxa_lcdc_2bpp] = pxa2xx_draw_line2,
401 [pxa_lcdc_4bpp] = pxa2xx_draw_line4,
402 [pxa_lcdc_8bpp] = pxa2xx_draw_line8,
403 [pxa_lcdc_16bpp] = pxa2xx_draw_line16,
404 [pxa_lcdc_18bpp] = pxa2xx_draw_line18,
405 [pxa_lcdc_18pbpp] = pxa2xx_draw_line18p,
406 [pxa_lcdc_24bpp] = pxa2xx_draw_line24,
409 /* Overlay planes enabled, transparency used */
410 static drawfn pxa2xx_draw_fn_32t[16] =
412 [0 ... 0xf] = NULL,
413 [pxa_lcdc_4bpp] = pxa2xx_draw_line4,
414 [pxa_lcdc_8bpp] = pxa2xx_draw_line8,
415 [pxa_lcdc_16bpp] = pxa2xx_draw_line16t,
416 [pxa_lcdc_19bpp] = pxa2xx_draw_line19,
417 [pxa_lcdc_19pbpp] = pxa2xx_draw_line19p,
418 [pxa_lcdc_24bpp] = pxa2xx_draw_line24t,
419 [pxa_lcdc_25bpp] = pxa2xx_draw_line25,
422 #undef COPY_PIXEL
423 #undef SKIP_PIXEL
425 #ifdef SWAP_WORDS
426 # undef SWAP_WORDS
427 #endif