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) do { to += deststep; } while (0)
13 # define COPY_PIXEL(to, from) \
15 *(uint32_t *) to = from; \
19 #ifdef HOST_WORDS_BIGENDIAN
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
, uint8_t *dest
, const uint8_t *src
,
27 int width
, int deststep
)
29 uint32_t *palette
= opaque
;
32 data
= *(uint32_t *) src
;
33 #define FN(x) COPY_PIXEL(dest, palette[(data >> ((x) * 2)) & 3]);
51 static void pxa2xx_draw_line4(void *opaque
, uint8_t *dest
, const uint8_t *src
,
52 int width
, int deststep
)
54 uint32_t *palette
= opaque
;
57 data
= *(uint32_t *) src
;
58 #define FN(x) COPY_PIXEL(dest, palette[(data >> ((x) * 4)) & 0xf]);
76 static void pxa2xx_draw_line8(void *opaque
, uint8_t *dest
, const uint8_t *src
,
77 int width
, int deststep
)
79 uint32_t *palette
= opaque
;
82 data
= *(uint32_t *) src
;
83 #define FN(x) COPY_PIXEL(dest, palette[(data >> (x)) & 0xff]);
101 static void pxa2xx_draw_line16(void *opaque
, uint8_t *dest
, const uint8_t *src
,
102 int width
, int deststep
)
105 unsigned int r
, g
, b
;
107 data
= *(uint32_t *) src
;
109 data
= bswap32(data
);
111 b
= (data
& 0x1f) << 3;
113 g
= (data
& 0x3f) << 2;
115 r
= (data
& 0x1f) << 3;
117 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
118 b
= (data
& 0x1f) << 3;
120 g
= (data
& 0x3f) << 2;
122 r
= (data
& 0x1f) << 3;
123 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
129 static void pxa2xx_draw_line16t(void *opaque
, uint8_t *dest
, const uint8_t *src
,
130 int width
, int deststep
)
133 unsigned int r
, g
, b
;
135 data
= *(uint32_t *) src
;
137 data
= bswap32(data
);
139 b
= (data
& 0x1f) << 3;
141 g
= (data
& 0x1f) << 3;
143 r
= (data
& 0x1f) << 3;
148 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
151 b
= (data
& 0x1f) << 3;
153 g
= (data
& 0x1f) << 3;
155 r
= (data
& 0x1f) << 3;
160 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
167 static void pxa2xx_draw_line18(void *opaque
, uint8_t *dest
, const uint8_t *src
,
168 int width
, int deststep
)
171 unsigned int r
, g
, b
;
173 data
= *(uint32_t *) src
;
175 data
= bswap32(data
);
177 b
= (data
& 0x3f) << 2;
179 g
= (data
& 0x3f) << 2;
181 r
= (data
& 0x3f) << 2;
182 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
188 /* The wicked packed format */
189 static void pxa2xx_draw_line18p(void *opaque
, uint8_t *dest
, const uint8_t *src
,
190 int width
, int deststep
)
193 unsigned int r
, g
, b
;
195 data
[0] = *(uint32_t *) src
;
197 data
[1] = *(uint32_t *) src
;
199 data
[2] = *(uint32_t *) src
;
202 data
[0] = bswap32(data
[0]);
203 data
[1] = bswap32(data
[1]);
204 data
[2] = bswap32(data
[2]);
206 b
= (data
[0] & 0x3f) << 2;
208 g
= (data
[0] & 0x3f) << 2;
210 r
= (data
[0] & 0x3f) << 2;
212 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
213 b
= (data
[0] & 0x3f) << 2;
215 g
= ((data
[1] & 0xf) << 4) | (data
[0] << 2);
217 r
= (data
[1] & 0x3f) << 2;
219 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
220 b
= (data
[1] & 0x3f) << 2;
222 g
= (data
[1] & 0x3f) << 2;
224 r
= ((data
[2] & 0x3) << 6) | (data
[1] << 2);
226 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
227 b
= (data
[2] & 0x3f) << 2;
229 g
= (data
[2] & 0x3f) << 2;
232 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
237 static void pxa2xx_draw_line19(void *opaque
, uint8_t *dest
, const uint8_t *src
,
238 int width
, int deststep
)
241 unsigned int r
, g
, b
;
243 data
= *(uint32_t *) src
;
245 data
= bswap32(data
);
247 b
= (data
& 0x3f) << 2;
249 g
= (data
& 0x3f) << 2;
251 r
= (data
& 0x3f) << 2;
256 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
263 /* The wicked packed format */
264 static void pxa2xx_draw_line19p(void *opaque
, uint8_t *dest
, const uint8_t *src
,
265 int width
, int deststep
)
268 unsigned int r
, g
, b
;
270 data
[0] = *(uint32_t *) src
;
272 data
[1] = *(uint32_t *) src
;
274 data
[2] = *(uint32_t *) src
;
277 data
[0] = bswap32(data
[0]);
278 data
[1] = bswap32(data
[1]);
279 data
[2] = bswap32(data
[2]);
281 b
= (data
[0] & 0x3f) << 2;
283 g
= (data
[0] & 0x3f) << 2;
285 r
= (data
[0] & 0x3f) << 2;
290 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
293 b
= (data
[0] & 0x3f) << 2;
295 g
= ((data
[1] & 0xf) << 4) | (data
[0] << 2);
297 r
= (data
[1] & 0x3f) << 2;
302 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
305 b
= (data
[1] & 0x3f) << 2;
307 g
= (data
[1] & 0x3f) << 2;
309 r
= ((data
[2] & 0x3) << 6) | (data
[1] << 2);
314 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
317 b
= (data
[2] & 0x3f) << 2;
319 g
= (data
[2] & 0x3f) << 2;
326 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
332 static void pxa2xx_draw_line24(void *opaque
, uint8_t *dest
, const uint8_t *src
,
333 int width
, int deststep
)
336 unsigned int r
, g
, b
;
338 data
= *(uint32_t *) src
;
340 data
= bswap32(data
);
347 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
353 static void pxa2xx_draw_line24t(void *opaque
, uint8_t *dest
, const uint8_t *src
,
354 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
, rgb_to_pixel32(r
, g
, b
));
379 static void pxa2xx_draw_line25(void *opaque
, uint8_t *dest
, const uint8_t *src
,
380 int width
, int deststep
)
383 unsigned int r
, g
, b
;
385 data
= *(uint32_t *) src
;
387 data
= bswap32(data
);
398 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
405 /* Overlay planes disabled, no transparency */
406 static drawfn pxa2xx_draw_fn_32
[16] = {
408 [pxa_lcdc_2bpp
] = pxa2xx_draw_line2
,
409 [pxa_lcdc_4bpp
] = pxa2xx_draw_line4
,
410 [pxa_lcdc_8bpp
] = pxa2xx_draw_line8
,
411 [pxa_lcdc_16bpp
] = pxa2xx_draw_line16
,
412 [pxa_lcdc_18bpp
] = pxa2xx_draw_line18
,
413 [pxa_lcdc_18pbpp
] = pxa2xx_draw_line18p
,
414 [pxa_lcdc_24bpp
] = pxa2xx_draw_line24
,
417 /* Overlay planes enabled, transparency used */
418 static drawfn pxa2xx_draw_fn_32t
[16] = {
420 [pxa_lcdc_4bpp
] = pxa2xx_draw_line4
,
421 [pxa_lcdc_8bpp
] = pxa2xx_draw_line8
,
422 [pxa_lcdc_16bpp
] = pxa2xx_draw_line16t
,
423 [pxa_lcdc_19bpp
] = pxa2xx_draw_line19
,
424 [pxa_lcdc_19pbpp
] = pxa2xx_draw_line19p
,
425 [pxa_lcdc_24bpp
] = pxa2xx_draw_line24t
,
426 [pxa_lcdc_25bpp
] = pxa2xx_draw_line25
,