2006-07-05 Roland Levillain <roland@lrde.epita.fr> Fix color conversions. * oln/convert/float_cmp.hh: New file. * oln/convert/rgbhsv.hh: Include it. (f_rgb_to_hsv::doit, f_hsv_to_rgb::doit): Use approx_eq and (resp. approx_neq) to compare float values instead of plain == (resp. !=). * oln/convert/rgbhsl.hh (f_rgb_to_hsl::doit, f_hsl_to_rgb::doit): Likewise. * tests/convert/conv.cc: Typo. * oln/makefile.src (OLN_DEP): Add convert/float_cmp.hh. Index: 10.232/olena/tests/convert/conv.cc --- 10.232/olena/tests/convert/conv.cc Thu, 31 Jul 2003 15:42:27 +0200 reda (oln/u/12_conv.cc 1.2 600) +++ 10.232(w)/olena/tests/convert/conv.cc Wed, 05 Jul 2006 17:43:16 +0200 levill_r (oln/u/12_conv.cc 1.2 600) @@ -2,8 +2,7 @@ /* The extra indirection to the _STR and _CONC macros is required so that if the arguments to STR() (or CONC()) are themselves macros, they will - ls - be expanded before being quoted. */ + be expanded before being quoted. */ #ifndef STR # define _STR(arg) #arg # define STR(arg) _STR(arg) Index: 10.232/olena/oln/convert/rgbhsv.hh --- 10.232/olena/oln/convert/rgbhsv.hh Sat, 26 Jun 2004 23:19:24 +0200 thivol_d (oln/j/35_rgbhsv.hh 1.4 600) +++ 10.232(w)/olena/oln/convert/rgbhsv.hh Tue, 04 Jul 2006 19:25:50 +0200 levill_r (oln/j/35_rgbhsv.hh 1.4 600) @@ -31,6 +31,7 @@ # include <oln/basics.hh> # include <oln/convert/abstract/colorconv.hh> +# include <oln/convert/float_cmp.hh> # include <ntg/basics.hh> # include <ntg/color/rgb.hh> @@ -71,17 +72,17 @@ out[hsv_V] = max_in; - if (max_in != 0) + if (approx_neq(max_in, 0)) out[hsv_S] = delta / max_in; else out[hsv_S] = 0; - if (out[hsv_S] == 0) + if (approx_eq(out[hsv_S], 0)) out[hsv_H] = -1; // undefined else { - if (in[rgb_R] == max_in) + if (approx_eq(in[rgb_R], max_in)) out[hsv_H] = (in[rgb_G] - in[rgb_B]) / delta; - else if (in[rgb_G] == max_in) + else if (approx_eq(in[rgb_G], max_in)) out[hsv_H] = 2 + (in[rgb_B] - in[rgb_R]) / delta; else out[hsv_H] = 4 + (in[rgb_R] - in[rgb_G]) / delta; @@ -129,7 +130,7 @@ vec<3, float> in = v.to_float(); vec<3, float> out; - if(in[hsv_S] == 0) + if(approx_eq(in[hsv_S], 0)) out[rgb_G] = out[rgb_B] = out[rgb_R] = in[hsv_V]; else { Index: 10.232/olena/oln/convert/rgbhsl.hh --- 10.232/olena/oln/convert/rgbhsl.hh Sat, 26 Jun 2004 23:19:24 +0200 thivol_d (oln/j/36_rgbhsl.hh 1.6 600) +++ 10.232(w)/olena/oln/convert/rgbhsl.hh Wed, 05 Jul 2006 17:50:01 +0200 levill_r (oln/j/36_rgbhsl.hh 1.6 600) @@ -31,6 +31,7 @@ # include <oln/basics.hh> # include <oln/convert/abstract/colorconv.hh> +# include <oln/convert/float_cmp.hh> # include <ntg/basics.hh> # include <ntg/color/rgb.hh> @@ -95,10 +96,11 @@ float diff = max_in-min_in; out[hsl_L] = (max_in + min_in) / 2; - if (std::abs(diff) <= FLT_EPSILON){ - out[hsl_S] = 0; - out[hsl_H] = 0; // undefined - } + if (approx_eq (diff, 0)) + { + out[hsl_S] = 0; + out[hsl_H] = 0; // undefined + } else { if (out[hsl_L] <= 0.5) out[hsl_S] = diff / (max_in + min_in); @@ -110,11 +112,11 @@ float g_dist = (max_in - in[rgb_G]) / diff; float b_dist = (max_in - in[rgb_B]) / diff; - if (in[rgb_R] == max_in) + if (approx_eq(in[rgb_R], max_in)) out[hsl_H] = b_dist - g_dist; - else if(in[rgb_G] == max_in) + else if(approx_eq(in[rgb_G], max_in)) out[hsl_H] = 2 + r_dist - b_dist; - else if(in[rgb_B] == max_in) + else if(approx_eq(in[rgb_B], max_in)) out[hsl_H] = 4 + g_dist - r_dist; out[hsl_H] *= 60; @@ -187,7 +189,7 @@ float p1 = 2 * in[hsl_L] - p2; - if(in[hsl_S] == 0) + if(approx_eq (in[hsl_S], 0)) out[rgb_R] = out[rgb_G] = out[rgb_B] = in[hsl_L]; else { Index: 10.232/olena/oln/makefile.src --- 10.232/olena/oln/makefile.src Thu, 09 Sep 2004 11:24:20 +0200 palma_g (oln/rOnly in 10.232(w): olena/oln/convert/float_cmp.hh /4_makefile.s 1.7 600) +++ 10.232(w)/olena/oln/makefile.src Wed, 05 Jul 2006 18:11:16 +0200 levill_r (oln/r/4_makefile.s 1.7 600) @@ -20,6 +20,7 @@ convert/abstract/conversion.hh \ convert/conversion.hh \ convert/conversion_ng_se.hh \ + convert/float_cmp.hh \ convert/force.hh \ convert/nrgbxyz.hh \ convert/rgbyiq.hh \