diff options
author | Přemysl Eric Janouch <p@janouch.name> | 2021-06-15 04:35:41 +0200 |
---|---|---|
committer | Přemysl Eric Janouch <p@janouch.name> | 2021-06-15 07:09:23 +0200 |
commit | b4dd0052ffc60fbd642729a3e05bcadbd6edd6e1 (patch) | |
tree | 68676dbb46fc9d1bb1e214ea9116f6ecaca8754b /degesch.c | |
parent | e3c47c33fa3a1fb9412198413962ac35f4483240 (diff) | |
download | xK-b4dd0052ffc60fbd642729a3e05bcadbd6edd6e1.tar.gz xK-b4dd0052ffc60fbd642729a3e05bcadbd6edd6e1.tar.xz xK-b4dd0052ffc60fbd642729a3e05bcadbd6edd6e1.zip |
degesch: pick colours based on relative luminance
Replaces the inaccurate Rec. 709 luma we used to use before.
This is the first feature here that requires libm, which doesn't
seem to be a particularly great sacrifice.
Moreover, I've rectified that the input isn't linear in sRGB,
and then was even normalized wrong for the luma formula.
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; |