From 4f4e3ef7e0fd95f97202493e02749c136f41ab64 Mon Sep 17 00:00:00 2001 From: Alberto Griggio Date: Thu, 22 Feb 2018 17:45:42 +0100 Subject: [PATCH] fixed NaN generation due to unbounded processing (no 0 clipping) --- rtengine/color.cc | 2 +- rtengine/curves.h | 12 ++++++------ rtengine/improcfun.cc | 15 ++++++++------- 3 files changed, 15 insertions(+), 14 deletions(-) diff --git a/rtengine/color.cc b/rtengine/color.cc index 71fb097f6..ab9223358 100644 --- a/rtengine/color.cc +++ b/rtengine/color.cc @@ -719,7 +719,7 @@ void Color::rgb2hsv(float r, float g, float b, float &h, float &s, float &v) if (del_Max < 0.00001 && del_Max > -0.00001) { // no fabs, slow! s = 0.f; } else { - s = del_Max / var_Max; + s = del_Max / (var_Max == 0.0 ? 1.0 : var_Max); if (var_R == var_Max) { h = (var_G - var_B) / del_Max; diff --git a/rtengine/curves.h b/rtengine/curves.h index 3762b3f1a..23a2aa0c3 100644 --- a/rtengine/curves.h +++ b/rtengine/curves.h @@ -943,9 +943,9 @@ inline void StandardToneCurve::BatchApply( } #ifdef __SSE2__ - float tmpr[4]; - float tmpg[4]; - float tmpb[4]; + vfloat tmpr; + vfloat tmpg; + vfloat tmpb; float mv = lutToneCurve[MAXVALF]; for (; i + 3 < end; i += 4) { __m128 r_val = LVF(r[i]); @@ -1130,9 +1130,9 @@ inline void WeightedStdToneCurve::BatchApply(const size_t start, const size_t en const vfloat zd5v = F2V(0.5f); const vfloat zd25v = F2V(0.25f); - float tmpr[4]; - float tmpg[4]; - float tmpb[4]; + vfloat tmpr; + vfloat tmpg; + vfloat tmpb; for (; i + 3 < end; i += 4) { vfloat r_val = LIMV(LVF(r[i]), ZEROV, c65535v); diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index f21d88c66..63ceccdaa 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -178,8 +178,9 @@ void proPhotoBlue(float *rtemp, float *gtemp, float *btemp, int istart, int tH, for (int k = 0; k < 4; ++k) { float r = rtemp[ti * tileSize + tj + k]; float g = gtemp[ti * tileSize + tj + k]; - if (r == 0.0f || g == 0.0f) { - float b = btemp[ti * tileSize + tj + k]; + float b = btemp[ti * tileSize + tj + k]; + + if ((r == 0.0f || g == 0.0f) && rtengine::min(r, g, b) >= 0.f) { float h, s, v; Color::rgb2hsv (r, g, b, h, s, v); s *= 0.99f; @@ -192,9 +193,9 @@ void proPhotoBlue(float *rtemp, float *gtemp, float *btemp, int istart, int tH, for (; j < tW; j++, tj++) { float r = rtemp[ti * tileSize + tj]; float g = gtemp[ti * tileSize + tj]; + float b = btemp[ti * tileSize + tj]; - if (r == 0.0f || g == 0.0f) { - float b = btemp[ti * tileSize + tj]; + if ((r == 0.0f || g == 0.0f) && rtengine::min(r, g, b) >= 0.f) { float h, s, v; Color::rgb2hsv (r, g, b, h, s, v); s *= 0.99f; @@ -3795,9 +3796,9 @@ void ImProcFunctions::rgbProc (Imagefloat* working, LabImage* lab, PipetteBuffer } } } else { - float tmpr[4]; - float tmpg[4]; - float tmpb[4]; + vfloat tmpr; + vfloat tmpg; + vfloat tmpb; for (int i = istart, ti = 0; i < tH; i++, ti++) { int j = jstart, tj = 0;