00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030 #if DEPTH == 8
00031 # define BPP 1
00032 # define PIXEL_TYPE uint8_t
00033 #elif DEPTH == 15 || DEPTH == 16
00034 # define BPP 2
00035 # define PIXEL_TYPE uint16_t
00036 #elif DEPTH == 32
00037 # define BPP 4
00038 # define PIXEL_TYPE uint32_t
00039 #else
00040 # error unsupport depth
00041 #endif
00042
00043
00044
00045
00046 static void glue(draw_line2_, DEPTH)(
00047 uint8_t *d, const uint8_t *s, int width, const uint16_t *pal)
00048 {
00049 uint8_t v, r, g, b;
00050
00051 do {
00052 v = ldub_raw((void *) s);
00053 r = (pal[v & 3] >> 4) & 0xf0;
00054 g = pal[v & 3] & 0xf0;
00055 b = (pal[v & 3] << 4) & 0xf0;
00056 ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
00057 d += BPP;
00058 v >>= 2;
00059 r = (pal[v & 3] >> 4) & 0xf0;
00060 g = pal[v & 3] & 0xf0;
00061 b = (pal[v & 3] << 4) & 0xf0;
00062 ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
00063 d += BPP;
00064 v >>= 2;
00065 r = (pal[v & 3] >> 4) & 0xf0;
00066 g = pal[v & 3] & 0xf0;
00067 b = (pal[v & 3] << 4) & 0xf0;
00068 ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
00069 d += BPP;
00070 v >>= 2;
00071 r = (pal[v & 3] >> 4) & 0xf0;
00072 g = pal[v & 3] & 0xf0;
00073 b = (pal[v & 3] << 4) & 0xf0;
00074 ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
00075 d += BPP;
00076 s ++;
00077 width -= 4;
00078 } while (width > 0);
00079 }
00080
00081
00082
00083
00084 static void glue(draw_line4_, DEPTH)(
00085 uint8_t *d, const uint8_t *s, int width, const uint16_t *pal)
00086 {
00087 uint8_t v, r, g, b;
00088
00089 do {
00090 v = ldub_raw((void *) s);
00091 r = (pal[v & 0xf] >> 4) & 0xf0;
00092 g = pal[v & 0xf] & 0xf0;
00093 b = (pal[v & 0xf] << 4) & 0xf0;
00094 ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
00095 d += BPP;
00096 v >>= 4;
00097 r = (pal[v & 0xf] >> 4) & 0xf0;
00098 g = pal[v & 0xf] & 0xf0;
00099 b = (pal[v & 0xf] << 4) & 0xf0;
00100 ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
00101 d += BPP;
00102 s ++;
00103 width -= 2;
00104 } while (width > 0);
00105 }
00106
00107
00108
00109
00110 static void glue(draw_line8_, DEPTH)(
00111 uint8_t *d, const uint8_t *s, int width, const uint16_t *pal)
00112 {
00113 uint8_t v, r, g, b;
00114
00115 do {
00116 v = ldub_raw((void *) s);
00117 r = (pal[v] >> 4) & 0xf0;
00118 g = pal[v] & 0xf0;
00119 b = (pal[v] << 4) & 0xf0;
00120 ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
00121 s ++;
00122 d += BPP;
00123 } while (-- width != 0);
00124 }
00125
00126
00127
00128
00129 static void glue(draw_line12_, DEPTH)(
00130 uint8_t *d, const uint8_t *s, int width, const uint16_t *pal)
00131 {
00132 uint16_t v;
00133 uint8_t r, g, b;
00134
00135 do {
00136 v = lduw_raw((void *) s);
00137 r = (v >> 4) & 0xf0;
00138 g = v & 0xf0;
00139 b = (v << 4) & 0xf0;
00140 ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
00141 s += 2;
00142 d += BPP;
00143 } while (-- width != 0);
00144 }
00145
00146
00147
00148
00149 static void glue(draw_line16_, DEPTH)(
00150 uint8_t *d, const uint8_t *s, int width, const uint16_t *pal)
00151 {
00152 #if DEPTH == 16 && defined(WORDS_BIGENDIAN) == defined(TARGET_WORDS_BIGENDIAN)
00153 memcpy(d, s, width * 2);
00154 #else
00155 uint16_t v;
00156 uint8_t r, g, b;
00157
00158 do {
00159 v = lduw_raw((void *) s);
00160 r = (v >> 8) & 0xf8;
00161 g = (v >> 3) & 0xfc;
00162 b = (v << 3) & 0xf8;
00163 ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
00164 s += 2;
00165 d += BPP;
00166 } while (-- width != 0);
00167 #endif
00168 }
00169
00170 #undef DEPTH
00171 #undef BPP
00172 #undef PIXEL_TYPE