From 60d3f7e3296589e3c712793ef75981e374126bcf Mon Sep 17 00:00:00 2001 From: Dimitri Sokolyuk Date: Mon, 1 Sep 2014 18:22:07 +0000 Subject: add HSL to RGB routine --- hsl2rgb.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 hsl2rgb.c diff --git a/hsl2rgb.c b/hsl2rgb.c new file mode 100644 index 0000000..1c8c124 --- /dev/null +++ b/hsl2rgb.c @@ -0,0 +1,46 @@ +/* $Id$ */ + +/* input: H 0..360, S 0..100, L 0..100 */ +/* output: R, G, B 0..65535 */ + +void +hsl2rgb(unsigned short *r, unsigned short *g, unsigned short *b, + double h, double s, double l) +{ + double v, F, M, mv, K, N; + int i; + + /* normalize */ + h /= 360.0; + s /= 100.0; + l /= 100.0; + + /* default to gray */ + *r = *g = *b = UINT16_MAX * l; + + v = (l <= 0.5) ? (l * (1.0 + s)) : (l + s - l * s); + + if (v > 0) { + h *= 6.0; + i = (int) h; + F = h - i; + M = 2.0 * l - v; + K = M + F * (v - M); + N = v - F * (v - M); + + /* scale up */ + v *= UINT16_MAX; + M *= UINT16_MAX; + K *= UINT16_MAX; + N *= UINT16_MAX; + + switch (i) { + case 0: *r = v; *g = K; *b = M; break; + case 1: *r = N; *g = v; *b = M; break; + case 2: *r = M; *g = v; *b = K; break; + case 3: *r = M; *g = N; *b = v; break; + case 4: *r = K; *g = M; *b = v; break; + case 5: *r = v; *g = M; *b = N; break; + } + } +} -- cgit v1.2.3