diff --git a/include/color.h b/include/color.h index 4a83cc24..9be29019 100644 --- a/include/color.h +++ b/include/color.h @@ -8,4 +8,6 @@ extern u_char colortab[4096]; /* Each argument must be in range 0-15. */ u_short ColorTransition(u_short from, u_short to, u_short step); +u_short HsvToRgb(short h, short s, short v); + #endif diff --git a/lib/libgfx/HsvToRgb.c b/lib/libgfx/HsvToRgb.c new file mode 100644 index 00000000..25659ace --- /dev/null +++ b/lib/libgfx/HsvToRgb.c @@ -0,0 +1,58 @@ +#include + +/* Based on https://stackoverflow.com/a/14733008 */ +u_short HsvToRgb(short h, short s, short v) { + short region, remainder, p, q, t; + u_char r, g, b; + + if (s == 0) { + v &= 0xf0; + return (v << 4) | v | (v >> 4); + } + + region = h / 43; + remainder = (h - (region * 43)) * 6; + + p = (v * (short)(255 - s)) >> 8; + q = (v * (short)(255 - ((s * remainder) >> 8))) >> 8; + t = (v * (short)(255 - ((s * (short)(255 - remainder)) >> 8))) >> 8; + + switch (region) { + case 0: + r = v; + g = t; + b = p; + break; + case 1: + r = q; + g = v; + b = p; + break; + case 2: + r = p; + g = v; + b = t; + break; + case 3: + r = p; + g = q; + b = v; + break; + case 4: + r = t; + g = p; + b = v; + break; + default: + r = v; + g = p; + b = q; + break; + } + + r &= 0xf0; + g &= 0xf0; + b &= 0xf0; + + return (r << 4) | g | (b >> 4); +} diff --git a/lib/libgfx/Makefile b/lib/libgfx/Makefile index 4e75d89a..fbb0a8d6 100644 --- a/lib/libgfx/Makefile +++ b/lib/libgfx/Makefile @@ -26,6 +26,7 @@ SOURCES := \ DeleteCopList.c \ DeletePixmap.c \ EndSprite.c \ + HsvToRgb.c \ InitSharedBitmap.c \ InsideArea.c \ LoadPalette.c \