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) \
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
,
27 uint8_t *dest
, const uint8_t *src
, 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
,
52 uint8_t *dest
, const uint8_t *src
, 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
,
77 uint8_t *dest
, const uint8_t *src
, 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
,
102 uint8_t *dest
, const uint8_t *src
, 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
,
130 uint8_t *dest
, const uint8_t *src
, 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
));
150 b
= (data
& 0x1f) << 3;
152 g
= (data
& 0x1f) << 3;
154 r
= (data
& 0x1f) << 3;
159 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
165 static void pxa2xx_draw_line18(void *opaque
,
166 uint8_t *dest
, const uint8_t *src
, int width
, int deststep
)
169 unsigned int r
, g
, b
;
171 data
= *(uint32_t *) src
;
173 data
= bswap32(data
);
175 b
= (data
& 0x3f) << 2;
177 g
= (data
& 0x3f) << 2;
179 r
= (data
& 0x3f) << 2;
180 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
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
)
191 unsigned int r
, g
, b
;
193 data
[0] = *(uint32_t *) src
;
195 data
[1] = *(uint32_t *) src
;
197 data
[2] = *(uint32_t *) src
;
200 data
[0] = bswap32(data
[0]);
201 data
[1] = bswap32(data
[1]);
202 data
[2] = bswap32(data
[2]);
204 b
= (data
[0] & 0x3f) << 2;
206 g
= (data
[0] & 0x3f) << 2;
208 r
= (data
[0] & 0x3f) << 2;
210 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
211 b
= (data
[0] & 0x3f) << 2;
213 g
= ((data
[1] & 0xf) << 4) | (data
[0] << 2);
215 r
= (data
[1] & 0x3f) << 2;
217 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
218 b
= (data
[1] & 0x3f) << 2;
220 g
= (data
[1] & 0x3f) << 2;
222 r
= ((data
[2] & 0x3) << 6) | (data
[1] << 2);
224 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
225 b
= (data
[2] & 0x3f) << 2;
227 g
= (data
[2] & 0x3f) << 2;
230 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
235 static void pxa2xx_draw_line19(void *opaque
,
236 uint8_t *dest
, const uint8_t *src
, int width
, int deststep
)
239 unsigned int r
, g
, b
;
241 data
= *(uint32_t *) src
;
243 data
= bswap32(data
);
245 b
= (data
& 0x3f) << 2;
247 g
= (data
& 0x3f) << 2;
249 r
= (data
& 0x3f) << 2;
254 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
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
)
265 unsigned int r
, g
, b
;
267 data
[0] = *(uint32_t *) src
;
269 data
[1] = *(uint32_t *) src
;
271 data
[2] = *(uint32_t *) src
;
274 data
[0] = bswap32(data
[0]);
275 data
[1] = bswap32(data
[1]);
276 data
[2] = bswap32(data
[2]);
278 b
= (data
[0] & 0x3f) << 2;
280 g
= (data
[0] & 0x3f) << 2;
282 r
= (data
[0] & 0x3f) << 2;
287 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
289 b
= (data
[0] & 0x3f) << 2;
291 g
= ((data
[1] & 0xf) << 4) | (data
[0] << 2);
293 r
= (data
[1] & 0x3f) << 2;
298 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
300 b
= (data
[1] & 0x3f) << 2;
302 g
= (data
[1] & 0x3f) << 2;
304 r
= ((data
[2] & 0x3) << 6) | (data
[1] << 2);
309 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
311 b
= (data
[2] & 0x3f) << 2;
313 g
= (data
[2] & 0x3f) << 2;
320 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
325 static void pxa2xx_draw_line24(void *opaque
,
326 uint8_t *dest
, const uint8_t *src
, int width
, int deststep
)
329 unsigned int r
, g
, b
;
331 data
= *(uint32_t *) src
;
333 data
= bswap32(data
);
340 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
346 static void pxa2xx_draw_line24t(void *opaque
,
347 uint8_t *dest
, const uint8_t *src
, int width
, int deststep
)
350 unsigned int r
, g
, b
;
352 data
= *(uint32_t *) src
;
354 data
= bswap32(data
);
356 b
= (data
& 0x7f) << 1;
365 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
371 static void pxa2xx_draw_line25(void *opaque
,
372 uint8_t *dest
, const uint8_t *src
, int width
, int deststep
)
375 unsigned int r
, g
, b
;
377 data
= *(uint32_t *) src
;
379 data
= bswap32(data
);
390 COPY_PIXEL(dest
, rgb_to_pixel32(r
, g
, b
));
396 /* Overlay planes disabled, no transparency */
397 static drawfn pxa2xx_draw_fn_32
[16] =
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] =
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
,