2 * Intel XScale PXA255/270 LCDC emulation.
4 * Copyright (c) 2006 Openedhand Ltd.
7 * This code is licensed under the GPLv2.
9 * Framebuffer format conversion routines.
12 # define SKIP_PIXEL(to) to += deststep
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)
18 # define COPY_PIXEL(to, from) \
19 *(uint16_t *) to = from; *(to + 2) = (from) >> 16; SKIP_PIXEL(to)
21 # define COPY_PIXEL(to, from) *(uint32_t *) to = from; SKIP_PIXEL(to)
23 # error unknown bit depth
26 #ifdef HOST_WORDS_BIGENDIAN
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)(void *opaque,
34 uint8_t *dest, const uint8_t *src, int width, int deststep)
36 uint32_t *palette = opaque;
39 data = *(uint32_t *) src;
40 #define FN(x) COPY_PIXEL(dest, palette[(data >> ((x) * 2)) & 3]);
58 static void glue(pxa2xx_draw_line4_, BITS)(void *opaque,
59 uint8_t *dest, const uint8_t *src, int width, int deststep)
61 uint32_t *palette = opaque;
64 data = *(uint32_t *) src;
65 #define FN(x) COPY_PIXEL(dest, palette[(data >> ((x) * 4)) & 0xf]);
83 static void glue(pxa2xx_draw_line8_, BITS)(void *opaque,
84 uint8_t *dest, const uint8_t *src, int width, int deststep)
86 uint32_t *palette = opaque;
89 data = *(uint32_t *) src;
90 #define FN(x) COPY_PIXEL(dest, palette[(data >> (x)) & 0xff]);
108 static void glue(pxa2xx_draw_line16_, BITS)(void *opaque,
109 uint8_t *dest, const uint8_t *src, int width, int deststep)
112 unsigned int r, g, b;
114 data = *(uint32_t *) src;
116 data = bswap32(data);
118 b = (data & 0x1f) << 3;
120 g = (data & 0x3f) << 2;
122 r = (data & 0x1f) << 3;
124 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
125 b = (data & 0x1f) << 3;
127 g = (data & 0x3f) << 2;
129 r = (data & 0x1f) << 3;
130 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
136 static void glue(pxa2xx_draw_line16t_, BITS)(void *opaque,
137 uint8_t *dest, const uint8_t *src, int width, int deststep)
140 unsigned int r, g, b;
142 data = *(uint32_t *) src;
144 data = bswap32(data);
146 b = (data & 0x1f) << 3;
148 g = (data & 0x1f) << 3;
150 r = (data & 0x1f) << 3;
155 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
157 b = (data & 0x1f) << 3;
159 g = (data & 0x1f) << 3;
161 r = (data & 0x1f) << 3;
166 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
172 static void glue(pxa2xx_draw_line18_, BITS)(void *opaque,
173 uint8_t *dest, const uint8_t *src, int width, int deststep)
176 unsigned int r, g, b;
178 data = *(uint32_t *) src;
180 data = bswap32(data);
182 b = (data & 0x3f) << 2;
184 g = (data & 0x3f) << 2;
186 r = (data & 0x3f) << 2;
187 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
193 /* The wicked packed format */
194 static void glue(pxa2xx_draw_line18p_, BITS)(void *opaque,
195 uint8_t *dest, const uint8_t *src, int width, int deststep)
198 unsigned int r, g, b;
200 data[0] = *(uint32_t *) src;
202 data[1] = *(uint32_t *) src;
204 data[2] = *(uint32_t *) src;
207 data[0] = bswap32(data[0]);
208 data[1] = bswap32(data[1]);
209 data[2] = bswap32(data[2]);
211 b = (data[0] & 0x3f) << 2;
213 g = (data[0] & 0x3f) << 2;
215 r = (data[0] & 0x3f) << 2;
217 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
218 b = (data[0] & 0x3f) << 2;
220 g = ((data[1] & 0xf) << 4) | (data[0] << 2);
222 r = (data[1] & 0x3f) << 2;
224 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
225 b = (data[1] & 0x3f) << 2;
227 g = (data[1] & 0x3f) << 2;
229 r = ((data[2] & 0x3) << 6) | (data[1] << 2);
231 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
232 b = (data[2] & 0x3f) << 2;
234 g = (data[2] & 0x3f) << 2;
237 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
242 static void glue(pxa2xx_draw_line19_, BITS)(void *opaque,
243 uint8_t *dest, const uint8_t *src, int width, int deststep)
246 unsigned int r, g, b;
248 data = *(uint32_t *) src;
250 data = bswap32(data);
252 b = (data & 0x3f) << 2;
254 g = (data & 0x3f) << 2;
256 r = (data & 0x3f) << 2;
261 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
267 /* The wicked packed format */
268 static void glue(pxa2xx_draw_line19p_, BITS)(void *opaque,
269 uint8_t *dest, const uint8_t *src, int width, int deststep)
272 unsigned int r, g, b;
274 data[0] = *(uint32_t *) src;
276 data[1] = *(uint32_t *) src;
278 data[2] = *(uint32_t *) src;
281 data[0] = bswap32(data[0]);
282 data[1] = bswap32(data[1]);
283 data[2] = bswap32(data[2]);
285 b = (data[0] & 0x3f) << 2;
287 g = (data[0] & 0x3f) << 2;
289 r = (data[0] & 0x3f) << 2;
294 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
296 b = (data[0] & 0x3f) << 2;
298 g = ((data[1] & 0xf) << 4) | (data[0] << 2);
300 r = (data[1] & 0x3f) << 2;
305 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
307 b = (data[1] & 0x3f) << 2;
309 g = (data[1] & 0x3f) << 2;
311 r = ((data[2] & 0x3) << 6) | (data[1] << 2);
316 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
318 b = (data[2] & 0x3f) << 2;
320 g = (data[2] & 0x3f) << 2;
327 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
332 static void glue(pxa2xx_draw_line24_, BITS)(void *opaque,
333 uint8_t *dest, const uint8_t *src, int width, int deststep)
336 unsigned int r, g, b;
338 data = *(uint32_t *) src;
340 data = bswap32(data);
347 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
353 static void glue(pxa2xx_draw_line24t_, BITS)(void *opaque,
354 uint8_t *dest, const uint8_t *src, int width, int deststep)
357 unsigned int r, g, b;
359 data = *(uint32_t *) src;
361 data = bswap32(data);
363 b = (data & 0x7f) << 1;
372 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
378 static void glue(pxa2xx_draw_line25_, BITS)(void *opaque,
379 uint8_t *dest, const uint8_t *src, int width, int deststep)
382 unsigned int r, g, b;
384 data = *(uint32_t *) src;
386 data = bswap32(data);
397 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
403 /* Overlay planes disabled, no transparency */
404 static drawfn glue(pxa2xx_draw_fn_, BITS)[16] =
407 [pxa_lcdc_2bpp] = glue(pxa2xx_draw_line2_, BITS),
408 [pxa_lcdc_4bpp] = glue(pxa2xx_draw_line4_, BITS),
409 [pxa_lcdc_8bpp] = glue(pxa2xx_draw_line8_, BITS),
410 [pxa_lcdc_16bpp] = glue(pxa2xx_draw_line16_, BITS),
411 [pxa_lcdc_18bpp] = glue(pxa2xx_draw_line18_, BITS),
412 [pxa_lcdc_18pbpp] = glue(pxa2xx_draw_line18p_, BITS),
413 [pxa_lcdc_24bpp] = glue(pxa2xx_draw_line24_, BITS),
416 /* Overlay planes enabled, transparency used */
417 static drawfn glue(glue(pxa2xx_draw_fn_, BITS), t)[16] =
420 [pxa_lcdc_4bpp] = glue(pxa2xx_draw_line4_, BITS),
421 [pxa_lcdc_8bpp] = glue(pxa2xx_draw_line8_, BITS),
422 [pxa_lcdc_16bpp] = glue(pxa2xx_draw_line16t_, BITS),
423 [pxa_lcdc_19bpp] = glue(pxa2xx_draw_line19_, BITS),
424 [pxa_lcdc_19pbpp] = glue(pxa2xx_draw_line19p_, BITS),
425 [pxa_lcdc_24bpp] = glue(pxa2xx_draw_line24t_, BITS),
426 [pxa_lcdc_25bpp] = glue(pxa2xx_draw_line25_, BITS),