pl110_template.h (6624B)
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 licensed under the GNU LGPL 8 * 9 * Framebuffer format conversion routines. 10 */ 11 12#ifndef ORDER 13#error "pl110_template.h is only for inclusion by pl110.c" 14#endif 15 16#if ORDER == 0 17#define NAME glue(lblp_, BORDER) 18#ifdef HOST_WORDS_BIGENDIAN 19#define SWAP_WORDS 1 20#endif 21#elif ORDER == 1 22#define NAME glue(bbbp_, BORDER) 23#ifndef HOST_WORDS_BIGENDIAN 24#define SWAP_WORDS 1 25#endif 26#else 27#define SWAP_PIXELS 1 28#define NAME glue(lbbp_, BORDER) 29#ifdef HOST_WORDS_BIGENDIAN 30#define SWAP_WORDS 1 31#endif 32#endif 33 34#define FN_2(x, y) FN(x, y) FN(x+1, y) 35#define FN_4(x, y) FN_2(x, y) FN_2(x+2, y) 36#define FN_8(y) FN_4(0, y) FN_4(4, y) 37 38static void glue(pl110_draw_line1_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep) 39{ 40 uint32_t *palette = opaque; 41 uint32_t data; 42 while (width > 0) { 43 data = *(uint32_t *)src; 44#ifdef SWAP_PIXELS 45#define FN(x, y) COPY_PIXEL(d, palette[(data >> (y + 7 - (x))) & 1]); 46#else 47#define FN(x, y) COPY_PIXEL(d, palette[(data >> ((x) + y)) & 1]); 48#endif 49#ifdef SWAP_WORDS 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 66static void glue(pl110_draw_line2_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep) 67{ 68 uint32_t *palette = opaque; 69 uint32_t data; 70 while (width > 0) { 71 data = *(uint32_t *)src; 72#ifdef SWAP_PIXELS 73#define FN(x, y) COPY_PIXEL(d, palette[(data >> (y + 6 - (x)*2)) & 3]); 74#else 75#define FN(x, y) COPY_PIXEL(d, palette[(data >> ((x)*2 + y)) & 3]); 76#endif 77#ifdef SWAP_WORDS 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 94static void glue(pl110_draw_line4_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep) 95{ 96 uint32_t *palette = opaque; 97 uint32_t data; 98 while (width > 0) { 99 data = *(uint32_t *)src; 100#ifdef SWAP_PIXELS 101#define FN(x, y) COPY_PIXEL(d, palette[(data >> (y + 4 - (x)*4)) & 0xf]); 102#else 103#define FN(x, y) COPY_PIXEL(d, palette[(data >> ((x)*4 + y)) & 0xf]); 104#endif 105#ifdef SWAP_WORDS 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 122static void glue(pl110_draw_line8_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep) 123{ 124 uint32_t *palette = opaque; 125 uint32_t data; 126 while (width > 0) { 127 data = *(uint32_t *)src; 128#define FN(x) COPY_PIXEL(d, palette[(data >> (x)) & 0xff]); 129#ifdef SWAP_WORDS 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 146static void glue(pl110_draw_line16_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep) 147{ 148 uint32_t data; 149 unsigned int r, g, b; 150 while (width > 0) { 151 data = *(uint32_t *)src; 152#ifdef SWAP_WORDS 153 data = bswap32(data); 154#endif 155#ifdef RGB 156#define LSB r 157#define MSB b 158#else 159#define LSB b 160#define MSB r 161#endif 162#if 0 163 LSB = data & 0x1f; 164 data >>= 5; 165 g = data & 0x3f; 166 data >>= 6; 167 MSB = data & 0x1f; 168 data >>= 5; 169#else 170 LSB = (data & 0x1f) << 3; 171 data >>= 5; 172 g = (data & 0x3f) << 2; 173 data >>= 6; 174 MSB = (data & 0x1f) << 3; 175 data >>= 5; 176#endif 177 COPY_PIXEL(d, rgb_to_pixel32(r, g, b)); 178 LSB = (data & 0x1f) << 3; 179 data >>= 5; 180 g = (data & 0x3f) << 2; 181 data >>= 6; 182 MSB = (data & 0x1f) << 3; 183 data >>= 5; 184 COPY_PIXEL(d, rgb_to_pixel32(r, g, b)); 185#undef MSB 186#undef LSB 187 width -= 2; 188 src += 4; 189 } 190} 191 192static void glue(pl110_draw_line32_,NAME)(void *opaque, uint8_t *d, const uint8_t *src, int width, int deststep) 193{ 194 uint32_t data; 195 unsigned int r, g, b; 196 while (width > 0) { 197 data = *(uint32_t *)src; 198#ifdef RGB 199#define LSB r 200#define MSB b 201#else 202#define LSB b 203#define MSB r 204#endif 205#ifndef SWAP_WORDS 206 LSB = data & 0xff; 207 g = (data >> 8) & 0xff; 208 MSB = (data >> 16) & 0xff; 209#else 210 LSB = (data >> 24) & 0xff; 211 g = (data >> 16) & 0xff; 212 MSB = (data >> 8) & 0xff; 213#endif 214 COPY_PIXEL(d, rgb_to_pixel32(r, g, b)); 215#undef MSB 216#undef LSB 217 width--; 218 src += 4; 219 } 220} 221 222static 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; 245 COPY_PIXEL(d, rgb_to_pixel32(r, g, b)); 246 LSB = (data & 0x1f) << 3; 247 data >>= 5; 248 g = (data & 0x1f) << 3; 249 data >>= 5; 250 MSB = (data & 0x1f) << 3; 251 data >>= 6; 252 COPY_PIXEL(d, rgb_to_pixel32(r, g, b)); 253#undef MSB 254#undef LSB 255 width -= 2; 256 src += 4; 257 } 258} 259 260static 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; 283 COPY_PIXEL(d, rgb_to_pixel32(r, g, b)); 284 LSB = (data & 0xf) << 4; 285 data >>= 4; 286 g = (data & 0xf) << 4; 287 data >>= 4; 288 MSB = (data & 0xf) << 4; 289 data >>= 8; 290 COPY_PIXEL(d, rgb_to_pixel32(r, g, b)); 291#undef MSB 292#undef LSB 293 width -= 2; 294 src += 4; 295 } 296} 297 298#undef SWAP_PIXELS 299#undef NAME 300#undef SWAP_WORDS 301#undef ORDER