Improve colour_lightness

Clearly document what colour_lightness does.
Fix the blue component value multiplier to be in bounds and correct value
This commit is contained in:
Vincent Sanders 2020-06-29 08:49:12 +01:00
parent b47a897699
commit 49a515c808
1 changed files with 17 additions and 4 deletions

View File

@ -125,12 +125,12 @@ typedef struct plot_font_style {
/* Darken a colour by taking seven eighths of each channel's intensity */
#define half_darken_colour(c1) \
#define half_darken_colour(c1) \
((((7 * (c1 & 0xff00ff)) >> 3) & 0xff00ff) | \
(((7 * (c1 & 0x00ff00)) >> 3) & 0x00ff00))
/* Darken a colour by taking three quarters of each channel's intensity */
#define darken_colour(c1) \
#define darken_colour(c1) \
((((3 * (c1 & 0xff00ff)) >> 2) & 0xff00ff) | \
(((3 * (c1 & 0x00ff00)) >> 2) & 0x00ff00))
@ -164,11 +164,24 @@ typedef struct plot_font_style {
(((((c0 & 0xff00ff) + (c1 & 0xff00ff)) >> 1) & 0xff00ff) | \
((((c0 & 0x00ff00) + (c1 & 0x00ff00)) >> 1) & 0x00ff00))
/* Get the percieved lightness of the supplied colour, c0. */
/**
* Obtain the luminance of a colour according to ITU BT.601
*
* ITU BT.601 formula is
* Y = 0.299 R + 0.587 G + 0.114 B
* actual values are
* Y = 76/255 R + 150/255 G + 29/255 B
* Y = 0.298 R + 0.588 G + 0.113 B
*
* @note if additional performance is required this could be altered to
* Y = 0.375 R + 0.5 G + 0.125 B
* with
* Y = (R << 1 + R + G << 2 + B) >> 3
*/
#define colour_lightness(c0) \
((((c0 & 0x0000ff) * 77) >> 8) + \
(((c0 & 0x00ff00) * 151) >> 16) + \
(((c0 & 0xff0000) * 28) >> 24))
(((c0 & 0xff0000) * 30) >> 24))
/* Choose either black or white, depending on which is nearest to the
* percieved lightness of the supplied colour, c0. */