|
|
1.1 ! root 1: /* ! 2: * Intel XScale PXA255/270 LCDC emulation. ! 3: * ! 4: * Copyright (c) 2006 Openedhand Ltd. ! 5: * Written by Andrzej Zaborowski <[email protected]> ! 6: * ! 7: * This code is licensed under the GPLv2. ! 8: * ! 9: * Framebuffer format conversion routines. ! 10: */ ! 11: ! 12: # define SKIP_PIXEL(to) to += deststep ! 13: #if BITS == 8 ! 14: # define COPY_PIXEL(to, from) *to = from; SKIP_PIXEL(to) ! 15: #elif BITS == 15 || BITS == 16 ! 16: # define COPY_PIXEL(to, from) *(uint16_t *) to = from; SKIP_PIXEL(to) ! 17: #elif BITS == 24 ! 18: # define COPY_PIXEL(to, from) \ ! 19: *(uint16_t *) to = from; *(to + 2) = (from) >> 16; SKIP_PIXEL(to) ! 20: #elif BITS == 32 ! 21: # define COPY_PIXEL(to, from) *(uint32_t *) to = from; SKIP_PIXEL(to) ! 22: #else ! 23: # error unknown bit depth ! 24: #endif ! 25: ! 26: #ifdef WORDS_BIGENDIAN ! 27: # define SWAP_WORDS 1 ! 28: #endif ! 29: ! 30: #define FN_2(x) FN(x + 1) FN(x) ! 31: #define FN_4(x) FN_2(x + 2) FN_2(x) ! 32: ! 33: static void glue(pxa2xx_draw_line2_, BITS)(uint32_t *palette, ! 34: uint8_t *dest, const uint8_t *src, int width, int deststep) ! 35: { ! 36: uint32_t data; ! 37: while (width > 0) { ! 38: data = *(uint32_t *) src; ! 39: #define FN(x) COPY_PIXEL(dest, palette[(data >> ((x) * 2)) & 3]); ! 40: #ifdef SWAP_WORDS ! 41: FN_4(12) ! 42: FN_4(8) ! 43: FN_4(4) ! 44: FN_4(0) ! 45: #else ! 46: FN_4(0) ! 47: FN_4(4) ! 48: FN_4(8) ! 49: FN_4(12) ! 50: #endif ! 51: #undef FN ! 52: width -= 16; ! 53: src += 4; ! 54: } ! 55: } ! 56: ! 57: static void glue(pxa2xx_draw_line4_, BITS)(uint32_t *palette, ! 58: uint8_t *dest, const uint8_t *src, int width, int deststep) ! 59: { ! 60: uint32_t data; ! 61: while (width > 0) { ! 62: data = *(uint32_t *) src; ! 63: #define FN(x) COPY_PIXEL(dest, palette[(data >> ((x) * 4)) & 0xf]); ! 64: #ifdef SWAP_WORDS ! 65: FN_2(6) ! 66: FN_2(4) ! 67: FN_2(2) ! 68: FN_2(0) ! 69: #else ! 70: FN_2(0) ! 71: FN_2(2) ! 72: FN_2(4) ! 73: FN_2(6) ! 74: #endif ! 75: #undef FN ! 76: width -= 8; ! 77: src += 4; ! 78: } ! 79: } ! 80: ! 81: static void glue(pxa2xx_draw_line8_, BITS)(uint32_t *palette, ! 82: uint8_t *dest, const uint8_t *src, int width, int deststep) ! 83: { ! 84: uint32_t data; ! 85: while (width > 0) { ! 86: data = *(uint32_t *) src; ! 87: #define FN(x) COPY_PIXEL(dest, palette[(data >> (x)) & 0xff]); ! 88: #ifdef SWAP_WORDS ! 89: FN(24) ! 90: FN(16) ! 91: FN(8) ! 92: FN(0) ! 93: #else ! 94: FN(0) ! 95: FN(8) ! 96: FN(16) ! 97: FN(24) ! 98: #endif ! 99: #undef FN ! 100: width -= 4; ! 101: src += 4; ! 102: } ! 103: } ! 104: ! 105: static void glue(pxa2xx_draw_line16_, BITS)(uint32_t *palette, ! 106: uint8_t *dest, const uint8_t *src, int width, int deststep) ! 107: { ! 108: uint32_t data; ! 109: unsigned int r, g, b; ! 110: while (width > 0) { ! 111: data = *(uint32_t *) src; ! 112: #ifdef SWAP_WORDS ! 113: data = bswap32(data); ! 114: #endif ! 115: b = (data & 0x1f) << 3; ! 116: data >>= 5; ! 117: g = (data & 0x3f) << 2; ! 118: data >>= 6; ! 119: r = (data & 0x1f) << 3; ! 120: data >>= 5; ! 121: COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b)); ! 122: b = (data & 0x1f) << 3; ! 123: data >>= 5; ! 124: g = (data & 0x3f) << 2; ! 125: data >>= 6; ! 126: r = (data & 0x1f) << 3; ! 127: COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b)); ! 128: width -= 2; ! 129: src += 4; ! 130: } ! 131: } ! 132: ! 133: static void glue(pxa2xx_draw_line16t_, BITS)(uint32_t *palette, ! 134: uint8_t *dest, const uint8_t *src, int width, int deststep) ! 135: { ! 136: uint32_t data; ! 137: unsigned int r, g, b; ! 138: while (width > 0) { ! 139: data = *(uint32_t *) src; ! 140: #ifdef SWAP_WORDS ! 141: data = bswap32(data); ! 142: #endif ! 143: b = (data & 0x1f) << 3; ! 144: data >>= 5; ! 145: g = (data & 0x1f) << 3; ! 146: data >>= 5; ! 147: r = (data & 0x1f) << 3; ! 148: data >>= 5; ! 149: if (data & 1) ! 150: SKIP_PIXEL(dest); ! 151: else ! 152: COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b)); ! 153: data >>= 1; ! 154: b = (data & 0x1f) << 3; ! 155: data >>= 5; ! 156: g = (data & 0x1f) << 3; ! 157: data >>= 5; ! 158: r = (data & 0x1f) << 3; ! 159: if (data & 1) ! 160: SKIP_PIXEL(dest); ! 161: else ! 162: COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b)); ! 163: width -= 2; ! 164: src += 4; ! 165: } ! 166: } ! 167: ! 168: static void glue(pxa2xx_draw_line18_, BITS)(uint32_t *palette, ! 169: uint8_t *dest, const uint8_t *src, int width, int deststep) ! 170: { ! 171: uint32_t data; ! 172: unsigned int r, g, b; ! 173: while (width > 0) { ! 174: data = *(uint32_t *) src; ! 175: #ifdef SWAP_WORDS ! 176: data = bswap32(data); ! 177: #endif ! 178: b = (data & 0x3f) << 2; ! 179: data >>= 6; ! 180: g = (data & 0x3f) << 2; ! 181: data >>= 6; ! 182: r = (data & 0x3f) << 2; ! 183: COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b)); ! 184: width -= 1; ! 185: src += 4; ! 186: } ! 187: } ! 188: ! 189: /* The wicked packed format */ ! 190: static void glue(pxa2xx_draw_line18p_, BITS)(uint32_t *palette, ! 191: uint8_t *dest, const uint8_t *src, int width, int deststep) ! 192: { ! 193: uint32_t data[3]; ! 194: unsigned int r, g, b; ! 195: while (width > 0) { ! 196: data[0] = *(uint32_t *) src; ! 197: src += 4; ! 198: data[1] = *(uint32_t *) src; ! 199: src += 4; ! 200: data[2] = *(uint32_t *) src; ! 201: src += 4; ! 202: #ifdef SWAP_WORDS ! 203: data[0] = bswap32(data[0]); ! 204: data[1] = bswap32(data[1]); ! 205: data[2] = bswap32(data[2]); ! 206: #endif ! 207: b = (data[0] & 0x3f) << 2; ! 208: data[0] >>= 6; ! 209: g = (data[0] & 0x3f) << 2; ! 210: data[0] >>= 6; ! 211: r = (data[0] & 0x3f) << 2; ! 212: data[0] >>= 12; ! 213: COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b)); ! 214: b = (data[0] & 0x3f) << 2; ! 215: data[0] >>= 6; ! 216: g = ((data[1] & 0xf) << 4) | (data[0] << 2); ! 217: data[1] >>= 4; ! 218: r = (data[1] & 0x3f) << 2; ! 219: data[1] >>= 12; ! 220: COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b)); ! 221: b = (data[1] & 0x3f) << 2; ! 222: data[1] >>= 6; ! 223: g = (data[1] & 0x3f) << 2; ! 224: data[1] >>= 6; ! 225: r = ((data[2] & 0x3) << 6) | (data[1] << 2); ! 226: data[2] >>= 8; ! 227: COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b)); ! 228: b = (data[2] & 0x3f) << 2; ! 229: data[2] >>= 6; ! 230: g = (data[2] & 0x3f) << 2; ! 231: data[2] >>= 6; ! 232: r = data[2] << 2; ! 233: COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b)); ! 234: width -= 4; ! 235: } ! 236: } ! 237: ! 238: static void glue(pxa2xx_draw_line19_, BITS)(uint32_t *palette, ! 239: uint8_t *dest, const uint8_t *src, int width, int deststep) ! 240: { ! 241: uint32_t data; ! 242: unsigned int r, g, b; ! 243: while (width > 0) { ! 244: data = *(uint32_t *) src; ! 245: #ifdef SWAP_WORDS ! 246: data = bswap32(data); ! 247: #endif ! 248: b = (data & 0x3f) << 2; ! 249: data >>= 6; ! 250: g = (data & 0x3f) << 2; ! 251: data >>= 6; ! 252: r = (data & 0x3f) << 2; ! 253: data >>= 6; ! 254: if (data & 1) ! 255: SKIP_PIXEL(dest); ! 256: else ! 257: COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b)); ! 258: width -= 1; ! 259: src += 4; ! 260: } ! 261: } ! 262: ! 263: /* The wicked packed format */ ! 264: static void glue(pxa2xx_draw_line19p_, BITS)(uint32_t *palette, ! 265: uint8_t *dest, const uint8_t *src, int width, int deststep) ! 266: { ! 267: uint32_t data[3]; ! 268: unsigned int r, g, b; ! 269: while (width > 0) { ! 270: data[0] = *(uint32_t *) src; ! 271: src += 4; ! 272: data[1] = *(uint32_t *) src; ! 273: src += 4; ! 274: data[2] = *(uint32_t *) src; ! 275: src += 4; ! 276: # ifdef SWAP_WORDS ! 277: data[0] = bswap32(data[0]); ! 278: data[1] = bswap32(data[1]); ! 279: data[2] = bswap32(data[2]); ! 280: # endif ! 281: b = (data[0] & 0x3f) << 2; ! 282: data[0] >>= 6; ! 283: g = (data[0] & 0x3f) << 2; ! 284: data[0] >>= 6; ! 285: r = (data[0] & 0x3f) << 2; ! 286: data[0] >>= 6; ! 287: if (data[0] & 1) ! 288: SKIP_PIXEL(dest); ! 289: else ! 290: COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b)); ! 291: data[0] >>= 6; ! 292: b = (data[0] & 0x3f) << 2; ! 293: data[0] >>= 6; ! 294: g = ((data[1] & 0xf) << 4) | (data[0] << 2); ! 295: data[1] >>= 4; ! 296: r = (data[1] & 0x3f) << 2; ! 297: data[1] >>= 6; ! 298: if (data[1] & 1) ! 299: SKIP_PIXEL(dest); ! 300: else ! 301: COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b)); ! 302: data[1] >>= 6; ! 303: b = (data[1] & 0x3f) << 2; ! 304: data[1] >>= 6; ! 305: g = (data[1] & 0x3f) << 2; ! 306: data[1] >>= 6; ! 307: r = ((data[2] & 0x3) << 6) | (data[1] << 2); ! 308: data[2] >>= 2; ! 309: if (data[2] & 1) ! 310: SKIP_PIXEL(dest); ! 311: else ! 312: COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b)); ! 313: data[2] >>= 6; ! 314: b = (data[2] & 0x3f) << 2; ! 315: data[2] >>= 6; ! 316: g = (data[2] & 0x3f) << 2; ! 317: data[2] >>= 6; ! 318: r = data[2] << 2; ! 319: data[2] >>= 6; ! 320: if (data[2] & 1) ! 321: SKIP_PIXEL(dest); ! 322: else ! 323: COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b)); ! 324: width -= 4; ! 325: } ! 326: } ! 327: ! 328: static void glue(pxa2xx_draw_line24_, BITS)(uint32_t *palette, ! 329: uint8_t *dest, const uint8_t *src, int width, int deststep) ! 330: { ! 331: uint32_t data; ! 332: unsigned int r, g, b; ! 333: while (width > 0) { ! 334: data = *(uint32_t *) src; ! 335: #ifdef SWAP_WORDS ! 336: data = bswap32(data); ! 337: #endif ! 338: b = data & 0xff; ! 339: data >>= 8; ! 340: g = data & 0xff; ! 341: data >>= 8; ! 342: r = data & 0xff; ! 343: COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b)); ! 344: width -= 1; ! 345: src += 4; ! 346: } ! 347: } ! 348: ! 349: static void glue(pxa2xx_draw_line24t_, BITS)(uint32_t *palette, ! 350: uint8_t *dest, const uint8_t *src, int width, int deststep) ! 351: { ! 352: uint32_t data; ! 353: unsigned int r, g, b; ! 354: while (width > 0) { ! 355: data = *(uint32_t *) src; ! 356: #ifdef SWAP_WORDS ! 357: data = bswap32(data); ! 358: #endif ! 359: b = (data & 0x7f) << 1; ! 360: data >>= 7; ! 361: g = data & 0xff; ! 362: data >>= 8; ! 363: r = data & 0xff; ! 364: data >>= 8; ! 365: if (data & 1) ! 366: SKIP_PIXEL(dest); ! 367: else ! 368: COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b)); ! 369: width -= 1; ! 370: src += 4; ! 371: } ! 372: } ! 373: ! 374: static void glue(pxa2xx_draw_line25_, BITS)(uint32_t *palette, ! 375: uint8_t *dest, const uint8_t *src, int width, int deststep) ! 376: { ! 377: uint32_t data; ! 378: unsigned int r, g, b; ! 379: while (width > 0) { ! 380: data = *(uint32_t *) src; ! 381: #ifdef SWAP_WORDS ! 382: data = bswap32(data); ! 383: #endif ! 384: b = data & 0xff; ! 385: data >>= 8; ! 386: g = data & 0xff; ! 387: data >>= 8; ! 388: r = data & 0xff; ! 389: data >>= 8; ! 390: if (data & 1) ! 391: SKIP_PIXEL(dest); ! 392: else ! 393: COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b)); ! 394: width -= 1; ! 395: src += 4; ! 396: } ! 397: } ! 398: ! 399: /* Overlay planes disabled, no transparency */ ! 400: static drawfn glue(pxa2xx_draw_fn_, BITS)[16] = ! 401: { ! 402: [0 ... 0xf] = 0, ! 403: [pxa_lcdc_2bpp] = glue(pxa2xx_draw_line2_, BITS), ! 404: [pxa_lcdc_4bpp] = glue(pxa2xx_draw_line4_, BITS), ! 405: [pxa_lcdc_8bpp] = glue(pxa2xx_draw_line8_, BITS), ! 406: [pxa_lcdc_16bpp] = glue(pxa2xx_draw_line16_, BITS), ! 407: [pxa_lcdc_18bpp] = glue(pxa2xx_draw_line18_, BITS), ! 408: [pxa_lcdc_18pbpp] = glue(pxa2xx_draw_line18p_, BITS), ! 409: [pxa_lcdc_24bpp] = glue(pxa2xx_draw_line24_, BITS), ! 410: }; ! 411: ! 412: /* Overlay planes enabled, transparency used */ ! 413: static drawfn glue(glue(pxa2xx_draw_fn_, BITS), t)[16] = ! 414: { ! 415: [0 ... 0xf] = 0, ! 416: [pxa_lcdc_4bpp] = glue(pxa2xx_draw_line4_, BITS), ! 417: [pxa_lcdc_8bpp] = glue(pxa2xx_draw_line8_, BITS), ! 418: [pxa_lcdc_16bpp] = glue(pxa2xx_draw_line16t_, BITS), ! 419: [pxa_lcdc_19bpp] = glue(pxa2xx_draw_line19_, BITS), ! 420: [pxa_lcdc_19pbpp] = glue(pxa2xx_draw_line19p_, BITS), ! 421: [pxa_lcdc_24bpp] = glue(pxa2xx_draw_line24t_, BITS), ! 422: [pxa_lcdc_25bpp] = glue(pxa2xx_draw_line25_, BITS), ! 423: }; ! 424: ! 425: #undef BITS ! 426: #undef COPY_PIXEL ! 427: #undef SKIP_PIXEL ! 428: ! 429: #ifdef SWAP_WORDS ! 430: # undef SWAP_WORDS ! 431: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.