aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2014-09-01 18:44:54 +0000
committerDimitri Sokolyuk <demon@dim13.org>2014-09-01 18:44:54 +0000
commit6569bd48e55e513307581a480a6280940aeaa663 (patch)
tree880c5b82addadbcdb560b0b6e0caf30105cb727a
parentf2736d91627fbbe879b9692d0dc98013a59fe655 (diff)
merge hsv and hsl routines
-rw-r--r--Makefile4
-rw-r--r--Makefile.linux4
-rw-r--r--cms.c (renamed from hsl2rgb.c)51
-rw-r--r--cms.h (renamed from hsl2rgb.h)11
-rw-r--r--hsv2rgb.c35
-rw-r--r--hsv2rgb.h23
-rw-r--r--spectrogram.c10
7 files changed, 64 insertions, 74 deletions
diff --git a/Makefile b/Makefile
index 53584df..d49feb4 100644
--- a/Makefile
+++ b/Makefile
@@ -2,9 +2,9 @@
VERSION=2.0
PROG= spectrogram
-SRCS= spectrogram.c sio.c fft.c hsv2rgb.c
+SRCS= spectrogram.c sio.c fft.c cms.c
BINDIR= /usr/local/bin
-HEADERS=sio.h fft.h hsv2rgb.h
+HEADERS=sio.h fft.h cms.h
LIBS= fftw3 x11
PCCF!= pkg-config --cflags ${LIBS}
PCLA!= pkg-config --libs ${LIBS}
diff --git a/Makefile.linux b/Makefile.linux
index 14b5a14..159ec60 100644
--- a/Makefile.linux
+++ b/Makefile.linux
@@ -1,9 +1,9 @@
# $Id$
PROG= spectrogram
-SRCS= spectrogram.c alsa.c fft.c hsv2rgb.c
+SRCS= spectrogram.c alsa.c fft.c cms.c
BINDIR= /usr/local/bin
-HEADERS=fft.h hsv2rgb.h
+HEADERS=fft.h cms.h
LIBS= fftw3 x11 alsa
PCCF!= pkg-config --cflags ${LIBS}
PCLA!= pkg-config --libs ${LIBS}
diff --git a/hsl2rgb.c b/cms.c
index bf15d42..56dfea5 100644
--- a/hsl2rgb.c
+++ b/cms.c
@@ -14,6 +14,55 @@
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
+
+/*
+ * input: H 0..360, S 0..100, V 0..100
+ * output: R, G, B 0..65535
+ */
+
+#include <stdint.h>
+
+void
+hsv2rgb(unsigned short *r, unsigned short *g, unsigned short *b,
+ double h, double s, double v)
+{
+ double F, M, N, K;
+ int i;
+
+ /* normalize */
+ h /= 360.0;
+ s /= 100.0;
+ l /= 100.0;
+
+ if (s == 0.0) {
+ *r = *g = *b = UINT16_MAX * v;
+ } else {
+ if (h == 1.0)
+ h = 0.0;
+ h *= 6.0;
+ i = (int)h;
+ F = h - i;
+ M = v * (1 - s);
+ N = v * (1 - s * F);
+ K = v * (1 - s * (1 - F));
+
+ /* 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;
+ }
+ }
+}
+
/*
* input: H 0..360, S 0..100, L 0..100
* output: R, G, B 0..65535
@@ -38,7 +87,7 @@ hsl2rgb(unsigned short *r, unsigned short *g, unsigned short *b,
if (v > 0) {
h *= 6.0;
- i = (int) h;
+ i = (int)h;
F = h - i;
M = 2.0 * l - v;
K = M + F * (v - M);
diff --git a/hsl2rgb.h b/cms.h
index 95cc231..cdfa94f 100644
--- a/hsl2rgb.h
+++ b/cms.h
@@ -15,12 +15,17 @@
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
-#ifndef __HSL2RGB_H
-#define __HSL2RGB_H
+#ifndef __CMS_H
+#define __CMS_H
-void hsl2rgb(
+void hsv2rgb(
unsigned short *r, unsigned short *g, unsigned short *b,
double h, double s, double v
);
+void hsl2rgb(
+ unsigned short *r, unsigned short *g, unsigned short *b,
+ double h, double s, double l
+);
+
#endif
diff --git a/hsv2rgb.c b/hsv2rgb.c
deleted file mode 100644
index bd7d7e2..0000000
--- a/hsv2rgb.c
+++ /dev/null
@@ -1,35 +0,0 @@
-/* $Id$ */
-
-#include <math.h>
-
-/* input: h, s, v [0..1]
- * output: r, g, b [0..1]
- */
-void
-hsv2rgb(float *r, float *g, float *b, float h, float s, float v)
-{
- float F, M, N, K;
- int i;
-
- if (s == 0.0) {
- *r = *g = *b = v;
- } else {
- if (h == 1.0)
- h = 0.0;
- h *= 6.0;
- i = floorf(h);
- F = h - i;
- M = v * (1 - s);
- N = v * (1 - s * F);
- K = v * (1 - s * (1 - F));
-
- 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;
- }
- }
-}
diff --git a/hsv2rgb.h b/hsv2rgb.h
deleted file mode 100644
index 1cacf20..0000000
--- a/hsv2rgb.h
+++ /dev/null
@@ -1,23 +0,0 @@
-/* $Id$ */
-/*
- * Copyright (c) 2010 Dimitri Sokolyuk <demon@dim13.org>
- *
- * Permission to use, copy, modify, and distribute this software for any
- * purpose with or without fee is hereby granted, provided that the above
- * copyright notice and this permission notice appear in all copies.
- *
- * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
- * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
- * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
- * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
- * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
- * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
- * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
- */
-
-#ifndef __HSV2RGB_H
-#define __HSV2RGB_H
-
-void hsv2rgb(float *r, float *g, float *b, float h, float s, float v);
-
-#endif
diff --git a/spectrogram.c b/spectrogram.c
index 90ca61a..284d685 100644
--- a/spectrogram.c
+++ b/spectrogram.c
@@ -24,7 +24,6 @@
#include <err.h>
#include <stdio.h>
#include <stdarg.h>
-#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
@@ -33,7 +32,7 @@
#include "sio.h"
#include "fft.h"
-#include "hsv2rgb.h"
+#include "cms.h"
#define HGAP 4
#define VGAP 1
@@ -80,7 +79,6 @@ enum scale { LIN_SCALE, LOG_SCALE };
unsigned long
hsvcolor(Display *d, struct hsv hsv, enum scale scale)
{
- float r, g, b;
int scr = DefaultScreen(d);
Colormap cmap = DefaultColormap(d, scr);
XColor c;
@@ -88,11 +86,7 @@ hsvcolor(Display *d, struct hsv hsv, enum scale scale)
if (scale == LOG_SCALE)
hsv.v = logf(100 * hsv.v + 1) / logf(101);
- hsv2rgb(&r, &g, &b, hsv.h, hsv.s, hsv.v);
-
- c.red = UINT16_MAX * r;
- c.green = UINT16_MAX * g;
- c.blue = UINT16_MAX * b;
+ hsv2rgb(&c.red, &c.green, &c.blue, hsv.h, hsv.s, hsv.v);
c.flags = DoRed|DoGreen|DoBlue;
XAllocColor(d, cmap, &c);