aboutsummaryrefslogtreecommitdiff
path: root/degesch.c
diff options
context:
space:
mode:
authorPřemysl Janouch <p.janouch@gmail.com>2015-08-10 07:51:03 +0200
committerPřemysl Janouch <p.janouch@gmail.com>2015-08-10 07:53:03 +0200
commit1cc8656368e229e9a63e8fdc8417451f2d955e49 (patch)
tree18636a7bcbb4bac15dadc6f24e3103e5ff144679 /degesch.c
parent4c811128402375945bccd9833f0db6036e882923 (diff)
downloadxK-1cc8656368e229e9a63e8fdc8417451f2d955e49.tar.gz
xK-1cc8656368e229e9a63e8fdc8417451f2d955e49.tar.xz
xK-1cc8656368e229e9a63e8fdc8417451f2d955e49.zip
degesch: precompute the filtered color cube
Diffstat (limited to 'degesch.c')
-rw-r--r--degesch.c56
1 files changed, 31 insertions, 25 deletions
diff --git a/degesch.c b/degesch.c
index 889d989..35dcce0 100644
--- a/degesch.c
+++ b/degesch.c
@@ -1363,6 +1363,9 @@ struct app_context
struct input input; ///< User interface
+ int *nick_palette; ///< A 256-color palette for nicknames
+ size_t nick_palette_len; ///< Number of entries in nick_palette
+
bool awaiting_mirc_escape; ///< Awaiting a mIRC attribute escape
char char_buf[MB_LEN_MAX + 1]; ///< Buffered multibyte char
size_t char_buf_len; ///< How much of an MB char is buffered
@@ -1371,6 +1374,28 @@ struct app_context
}
*g_ctx;
+static int *
+filter_color_cube_for_acceptable_nick_colors (size_t *len)
+{
+ // This is a pure function and we don't use threads, static storage is fine
+ static int table[6 * 6 * 6];
+ size_t len_counter = 0;
+ for (int x = 0; x < 6 * 6 * 6; x++)
+ {
+ int r = x / 36;
+ int g = (x / 6) % 6;
+ int b = (x % 6);
+
+ // Use the luma value of colours within the cube to filter colours that
+ // look okay-ish on terminals with both black and white backgrounds
+ double luma = 0.2126 * r / 6. + 0.7152 * g / 6. + 0.0722 * b / 6.;
+ if (luma >= .3 && luma <= .5)
+ table[len_counter++] = 16 + x;
+ }
+ *len = len_counter;
+ return table;
+}
+
static void
app_context_init (struct app_context *self)
{
@@ -1407,6 +1432,9 @@ app_context_init (struct app_context *self)
free (encoding);
input_init (&self->input);
+
+ self->nick_palette =
+ filter_color_cube_for_acceptable_nick_colors (&self->nick_palette_len);
}
static void
@@ -2467,27 +2495,6 @@ formatter_parse_mirc (struct formatter *self, const char *s)
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-static int *
-filter_color_cube_for_acceptable_nick_colors (size_t *len)
-{
- static int table[6 * 6 * 6];
- size_t len_counter = 0;
- for (int x = 0; x < 6 * 6 * 6; x++)
- {
- int r = x / 36;
- int g = (x / 6) % 6;
- int b = (x % 6);
-
- // Use the luma value of colours within the cube to filter colours that
- // look okay-ish on terminals with both black and white backgrounds
- double luma = 0.2126 * r / 6. + 0.7152 * g / 6. + 0.0722 * b / 6.;
- if (luma >= .3 && luma <= .5)
- table[len_counter++] = 16 + x;
- }
- *len = len_counter;
- return table;
-}
-
static void
formatter_parse_nick (struct formatter *self, char *s)
{
@@ -2499,10 +2506,9 @@ formatter_parse_nick (struct formatter *self, char *s)
if (color == COLOR_BLACK)
color = -1;
- size_t len;
- // TODO: precompute this table
- int *colors = filter_color_cube_for_acceptable_nick_colors (&len);
- color |= colors[siphash_wrapper (nick, strlen (nick)) % len] << 16;
+ // Use a color from the 256-color cube if available
+ color |= self->ctx->nick_palette[siphash_wrapper (nick,
+ strlen (nick)) % self->ctx->nick_palette_len] << 16;
// We always use the default color for ourselves
if (self->s && irc_is_this_us (self->s, nick))