Fix error reporting under Win32 (CreateFile does not set errno)
[qemu-kvm/fedora.git] / hw / pxa2xx_template.h
blobad3799df2ce3e9a1dfa2f75812380f49febe8193
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 #if BITS == 8
14 # define COPY_PIXEL(to, from) *to = from; SKIP_PIXEL(to)
15 #elif BITS == 15 || BITS == 16
16 # define COPY_PIXEL(to, from) *(uint16_t *) to = from; SKIP_PIXEL(to)
17 #elif BITS == 24
18 # define COPY_PIXEL(to, from) \
19 *(uint16_t *) to = from; *(to + 2) = (from) >> 16; SKIP_PIXEL(to)
20 #elif BITS == 32
21 # define COPY_PIXEL(to, from) *(uint32_t *) to = from; SKIP_PIXEL(to)
22 #else
23 # error unknown bit depth
24 #endif
26 #ifdef WORDS_BIGENDIAN
27 # define SWAP_WORDS 1
28 #endif
30 #define FN_2(x) FN(x + 1) FN(x)
31 #define FN_4(x) FN_2(x + 2) FN_2(x)
33 static void glue(pxa2xx_draw_line2_, BITS)(uint32_t *palette,
34 uint8_t *dest, const uint8_t *src, int width, int deststep)
36 uint32_t data;
37 while (width > 0) {
38 data = *(uint32_t *) src;
39 #define FN(x) COPY_PIXEL(dest, palette[(data >> ((x) * 2)) & 3]);
40 #ifdef SWAP_WORDS
41 FN_4(12)
42 FN_4(8)
43 FN_4(4)
44 FN_4(0)
45 #else
46 FN_4(0)
47 FN_4(4)
48 FN_4(8)
49 FN_4(12)
50 #endif
51 #undef FN
52 width -= 16;
53 src += 4;
57 static void glue(pxa2xx_draw_line4_, BITS)(uint32_t *palette,
58 uint8_t *dest, const uint8_t *src, int width, int deststep)
60 uint32_t data;
61 while (width > 0) {
62 data = *(uint32_t *) src;
63 #define FN(x) COPY_PIXEL(dest, palette[(data >> ((x) * 4)) & 0xf]);
64 #ifdef SWAP_WORDS
65 FN_2(6)
66 FN_2(4)
67 FN_2(2)
68 FN_2(0)
69 #else
70 FN_2(0)
71 FN_2(2)
72 FN_2(4)
73 FN_2(6)
74 #endif
75 #undef FN
76 width -= 8;
77 src += 4;
81 static void glue(pxa2xx_draw_line8_, BITS)(uint32_t *palette,
82 uint8_t *dest, const uint8_t *src, int width, int deststep)
84 uint32_t data;
85 while (width > 0) {
86 data = *(uint32_t *) src;
87 #define FN(x) COPY_PIXEL(dest, palette[(data >> (x)) & 0xff]);
88 #ifdef SWAP_WORDS
89 FN(24)
90 FN(16)
91 FN(8)
92 FN(0)
93 #else
94 FN(0)
95 FN(8)
96 FN(16)
97 FN(24)
98 #endif
99 #undef FN
100 width -= 4;
101 src += 4;
105 static void glue(pxa2xx_draw_line16_, BITS)(uint32_t *palette,
106 uint8_t *dest, const uint8_t *src, int width, int deststep)
108 uint32_t data;
109 unsigned int r, g, b;
110 while (width > 0) {
111 data = *(uint32_t *) src;
112 #ifdef SWAP_WORDS
113 data = bswap32(data);
114 #endif
115 b = (data & 0x1f) << 3;
116 data >>= 5;
117 g = (data & 0x3f) << 2;
118 data >>= 6;
119 r = (data & 0x1f) << 3;
120 data >>= 5;
121 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
122 b = (data & 0x1f) << 3;
123 data >>= 5;
124 g = (data & 0x3f) << 2;
125 data >>= 6;
126 r = (data & 0x1f) << 3;
127 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
128 width -= 2;
129 src += 4;
133 static void glue(pxa2xx_draw_line16t_, BITS)(uint32_t *palette,
134 uint8_t *dest, const uint8_t *src, int width, int deststep)
136 uint32_t data;
137 unsigned int r, g, b;
138 while (width > 0) {
139 data = *(uint32_t *) src;
140 #ifdef SWAP_WORDS
141 data = bswap32(data);
142 #endif
143 b = (data & 0x1f) << 3;
144 data >>= 5;
145 g = (data & 0x1f) << 3;
146 data >>= 5;
147 r = (data & 0x1f) << 3;
148 data >>= 5;
149 if (data & 1)
150 SKIP_PIXEL(dest);
151 else
152 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
153 data >>= 1;
154 b = (data & 0x1f) << 3;
155 data >>= 5;
156 g = (data & 0x1f) << 3;
157 data >>= 5;
158 r = (data & 0x1f) << 3;
159 if (data & 1)
160 SKIP_PIXEL(dest);
161 else
162 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
163 width -= 2;
164 src += 4;
168 static void glue(pxa2xx_draw_line18_, BITS)(uint32_t *palette,
169 uint8_t *dest, const uint8_t *src, int width, int deststep)
171 uint32_t data;
172 unsigned int r, g, b;
173 while (width > 0) {
174 data = *(uint32_t *) src;
175 #ifdef SWAP_WORDS
176 data = bswap32(data);
177 #endif
178 b = (data & 0x3f) << 2;
179 data >>= 6;
180 g = (data & 0x3f) << 2;
181 data >>= 6;
182 r = (data & 0x3f) << 2;
183 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
184 width -= 1;
185 src += 4;
189 /* The wicked packed format */
190 static void glue(pxa2xx_draw_line18p_, BITS)(uint32_t *palette,
191 uint8_t *dest, const uint8_t *src, int width, int deststep)
193 uint32_t data[3];
194 unsigned int r, g, b;
195 while (width > 0) {
196 data[0] = *(uint32_t *) src;
197 src += 4;
198 data[1] = *(uint32_t *) src;
199 src += 4;
200 data[2] = *(uint32_t *) src;
201 src += 4;
202 #ifdef SWAP_WORDS
203 data[0] = bswap32(data[0]);
204 data[1] = bswap32(data[1]);
205 data[2] = bswap32(data[2]);
206 #endif
207 b = (data[0] & 0x3f) << 2;
208 data[0] >>= 6;
209 g = (data[0] & 0x3f) << 2;
210 data[0] >>= 6;
211 r = (data[0] & 0x3f) << 2;
212 data[0] >>= 12;
213 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
214 b = (data[0] & 0x3f) << 2;
215 data[0] >>= 6;
216 g = ((data[1] & 0xf) << 4) | (data[0] << 2);
217 data[1] >>= 4;
218 r = (data[1] & 0x3f) << 2;
219 data[1] >>= 12;
220 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
221 b = (data[1] & 0x3f) << 2;
222 data[1] >>= 6;
223 g = (data[1] & 0x3f) << 2;
224 data[1] >>= 6;
225 r = ((data[2] & 0x3) << 6) | (data[1] << 2);
226 data[2] >>= 8;
227 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
228 b = (data[2] & 0x3f) << 2;
229 data[2] >>= 6;
230 g = (data[2] & 0x3f) << 2;
231 data[2] >>= 6;
232 r = data[2] << 2;
233 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
234 width -= 4;
238 static void glue(pxa2xx_draw_line19_, BITS)(uint32_t *palette,
239 uint8_t *dest, const uint8_t *src, int width, int deststep)
241 uint32_t data;
242 unsigned int r, g, b;
243 while (width > 0) {
244 data = *(uint32_t *) src;
245 #ifdef SWAP_WORDS
246 data = bswap32(data);
247 #endif
248 b = (data & 0x3f) << 2;
249 data >>= 6;
250 g = (data & 0x3f) << 2;
251 data >>= 6;
252 r = (data & 0x3f) << 2;
253 data >>= 6;
254 if (data & 1)
255 SKIP_PIXEL(dest);
256 else
257 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
258 width -= 1;
259 src += 4;
263 /* The wicked packed format */
264 static void glue(pxa2xx_draw_line19p_, BITS)(uint32_t *palette,
265 uint8_t *dest, const uint8_t *src, int width, int deststep)
267 uint32_t data[3];
268 unsigned int r, g, b;
269 while (width > 0) {
270 data[0] = *(uint32_t *) src;
271 src += 4;
272 data[1] = *(uint32_t *) src;
273 src += 4;
274 data[2] = *(uint32_t *) src;
275 src += 4;
276 # ifdef SWAP_WORDS
277 data[0] = bswap32(data[0]);
278 data[1] = bswap32(data[1]);
279 data[2] = bswap32(data[2]);
280 # endif
281 b = (data[0] & 0x3f) << 2;
282 data[0] >>= 6;
283 g = (data[0] & 0x3f) << 2;
284 data[0] >>= 6;
285 r = (data[0] & 0x3f) << 2;
286 data[0] >>= 6;
287 if (data[0] & 1)
288 SKIP_PIXEL(dest);
289 else
290 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
291 data[0] >>= 6;
292 b = (data[0] & 0x3f) << 2;
293 data[0] >>= 6;
294 g = ((data[1] & 0xf) << 4) | (data[0] << 2);
295 data[1] >>= 4;
296 r = (data[1] & 0x3f) << 2;
297 data[1] >>= 6;
298 if (data[1] & 1)
299 SKIP_PIXEL(dest);
300 else
301 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
302 data[1] >>= 6;
303 b = (data[1] & 0x3f) << 2;
304 data[1] >>= 6;
305 g = (data[1] & 0x3f) << 2;
306 data[1] >>= 6;
307 r = ((data[2] & 0x3) << 6) | (data[1] << 2);
308 data[2] >>= 2;
309 if (data[2] & 1)
310 SKIP_PIXEL(dest);
311 else
312 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
313 data[2] >>= 6;
314 b = (data[2] & 0x3f) << 2;
315 data[2] >>= 6;
316 g = (data[2] & 0x3f) << 2;
317 data[2] >>= 6;
318 r = data[2] << 2;
319 data[2] >>= 6;
320 if (data[2] & 1)
321 SKIP_PIXEL(dest);
322 else
323 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
324 width -= 4;
328 static void glue(pxa2xx_draw_line24_, BITS)(uint32_t *palette,
329 uint8_t *dest, const uint8_t *src, int width, int deststep)
331 uint32_t data;
332 unsigned int r, g, b;
333 while (width > 0) {
334 data = *(uint32_t *) src;
335 #ifdef SWAP_WORDS
336 data = bswap32(data);
337 #endif
338 b = data & 0xff;
339 data >>= 8;
340 g = data & 0xff;
341 data >>= 8;
342 r = data & 0xff;
343 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
344 width -= 1;
345 src += 4;
349 static void glue(pxa2xx_draw_line24t_, BITS)(uint32_t *palette,
350 uint8_t *dest, const uint8_t *src, int width, int deststep)
352 uint32_t data;
353 unsigned int r, g, b;
354 while (width > 0) {
355 data = *(uint32_t *) src;
356 #ifdef SWAP_WORDS
357 data = bswap32(data);
358 #endif
359 b = (data & 0x7f) << 1;
360 data >>= 7;
361 g = data & 0xff;
362 data >>= 8;
363 r = data & 0xff;
364 data >>= 8;
365 if (data & 1)
366 SKIP_PIXEL(dest);
367 else
368 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
369 width -= 1;
370 src += 4;
374 static void glue(pxa2xx_draw_line25_, BITS)(uint32_t *palette,
375 uint8_t *dest, const uint8_t *src, int width, int deststep)
377 uint32_t data;
378 unsigned int r, g, b;
379 while (width > 0) {
380 data = *(uint32_t *) src;
381 #ifdef SWAP_WORDS
382 data = bswap32(data);
383 #endif
384 b = data & 0xff;
385 data >>= 8;
386 g = data & 0xff;
387 data >>= 8;
388 r = data & 0xff;
389 data >>= 8;
390 if (data & 1)
391 SKIP_PIXEL(dest);
392 else
393 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
394 width -= 1;
395 src += 4;
399 /* Overlay planes disabled, no transparency */
400 static drawfn glue(pxa2xx_draw_fn_, BITS)[16] =
402 [0 ... 0xf] = 0,
403 [pxa_lcdc_2bpp] = glue(pxa2xx_draw_line2_, BITS),
404 [pxa_lcdc_4bpp] = glue(pxa2xx_draw_line4_, BITS),
405 [pxa_lcdc_8bpp] = glue(pxa2xx_draw_line8_, BITS),
406 [pxa_lcdc_16bpp] = glue(pxa2xx_draw_line16_, BITS),
407 [pxa_lcdc_18bpp] = glue(pxa2xx_draw_line18_, BITS),
408 [pxa_lcdc_18pbpp] = glue(pxa2xx_draw_line18p_, BITS),
409 [pxa_lcdc_24bpp] = glue(pxa2xx_draw_line24_, BITS),
412 /* Overlay planes enabled, transparency used */
413 static drawfn glue(glue(pxa2xx_draw_fn_, BITS), t)[16] =
415 [0 ... 0xf] = 0,
416 [pxa_lcdc_4bpp] = glue(pxa2xx_draw_line4_, BITS),
417 [pxa_lcdc_8bpp] = glue(pxa2xx_draw_line8_, BITS),
418 [pxa_lcdc_16bpp] = glue(pxa2xx_draw_line16t_, BITS),
419 [pxa_lcdc_19bpp] = glue(pxa2xx_draw_line19_, BITS),
420 [pxa_lcdc_19pbpp] = glue(pxa2xx_draw_line19p_, BITS),
421 [pxa_lcdc_24bpp] = glue(pxa2xx_draw_line24t_, BITS),
422 [pxa_lcdc_25bpp] = glue(pxa2xx_draw_line25_, BITS),
425 #undef BITS
426 #undef COPY_PIXEL
427 #undef SKIP_PIXEL
429 #ifdef SWAP_WORDS
430 # undef SWAP_WORDS
431 #endif