Solving issue 1427: "HSV equalizer: wrong color lines"
This commit is contained in:
@@ -961,6 +961,11 @@ fclose(f);*/
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
//
|
||||||
|
// WARNING: rtengine/color.cc have similar functions. I guess that color.cc was mistakenly committed from the denoise branch
|
||||||
|
// in changeset #2493dd00b9f3. Code cleanup about those methods will have to be made when the denoise branch will be merged
|
||||||
|
//
|
||||||
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
|
||||||
|
|
||||||
void ImProcFunctions::hsv2rgb (float h, float s, float v, float &r, float &g, float &b) {
|
void ImProcFunctions::hsv2rgb (float h, float s, float v, float &r, float &g, float &b) {
|
||||||
@@ -987,6 +992,26 @@ fclose(f);*/
|
|||||||
b = ((b1)*65535.0);
|
b = ((b1)*65535.0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Function copied for speed concerns
|
||||||
|
// Not exactly the same as above ; this one return a result in the [0.0 ; 1.0] range
|
||||||
|
void ImProcFunctions::hsv2rgb01 (float h, float s, float v, float &r, float &g, float &b) {
|
||||||
|
|
||||||
|
float h1 = h*6; // sector 0 to 5
|
||||||
|
int i = int(h1);
|
||||||
|
float f = h1 - i; // fractional part of h
|
||||||
|
|
||||||
|
float p = v * ( 1 - s );
|
||||||
|
float q = v * ( 1 - s * f );
|
||||||
|
float t = v * ( 1 - s * ( 1 - f ) );
|
||||||
|
|
||||||
|
if (i==1) {r = q; g = v; b = p;}
|
||||||
|
else if (i==2) {r = p; g = v; b = t;}
|
||||||
|
else if (i==3) {r = p; g = q; b = v;}
|
||||||
|
else if (i==4) {r = t; g = p; b = v;}
|
||||||
|
else if (i==5) {r = v; g = p; b = q;}
|
||||||
|
else /*(i==0|6)*/ {r = v; g = t; b = p;}
|
||||||
|
}
|
||||||
|
|
||||||
void ImProcFunctions::xyz2srgb (float x, float y, float z, float &r, float &g, float &b) {
|
void ImProcFunctions::xyz2srgb (float x, float y, float z, float &r, float &g, float &b) {
|
||||||
|
|
||||||
//Transform to output color. Standard sRGB is D65, but internal representation is D50
|
//Transform to output color. Standard sRGB is D65, but internal representation is D50
|
||||||
|
@@ -169,6 +169,7 @@ class ImProcFunctions {
|
|||||||
|
|
||||||
static void rgb2hsv (float r, float g, float b, float &h, float &s, float &v);
|
static void rgb2hsv (float r, float g, float b, float &h, float &s, float &v);
|
||||||
static void hsv2rgb (float h, float s, float v, float &r, float &g, float &b);
|
static void hsv2rgb (float h, float s, float v, float &r, float &g, float &b);
|
||||||
|
static void hsv2rgb01 (float h, float s, float v, float &r, float &g, float &b);
|
||||||
void xyz2srgb (float x, float y, float z, float &r, float &g, float &b);
|
void xyz2srgb (float x, float y, float z, float &r, float &g, float &b);
|
||||||
void xyz2rgb (float x, float y, float z, float &r, float &g, float &b, double rgb_xyz[3][3]);
|
void xyz2rgb (float x, float y, float z, float &r, float &g, float &b, double rgb_xyz[3][3]);
|
||||||
void Lab2XYZ(float L, float a, float b, float &x, float &y, float &z);
|
void Lab2XYZ(float L, float a, float b, float &x, float &y, float &z);
|
||||||
|
@@ -190,27 +190,27 @@ void HSVEqualizer::colorForValue (double valX, double valY) {
|
|||||||
|
|
||||||
if (ce == hshape) { // Hue = f(Hue)
|
if (ce == hshape) { // Hue = f(Hue)
|
||||||
|
|
||||||
float h = (float)((valY - 0.5) * 2. + valX);
|
float h = float((valY - 0.5) * 2. + valX);
|
||||||
if (h > 1.0)
|
if (h > 1.0f)
|
||||||
h -= 1.0;
|
h -= 1.0f;
|
||||||
else if (h < 0.0)
|
else if (h < 0.0f)
|
||||||
h += 1.0;
|
h += 1.0f;
|
||||||
ImProcFunctions::hsv2rgb(h, (float)0.5, (float)0.5, r, g, b);
|
ImProcFunctions::hsv2rgb01(h, 0.5f, 0.5f, r, g, b);
|
||||||
red = (double)r;
|
red = double(r);
|
||||||
green = (double)g;
|
green = double(g);
|
||||||
blue = (double)b;
|
blue = double(b);
|
||||||
}
|
}
|
||||||
else if (ce == sshape) { // Saturation = f(Hue)
|
else if (ce == sshape) { // Saturation = f(Hue)
|
||||||
ImProcFunctions::hsv2rgb((float)valX, (float)valY, (float)0.5, r, g, b);
|
ImProcFunctions::hsv2rgb01(float(valX), float(valY), 0.5f, r, g, b);
|
||||||
red = (double)r;
|
red = double(r);
|
||||||
green = (double)g;
|
green = double(g);
|
||||||
blue = (double)b;
|
blue = double(b);
|
||||||
}
|
}
|
||||||
else if (ce == vshape) { // Value = f(Hue)
|
else if (ce == vshape) { // Value = f(Hue)
|
||||||
ImProcFunctions::hsv2rgb((float)valX, (float)0.5, (float)valY, r, g, b);
|
ImProcFunctions::hsv2rgb01(float(valX), 0.5f, float(valY), r, g, b);
|
||||||
red = (double)r;
|
red = double(r);
|
||||||
green = (double)g;
|
green = double(g);
|
||||||
blue = (double)b;
|
blue = double(b);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
printf("Error: no curve displayed!\n");
|
printf("Error: no curve displayed!\n");
|
||||||
|
Reference in New Issue
Block a user