aboutsummaryrefslogtreecommitdiff
path: root/degesch.c
diff options
context:
space:
mode:
Diffstat (limited to 'degesch.c')
-rw-r--r--degesch.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/degesch.c b/degesch.c
index 3262691..0e70813 100644
--- a/degesch.c
+++ b/degesch.c
@@ -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;