root / hw / pl110_template.h @ 5fafdf24
History | View | Annotate | Download (5.5 kB)
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 |
|
34 |
static 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+2, y) |
83 |
#define FN_8(y) FN_4(0, y) FN_4(4, y) |
84 |
|
85 |
static 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 |
|
112 |
static 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 |
|
139 |
static 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 |
|
166 |
static 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 |
|
189 |
static 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 |
|
226 |
static 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
|