From 5559f3ba7ee276dcb57a04fb53fe042e16549d17 Mon Sep 17 00:00:00 2001 From: sghctoma Date: Thu, 22 Oct 2015 22:21:59 +0200 Subject: [PATCH] Made the "ec" command family 24bit-aware. --- libr/cons/pal.c | 52 ++++++++++++++++++++++++++++++------------------- libr/cons/rgb.c | 29 +++++++++++++++++---------- 2 files changed, 51 insertions(+), 30 deletions(-) diff --git a/libr/cons/pal.c b/libr/cons/pal.c index d65cdb73bc..e518eeff57 100644 --- a/libr/cons/pal.c +++ b/libr/cons/pal.c @@ -100,10 +100,11 @@ struct { { NULL, NULL, NULL } }; -static inline ut8 rgbnum (const char ch) { +static inline ut8 rgbnum (const char ch1, const char ch2) { ut8 r = 0; - r_hex_to_byte (&r, ch); - return r*16; + r_hex_to_byte (&r, ch1); + r_hex_to_byte (&r, ch2); + return r; } R_API void r_cons_pal_random() { @@ -116,10 +117,10 @@ R_API void r_cons_pal_random() { k = r_cons_pal_get_i (i); if (!k) break; if (cons->truecolor>0) { - r = r_num_rand (0xf); - g = r_num_rand (0xf); - b = r_num_rand (0xf); - sprintf (val, "rgb:%x%x%x", r, g, b); + r = r_num_rand (0xff); + g = r_num_rand (0xff); + b = r_num_rand (0xff); + sprintf (val, "rgb:%02x%02x%02x", r, g, b); r_cons_pal_set (k, val); } else { char *s = r_cons_color_random_string (0); @@ -151,16 +152,30 @@ R_API char *r_cons_pal_parse(const char *str) { return r_cons_color_random (0); } if (!strncmp (s, "rgb:", 4)) { - r = rgbnum (s[4]); - g = rgbnum (s[5]); - b = rgbnum (s[6]); - r_cons_rgb_str (out, r, g, b, 0); + if (strlen(s) == 7) { + r = rgbnum (s[4], '0'); + g = rgbnum (s[5], '0'); + b = rgbnum (s[6], '0'); + r_cons_rgb_str (out, r, g, b, 0); + } else if (strlen(s) == 10) { + r = rgbnum (s[4], s[5]); + g = rgbnum (s[6], s[7]); + b = rgbnum (s[8], s[9]); + r_cons_rgb_str (out, r, g, b, 0); + } } if (p && !strncmp (p, "rgb:", 4)) { - r = rgbnum (p[4]); - g = rgbnum (p[5]); - b = rgbnum (p[6]); - r_cons_rgb_str (out+strlen (out), r, g, b, 1); + if (strlen(s) == 7) { + r = rgbnum (p[4], '0'); + g = rgbnum (p[5], '0'); + b = rgbnum (p[6], '0'); + r_cons_rgb_str (out, r, g, b, 0); + } else if (strlen(s) == 10) { + r = rgbnum (p[4], p[5]); + g = rgbnum (p[6], p[7]); + b = rgbnum (p[8], p[9]); + r_cons_rgb_str (out, r, g, b, 0); + } } for (i=0; colors[i].name; i++) { if (!strcmp (s, colors[i].name)) @@ -346,11 +361,8 @@ R_API void r_cons_pal_list (int rad) { r_cons_rgb_parse (*color, &r, &g, &b, NULL); rgbstr[0] = 0; r_cons_rgb_str (rgbstr, r, g, b, 0); - r >>= 4; - g >>= 4; - b >>= 4; - r_cons_printf ("ec %s rgb:%x%x%x\n", - keys[i].name, r&0xf, g&0xf, b&0xf); + r_cons_printf ("ec %s rgb:%02x%02x%02x\n", + keys[i].name, r, g, b); break; default: r_cons_printf (" %s##"Color_RESET" %s\n", *color, keys[i].name); diff --git a/libr/cons/rgb.c b/libr/cons/rgb.c index fc430fccf7..e346dae57d 100644 --- a/libr/cons/rgb.c +++ b/libr/cons/rgb.c @@ -37,16 +37,22 @@ static void init_color_table() { } } -static int gs (int rgb) { - return 232 + (double)rgb/(255/24.1); +static int lookup_rgb (int r, int g, int b) { + int i; + + int color = (r << 16) + (g << 8) + b; + for (i = 0; i < 256; ++i) + if (color_table[i] == color) return i; + + return -1; } -static int rgb(int r, int g, int b) { +static int approximate_rgb (int r, int g, int b) { const double k = (256.0/6.0); int grey = 0; if (r > 0 && r < 255 && r == g && r == b) grey = 1; if (grey > 0) { - return gs(r); + return 232 + (double)r/(255/24.1); } else { r = R_DIM (r/k, 0, 6); g = R_DIM (g/k, 0, 6); @@ -55,6 +61,12 @@ static int rgb(int r, int g, int b) { } } +static int rgb (int r, int g, int b) { + int c = lookup_rgb(r, g, b); + if (c == -1) return approximate_rgb(r, g, b); + else return c; +} + static void unrgb(int color, int *r, int *g, int *b) { if (color_table[255] == 0) init_color_table(); int rgb = color_table[color]; @@ -132,18 +144,15 @@ R_API int r_cons_rgb_parse (const char *p, ut8 *r, ut8 *g, ut8 *b, int *is_bg) { } R_API char *r_cons_rgb_str (char *outstr, ut8 r, ut8 g, ut8 b, int is_bg) { - int k, fgbg = is_bg? 48: 38; - k = (r == g && g == b)? gs (r): rgb (r, g, b); - //k = rgb (r, g, b); + int fgbg = is_bg? 48: 38; if (!outstr) outstr = malloc (32); switch (r_cons_singleton()->truecolor) { case 1: // 256 color palette - sprintf (outstr, "\x1b[%d;5;%dm", fgbg, k); + sprintf (outstr, "\x1b[%d;5;%dm", fgbg, rgb(r, g, b)); break; case 2: // 16M - xterm only - sprintf (outstr, "\x1b[%d;2;%d;%d;%dm", fgbg, - r&0xff, g&0xff, b&0xff); + sprintf (outstr, "\x1b[%d;2;%d;%d;%dm", fgbg, r, g, b); break; case 0: // ansi 16 colors default: