aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2014-09-01 18:22:07 +0000
committerDimitri Sokolyuk <demon@dim13.org>2014-09-01 18:22:07 +0000
commit60d3f7e3296589e3c712793ef75981e374126bcf (patch)
treed92918a10f6acc07ebf7cd86af9bba6f2b6fdac2
parent850c0f4cd77ae94dc66130e6f01351d268f87b9c (diff)
add HSL to RGB routine
-rw-r--r--hsl2rgb.c46
1 files changed, 46 insertions, 0 deletions
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;
+ }
+ }
+}