Added HSL colour conversion
This commit is contained in:
parent
984885f9a0
commit
0c6a998be6
167
colours.c
167
colours.c
@ -21,7 +21,7 @@ struct ColourRGB HSVtoRGB(struct ColourHSV hsv)
|
|||||||
double m;
|
double m;
|
||||||
|
|
||||||
c = hsv.s * hsv.v;
|
c = hsv.s * hsv.v;
|
||||||
x = c * (1 - fabs(fmod(hsv.h / 60.0, 2) - 1));
|
x = c * (1.0 - fabs(fmod(hsv.h / 60.0, 2) - 1.0));
|
||||||
m = hsv.v - c;
|
m = hsv.v - c;
|
||||||
|
|
||||||
int angle = hsv.h / 60;
|
int angle = hsv.h / 60;
|
||||||
@ -79,16 +79,76 @@ struct ColourRGB HSVtoRGB(struct ColourHSV hsv)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
// struct ColourRGB HSLtoRGB(struct ColourHSL hsl)
|
struct ColourRGB HSLtoRGB(struct ColourHSL hsl)
|
||||||
// {
|
{
|
||||||
|
struct ColourRGB result;
|
||||||
|
double c;
|
||||||
|
double x;
|
||||||
|
double m;
|
||||||
|
|
||||||
// }
|
c = hsl.s * (1.0 - fabs(2 * hsl.l - 1));
|
||||||
|
x = c * (1.0 - fabs(fmod(hsl.h / 60.0, 2) - 1.0));
|
||||||
|
m = hsl.l - c/2;
|
||||||
|
|
||||||
|
int angle = hsl.h / 60;
|
||||||
|
switch (angle)
|
||||||
|
{
|
||||||
|
// 0 - 60
|
||||||
|
case 6:
|
||||||
|
case 0:
|
||||||
|
result.r = c;
|
||||||
|
result.g = x;
|
||||||
|
result.b = 0;
|
||||||
|
break;
|
||||||
|
// 60 - 120
|
||||||
|
case 1:
|
||||||
|
result.r = x;
|
||||||
|
result.g = c;
|
||||||
|
result.b = 0;
|
||||||
|
break;
|
||||||
|
// 120 - 180
|
||||||
|
case 2:
|
||||||
|
result.r = 0;
|
||||||
|
result.g = c;
|
||||||
|
result.b = x;
|
||||||
|
break;
|
||||||
|
// 180 - 240
|
||||||
|
case 3:
|
||||||
|
result.r = 0;
|
||||||
|
result.g = x;
|
||||||
|
result.b = c;
|
||||||
|
break;
|
||||||
|
// 240 - 300
|
||||||
|
case 4:
|
||||||
|
result.r = x;
|
||||||
|
result.g = 0;
|
||||||
|
result.b = c;
|
||||||
|
break;
|
||||||
|
// 300 - 360
|
||||||
|
case 5:
|
||||||
|
result.r = c;
|
||||||
|
result.g = 0;
|
||||||
|
result.b = x;
|
||||||
|
break;
|
||||||
|
// Should never happen
|
||||||
|
default:
|
||||||
|
result.r = 0;
|
||||||
|
result.g = 0;
|
||||||
|
result.b = 0;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
result.r += m;
|
||||||
|
result.g += m;
|
||||||
|
result.b += m;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
struct ColourCMYK RGBtoCMYK(struct ColourRGB rgb)
|
struct ColourCMYK RGBtoCMYK(struct ColourRGB rgb)
|
||||||
{
|
{
|
||||||
struct ColourCMYK result;
|
struct ColourCMYK result;
|
||||||
|
|
||||||
|
|
||||||
// max(r,g,b)
|
// max(r,g,b)
|
||||||
result.k = rgb.r > rgb.g ? rgb.r : rgb.g;
|
result.k = rgb.r > rgb.g ? rgb.r : rgb.g;
|
||||||
result.k = rgb.b > result.k ? rgb.b : result.k;
|
result.k = rgb.b > result.k ? rgb.b : result.k;
|
||||||
@ -119,6 +179,15 @@ struct ColourCMYK HSVtoCMYK(struct ColourHSV hsv)
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct ColourCMYK HSLtoCMYK(struct ColourHSL hsl)
|
||||||
|
{
|
||||||
|
struct ColourCMYK result;
|
||||||
|
|
||||||
|
result = RGBtoCMYK(HSLtoRGB(hsl));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
struct ColourHSV RGBtoHSV(struct ColourRGB rgb)
|
struct ColourHSV RGBtoHSV(struct ColourRGB rgb)
|
||||||
{
|
{
|
||||||
struct ColourHSV result;
|
struct ColourHSV result;
|
||||||
@ -152,16 +221,8 @@ struct ColourHSV RGBtoHSV(struct ColourRGB rgb)
|
|||||||
result.h = 60 * ((rgb.r - rgb.g) / delta + 4);
|
result.h = 60 * ((rgb.r - rgb.g) / delta + 4);
|
||||||
}
|
}
|
||||||
|
|
||||||
if(c_max > 0)
|
|
||||||
{
|
|
||||||
result.s = delta / c_max;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
result.s = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
result.v = c_max;
|
result.v = c_max;
|
||||||
|
result.s = delta / result.v;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@ -186,3 +247,81 @@ struct ColourHSV CMYKtoHSV(struct ColourCMYK cmyk)
|
|||||||
|
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct ColourHSV HSLtoHSV(struct ColourHSL hsl)
|
||||||
|
{
|
||||||
|
struct ColourHSV result;
|
||||||
|
|
||||||
|
result = RGBtoHSV(HSLtoRGB(hsl));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ColourHSL RGBtoHSL(struct ColourRGB rgb)
|
||||||
|
{
|
||||||
|
struct ColourHSL result;
|
||||||
|
|
||||||
|
double c_max;
|
||||||
|
double c_min;
|
||||||
|
double delta;
|
||||||
|
|
||||||
|
// max(r,g,b)
|
||||||
|
c_max = rgb.r > rgb.g ? rgb.r : rgb.g;
|
||||||
|
c_max = rgb.b > c_max ? rgb.b : c_max;
|
||||||
|
|
||||||
|
// min(r,g,b)
|
||||||
|
c_min = rgb.r < rgb.g ? rgb.r : rgb.g;
|
||||||
|
c_min = rgb.b < c_min ? rgb.b : c_min;
|
||||||
|
|
||||||
|
delta = c_max - c_min;
|
||||||
|
|
||||||
|
if (delta > 0)
|
||||||
|
{
|
||||||
|
if (c_max == rgb.r)
|
||||||
|
{
|
||||||
|
result.h = 60 * fmod((rgb.g - rgb.b) / delta, 6);
|
||||||
|
}
|
||||||
|
else if (c_max == rgb.g)
|
||||||
|
{
|
||||||
|
result.h = 60 * ((rgb.b - rgb.r) / delta + 2);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.h = 60 * ((rgb.r - rgb.g) / delta + 4);
|
||||||
|
}
|
||||||
|
|
||||||
|
result.l = (c_max + c_min) / 2;
|
||||||
|
result.s = delta / (1.0 - fabs(2 * result.l - 1.0));
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
result.h = 0;
|
||||||
|
result.s = 0;
|
||||||
|
result.l = (c_max + c_min) / 2;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (result.h < 0)
|
||||||
|
{
|
||||||
|
result.h += 360;
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ColourHSL CMYKtoHSL(struct ColourCMYK cmyk)
|
||||||
|
{
|
||||||
|
struct ColourHSL result;
|
||||||
|
|
||||||
|
result = RGBtoHSL(CMYKtoRGB(cmyk));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct ColourHSL HSVtoHSL(struct ColourHSV hsv)
|
||||||
|
{
|
||||||
|
struct ColourHSL result;
|
||||||
|
|
||||||
|
result = RGBtoHSL(HSVtoRGB(hsv));
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|||||||
@ -32,18 +32,18 @@ struct ColourHSL
|
|||||||
|
|
||||||
struct ColourRGB CMYKtoRGB(struct ColourCMYK cmyk);
|
struct ColourRGB CMYKtoRGB(struct ColourCMYK cmyk);
|
||||||
struct ColourRGB HSVtoRGB(struct ColourHSV hsv);
|
struct ColourRGB HSVtoRGB(struct ColourHSV hsv);
|
||||||
// struct ColourRGB HSLtoRGB(struct ColourHSL hsl);
|
struct ColourRGB HSLtoRGB(struct ColourHSL hsl);
|
||||||
|
|
||||||
struct ColourCMYK RGBtoCMYK(struct ColourRGB rgb);
|
struct ColourCMYK RGBtoCMYK(struct ColourRGB rgb);
|
||||||
struct ColourCMYK HSVtoCMYK(struct ColourHSV hsv);
|
struct ColourCMYK HSVtoCMYK(struct ColourHSV hsv);
|
||||||
// struct ColourCMYK HSLtoCMYK(struct ColourHSL hsl);
|
struct ColourCMYK HSLtoCMYK(struct ColourHSL hsl);
|
||||||
|
|
||||||
struct ColourHSV RGBtoHSV(struct ColourRGB rgb);
|
struct ColourHSV RGBtoHSV(struct ColourRGB rgb);
|
||||||
struct ColourHSV CMYKtoHSV(struct ColourCMYK cmyk);
|
struct ColourHSV CMYKtoHSV(struct ColourCMYK cmyk);
|
||||||
// struct ColourHSV HSLtoHSV(struct ColourHSL hsl);
|
struct ColourHSV HSLtoHSV(struct ColourHSL hsl);
|
||||||
|
|
||||||
struct ColourHSL RGBtoHSL(struct ColourRGB rgb);
|
struct ColourHSL RGBtoHSL(struct ColourRGB rgb);
|
||||||
struct ColourHSL CMYKtoHSL(struct ColourCMYK cmyk);
|
struct ColourHSL CMYKtoHSL(struct ColourCMYK cmyk);
|
||||||
// struct ColourHSL HSVtoHSL(struct ColourHSV hsv);
|
struct ColourHSL HSVtoHSL(struct ColourHSV hsv);
|
||||||
|
|
||||||
#endif // COLOURS_H_
|
#endif // COLOURS_H_
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user