aboutsummaryrefslogtreecommitdiffstats
path: root/src/blackbody.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/blackbody.c')
-rw-r--r--src/blackbody.c41
1 files changed, 11 insertions, 30 deletions
diff --git a/src/blackbody.c b/src/blackbody.c
index 26ea52e..d393686 100644
--- a/src/blackbody.c
+++ b/src/blackbody.c
@@ -22,23 +22,6 @@
/**
- * The highest colour temperature in the table.
- */
-#define HIGHEST 40000
-
-/**
- * The lowest colour temperature in the table.
- */
-#define LOWEST 1000
-
-/**
- * The temperature difference between the colours in the table.
- */
-#define DELTA 100
-
-
-
-/**
* Convert from CIE xyY to [0, 1] sRGB.
*
* @param x The 'x' component.
@@ -49,15 +32,15 @@
* @param g Output parameter for the green value.
* @param b Output parameter for the blue value.
*/
-static void
+void
ciexyy_to_srgb(double x, double y, double Y, double *r, double *g, double *b)
{
#define SRGB(C) (((C) <= 0.0031308) ? (12.92 * (C)) : ((1.0 + 0.055) * pow((C), 1.0 / 2.4) - 0.055))
double X, Z;
/* Convert CIE xyY to CIE XYZ. */
- X = Y * (y == 0 ? 0 : (x / y));
- Z = Y * (y == 0 ? 0 : ((1 - x - y) / y));
+ X = Y * (y == 0.0 ? 0.0 : (x / y));
+ Z = Y * (y == 0.0 ? 0.0 : ((1.0 - x - y) / y));
/* Convert CIE XYZ to [0, 1] linear RGB. (ciexyz_to_linear) */
*r = ( 3.240450 * X) + (-1.537140 * Y) + (-0.4985320 * Z);
@@ -88,7 +71,7 @@ ciexyy_to_srgb(double x, double y, double Y, double *r, double *g, double *b)
static void
interpolate(double x1, double y1, double x2, double y2, double temp, double *r, double *g, double *b)
{
- double weight = fmod(temp, (double)DELTA) / (double)DELTA;
+ double weight = fmod(temp, (double)DELTA_TEMPERATURE) / (double)DELTA_TEMPERATURE;
double x = x1 * (1 - weight) + x2 * weight;
double y = y1 * (1 - weight) + y2 * weight;
ciexyy_to_srgb(x, y, 1.0, r, g, b);
@@ -118,26 +101,24 @@ get_colour(int fd, long int temp, double *r, double *g, double *b)
/* We do not have any values for above 40 000 K, but
* the differences will be unnoticeable, perhaps even
* unencodeable. */
- if (temp > HIGHEST) temp = HIGHEST;
+ if (temp > HIGHEST_TEMPERATURE) temp = HIGHEST_TEMPERATURE;
/* Things do not glow below 1000 K. Yes, fire is hot! */
- if (temp < LOWEST) t ((errno = EDOM));
+ if (temp < LOWEST_TEMPERATURE) t ((errno = EDOM));
/* Read table. */
- offset = ((off_t)temp - LOWEST) / DELTA;
- offset *= (off_t)(5 * sizeof(double));
- errno = 0;
- xpread(fd, values, sizeof(values), offset);
+ offset = ((off_t)temp - LOWEST_TEMPERATURE) / DELTA_TEMPERATURE;
+ offset *= (off_t)(sizeof(values) / 2);
+ errno = 0; xpread(fd, values, sizeof(values), offset);
/* Get colour. */
- if (temp % DELTA)
+ if (temp % DELTA_TEMPERATURE)
interpolate(values[0], values[1], values[6], values[7], (double)temp, r, g, b);
else
*r = values[2], *g = values[3], *b = values[4];
/* Adjust colours for use. */
max = fmax(fmax(fabs(*r), fabs(*g)), fabs(*b));
- if (max != 0)
- *r /= max, *g /= max, *b /= max;
+ if (max != 0) *r /= max, *g /= max, *b /= max;
*r = *r > 0.0 ? *r : 0.0;
*g = *g > 0.0 ? *g : 0.0;
*b = *b > 0.0 ? *b : 0.0;