From bc856c23773e74e9ff056dd62d405d557bd563bd Mon Sep 17 00:00:00 2001 From: Ingo Date: Wed, 28 Jan 2015 13:18:01 +0100 Subject: [PATCH] Division by zero in ciecam02, Issue 2646 --- rtengine/colortemp.cc | 1 + rtengine/improccoordinator.cc | 4 ++-- rtengine/improcfun.cc | 9 +++++---- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 92c6f2446..268915ee8 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -2131,6 +2131,7 @@ void ColorTemp::xyz2jchqms_ciecam02float( float &J, float &C, float &h, float &Q Q = wh * J; J *= J * 100.0f; M = C * pfl; + Q = (Q == 0.f ? 0.0001f : Q); // avoid division by zero s = 100.0f * sqrtf( M / Q ); h = (myh * 180.f) / (float)M_PI; diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index c805d240e..cb25ec8ee 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -620,9 +620,9 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) { ncie = new CieImage (pW, pH); if (!CAMBrightCurveJ && (params.colorappearance.algo=="JC" || params.colorappearance.algo=="JS" || params.colorappearance.algo=="ALL")) - CAMBrightCurveJ(65536,0); + CAMBrightCurveJ(32768,0); if (!CAMBrightCurveQ && (params.colorappearance.algo=="QM" || params.colorappearance.algo=="ALL")) - CAMBrightCurveQ(65536,0); + CAMBrightCurveQ(32768,0); if(settings->ciecamfloat){ ipf.ciecam_02float (ncie, float(adap), begh, endh, pW, 2, nprevl, ¶ms, customColCurve1,customColCurve2,customColCurve3, histLCAM, histCCAM, CAMBrightCurveJ, CAMBrightCurveQ, CAMMean, 5, 1, execsharp, d, scale, 1); if(params.colorappearance.autodegree && acListener && params.colorappearance.enabled) acListener->autoCamChanged(100.*(double)d); diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index b223251dd..f54be0903 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -1365,7 +1365,7 @@ if(params->colorappearance.enabled) { //evaluate lightness, contrast if (needJ) { if (!CAMBrightCurveJ) { - CAMBrightCurveJ(65536,0); + CAMBrightCurveJ(32768,0); CAMBrightCurveJ.dirty = false; } float jli=params->colorappearance.jlight; @@ -1374,7 +1374,7 @@ if(params->colorappearance.enabled) { } if (needQ) { if (!CAMBrightCurveQ) { - CAMBrightCurveQ(65536,0); + CAMBrightCurveQ(32768,0); CAMBrightCurveQ.clear(); CAMBrightCurveQ.dirty = false; } @@ -1497,8 +1497,8 @@ if(settings->viewinggreySc==1) yb=18.0f;//fixed else if(alg==3 || alg==0 || alg==2) { if(alg==3 || alg==2) { float coef=32760.f/wh; - if(Qpro*coef > 32767.0f) - Qpro=(CAMBrightCurveQ[(float)32767.0f])/coef;//brightness and contrast + if(Qpro*coef >= 32767.0f) + Qpro=(CAMBrightCurveQ[32767])/coef;//brightness and contrast else Qpro=(CAMBrightCurveQ[(float)(Qpro*coef)])/coef;//brightness and contrast } @@ -1512,6 +1512,7 @@ if(settings->viewinggreySc==1) yb=18.0f;//fixed Color::skinredfloat(Jpro, hpro, sres, Mp, dred, protect_red,0,rstprotection,100.f, Mpro); Jpro = SQR((10.f*Qpro)/wh); Cpro= Mpro/coe; + Qpro = (Qpro == 0.f ? epsil : Qpro); // avoid division by zero spro = 100.0f * sqrtf( Mpro / Qpro ); if(alg!=2) { if(Jpro > 99.9f)