]>
Commit | Line | Data |
---|---|---|
5fafdf24 | 1 | /* |
bdd5003a PB |
2 | * Arm PrimeCell PL110 Color LCD Controller |
3 | * | |
4 | * Copyright (c) 2005 CodeSourcery, LLC. | |
5 | * Written by Paul Brook | |
6 | * | |
8e31bf38 | 7 | * This code is licensed under the GNU LGPL |
bdd5003a PB |
8 | * |
9 | * Framebuffer format conversion routines. | |
10 | */ | |
11 | ||
12 | #ifndef ORDER | |
560ebce6 | 13 | #error "pl110_template.h is only for inclusion by pl110.c" |
bdd5003a PB |
14 | #endif |
15 | ||
bdd5003a | 16 | #if ORDER == 0 |
ba1c16e4 | 17 | #define NAME glue(lblp_, BORDER) |
e2542fe2 | 18 | #ifdef HOST_WORDS_BIGENDIAN |
bdd5003a PB |
19 | #define SWAP_WORDS 1 |
20 | #endif | |
21 | #elif ORDER == 1 | |
ba1c16e4 | 22 | #define NAME glue(bbbp_, BORDER) |
e2542fe2 | 23 | #ifndef HOST_WORDS_BIGENDIAN |
bdd5003a PB |
24 | #define SWAP_WORDS 1 |
25 | #endif | |
26 | #else | |
27 | #define SWAP_PIXELS 1 | |
ba1c16e4 | 28 | #define NAME glue(lbbp_, BORDER) |
e2542fe2 | 29 | #ifdef HOST_WORDS_BIGENDIAN |
bdd5003a PB |
30 | #define SWAP_WORDS 1 |
31 | #endif | |
32 | #endif | |
33 | ||
34 | #define FN_2(x, y) FN(x, y) FN(x+1, y) | |
1f9519c9 | 35 | #define FN_4(x, y) FN_2(x, y) FN_2(x+2, y) |
bdd5003a PB |
36 | #define FN_8(y) FN_4(0, y) FN_4(4, y) |
37 | ||
714fa308 | 38 | static void glue(pl110_draw_line1_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep) |
bdd5003a | 39 | { |
6e4c0d1f | 40 | uint32_t *palette = opaque; |
bdd5003a PB |
41 | uint32_t data; |
42 | while (width > 0) { | |
43 | data = *(uint32_t *)src; | |
44 | #ifdef SWAP_PIXELS | |
6e4c0d1f | 45 | #define FN(x, y) COPY_PIXEL(d, palette[(data >> (y + 7 - (x))) & 1]); |
bdd5003a | 46 | #else |
6e4c0d1f | 47 | #define FN(x, y) COPY_PIXEL(d, palette[(data >> ((x) + y)) & 1]); |
bdd5003a | 48 | #endif |
be9d3657 | 49 | #ifdef SWAP_WORDS |
bdd5003a PB |
50 | FN_8(24) |
51 | FN_8(16) | |
52 | FN_8(8) | |
53 | FN_8(0) | |
54 | #else | |
55 | FN_8(0) | |
56 | FN_8(8) | |
57 | FN_8(16) | |
58 | FN_8(24) | |
59 | #endif | |
60 | #undef FN | |
61 | width -= 32; | |
62 | src += 4; | |
63 | } | |
64 | } | |
65 | ||
714fa308 | 66 | static void glue(pl110_draw_line2_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep) |
bdd5003a | 67 | { |
6e4c0d1f | 68 | uint32_t *palette = opaque; |
bdd5003a PB |
69 | uint32_t data; |
70 | while (width > 0) { | |
71 | data = *(uint32_t *)src; | |
72 | #ifdef SWAP_PIXELS | |
6e4c0d1f | 73 | #define FN(x, y) COPY_PIXEL(d, palette[(data >> (y + 6 - (x)*2)) & 3]); |
bdd5003a | 74 | #else |
6e4c0d1f | 75 | #define FN(x, y) COPY_PIXEL(d, palette[(data >> ((x)*2 + y)) & 3]); |
bdd5003a | 76 | #endif |
be9d3657 | 77 | #ifdef SWAP_WORDS |
bdd5003a PB |
78 | FN_4(0, 24) |
79 | FN_4(0, 16) | |
80 | FN_4(0, 8) | |
81 | FN_4(0, 0) | |
82 | #else | |
83 | FN_4(0, 0) | |
84 | FN_4(0, 8) | |
85 | FN_4(0, 16) | |
86 | FN_4(0, 24) | |
87 | #endif | |
88 | #undef FN | |
89 | width -= 16; | |
90 | src += 4; | |
91 | } | |
92 | } | |
93 | ||
714fa308 | 94 | static void glue(pl110_draw_line4_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep) |
bdd5003a | 95 | { |
6e4c0d1f | 96 | uint32_t *palette = opaque; |
bdd5003a PB |
97 | uint32_t data; |
98 | while (width > 0) { | |
99 | data = *(uint32_t *)src; | |
100 | #ifdef SWAP_PIXELS | |
6e4c0d1f | 101 | #define FN(x, y) COPY_PIXEL(d, palette[(data >> (y + 4 - (x)*4)) & 0xf]); |
bdd5003a | 102 | #else |
6e4c0d1f | 103 | #define FN(x, y) COPY_PIXEL(d, palette[(data >> ((x)*4 + y)) & 0xf]); |
bdd5003a | 104 | #endif |
be9d3657 | 105 | #ifdef SWAP_WORDS |
bdd5003a PB |
106 | FN_2(0, 24) |
107 | FN_2(0, 16) | |
108 | FN_2(0, 8) | |
109 | FN_2(0, 0) | |
110 | #else | |
111 | FN_2(0, 0) | |
112 | FN_2(0, 8) | |
113 | FN_2(0, 16) | |
114 | FN_2(0, 24) | |
115 | #endif | |
116 | #undef FN | |
117 | width -= 8; | |
118 | src += 4; | |
119 | } | |
120 | } | |
121 | ||
714fa308 | 122 | static void glue(pl110_draw_line8_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep) |
bdd5003a | 123 | { |
6e4c0d1f | 124 | uint32_t *palette = opaque; |
bdd5003a PB |
125 | uint32_t data; |
126 | while (width > 0) { | |
127 | data = *(uint32_t *)src; | |
6e4c0d1f | 128 | #define FN(x) COPY_PIXEL(d, palette[(data >> (x)) & 0xff]); |
be9d3657 | 129 | #ifdef SWAP_WORDS |
bdd5003a PB |
130 | FN(24) |
131 | FN(16) | |
132 | FN(8) | |
133 | FN(0) | |
134 | #else | |
135 | FN(0) | |
136 | FN(8) | |
137 | FN(16) | |
138 | FN(24) | |
139 | #endif | |
140 | #undef FN | |
141 | width -= 4; | |
142 | src += 4; | |
143 | } | |
144 | } | |
145 | ||
714fa308 | 146 | static void glue(pl110_draw_line16_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep) |
bdd5003a PB |
147 | { |
148 | uint32_t data; | |
149 | unsigned int r, g, b; | |
150 | while (width > 0) { | |
151 | data = *(uint32_t *)src; | |
be9d3657 | 152 | #ifdef SWAP_WORDS |
bdd5003a PB |
153 | data = bswap32(data); |
154 | #endif | |
e9c05b42 AZ |
155 | #ifdef RGB |
156 | #define LSB r | |
157 | #define MSB b | |
158 | #else | |
159 | #define LSB b | |
160 | #define MSB r | |
161 | #endif | |
bdd5003a | 162 | #if 0 |
e9c05b42 | 163 | LSB = data & 0x1f; |
bdd5003a PB |
164 | data >>= 5; |
165 | g = data & 0x3f; | |
166 | data >>= 6; | |
e9c05b42 | 167 | MSB = data & 0x1f; |
bdd5003a PB |
168 | data >>= 5; |
169 | #else | |
e9c05b42 | 170 | LSB = (data & 0x1f) << 3; |
bdd5003a PB |
171 | data >>= 5; |
172 | g = (data & 0x3f) << 2; | |
173 | data >>= 6; | |
e9c05b42 | 174 | MSB = (data & 0x1f) << 3; |
bdd5003a PB |
175 | data >>= 5; |
176 | #endif | |
ba1c16e4 | 177 | COPY_PIXEL(d, rgb_to_pixel32(r, g, b)); |
e9c05b42 | 178 | LSB = (data & 0x1f) << 3; |
bdd5003a PB |
179 | data >>= 5; |
180 | g = (data & 0x3f) << 2; | |
181 | data >>= 6; | |
e9c05b42 | 182 | MSB = (data & 0x1f) << 3; |
bdd5003a | 183 | data >>= 5; |
ba1c16e4 | 184 | COPY_PIXEL(d, rgb_to_pixel32(r, g, b)); |
e9c05b42 AZ |
185 | #undef MSB |
186 | #undef LSB | |
bdd5003a PB |
187 | width -= 2; |
188 | src += 4; | |
189 | } | |
190 | } | |
191 | ||
714fa308 | 192 | static void glue(pl110_draw_line32_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep) |
bdd5003a PB |
193 | { |
194 | uint32_t data; | |
195 | unsigned int r, g, b; | |
196 | while (width > 0) { | |
197 | data = *(uint32_t *)src; | |
e9c05b42 AZ |
198 | #ifdef RGB |
199 | #define LSB r | |
200 | #define MSB b | |
201 | #else | |
202 | #define LSB b | |
203 | #define MSB r | |
204 | #endif | |
399a4e21 | 205 | #ifndef SWAP_WORDS |
e9c05b42 | 206 | LSB = data & 0xff; |
bdd5003a | 207 | g = (data >> 8) & 0xff; |
e9c05b42 | 208 | MSB = (data >> 16) & 0xff; |
bdd5003a | 209 | #else |
e9c05b42 | 210 | LSB = (data >> 24) & 0xff; |
bdd5003a | 211 | g = (data >> 16) & 0xff; |
e9c05b42 | 212 | MSB = (data >> 8) & 0xff; |
bdd5003a | 213 | #endif |
ba1c16e4 | 214 | COPY_PIXEL(d, rgb_to_pixel32(r, g, b)); |
e9c05b42 AZ |
215 | #undef MSB |
216 | #undef LSB | |
bdd5003a PB |
217 | width--; |
218 | src += 4; | |
219 | } | |
220 | } | |
221 | ||
4fbf5556 PM |
222 | static void glue(pl110_draw_line16_555_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep) |
223 | { | |
224 | /* RGB 555 plus an intensity bit (which we ignore) */ | |
225 | uint32_t data; | |
226 | unsigned int r, g, b; | |
227 | while (width > 0) { | |
228 | data = *(uint32_t *)src; | |
229 | #ifdef SWAP_WORDS | |
230 | data = bswap32(data); | |
231 | #endif | |
232 | #ifdef RGB | |
233 | #define LSB r | |
234 | #define MSB b | |
235 | #else | |
236 | #define LSB b | |
237 | #define MSB r | |
238 | #endif | |
239 | LSB = (data & 0x1f) << 3; | |
240 | data >>= 5; | |
241 | g = (data & 0x1f) << 3; | |
242 | data >>= 5; | |
243 | MSB = (data & 0x1f) << 3; | |
244 | data >>= 5; | |
ba1c16e4 | 245 | COPY_PIXEL(d, rgb_to_pixel32(r, g, b)); |
4fbf5556 PM |
246 | LSB = (data & 0x1f) << 3; |
247 | data >>= 5; | |
248 | g = (data & 0x1f) << 3; | |
249 | data >>= 5; | |
250 | MSB = (data & 0x1f) << 3; | |
251 | data >>= 6; | |
ba1c16e4 | 252 | COPY_PIXEL(d, rgb_to_pixel32(r, g, b)); |
4fbf5556 PM |
253 | #undef MSB |
254 | #undef LSB | |
255 | width -= 2; | |
256 | src += 4; | |
257 | } | |
258 | } | |
259 | ||
260 | static void glue(pl110_draw_line12_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep) | |
261 | { | |
262 | /* RGB 444 with 4 bits of zeroes at the top of each halfword */ | |
263 | uint32_t data; | |
264 | unsigned int r, g, b; | |
265 | while (width > 0) { | |
266 | data = *(uint32_t *)src; | |
267 | #ifdef SWAP_WORDS | |
268 | data = bswap32(data); | |
269 | #endif | |
270 | #ifdef RGB | |
271 | #define LSB r | |
272 | #define MSB b | |
273 | #else | |
274 | #define LSB b | |
275 | #define MSB r | |
276 | #endif | |
277 | LSB = (data & 0xf) << 4; | |
278 | data >>= 4; | |
279 | g = (data & 0xf) << 4; | |
280 | data >>= 4; | |
281 | MSB = (data & 0xf) << 4; | |
282 | data >>= 8; | |
ba1c16e4 | 283 | COPY_PIXEL(d, rgb_to_pixel32(r, g, b)); |
4fbf5556 PM |
284 | LSB = (data & 0xf) << 4; |
285 | data >>= 4; | |
286 | g = (data & 0xf) << 4; | |
287 | data >>= 4; | |
288 | MSB = (data & 0xf) << 4; | |
289 | data >>= 8; | |
ba1c16e4 | 290 | COPY_PIXEL(d, rgb_to_pixel32(r, g, b)); |
4fbf5556 PM |
291 | #undef MSB |
292 | #undef LSB | |
293 | width -= 2; | |
294 | src += 4; | |
295 | } | |
296 | } | |
297 | ||
bdd5003a PB |
298 | #undef SWAP_PIXELS |
299 | #undef NAME | |
300 | #undef SWAP_WORDS | |
301 | #undef ORDER |