00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012 # define SKIP_PIXEL(to) to += deststep
00013 #if BITS == 8
00014 # define COPY_PIXEL(to, from) *to = from; SKIP_PIXEL(to)
00015 #elif BITS == 15 || BITS == 16
00016 # define COPY_PIXEL(to, from) *(uint16_t *) to = from; SKIP_PIXEL(to)
00017 #elif BITS == 24
00018 # define COPY_PIXEL(to, from) \
00019 *(uint16_t *) to = from; *(to + 2) = (from) >> 16; SKIP_PIXEL(to)
00020 #elif BITS == 32
00021 # define COPY_PIXEL(to, from) *(uint32_t *) to = from; SKIP_PIXEL(to)
00022 #else
00023 # error unknown bit depth
00024 #endif
00025
00026 #ifdef WORDS_BIGENDIAN
00027 # define SWAP_WORDS 1
00028 #endif
00029
00030 #define FN_2(x) FN(x + 1) FN(x)
00031 #define FN_4(x) FN_2(x + 2) FN_2(x)
00032
00033 static void glue(pxa2xx_draw_line2_, BITS)(uint32_t *palette,
00034 uint8_t *dest, const uint8_t *src, int width, int deststep)
00035 {
00036 uint32_t data;
00037 while (width > 0) {
00038 data = *(uint32_t *) src;
00039 #define FN(x) COPY_PIXEL(dest, palette[(data >> ((x) * 2)) & 3]);
00040 #ifdef SWAP_WORDS
00041 FN_4(12)
00042 FN_4(8)
00043 FN_4(4)
00044 FN_4(0)
00045 #else
00046 FN_4(0)
00047 FN_4(4)
00048 FN_4(8)
00049 FN_4(12)
00050 #endif
00051 #undef FN
00052 width -= 16;
00053 src += 4;
00054 }
00055 }
00056
00057 static void glue(pxa2xx_draw_line4_, BITS)(uint32_t *palette,
00058 uint8_t *dest, const uint8_t *src, int width, int deststep)
00059 {
00060 uint32_t data;
00061 while (width > 0) {
00062 data = *(uint32_t *) src;
00063 #define FN(x) COPY_PIXEL(dest, palette[(data >> ((x) * 4)) & 0xf]);
00064 #ifdef SWAP_WORDS
00065 FN_2(6)
00066 FN_2(4)
00067 FN_2(2)
00068 FN_2(0)
00069 #else
00070 FN_2(0)
00071 FN_2(2)
00072 FN_2(4)
00073 FN_2(6)
00074 #endif
00075 #undef FN
00076 width -= 8;
00077 src += 4;
00078 }
00079 }
00080
00081 static void glue(pxa2xx_draw_line8_, BITS)(uint32_t *palette,
00082 uint8_t *dest, const uint8_t *src, int width, int deststep)
00083 {
00084 uint32_t data;
00085 while (width > 0) {
00086 data = *(uint32_t *) src;
00087 #define FN(x) COPY_PIXEL(dest, palette[(data >> (x)) & 0xff]);
00088 #ifdef SWAP_WORDS
00089 FN(24)
00090 FN(16)
00091 FN(8)
00092 FN(0)
00093 #else
00094 FN(0)
00095 FN(8)
00096 FN(16)
00097 FN(24)
00098 #endif
00099 #undef FN
00100 width -= 4;
00101 src += 4;
00102 }
00103 }
00104
00105 static void glue(pxa2xx_draw_line16_, BITS)(uint32_t *palette,
00106 uint8_t *dest, const uint8_t *src, int width, int deststep)
00107 {
00108 uint32_t data;
00109 unsigned int r, g, b;
00110 while (width > 0) {
00111 data = *(uint32_t *) src;
00112 #ifdef SWAP_WORDS
00113 data = bswap32(data);
00114 #endif
00115 b = (data & 0x1f) << 3;
00116 data >>= 5;
00117 g = (data & 0x3f) << 2;
00118 data >>= 6;
00119 r = (data & 0x1f) << 3;
00120 data >>= 5;
00121 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
00122 b = (data & 0x1f) << 3;
00123 data >>= 5;
00124 g = (data & 0x3f) << 2;
00125 data >>= 6;
00126 r = (data & 0x1f) << 3;
00127 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
00128 width -= 2;
00129 src += 4;
00130 }
00131 }
00132
00133 static void glue(pxa2xx_draw_line16t_, BITS)(uint32_t *palette,
00134 uint8_t *dest, const uint8_t *src, int width, int deststep)
00135 {
00136 uint32_t data;
00137 unsigned int r, g, b;
00138 while (width > 0) {
00139 data = *(uint32_t *) src;
00140 #ifdef SWAP_WORDS
00141 data = bswap32(data);
00142 #endif
00143 b = (data & 0x1f) << 3;
00144 data >>= 5;
00145 g = (data & 0x1f) << 3;
00146 data >>= 5;
00147 r = (data & 0x1f) << 3;
00148 data >>= 5;
00149 if (data & 1)
00150 SKIP_PIXEL(dest);
00151 else
00152 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
00153 data >>= 1;
00154 b = (data & 0x1f) << 3;
00155 data >>= 5;
00156 g = (data & 0x1f) << 3;
00157 data >>= 5;
00158 r = (data & 0x1f) << 3;
00159 data >>= 5;
00160 if (data & 1)
00161 SKIP_PIXEL(dest);
00162 else
00163 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
00164 width -= 2;
00165 src += 4;
00166 }
00167 }
00168
00169 static void glue(pxa2xx_draw_line18_, BITS)(uint32_t *palette,
00170 uint8_t *dest, const uint8_t *src, int width, int deststep)
00171 {
00172 uint32_t data;
00173 unsigned int r, g, b;
00174 while (width > 0) {
00175 data = *(uint32_t *) src;
00176 #ifdef SWAP_WORDS
00177 data = bswap32(data);
00178 #endif
00179 b = (data & 0x3f) << 2;
00180 data >>= 6;
00181 g = (data & 0x3f) << 2;
00182 data >>= 6;
00183 r = (data & 0x3f) << 2;
00184 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
00185 width -= 1;
00186 src += 4;
00187 }
00188 }
00189
00190
00191 static void glue(pxa2xx_draw_line18p_, BITS)(uint32_t *palette,
00192 uint8_t *dest, const uint8_t *src, int width, int deststep)
00193 {
00194 uint32_t data[3];
00195 unsigned int r, g, b;
00196 while (width > 0) {
00197 data[0] = *(uint32_t *) src;
00198 src += 4;
00199 data[1] = *(uint32_t *) src;
00200 src += 4;
00201 data[2] = *(uint32_t *) src;
00202 src += 4;
00203 #ifdef SWAP_WORDS
00204 data[0] = bswap32(data[0]);
00205 data[1] = bswap32(data[1]);
00206 data[2] = bswap32(data[2]);
00207 #endif
00208 b = (data[0] & 0x3f) << 2;
00209 data[0] >>= 6;
00210 g = (data[0] & 0x3f) << 2;
00211 data[0] >>= 6;
00212 r = (data[0] & 0x3f) << 2;
00213 data[0] >>= 12;
00214 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
00215 b = (data[0] & 0x3f) << 2;
00216 data[0] >>= 6;
00217 g = ((data[1] & 0xf) << 4) | (data[0] << 2);
00218 data[1] >>= 4;
00219 r = (data[1] & 0x3f) << 2;
00220 data[1] >>= 12;
00221 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
00222 b = (data[1] & 0x3f) << 2;
00223 data[1] >>= 6;
00224 g = (data[1] & 0x3f) << 2;
00225 data[1] >>= 6;
00226 r = ((data[2] & 0x3) << 6) | (data[1] << 2);
00227 data[2] >>= 8;
00228 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
00229 b = (data[2] & 0x3f) << 2;
00230 data[2] >>= 6;
00231 g = (data[2] & 0x3f) << 2;
00232 data[2] >>= 6;
00233 r = data[2] << 2;
00234 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
00235 width -= 4;
00236 }
00237 }
00238
00239 static void glue(pxa2xx_draw_line19_, BITS)(uint32_t *palette,
00240 uint8_t *dest, const uint8_t *src, int width, int deststep)
00241 {
00242 uint32_t data;
00243 unsigned int r, g, b;
00244 while (width > 0) {
00245 data = *(uint32_t *) src;
00246 #ifdef SWAP_WORDS
00247 data = bswap32(data);
00248 #endif
00249 b = (data & 0x3f) << 2;
00250 data >>= 6;
00251 g = (data & 0x3f) << 2;
00252 data >>= 6;
00253 r = (data & 0x3f) << 2;
00254 data >>= 6;
00255 if (data & 1)
00256 SKIP_PIXEL(dest);
00257 else
00258 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
00259 width -= 1;
00260 src += 4;
00261 }
00262 }
00263
00264
00265 static void glue(pxa2xx_draw_line19p_, BITS)(uint32_t *palette,
00266 uint8_t *dest, const uint8_t *src, int width, int deststep)
00267 {
00268 uint32_t data[3];
00269 unsigned int r, g, b;
00270 while (width > 0) {
00271 data[0] = *(uint32_t *) src;
00272 src += 4;
00273 data[1] = *(uint32_t *) src;
00274 src += 4;
00275 data[2] = *(uint32_t *) src;
00276 src += 4;
00277 # ifdef SWAP_WORDS
00278 data[0] = bswap32(data[0]);
00279 data[1] = bswap32(data[1]);
00280 data[2] = bswap32(data[2]);
00281 # endif
00282 b = (data[0] & 0x3f) << 2;
00283 data[0] >>= 6;
00284 g = (data[0] & 0x3f) << 2;
00285 data[0] >>= 6;
00286 r = (data[0] & 0x3f) << 2;
00287 data[0] >>= 6;
00288 if (data[0] & 1)
00289 SKIP_PIXEL(dest);
00290 else
00291 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
00292 data[0] >>= 6;
00293 b = (data[0] & 0x3f) << 2;
00294 data[0] >>= 6;
00295 g = ((data[1] & 0xf) << 4) | (data[0] << 2);
00296 data[1] >>= 4;
00297 r = (data[1] & 0x3f) << 2;
00298 data[1] >>= 6;
00299 if (data[1] & 1)
00300 SKIP_PIXEL(dest);
00301 else
00302 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
00303 data[1] >>= 6;
00304 b = (data[1] & 0x3f) << 2;
00305 data[1] >>= 6;
00306 g = (data[1] & 0x3f) << 2;
00307 data[1] >>= 6;
00308 r = ((data[2] & 0x3) << 6) | (data[1] << 2);
00309 data[2] >>= 2;
00310 if (data[2] & 1)
00311 SKIP_PIXEL(dest);
00312 else
00313 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
00314 data[2] >>= 6;
00315 b = (data[2] & 0x3f) << 2;
00316 data[2] >>= 6;
00317 g = (data[2] & 0x3f) << 2;
00318 data[2] >>= 6;
00319 r = data[2] << 2;
00320 data[2] >>= 6;
00321 if (data[2] & 1)
00322 SKIP_PIXEL(dest);
00323 else
00324 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
00325 width -= 4;
00326 }
00327 }
00328
00329 static void glue(pxa2xx_draw_line24_, BITS)(uint32_t *palette,
00330 uint8_t *dest, const uint8_t *src, int width, int deststep)
00331 {
00332 uint32_t data;
00333 unsigned int r, g, b;
00334 while (width > 0) {
00335 data = *(uint32_t *) src;
00336 #ifdef SWAP_WORDS
00337 data = bswap32(data);
00338 #endif
00339 b = data & 0xff;
00340 data >>= 8;
00341 g = data & 0xff;
00342 data >>= 8;
00343 r = data & 0xff;
00344 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
00345 width -= 1;
00346 src += 4;
00347 }
00348 }
00349
00350 static void glue(pxa2xx_draw_line24t_, BITS)(uint32_t *palette,
00351 uint8_t *dest, const uint8_t *src, int width, int deststep)
00352 {
00353 uint32_t data;
00354 unsigned int r, g, b;
00355 while (width > 0) {
00356 data = *(uint32_t *) src;
00357 #ifdef SWAP_WORDS
00358 data = bswap32(data);
00359 #endif
00360 b = (data & 0x7f) << 1;
00361 data >>= 7;
00362 g = data & 0xff;
00363 data >>= 8;
00364 r = data & 0xff;
00365 data >>= 8;
00366 if (data & 1)
00367 SKIP_PIXEL(dest);
00368 else
00369 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
00370 width -= 1;
00371 src += 4;
00372 }
00373 }
00374
00375 static void glue(pxa2xx_draw_line25_, BITS)(uint32_t *palette,
00376 uint8_t *dest, const uint8_t *src, int width, int deststep)
00377 {
00378 uint32_t data;
00379 unsigned int r, g, b;
00380 while (width > 0) {
00381 data = *(uint32_t *) src;
00382 #ifdef SWAP_WORDS
00383 data = bswap32(data);
00384 #endif
00385 b = data & 0xff;
00386 data >>= 8;
00387 g = data & 0xff;
00388 data >>= 8;
00389 r = data & 0xff;
00390 data >>= 8;
00391 if (data & 1)
00392 SKIP_PIXEL(dest);
00393 else
00394 COPY_PIXEL(dest, glue(rgb_to_pixel, BITS)(r, g, b));
00395 width -= 1;
00396 src += 4;
00397 }
00398 }
00399
00400
00401 static drawfn glue(pxa2xx_draw_fn_, BITS)[16] =
00402 {
00403 [0 ... 0xf] = 0,
00404 [pxa_lcdc_2bpp] = glue(pxa2xx_draw_line2_, BITS),
00405 [pxa_lcdc_4bpp] = glue(pxa2xx_draw_line4_, BITS),
00406 [pxa_lcdc_8bpp] = glue(pxa2xx_draw_line8_, BITS),
00407 [pxa_lcdc_16bpp] = glue(pxa2xx_draw_line16_, BITS),
00408 [pxa_lcdc_18bpp] = glue(pxa2xx_draw_line18_, BITS),
00409 [pxa_lcdc_18pbpp] = glue(pxa2xx_draw_line18p_, BITS),
00410 [pxa_lcdc_24bpp] = glue(pxa2xx_draw_line24_, BITS),
00411 };
00412
00413
00414 static drawfn glue(glue(pxa2xx_draw_fn_, BITS), t)[16] =
00415 {
00416 [0 ... 0xf] = 0,
00417 [pxa_lcdc_4bpp] = glue(pxa2xx_draw_line4_, BITS),
00418 [pxa_lcdc_8bpp] = glue(pxa2xx_draw_line8_, BITS),
00419 [pxa_lcdc_16bpp] = glue(pxa2xx_draw_line16t_, BITS),
00420 [pxa_lcdc_19bpp] = glue(pxa2xx_draw_line19_, BITS),
00421 [pxa_lcdc_19pbpp] = glue(pxa2xx_draw_line19p_, BITS),
00422 [pxa_lcdc_24bpp] = glue(pxa2xx_draw_line24t_, BITS),
00423 [pxa_lcdc_25bpp] = glue(pxa2xx_draw_line25_, BITS),
00424 };
00425
00426 #undef BITS
00427 #undef COPY_PIXEL
00428 #undef SKIP_PIXEL
00429
00430 #ifdef SWAP_WORDS
00431 # undef SWAP_WORDS
00432 #endif