Fix H clamping for very small negative values.
authorVincent Rabaud <vrabaud@google.com>
Mon, 15 Nov 2021 12:09:02 +0000 (13:09 +0100)
committerVincent Rabaud <vrabaud@google.com>
Fri, 19 Nov 2021 15:34:09 +0000 (16:34 +0100)
In case of very small negative h (e.g. -1e-40), with the current implementation,
you will go through the first condition and end up with h = 6.f, and will miss
the second condition.

modules/imgproc/src/color_hsv.simd.hpp

index 7501f4b..b1eb50d 100644 (file)
@@ -955,12 +955,11 @@ struct HLS2RGB_f
                 float p1 = 2*l - p2;
 
                 h *= hscale;
-                if( h < 0 )
-                    do h += 6; while( h < 0 );
-                else if( h >= 6 )
-                    do h -= 6; while( h >= 6 );
+                // We need both loops to clamp (e.g. for h == -1e-40).
+                while( h < 0 ) h += 6;
+                while( h >= 6 ) h -= 6;
 
-                assert( 0 <= h && h < 6 );
+                CV_DbgAssert( 0 <= h && h < 6 );
                 sector = cvFloor(h);
                 h -= sector;