Check tweet length
[rainbowstream.git] / rainbowstream / image.c
1 /*
2 * This source is borrowed from following link
3 * https://github.com/jart/fabulous/blob/master/fabulous/_xterm256.c
4 * I make a slightly change to fit my module here
5 */
6 typedef struct {
7 int r;
8 int g;
9 int b;
10 } rgb_t;
11 int CUBE_STEPS[] = { 0x00, 0x5F, 0x87, 0xAF, 0xD7, 0xFF };
12 rgb_t BASIC16[] =
13 { { 0, 0, 0 }, { 205, 0, 0}, { 0, 205, 0 },
14 { 205, 205, 0 }, { 0, 0, 238}, { 205, 0, 205 },
15 { 0, 205, 205 }, { 229, 229, 229}, { 127, 127, 127 },
16 { 255, 0, 0 }, { 0, 255, 0}, { 255, 255, 0 },
17 { 92, 92, 255 }, { 255, 0, 255}, { 0, 255, 255 },
18 { 255, 255, 255 } };
19 rgb_t COLOR_TABLE[256];
20
21
22 rgb_t ansi_to_rgb(int xcolor)
23 {
24 rgb_t res;
25 if (xcolor < 16) {
26 res = BASIC16[xcolor];
27 } else if (16 <= xcolor && xcolor <= 231) {
28 xcolor -= 16;
29 res.r = CUBE_STEPS[(xcolor / 36) % 6];
30 res.g = CUBE_STEPS[(xcolor / 6) % 6];
31 res.b = CUBE_STEPS[xcolor % 6];
32 } else if (232 <= xcolor && xcolor <= 255) {
33 res.r = res.g = res.b = 8 + (xcolor - 232) * 0x0A;
34 }
35 return res;
36 }
37
38 int init()
39 {
40 int c;
41 for (c = 0; c < 256; c++) {
42 COLOR_TABLE[c] = ansi_to_rgb(c);
43 }
44 return 0;
45 }
46
47 int rgb_to_ansi(int r, int g, int b)
48 {
49 int best_match = 0;
50 int smallest_distance = 1000000000;
51 int c, d;
52 for (c = 16; c < 256; c++) {
53 d = (COLOR_TABLE[c].r - r)*(COLOR_TABLE[c].r - r) +
54 (COLOR_TABLE[c].g - g)*(COLOR_TABLE[c].g - g) +
55 (COLOR_TABLE[c].b - b)*(COLOR_TABLE[c].b - b);
56 if (d < smallest_distance) {
57 smallest_distance = d;
58 best_match = c;
59 }
60 }
61 return best_match;
62 }