1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30: #if DEPTH == 8
31: # define BPP 1
32: # define PIXEL_TYPE uint8_t
33: #elif DEPTH == 15 || DEPTH == 16
34: # define BPP 2
35: # define PIXEL_TYPE uint16_t
36: #elif DEPTH == 32
37: # define BPP 4
38: # define PIXEL_TYPE uint32_t
39: #else
40: # error unsupport depth
41: #endif
42:
43:
44:
45:
46: static void glue(draw_line2_, DEPTH)(
47: uint8_t *d, const uint8_t *s, int width, const uint16_t *pal)
48: {
49: uint8_t v, r, g, b;
50:
51: do {
52: v = ldub_raw((void *) s);
53: r = (pal[v & 3] >> 4) & 0xf0;
54: g = pal[v & 3] & 0xf0;
55: b = (pal[v & 3] << 4) & 0xf0;
56: ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
57: d += BPP;
58: v >>= 2;
59: r = (pal[v & 3] >> 4) & 0xf0;
60: g = pal[v & 3] & 0xf0;
61: b = (pal[v & 3] << 4) & 0xf0;
62: ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
63: d += BPP;
64: v >>= 2;
65: r = (pal[v & 3] >> 4) & 0xf0;
66: g = pal[v & 3] & 0xf0;
67: b = (pal[v & 3] << 4) & 0xf0;
68: ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
69: d += BPP;
70: v >>= 2;
71: r = (pal[v & 3] >> 4) & 0xf0;
72: g = pal[v & 3] & 0xf0;
73: b = (pal[v & 3] << 4) & 0xf0;
74: ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
75: d += BPP;
76: s ++;
77: width -= 4;
78: } while (width > 0);
79: }
80:
81:
82:
83:
84: static void glue(draw_line4_, DEPTH)(
85: uint8_t *d, const uint8_t *s, int width, const uint16_t *pal)
86: {
87: uint8_t v, r, g, b;
88:
89: do {
90: v = ldub_raw((void *) s);
91: r = (pal[v & 0xf] >> 4) & 0xf0;
92: g = pal[v & 0xf] & 0xf0;
93: b = (pal[v & 0xf] << 4) & 0xf0;
94: ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
95: d += BPP;
96: v >>= 4;
97: r = (pal[v & 0xf] >> 4) & 0xf0;
98: g = pal[v & 0xf] & 0xf0;
99: b = (pal[v & 0xf] << 4) & 0xf0;
100: ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
101: d += BPP;
102: s ++;
103: width -= 2;
104: } while (width > 0);
105: }
106:
107:
108:
109:
110: static void glue(draw_line8_, DEPTH)(
111: uint8_t *d, const uint8_t *s, int width, const uint16_t *pal)
112: {
113: uint8_t v, r, g, b;
114:
115: do {
116: v = ldub_raw((void *) s);
117: r = (pal[v] >> 4) & 0xf0;
118: g = pal[v] & 0xf0;
119: b = (pal[v] << 4) & 0xf0;
120: ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
121: s ++;
122: d += BPP;
123: } while (-- width != 0);
124: }
125:
126:
127:
128:
129: static void glue(draw_line12_, DEPTH)(
130: uint8_t *d, const uint8_t *s, int width, const uint16_t *pal)
131: {
132: uint16_t v;
133: uint8_t r, g, b;
134:
135: do {
136: v = lduw_raw((void *) s);
137: r = (v >> 4) & 0xf0;
138: g = v & 0xf0;
139: b = (v << 4) & 0xf0;
140: ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
141: s += 2;
142: d += BPP;
143: } while (-- width != 0);
144: }
145:
146:
147:
148:
149: static void glue(draw_line16_, DEPTH)(
150: uint8_t *d, const uint8_t *s, int width, const uint16_t *pal)
151: {
152: #if DEPTH == 16 && defined(WORDS_BIGENDIAN) == defined(TARGET_WORDS_BIGENDIAN)
153: memcpy(d, s, width * 2);
154: #else
155: uint16_t v;
156: uint8_t r, g, b;
157:
158: do {
159: v = lduw_raw((void *) s);
160: r = (v >> 8) & 0xf8;
161: g = (v >> 3) & 0xfc;
162: b = (v << 3) & 0xf8;
163: ((PIXEL_TYPE *) d)[0] = glue(rgb_to_pixel, DEPTH)(r, g, b);
164: s += 2;
165: d += BPP;
166: } while (-- width != 0);
167: #endif
168: }
169:
170: #undef DEPTH
171: #undef BPP
172: #undef PIXEL_TYPE