1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
|
/**************************************************/
/*** colourLib.c ***/
/*** Somehow from Xrgb ***/
/**************************************************/
#include <glib.h>
#include "colourlib.h"
void hsv2lrgb(float hue,float saturation,float value,unsigned long *color)
{
unsigned long ired,igreen,iblue,ialpha;
float red,green,blue;
ialpha = (ALPHA_MASK & *color); /*** Keep whatever value of alpha already exists ***/
hsv2rgb(hue, saturation, value, &red, &green, &blue);
ired = (unsigned long)(red * 255.0);
igreen = (unsigned long)(green * 255.0);
iblue = (unsigned long)(blue * 255.0);
iblue = iblue << 16;
igreen = igreen << 8;
*color = (iblue | igreen | ired | ialpha);
}
void hsv2rgb(float hue, float saturation, float value, float *red, float *green, float *blue)
{
int i;
float f, m, n, k;
hue = (hue > 360.0) ? 360.0 : (hue < 0.0) ? 0.0 : hue;
saturation = (saturation > 1.0) ? 1.0 : (saturation < 0.0) ? 0.0 : saturation;
value = (value > 1.0) ? 1.0 : (value < 0.0) ? 0.0 : value;
if ( saturation == 0.0 ) {
*red = *green = *blue = value;
} else {
if ( hue == 360.0 ) {
hue = 0.0;
} else {
hue /= 60.0;
i = hue; /* truncate */
f = hue - (float)i;
m = value * (1.0 - saturation);
n = value * (1.0 - (saturation * f));
k = value * (1.0 - (saturation * (1.0 - f)));
switch (i) {
case 0:
*red = value;
*green = k;
*blue = m;
break;
case 1:
*red = n;
*green = value;
*blue = m;
break;
case 2:
*red = m;
*green = value;
*blue = k;
break;
case 3:
*red = m;
*green = n;
*blue = value;
break;
case 4:
*red = k;
*green = m;
*blue = value;
break;
case 5:
default:
*red = value;
*green = m;
*blue = n;
break;
}
}
}
*red = (*red > 1.0) ? 1.0 : (*red < 0.0) ? 0.0 : *red;
*green = (*green > 1.0) ? 1.0 : (*green < 0.0) ? 0.0 : *green;
*blue = (*blue > 1.0) ? 1.0 : (*blue < 0.0) ? 0.0 : *blue;
return;
}
/************************************************************/
/* RGB to HSV converter */
/* From an algorithm in: */
/* Foley, J. D., van Dam, A., et al. (1990). */
/* Computer Graphics - Principles and Practice, */
/* Addison-Wesley. */
/************************************************************/
void rgb2hsv(float red, float green, float blue, float *hue, float *saturation, float *value )
{
float myMin,myMax, delta;
myMin = 1.0;
myMax = 0.0;
if (red < 0.0) red = 0.0;
if (green < 0.0) green = 0.0;
if (blue < 0.0) blue = 0.0;
myMax = MAX(red, green);
myMax = MAX(myMax, blue);
myMin = MIN(red, green);
myMin = MIN(myMin, blue);
*value = myMax;
delta = myMax - myMin;
if ( myMax > 0.0 ){
*saturation = (myMax - myMin)/myMax;
} else {
*saturation = 0.0;
}
if (*saturation == 0.0){
*hue = 0.0; /* supposed to be "undefined", but that doesn't really work for me */
} else {
if (red == myMax){
*hue = (green - blue)/delta; /* resulting colour is between yellow and magenta */
} else if (green == myMax){
*hue = 2 + (blue - red)/delta; /* resulting colour is between cyan and yellow */
} else if (blue == myMax){
*hue = 4 + (red - green)/delta; /* resulting colour is between magenta and cyan */
}
*hue = *hue * 60; /* convert hue to degrees */
if ( *hue < 0.0) *hue+= 360; /* Make sure hue is non-negative */
if ( *hue < 0.0) *hue = 0.0;
*hue = *hue / 360.0; /* finally convert to a value in the range [0.0 - 1.0] */
}
}
|