diff options
Diffstat (limited to 'degesch.c')
-rw-r--r-- | degesch.c | 19 |
1 files changed, 13 insertions, 6 deletions
@@ -51,6 +51,7 @@ enum #include "common.c" #include "kike-replies.c" +#include <math.h> #include <langinfo.h> #include <locale.h> #include <pwd.h> @@ -2108,17 +2109,23 @@ 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++) + for (int x = 0; x < N_ELEMENTS (table); x++) { - // FIXME this isn't exactly right, the values aren't linear 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) + // The first step is 95/255, the rest are 40/255, + // as an approximation we can double the first step + double linear_R = pow ((r + !!r) / 6., 2.2); + double linear_G = pow ((g + !!g) / 6., 2.2); + double linear_B = pow ((b + !!b) / 6., 2.2); + + // Use the relative luminance of colours within the cube to filter + // colours that look okay-ish on terminals with both black and white + // backgrounds (use the test-nick-colors script to calibrate) + double Y = 0.2126 * linear_R + 0.7152 * linear_G + 0.0722 * linear_B; + if (Y >= .25 && Y <= .4) table[len_counter++] = 16 + x; } *len = len_counter; |