Code:
enum ColorSpace{
HSV,
HSL
};
//Color
std::vector<int> CL_Color::get_hsv(){
std::vector<int> hsv;
int min = cl_min(get_red(),cl_min(get_blue(),get_green()));
int max = cl_max(get_red(),cl_max(get_blue(),get_green()));
hsv[1] = max != 0 ? 255 * (max - min) / max : 0;
hsv[2] = max;
float r = float(max - red) / (max - min);
float g = float(max - green) / (max - min);
float b = float(max - blue) / (max - min);
switch (max){
case get_red(): hsv[0]= (60 * (b - g)).round;break;
case get_green(): hsv[0]= (60 * (2 + r - b)).round;break;
case get_red(): hsv[0]= (60 * (4 + g - r)).round;break;
}
if (hsv[0] < 0)
hsv[0] += 360;
return hsv;
}
int CL_Color::get_hue(){
return get_hsv()[0];
}
int CL_Color::get_saturation(ColorSpace space = HSV ){
switch (space){
case HSV:
return get_hsv()[1];
case HSL:
return get_hsl()[1];
}
}
int CL_Color::get_value(){
return get_hsv()[2];
}
std::vector<int> CL_Color::get_hsl(){
std::vector<double> hsl;
int min = cl_min(get_red(),cl_min(get_blue(),get_green()));
int max = cl_max(get_red(),cl_max(get_blue(),get_green()));
hsl[2]= (max + min)/2;
if(min == max) {
hsl[1]= 0;
}else if (l <= 0.5) {
hsl[1]= (max - min) / (2*hsl[2]);
}else
hsl[1]= (max - min) / (2-2*hsl[2]);
hsl[1]*=256;
hsl[2]*=256;
switch (max){
case get_red(): hsl[0]= (60 * (get_blue() - get_green())).round;break;
case get_green(): hsl[0]= (60 * (2 + get_red() - get_blue())).round;break;
case get_red(): hsl[0]= (60 * (4 + get_green() - get_red())).round;break;
}
if (hsl[0] < 0)
hsl[0] += 360;
return hsl;
}
//hue [0,359]
//saturation = [0,255]
//value = [0,255]
void CL_Color::set_hsv(int hue,int saturation,int value){
hue = cl_min(359,cl_max(0,hue));
saturation = cl_min(255,cl_max(0,hue));
value = cl_min(255,cl_max(0,hue));
if (saturation == 0)
{
set_red(value);
set_green(value);
set_blue(value);
}else
{
double h = int(hue / 60);
double f = hue / 60 - h;
double p = value * (255 - saturation) / 255;
double q = value * (255 - saturation * f) / 255;
double t = value * (255 - saturation * (255 - f)) / 255;
switch(h){
case 1:
set_red(q);set_green(value);set_blue(p);
break;
case 2:
set_red(p);set_green(value);set_blue(t);
break;
case 3:
set_red(p);set_green(q);set_blue(value);
break;
case 4:
set_red(t);set_green(p);set_blue(value);
break;
case 5:
set_red(value);set_green(p);set_blue(q);
break;
default:
set_red(value);set_green(t);set_blue(p);
break;
}
}
}
void CL_Colord::set_hsl(int hue,int saturation,int lightness){
t_hue = cl_min(359,cl_max(0,hue)) / 360.0;
t_saturation = cl_min(255,cl_max(0,saturation)) / 255.0;
t_lightness = cl_min(255,cl_max(0,lightness)) / 255.0;
if (t_saturation == 0)
{
set_red(t_lightness);
set_green(t_lightness);
set_blue(t_lightness);
}else
{
double q;
if (l < 0.5)
q = t_lightness * (1+t_saturation)
else
q = t_lightness + t_saturation - t_lightness * t_saturation;
double p = 2 * t_lightness - q;
std::vector<double> temp;
int i=0;
temp[0]=t_hue + 1.0 / 3;
temp[1]=t_hue;
temp[2]=t_hue - 1.0 / 3;
for (i=0;i<2;i++){
temp[i]= temp[i] % 1;
if (temp[i] < 1.0/6)
temp[i] = p + (q - p) * 6 * temp[i];
else if (temp[i] < 0.5)
temp[i] = q
else if (temp[i] < 2.0/3)
temp[i] = p + (q - p) * 6 * (2.0/3 - temp[i]);
}
set_red(temp[0]*256);
set_green(temp[1]*256);
set_blue(temp[2]*256);
}
}
void CL_Color::set_hue(int hue){
std::vector<int> hsv = get_hsv();
set_hsv(hue,hsv[1],hsv[2]);
}
void CL_Colord::set_saturation(int saturation,ColorSpace space = HSV){
switch (space){
case HSV:
std::vector<int> hsv = get_hsv();
set_hsv(hsv[0],saturation,hsv[2]);
break;
case HSL:
std::vector<int> hsl = get_hsl();
set_hsl(hsl[0],saturation,hsl[2]);
break;
}
}
void CL_Color::set_value(int value){
std::vector<int> hsv = get_hsv();
set_hsv(hsv[0],hsv[1],value);
}
void CL_Colord::set_lightness(int lightness){
std::vector<int> hsl = get_hsl();
set_hsl(hsl[0],hsl[1],lightness);
}
//Colord
std::vector<double> CL_Colord::get_hsv(){
std::vector<double> hsv;
double min = cl_min(get_red(),cl_min(get_blue(),get_green()));
double max = cl_max(get_red(),cl_max(get_blue(),get_green()));
hsv[1] = max != 0 ? (max - min) / max : 0;
hsv[2] = max;
switch (max){
case get_red(): hsv[0]= (60 * (get_blue() - get_green())).round;break;
case get_green(): hsv[0]= (60 * (2 + get_red() - get_blue())).round;break;
case get_red(): hsv[0]= (60 * (4 + get_green() - get_red())).round;break;
}
if (hsv[0] < 0)
hsv[0] += 360;
return hsv;
}
std::vector<double> CL_Colord::get_hsl(){
std::vector<double> hsl;
double min = cl_min(get_red(),cl_min(get_blue(),get_green()));
double max = cl_max(get_red(),cl_max(get_blue(),get_green()));
hsl[2]= (max + min)/2;
if(min == max) {
hsl[1]= 0;
}else if (l <= 0.5) {
hsl[1]= (max - min) / (2*hsl[2]);
}else
hsl[1]= (max - min) / (2-2*hsl[2]);
switch (max){
case get_red(): hsl[0]= (60 * (get_blue() - get_green())).round;break;
case get_green(): hsl[0]= (60 * (2 + get_red() - get_blue())).round;break;
case get_red(): hsl[0]= (60 * (4 + get_green() - get_red())).round;break;
}
if (hsl[0] < 0)
hsl[0] += 360;
return hsl;
}
double CL_Colord::get_hue(){
return get_hsv()[0];
}
double CL_Colord::get_saturation(ColorSpace space = HSV ){
switch (space){
case HSV:
return get_hsv()[1];
case HSL:
return get_hsl()[1];
}
}
double CL_Colord::get_value(){
return get_hsv()[2];
}
//hue [0,360]
//saturation = [0,1]
//value = [0,1]
void CL_Colord::set_hsv(double hue,double saturation,double value){
hue = cl_min(359,cl_max(0,hue));
saturation = cl_min(1,cl_max(0,saturation));
value = cl_min(1,cl_max(0,value));
if (saturation == 0)
{
set_red(value);
set_green(value);
set_blue(value);
}else
{
double h = int(hue / 60);
double f = hue / 60 - h;
double p = value * (1 - saturation);
double q = value * (1 - saturation * f);
double t = value * (1 - saturation * (1 - f));
switch(h){
case 1:
set_red(q);set_green(value);set_blue(p);
break;
case 2:
set_red(p);set_green(value);set_blue(t);
break;
case 3:
set_red(p);set_green(q);set_blue(value);
break;
case 4:
set_red(t);set_green(p);set_blue(value);
break;
case 5:
set_red(value);set_green(p);set_blue(q);
break;
default:
set_red(value);set_green(t);set_blue(p);
break;
}
}
}
void CL_Colord::set_hsl(double hue,double saturation,double lightness){
hue = cl_min(359,cl_max(0,hue)) / 360;
saturation = cl_min(1,cl_max(0,saturation));
lightness = cl_min(1,cl_max(0,lightness));
if (saturation == 0)
{
set_red(lightness);
set_green(lightness);
set_blue(lightness);
}else
{
double q;
if (l < 0.5)
q = lightness * (1+saturation)
else
q = lightness + saturation - lightness * saturation;
double p = 2 * lightness - q;
std::vector<double> temp;
int i=0;
temp[0]=hue + 1.0 / 3;
temp[1]=hue;
temp[2]=hue - 1.0 / 3;
for (i=0;i<2;i++){
temp[i]= temp[i] % 1;
if (temp[i] < 1.0/6)
temp[i] = p + (q - p) * 6 * temp[i];
else if (temp[i] < 0.5)
temp[i] = q
else if (temp[i] < 2.0/3)
temp[i] = p + (q - p) * 6 * (2.0/3 - temp[i]);
}
set_red(temp[0]);
set_green(temp[1]);
set_blue(temp[2]);
}
}
void CL_Colord::set_hue(double hue){
std::vector<double> hsv = get_hsv();
set_hsv(hue,hsv[1],hsv[2]);
}
void CL_Colord::set_saturation(double saturation,ColorSpace space = HSV){
switch (space){
case HSV:
std::vector<double> hsv = get_hsv();
set_hsv(hsv[0],saturation,hsv[2]);
break;
case HSL:
std::vector<double> hsl = get_hsl();
set_hsl(hsl[0],saturation,hsl[2]);
break;
}
}
void CL_Colord::set_value(double value){
std::vector<double> hsv = get_hsv();
set_hsv(hsv[0],hsv[1],value);
}
void CL_Colord::set_lightness(double lightness){
std::vector<double> hsl = get_hsl();
set_hsl(hsl[0],hsl[1],lightness);
}
//Colorf
std::vector<float> CL_Colorf::get_hsv(){
std::vector<float> hsv;
float min = cl_min(get_red(),cl_min(get_blue(),get_green()));
float max = cl_max(get_red(),cl_max(get_blue(),get_green()));
hsv[1] = max != 0 ? (max - min) / max : 0;
hsv[2] = max;
switch (max){
case get_red(): hsv[0]= (60 * (get_blue() - get_green())).round;break;
case get_green(): hsv[0]= (60 * (2 + get_red() - get_blue())).round;break;
case get_red(): hsv[0]= (60 * (4 + get_green() - get_red())).round;break;
}
if (hsv[0] < 0)
hsv[0] += 360;
return hsv;
}
std::vector<float> CL_Colorf::get_hsl(){
std::vector<float> hsl;
float min = cl_min(get_red(),cl_min(get_blue(),get_green()));
float max = cl_max(get_red(),cl_max(get_blue(),get_green()));
hsl[2]= (max + min)/2;
if(min == max) {
hsl[1]= 0;
}else if (l <= 0.5) {
hsl[1]= (max - min) / (2*hsl[2]);
}else
hsl[1]= (max - min) / (2-2*hsl[2]);
switch (max){
case get_red(): hsl[0]= (60 * (get_blue() - get_green())).round;break;
case get_green(): hsl[0]= (60 * (2 + get_red() - get_blue())).round;break;
case get_red(): hsl[0]= (60 * (4 + get_green() - get_red())).round;break;
}
if (hsl[0] < 0)
hsl[0] += 360;
return hsl;
}
float CL_Colorf::get_hue(){
return get_hsv()[0];
}
float CL_Colorf::get_saturation(ColorSpace space = HSV ){
switch (space){
case HSV:
return get_hsv()[1];
case HSL:
return get_hsl()[1];
}
}
float CL_Colorf::get_value(){
return get_hsv()[2];
}
//hue [0,360]
//saturation = [0,1]
//value = [0,1]
void CL_Colorf::set_hsv(float hue,float saturation,float value){
hue = cl_min(359,cl_max(0,hue));
saturation = cl_min(1,cl_max(0,saturation));
value = cl_min(1,cl_max(0,value));
if (saturation == 0)
{
set_red(value);
set_green(value);
set_blue(value);
}else
{
float h = int(hue / 60);
float f = hue / 60 - h;
float p = value * (1 - saturation);
float q = value * (1 - saturation * f);
float t = value * (1 - saturation * (1 - f));
switch(h){
case 1:
set_red(q);set_green(value);set_blue(p);
break;
case 2:
set_red(p);set_green(value);set_blue(t);
break;
case 3:
set_red(p);set_green(q);set_blue(value);
break;
case 4:
set_red(t);set_green(p);set_blue(value);
break;
case 5:
set_red(value);set_green(p);set_blue(q);
break;
default:
set_red(value);set_green(t);set_blue(p);
break;
}
}
}
void CL_Colorf::set_hsl(float hue,float saturation,float lightness){
hue = cl_min(359,cl_max(0,hue)) / 360;
saturation = cl_min(1,cl_max(0,saturation));
lightness = cl_min(1,cl_max(0,lightness));
if (saturation == 0)
{
set_red(lightness);
set_green(lightness);
set_blue(lightness);
}else
{
float q;
if (l < 0.5)
q = lightness * (1+saturation)
else
q = lightness + saturation - lightness * saturation;
float p = 2 * lightness - q;
std::vector<float> temp;
int i=0;
temp[0]=hue + 1.0 / 3;
temp[1]=hue;
temp[2]=hue - 1.0 / 3;
for (i=0;i<2;i++){
temp[i]= temp[i] % 1;
if (temp[i] < 1.0/6)
temp[i] = p + (q - p) * 6 * temp[i];
else if (temp[i] < 0.5)
temp[i] = q
else if (temp[i] < 2.0/3)
temp[i] = p + (q - p) * 6 * (2.0/3 - temp[i]);
}
set_red(temp[0]);
set_green(temp[1]);
set_blue(temp[2]);
}
}
void CL_Colorf::set_hue(float hue){
std::vector<float> hsv = get_hsv();
set_hsv(hue,hsv[1],hsv[2]);
}
void CL_Colorf::set_saturation(float saturation,ColorSpace space = HSV){
switch (space){
case HSV:
std::vector<float> hsv = get_hsv();
set_hsv(hsv[0],saturation,hsv[2]);
break;
case HSL:
std::vector<float> hsl = get_hsl();
set_hsl(hsl[0],saturation,hsl[2]);
break;
}
}
void CL_Colorf::set_value(float value){
std::vector<float> hsv = get_hsv();
set_hsv(hsv[0],hsv[1],value);
}
void CL_Colorf::set_lightness(float lightness){
std::vector<float> hsl = get_hsl();
set_hsl(hsl[0],hsl[1],lightness);
}
Bookmarks