diff options
Diffstat (limited to 'src/blackbody.c')
-rw-r--r-- | src/blackbody.c | 41 |
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; |