source: trunk/packages/xen-3.1/xen-3.1/tools/ioemu/hw/pl110_template.h @ 34

Last change on this file since 34 was 34, checked in by hartmans, 18 years ago

Add xen and xen-common

File size: 5.5 KB
Line 
1/*
2 * Arm PrimeCell PL110 Color LCD Controller
3 *
4 * Copyright (c) 2005 CodeSourcery, LLC.
5 * Written by Paul Brook
6 *
7 * This code is licenced under the GNU LGPL
8 *
9 * Framebuffer format conversion routines.
10 */
11
12#ifndef ORDER
13
14#if BITS == 8
15#define COPY_PIXEL(to, from) *(to++) = from
16#elif BITS == 15 || BITS == 16
17#define COPY_PIXEL(to, from) *(uint16_t *)to = from; to += 2;
18#elif BITS == 24
19#define COPY_PIXEL(to, from) \
20  *(to++) = from; *(to++) = (from) >> 8; *(to++) = (from) >> 16
21#elif BITS == 32
22#define COPY_PIXEL(to, from) *(uint32_t *)to = from; to += 4;
23#else
24#error unknown bit depth
25#endif
26
27#define ORDER 0
28#include "pl110_template.h"
29#define ORDER 1
30#include "pl110_template.h"
31#define ORDER 2
32#include "pl110_template.h"
33
34static drawfn glue(pl110_draw_fn_,BITS)[18] =
35{
36    glue(pl110_draw_line1_lblp,BITS),
37    glue(pl110_draw_line2_lblp,BITS),
38    glue(pl110_draw_line4_lblp,BITS),
39    glue(pl110_draw_line8_lblp,BITS),
40    glue(pl110_draw_line16_lblp,BITS),
41    glue(pl110_draw_line32_lblp,BITS),
42
43    glue(pl110_draw_line1_bbbp,BITS),
44    glue(pl110_draw_line2_bbbp,BITS),
45    glue(pl110_draw_line4_bbbp,BITS),
46    glue(pl110_draw_line8_bbbp,BITS),
47    glue(pl110_draw_line16_bbbp,BITS),
48    glue(pl110_draw_line32_bbbp,BITS),
49
50    glue(pl110_draw_line1_lbbp,BITS),
51    glue(pl110_draw_line2_lbbp,BITS),
52    glue(pl110_draw_line4_lbbp,BITS),
53    glue(pl110_draw_line8_lbbp,BITS),
54    glue(pl110_draw_line16_lbbp,BITS),
55    glue(pl110_draw_line32_lbbp,BITS)
56};
57
58#undef BITS
59#undef COPY_PIXEL
60
61#else
62
63#if ORDER == 0
64#define NAME glue(lblp, BITS)
65#ifdef WORDS_BIGENDIAN
66#define SWAP_WORDS 1
67#endif
68#elif ORDER == 1
69#define NAME glue(bbbp, BITS)
70#ifndef WORDS_BIGENDIAN
71#define SWAP_WORDS 1
72#endif
73#else
74#define SWAP_PIXELS 1
75#define NAME glue(lbbp, BITS)
76#ifdef WORDS_BIGENDIAN
77#define SWAP_WORDS 1
78#endif
79#endif
80
81#define FN_2(x, y) FN(x, y) FN(x+1, y)
82#define FN_4(x, y) FN_2(x, y) FN_2(x+1, y)
83#define FN_8(y) FN_4(0, y) FN_4(4, y)
84
85static void glue(pl110_draw_line1_,NAME)(uint32_t *pallette, uint8_t *d, const uint8_t *src, int width)
86{
87    uint32_t data;
88    while (width > 0) {
89        data = *(uint32_t *)src;
90#ifdef SWAP_PIXELS
91#define FN(x, y) COPY_PIXEL(d, pallette[(data >> (y + 7 - (x))) & 1]);
92#else
93#define FN(x, y) COPY_PIXEL(d, pallette[(data >> ((x) + y)) & 1]);
94#endif
95#ifdef SWAP_WORDS
96        FN_8(24)
97        FN_8(16)
98        FN_8(8)
99        FN_8(0)
100#else
101        FN_8(0)
102        FN_8(8)
103        FN_8(16)
104        FN_8(24)
105#endif
106#undef FN
107        width -= 32;
108        src += 4;
109    }
110}
111
112static void glue(pl110_draw_line2_,NAME)(uint32_t *pallette, uint8_t *d, const uint8_t *src, int width)
113{
114    uint32_t data;
115    while (width > 0) {
116        data = *(uint32_t *)src;
117#ifdef SWAP_PIXELS
118#define FN(x, y) COPY_PIXEL(d, pallette[(data >> (y + 6 - (x)*2)) & 3]);
119#else
120#define FN(x, y) COPY_PIXEL(d, pallette[(data >> ((x)*2 + y)) & 3]);
121#endif
122#ifdef SWAP_WORDS
123        FN_4(0, 24)
124        FN_4(0, 16)
125        FN_4(0, 8)
126        FN_4(0, 0)
127#else
128        FN_4(0, 0)
129        FN_4(0, 8)
130        FN_4(0, 16)
131        FN_4(0, 24)
132#endif
133#undef FN
134        width -= 16;
135        src += 4;
136    }
137}
138
139static void glue(pl110_draw_line4_,NAME)(uint32_t *pallette, uint8_t *d, const uint8_t *src, int width)
140{
141    uint32_t data;
142    while (width > 0) {
143        data = *(uint32_t *)src;
144#ifdef SWAP_PIXELS
145#define FN(x, y) COPY_PIXEL(d, pallette[(data >> (y + 4 - (x)*4)) & 0xf]);
146#else
147#define FN(x, y) COPY_PIXEL(d, pallette[(data >> ((x)*4 + y)) & 0xf]);
148#endif
149#ifdef SWAP_WORDS
150        FN_2(0, 24)
151        FN_2(0, 16)
152        FN_2(0, 8)
153        FN_2(0, 0)
154#else
155        FN_2(0, 0)
156        FN_2(0, 8)
157        FN_2(0, 16)
158        FN_2(0, 24)
159#endif
160#undef FN
161        width -= 8;
162        src += 4;
163    }
164}
165
166static void glue(pl110_draw_line8_,NAME)(uint32_t *pallette, uint8_t *d, const uint8_t *src, int width)
167{
168    uint32_t data;
169    while (width > 0) {
170        data = *(uint32_t *)src;
171#define FN(x) COPY_PIXEL(d, pallette[(data >> (x)) & 0xff]);
172#ifdef SWAP_WORDS
173        FN(24)
174        FN(16)
175        FN(8)
176        FN(0)
177#else
178        FN(0)
179        FN(8)
180        FN(16)
181        FN(24)
182#endif
183#undef FN
184        width -= 4;
185        src += 4;
186    }
187}
188
189static void glue(pl110_draw_line16_,NAME)(uint32_t *pallette, uint8_t *d, const uint8_t *src, int width)
190{
191    uint32_t data;
192    unsigned int r, g, b;
193    while (width > 0) {
194        data = *(uint32_t *)src;
195#ifdef SWAP_WORDS
196        data = bswap32(data);
197#endif
198#if 0
199        r = data & 0x1f;
200        data >>= 5;
201        g = data & 0x3f;
202        data >>= 6;
203        b = data & 0x1f;
204        data >>= 5;
205#else
206        r = (data & 0x1f) << 3;
207        data >>= 5;
208        g = (data & 0x3f) << 2;
209        data >>= 6;
210        b = (data & 0x1f) << 3;
211        data >>= 5;
212#endif
213        COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b));
214        r = (data & 0x1f) << 3;
215        data >>= 5;
216        g = (data & 0x3f) << 2;
217        data >>= 6;
218        b = (data & 0x1f) << 3;
219        data >>= 5;
220        COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b));
221        width -= 2;
222        src += 4;
223    }
224}
225
226static void glue(pl110_draw_line32_,NAME)(uint32_t *pallette, uint8_t *d, const uint8_t *src, int width)
227{
228    uint32_t data;
229    unsigned int r, g, b;
230    while (width > 0) {
231        data = *(uint32_t *)src;
232#ifdef SWAP_WORDS
233        r = data & 0xff;
234        g = (data >> 8) & 0xff;
235        b = (data >> 16) & 0xff;
236#else
237        r = (data >> 24) & 0xff;
238        g = (data >> 16) & 0xff;
239        b = (data >> 8) & 0xff;
240#endif
241        COPY_PIXEL(d, glue(rgb_to_pixel,BITS)(r, g, b));
242        width--;
243        src += 4;
244    }
245}
246
247#undef SWAP_PIXELS
248#undef NAME
249#undef SWAP_WORDS
250#undef ORDER
251
252#endif
Note: See TracBrowser for help on using the repository browser.