00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #define SKIP_PIXEL(to) to += deststep
00023 #if DEPTH == 8
00024 # define PIXEL_TYPE uint8_t
00025 # define COPY_PIXEL(to, from) *to = from; SKIP_PIXEL(to)
00026 # define COPY_PIXEL1(to, from) *to ++ = from
00027 #elif DEPTH == 15 || DEPTH == 16
00028 # define PIXEL_TYPE uint16_t
00029 # define COPY_PIXEL(to, from) *to = from; SKIP_PIXEL(to)
00030 # define COPY_PIXEL1(to, from) *to ++ = from
00031 #elif DEPTH == 24
00032 # define PIXEL_TYPE uint8_t
00033 # define COPY_PIXEL(to, from) \
00034 to[0] = from; to[1] = (from) >> 8; to[2] = (from) >> 16; SKIP_PIXEL(to)
00035 # define COPY_PIXEL1(to, from) \
00036 *to ++ = from; *to ++ = (from) >> 8; *to ++ = (from) >> 16
00037 #elif DEPTH == 32
00038 # define PIXEL_TYPE uint32_t
00039 # define COPY_PIXEL(to, from) *to = from; SKIP_PIXEL(to)
00040 # define COPY_PIXEL1(to, from) *to ++ = from
00041 #else
00042 # error unknown bit depth
00043 #endif
00044
00045 #ifdef WORDS_BIGENDIAN
00046 # define SWAP_WORDS 1
00047 #endif
00048
00049 static void glue(blizzard_draw_line16_, DEPTH)(PIXEL_TYPE *dest,
00050 const uint16_t *src, unsigned int width)
00051 {
00052 #if !defined(SWAP_WORDS) && DEPTH == 16
00053 memcpy(dest, src, width);
00054 #else
00055 uint16_t data;
00056 unsigned int r, g, b;
00057 const uint16_t *end = (const void *) src + width;
00058 while (src < end) {
00059 data = lduw_raw(src ++);
00060 b = (data & 0x1f) << 3;
00061 data >>= 5;
00062 g = (data & 0x3f) << 2;
00063 data >>= 6;
00064 r = (data & 0x1f) << 3;
00065 data >>= 5;
00066 COPY_PIXEL1(dest, glue(rgb_to_pixel, DEPTH)(r, g, b));
00067 }
00068 #endif
00069 }
00070
00071 static void glue(blizzard_draw_line24mode1_, DEPTH)(PIXEL_TYPE *dest,
00072 const uint8_t *src, unsigned int width)
00073 {
00074
00075
00076 unsigned int r[2], g[2], b[2];
00077 const uint8_t *end = src + width;
00078 while (src < end) {
00079 g[0] = *src ++;
00080 r[0] = *src ++;
00081 r[1] = *src ++;
00082 b[0] = *src ++;
00083 COPY_PIXEL1(dest, glue(rgb_to_pixel, DEPTH)(r[0], g[0], b[0]));
00084 b[1] = *src ++;
00085 g[1] = *src ++;
00086 COPY_PIXEL1(dest, glue(rgb_to_pixel, DEPTH)(r[1], g[1], b[1]));
00087 }
00088 }
00089
00090 static void glue(blizzard_draw_line24mode2_, DEPTH)(PIXEL_TYPE *dest,
00091 const uint8_t *src, unsigned int width)
00092 {
00093 unsigned int r, g, b;
00094 const uint8_t *end = src + width;
00095 while (src < end) {
00096 r = *src ++;
00097 src ++;
00098 b = *src ++;
00099 g = *src ++;
00100 COPY_PIXEL1(dest, glue(rgb_to_pixel, DEPTH)(r, g, b));
00101 }
00102 }
00103
00104
00105 static blizzard_fn_t glue(blizzard_draw_fn_, DEPTH)[0x10] = {
00106 NULL,
00107
00108 (blizzard_fn_t) glue(blizzard_draw_line16_, DEPTH),
00109
00110 (blizzard_fn_t) glue(blizzard_draw_line24mode1_, DEPTH),
00111
00112 (blizzard_fn_t) glue(blizzard_draw_line24mode1_, DEPTH),
00113 NULL, NULL,
00114
00115 (blizzard_fn_t) glue(blizzard_draw_line24mode2_, DEPTH),
00116
00117 (blizzard_fn_t) glue(blizzard_draw_line24mode2_, DEPTH),
00118
00119 NULL,
00120
00121 NULL,
00122 NULL, NULL, NULL, NULL, NULL, NULL,
00123 };
00124
00125
00126 static blizzard_fn_t glue(blizzard_draw_fn_r_, DEPTH)[0x10] = {
00127
00128 [0 ... 0xf] = NULL,
00129 };
00130
00131 #undef DEPTH
00132 #undef SKIP_PIXEL
00133 #undef COPY_PIXEL
00134 #undef COPY_PIXEL1
00135 #undef PIXEL_TYPE
00136
00137 #undef SWAP_WORDS