Skip to content

Commit 6654e49

Browse files
committed
Add HsvToRgb routine (backported from eed9a67)
1 parent a464886 commit 6654e49

File tree

3 files changed

+61
-0
lines changed

3 files changed

+61
-0
lines changed

include/color.h

+2
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,6 @@ extern u_char colortab[4096];
88
/* Each argument must be in range 0-15. */
99
u_short ColorTransition(u_short from, u_short to, u_short step);
1010

11+
u_short HsvToRgb(short h, short s, short v);
12+
1113
#endif

lib/libgfx/HsvToRgb.c

+58
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
#include <color.h>
2+
3+
/* Based on https://stackoverflow.com/a/14733008 */
4+
u_short HsvToRgb(short h, short s, short v) {
5+
short region, remainder, p, q, t;
6+
u_char r, g, b;
7+
8+
if (s == 0) {
9+
v &= 0xf0;
10+
return (v << 4) | v | (v >> 4);
11+
}
12+
13+
region = h / 43;
14+
remainder = (h - (region * 43)) * 6;
15+
16+
p = (v * (short)(255 - s)) >> 8;
17+
q = (v * (short)(255 - ((s * remainder) >> 8))) >> 8;
18+
t = (v * (short)(255 - ((s * (short)(255 - remainder)) >> 8))) >> 8;
19+
20+
switch (region) {
21+
case 0:
22+
r = v;
23+
g = t;
24+
b = p;
25+
break;
26+
case 1:
27+
r = q;
28+
g = v;
29+
b = p;
30+
break;
31+
case 2:
32+
r = p;
33+
g = v;
34+
b = t;
35+
break;
36+
case 3:
37+
r = p;
38+
g = q;
39+
b = v;
40+
break;
41+
case 4:
42+
r = t;
43+
g = p;
44+
b = v;
45+
break;
46+
default:
47+
r = v;
48+
g = p;
49+
b = q;
50+
break;
51+
}
52+
53+
r &= 0xf0;
54+
g &= 0xf0;
55+
b &= 0xf0;
56+
57+
return (r << 4) | g | (b >> 4);
58+
}

lib/libgfx/Makefile

+1
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ SOURCES := \
2626
DeleteCopList.c \
2727
DeletePixmap.c \
2828
EndSprite.c \
29+
HsvToRgb.c \
2930
InitSharedBitmap.c \
3031
InsideArea.c \
3132
LoadPalette.c \

0 commit comments

Comments
 (0)