diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 64e81720b..f0fad5917 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -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) { @@ -987,6 +992,26 @@ fclose(f);*/ 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) { //Transform to output color. Standard sRGB is D65, but internal representation is D50 diff --git a/rtengine/improcfun.h b/rtengine/improcfun.h index 9b5651089..205f97243 100644 --- a/rtengine/improcfun.h +++ b/rtengine/improcfun.h @@ -169,6 +169,7 @@ class ImProcFunctions { 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 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 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); diff --git a/rtgui/hsvequalizer.cc b/rtgui/hsvequalizer.cc index 5b61d0217..bc247c449 100644 --- a/rtgui/hsvequalizer.cc +++ b/rtgui/hsvequalizer.cc @@ -190,27 +190,27 @@ void HSVEqualizer::colorForValue (double valX, double valY) { if (ce == hshape) { // Hue = f(Hue) - float h = (float)((valY - 0.5) * 2. + valX); - if (h > 1.0) - h -= 1.0; - else if (h < 0.0) - h += 1.0; - ImProcFunctions::hsv2rgb(h, (float)0.5, (float)0.5, r, g, b); - red = (double)r; - green = (double)g; - blue = (double)b; + float h = float((valY - 0.5) * 2. + valX); + if (h > 1.0f) + h -= 1.0f; + else if (h < 0.0f) + h += 1.0f; + ImProcFunctions::hsv2rgb01(h, 0.5f, 0.5f, r, g, b); + red = double(r); + green = double(g); + blue = double(b); } else if (ce == sshape) { // Saturation = f(Hue) - ImProcFunctions::hsv2rgb((float)valX, (float)valY, (float)0.5, r, g, b); - red = (double)r; - green = (double)g; - blue = (double)b; + ImProcFunctions::hsv2rgb01(float(valX), float(valY), 0.5f, r, g, b); + red = double(r); + green = double(g); + blue = double(b); } else if (ce == vshape) { // Value = f(Hue) - ImProcFunctions::hsv2rgb((float)valX, (float)0.5, (float)valY, r, g, b); - red = (double)r; - green = (double)g; - blue = (double)b; + ImProcFunctions::hsv2rgb01(float(valX), 0.5f, float(valY), r, g, b); + red = double(r); + green = double(g); + blue = double(b); } else { printf("Error: no curve displayed!\n");