diff --git a/rtengine/colortemp.cc b/rtengine/colortemp.cc index 17d8c5af5..d5ac4c9c7 100644 --- a/rtengine/colortemp.cc +++ b/rtengine/colortemp.cc @@ -1935,7 +1935,7 @@ void ColorTemp::initcam1float(float gamu, float yb, float pilotd, float f, float wh =( 4.0f / c ) * ( aw + 4.0f ) * pow_F( fl, 0.25f ); pfl = pow_F( fl, 0.25f ); #ifdef _DEBUG - if (settings->verbose) printf("Source float d=%f aw=%f fl=%f wh=%f\n",d,aw,fl,wh); + if (settings->verbose) printf("Source float d=%f aw=%f fl=%f wh=%f c=%f awc=%f\n",d,aw,fl,wh,c,(4.f/c)*(aw+4.f)); #endif } diff --git a/rtengine/demosaic_algos.cc b/rtengine/demosaic_algos.cc index 1caf86cc1..1f0fb89a1 100644 --- a/rtengine/demosaic_algos.cc +++ b/rtengine/demosaic_algos.cc @@ -1397,7 +1397,7 @@ void RawImageSource::lmmse_interpolate_omp(int winw, int winh) void RawImageSource::igv_interpolate(int winw, int winh) { - static const float eps=1e-5f, epssq=1e-5f; + static const float eps=1e-5f, epssq=1e-5f;//mod epssq -10f =>-5f Jacques 3/2013 to prevent artifact (divide by zero) static const int h1=1, h2=2, h3=3, h4=4, h5=5, h6=6; const int width=winw, height=winh; const int v1=1*width, v2=2*width, v3=3*width, v4=4*width, v5=5*width, v6=6*width; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 2b79c5a69..c28614d61 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -548,24 +548,61 @@ if(params->colorappearance.enabled) { if (hasColCurve1) {//curve 1 with Lightness and Brightness if (curveMode==ColorAppearanceParams::TC_MODE_LIGHT){ - float Jj=(float) Jpro*327.68; + /* float Jj=(float) Jpro*327.68; float Jold=Jj; const Lightcurve& userColCurve = static_cast(customColCurve1); userColCurve.Apply(Jj); Jj=0.7f*(Jj-Jold)+Jold;//divide sensibility + */ + float Jj=(float) Jpro*327.68f; + float Jold=Jj; + float Jold100=(float) Jpro; + float redu=25.f; + float reduc=1.f; + const Lightcurve& userColCurveJ1 = static_cast(customColCurve1); + userColCurveJ1.Apply(Jj); + if(Jj>Jold) { + if(Jj<65535.f) { + if(Jold < 327.68f*redu) Jj=0.3f*(Jj-Jold)+Jold;//divide sensibility + else { + reduc=LIM((100.f-Jold100)/(100.f-redu),0.f,1.f); + Jj=0.3f*reduc*(Jj-Jold)+Jold;//reduct sensibility in highlights + } + } + } + else if(Jj>10.f) Jj=0.8f*(Jj-Jold)+Jold; + else if (Jj>=0.f) Jj=0.90f*(Jj-Jold)+Jold;// not zero ==>artifacts + + Jpro=(double)(Jj/327.68f); t1L=true; } else if (curveMode==ColorAppearanceParams::TC_MODE_BRIGHT){ - double coef=32760./wh; - float Qq=(float) Qpro*coef; + //attention! Brightness curves are open - unlike Lightness or Lab or RGB==> rendering and algoritms will be different + float coef=((aw+4.f)*(4.f/c))/100.f; + float Qq=(float) Qpro*327.68f*(1.f/coef); + float Qold100=(float) Qpro/coef; + float Qold=Qq; - const Brightcurve& userColCurve = static_cast(customColCurve1); - userColCurve.Apply(Qq); - Qq=0.5f*(Qq-Qold)+Qold;//divide sensibility - Qpro=(double)(Qq/coef); - Jpro=(100.0* Qpro*Qpro) /(wh*wh); - t1B=true; + float redu=20.f; + float reduc=1.f; + + const Brightcurve& userColCurveB1 = static_cast(customColCurve1); + userColCurveB1.Apply(Qq); + if(Qq>Qold) { + if(Qq<65535.f) { + if(Qold < 327.68f*redu) Qq=0.25f*(Qq-Qold)+Qold;//divide sensibility + else { + reduc=LIM((100.f-Qold100)/(100.f-redu),0.f,1.f); + Qq=0.25f*reduc*(Qq-Qold)+Qold;//reduct sensibility in highlights + } + } + } + else if(Qq>10.f) Qq=0.5f*(Qq-Qold)+Qold; + else if (Qq>=0.f) Qq=0.7f*(Qq-Qold)+Qold;// not zero ==>artifacts + Qpro=(double)(Qq*(coef)/327.68f); + Jpro=100.*(Qpro*Qpro)/((4.0/c)*(4.0/c)*(aw+4.0)*(aw+4.0)); + t1B=true; } } @@ -573,22 +610,68 @@ if(params->colorappearance.enabled) { if (curveMode2==ColorAppearanceParams::TC_MODE_LIGHT){ float Jj=(float) Jpro*327.68; float Jold=Jj; + /* const Lightcurve& userColCurve = static_cast(customColCurve2); userColCurve.Apply(Jj); Jj=0.7f*(Jj-Jold)+Jold;//divide sensibility + */ + float Jold100=(float) Jpro; + float redu=25.f; + float reduc=1.f; + const Lightcurve& userColCurveJ2 = static_cast(customColCurve2); + userColCurveJ2.Apply(Jj); + if(Jj>Jold) { + if(Jj<65535.f) { + if(Jold < 327.68f*redu) Jj=0.3f*(Jj-Jold)+Jold;//divide sensibility + else { + reduc=LIM((100.f-Jold100)/(100.f-redu),0.f,1.f); + Jj=0.3f*reduc*(Jj-Jold)+Jold;//reduct sensibility in highlights + } + } + } + else if(Jj>10.f) {if(!t1L)Jj=0.8f*(Jj-Jold)+Jold;else Jj=0.4f*(Jj-Jold)+Jold;} + else if (Jj>=0.f){if(!t1L)Jj=0.90f*(Jj-Jold)+Jold;else Jj=0.5f*(Jj-Jold)+Jold;}// not zero ==>artifacts + Jpro=(double)(Jj/327.68f); t2L=true; } else if (curveMode2==ColorAppearanceParams::TC_MODE_BRIGHT){ // - double coef=32760./wh; - float Qq=(float) Qpro*coef; - float Qold = Qq; - const Brightcurve& userColCurve = static_cast(customColCurve2); - userColCurve.Apply(Qq); - Qq=0.5f*(Qq-Qold)+Qold;//divide sensibility - Qpro=(double)(Qq/coef); - Jpro=(100.0* Qpro*Qpro) /(wh*wh); + float coef=((aw+4.f)*(4.f/c))/100.f; + float Qq=(float) Qpro*327.68f*(1.f/coef); + float Qold100=(float) Qpro/coef; + + float Qold=Qq; + float redu=20.f; + float reduc=1.f; + + const Brightcurve& userColCurveB2 = static_cast(customColCurve2); + userColCurveB2.Apply(Qq); + if(Qq>Qold) { + if(Qq<65535.f) { + if(Qold < 327.68f*redu) Qq=0.25f*(Qq-Qold)+Qold;//divide sensibility + else { + reduc=LIM((100.f-Qold100)/(100.f-redu),0.f,1.f); + Qq=0.25f*reduc*(Qq-Qold)+Qold;//reduct sensibility in highlights + } + } + } + else if(Qq>10.f) Qq=0.5f*(Qq-Qold)+Qold; + else if (Qq>=0.f) Qq=0.7f*(Qq-Qold)+Qold;// not zero ==>artifacts + Qpro=(double)(Qq*(coef)/327.68f); + Jpro=100.*(Qpro*Qpro)/((4.0/c)*(4.0/c)*(aw+4.0)*(aw+4.0)); t2B=true; + + if(t1L){//to workaround the problem if we modify curve1-lightnees after curve2 brightness(the cat that bites its own tail!) in fact it's another type of curve only for this case + coef=2.f;//adapt Q to J approximation + Qq=(float) Qpro*coef; + Qold=Qq; + const Lightcurve& userColCurveJ1 = static_cast(customColCurve1); + userColCurveJ1.Apply(Qq); + Qq=0.1f*(Qq-Qold)+Qold;//approximative adaptation + Qpro=(double)(Qq/coef); + Jpro=100.*(Qpro*Qpro)/((4.0/c)*(4.0/c)*(aw+4.0)*(aw+4.0)); + } + } } @@ -1036,61 +1119,61 @@ if(params->colorappearance.enabled) { } //mean=(sum/((endh-begh)*width))/327.68f;//for Yb for all image...if one day "pipette" we can adapt Yb for each zone mean=(sum/((height)*width))/327.68f;//for Yb for all image...if one day "pipette" we can adapt Yb for each zone - if (mean<15.f) yb=3.0; - else if(mean<30.f) yb=5.0; - else if(mean<40.f) yb=10.0; - else if(mean<45.f) yb=15.0; - else if(mean<50.f) yb=18.0; - else if(mean<55.f) yb=23.0; - else if(mean<60.f) yb=30.0; - else if(mean<70.f) yb=40.0; - else if(mean<80.f) yb=60.0; - else if(mean<90.f) yb=80.0; - else yb=90.0; + if (mean<15.f) yb=3.0f; + else if(mean<30.f) yb=5.0f; + else if(mean<40.f) yb=10.0f; + else if(mean<45.f) yb=15.0f; + else if(mean<50.f) yb=18.0f; + else if(mean<55.f) yb=23.0f; + else if(mean<60.f) yb=30.0f; + else if(mean<70.f) yb=40.0f; + else if(mean<80.f) yb=60.0f; + else if(mean<90.f) yb=80.0f; + else yb=90.0f; bool ciedata=params->colorappearance.datacie; ColorTemp::temp2mulxyz (params->wb.temperature, params->wb.green, params->wb.method, Xw, Zw); //compute white Xw Yw Zw : white current WB //viewing condition for surround - if(params->colorappearance.surround=="Average") { f = 1.00; c = 0.69; nc = 1.00;f2=1.0,c2=0.69,nc2=1.0;} - else if(params->colorappearance.surround=="Dim"){ f2 = 0.9; c2 = 0.59; nc2 = 0.9;f=1.0,c=0.69,nc=1.0;} - else if(params->colorappearance.surround=="Dark"){f2 = 0.8; c2 = 0.525;nc2 = 0.8;f=1.0,c=0.69,nc=1.0;} - else if(params->colorappearance.surround=="ExtremelyDark"){f2 = 0.8; c2 = 0.41;nc2 = 0.8;f=1.0,c=0.69,nc=1.0;} + if(params->colorappearance.surround=="Average") { f = 1.00f; c = 0.69f; nc = 1.00f;f2=1.0f,c2=0.69f,nc2=1.0f;} + else if(params->colorappearance.surround=="Dim"){ f2 = 0.9f; c2 = 0.59f; nc2 = 0.9f;f=1.0f,c=0.69f,nc=1.0f;} + else if(params->colorappearance.surround=="Dark"){f2 = 0.8f; c2 = 0.525f;nc2 = 0.8f;f=1.0f,c=0.69f,nc=1.0f;} + else if(params->colorappearance.surround=="ExtremelyDark"){f2 = 0.8f; c2 = 0.41f;nc2 = 0.8f;f=1.0f,c=0.69f,nc=1.0f;} //scene condition for surround - if(params->colorappearance.surrsource==true) {f = 0.85; c = 0.55; nc = 0.85;}// if user => source image has surround very dark + if(params->colorappearance.surrsource==true) {f = 0.85f; c = 0.55f; nc = 0.85f;}// if user => source image has surround very dark //with which algorithme if (params->colorappearance.algo=="JC") alg=0; else if(params->colorappearance.algo=="JS") alg=1; else if(params->colorappearance.algo=="QM") {alg=2;algepd=true;} else if(params->colorappearance.algo=="ALL") {alg=3;algepd=true;} //settings white point of output device - or illuminant viewing - if(settings->viewingdevice==0) {xwd=96.42;ywd=100.0;zwd=82.52;}//5000K - else if(settings->viewingdevice==1) {xwd=95.68;ywd=100.0;zwd=92.15;}//5500 - else if(settings->viewingdevice==2) {xwd=95.24;ywd=100.0;zwd=100.81;}//6000 - else if(settings->viewingdevice==3) {xwd=95.04;ywd=100.0;zwd=108.88;}//6500 - else if(settings->viewingdevice==4) {xwd=109.85;ywd=100.0;zwd=35.58;}//tungsten - else if(settings->viewingdevice==5) {xwd=99.18;ywd=100.0;zwd=67.39;}//fluo F2 - else if(settings->viewingdevice==6) {xwd=95.04;ywd=100.0;zwd=108.75;}//fluo F7 - else if(settings->viewingdevice==7) {xwd=100.96;ywd=100.0;zwd=64.35;}//fluo F11 + if(settings->viewingdevice==0) {xwd=96.42f;ywd=100.0f;zwd=82.52f;}//5000K + else if(settings->viewingdevice==1) {xwd=95.68f;ywd=100.0f;zwd=92.15f;}//5500 + else if(settings->viewingdevice==2) {xwd=95.24f;ywd=100.0f;zwd=100.81f;}//6000 + else if(settings->viewingdevice==3) {xwd=95.04f;ywd=100.0f;zwd=108.88f;}//6500 + else if(settings->viewingdevice==4) {xwd=109.85f;ywd=100.0f;zwd=35.58f;}//tungsten + else if(settings->viewingdevice==5) {xwd=99.18f;ywd=100.0f;zwd=67.39f;}//fluo F2 + else if(settings->viewingdevice==6) {xwd=95.04f;ywd=100.0f;zwd=108.75f;}//fluo F7 + else if(settings->viewingdevice==7) {xwd=100.96f;ywd=100.0f;zwd=64.35f;}//fluo F11 //settings mean Luminance Y of output device or viewing - if(settings->viewingdevicegrey==0) {yb2=5.0;} - else if(settings->viewingdevicegrey==1) {yb2=10.0;} - else if(settings->viewingdevicegrey==2) {yb2=15.0;} - else if(settings->viewingdevicegrey==3) {yb2=18.0;} - else if(settings->viewingdevicegrey==4) {yb2=23.0;} - else if(settings->viewingdevicegrey==5) {yb2=30.0;} - else if(settings->viewingdevicegrey==6) {yb2=40.0;} + if(settings->viewingdevicegrey==0) {yb2=5.0f;} + else if(settings->viewingdevicegrey==1) {yb2=10.0f;} + else if(settings->viewingdevicegrey==2) {yb2=15.0f;} + else if(settings->viewingdevicegrey==3) {yb2=18.0f;} + else if(settings->viewingdevicegrey==4) {yb2=23.0f;} + else if(settings->viewingdevicegrey==5) {yb2=30.0f;} + else if(settings->viewingdevicegrey==6) {yb2=40.0f;} //La and la2 = ambiant luminosity scene and viewing la=float(params->colorappearance.adapscen); la2=float(params->colorappearance.adaplum); // level of adaptation - float deg=(params->colorappearance.degree)/100.0; - float pilot=params->colorappearance.autodegree ? 2.0 : deg; + float deg=(params->colorappearance.degree)/100.0f; + float pilot=params->colorappearance.autodegree ? 2.0f : deg; //algoritm's params float jli=params->colorappearance.jlight; @@ -1121,12 +1204,12 @@ if(params->colorappearance.enabled) { bool highlight = params->hlrecovery.enabled; //Get the value if "highlight reconstruction" is activated if(params->colorappearance.gamut==true) gamu=1;//enabled gamut control - xw=100.0*Xw; - yw=100.0*Yw; - zw=100.0*Zw; + xw=100.0f*Xw; + yw=100.0f*Yw; + zw=100.0f*Zw; float xw1,yw1,zw1,xw2,yw2,zw2; // settings of WB: scene and viewing - if(params->colorappearance.wbmodel=="RawT") {xw1=96.46;yw1=100.0;zw1=82.445;xw2=xwd;yw2=ywd;zw2=zwd;} //use RT WB; CAT 02 is used for output device (see prefreneces) + if(params->colorappearance.wbmodel=="RawT") {xw1=96.46f;yw1=100.0f;zw1=82.445f;xw2=xwd;yw2=ywd;zw2=zwd;} //use RT WB; CAT 02 is used for output device (see prefreneces) else if(params->colorappearance.wbmodel=="RawTCAT02") {xw1=xw;yw1=yw;zw1=zw;xw2=xwd;yw2=ywd;zw2=zwd;} // Settings RT WB are used for CAT02 => mix , CAT02 is use for output device (screen: D50 D65, projector: lamp, LED) see preferences float cz,wh, pfl; ColorTemp::initcam1float(gamu, yb, pilot, f, la,xw, yw, zw, n, d, nbb, ncb,cz, aw, wh, pfl, fl, c); @@ -1157,7 +1240,7 @@ if(params->colorappearance.enabled) { float b=lab->b[i][j]; float x1,y1,z1; float x,y,z; - float epsil=0.0001; + float epsil=0.0001f; //convert Lab => XYZ Color::Lab2XYZ(L, a, b, x1, y1, z1); float J, C, h, Q, M, s; @@ -1205,7 +1288,7 @@ if(params->colorappearance.enabled) { float dred=100.f;// in C mode float protect_red=80.0f; // in C mode dred = 100.0f * sqrt((dred*coe)/Qpro); - protect_red=100.0 * sqrt((protect_red*coe)/Qpro); + protect_red=100.0f * sqrt((protect_red*coe)/Qpro); int sk=0; float ko=100.f; Color::skinredfloat(Jpro, hpro, sres, Sp, dred, protect_red,sk,rstprotection,ko, spro); @@ -1235,13 +1318,13 @@ if(params->colorappearance.enabled) { if(alg!=2) Jpro=(bright_curve[(float)(Jpro*327.68f)])/327.68f;//ligthness CIECAM02 + contrast float Cp; float Sp=spro/100.0f; - parsat=1.5; + parsat=1.5f; if(schr==-100.0f) schr=-99.f; if(schr==100.0f) schr=98.f; - if(alg==3) ColorTemp::curvecolorfloat(schr, Sp , sres, parsat); else ColorTemp::curvecolorfloat(0.0, Sp , sres, parsat); //saturation + if(alg==3) ColorTemp::curvecolorfloat(schr, Sp , sres, parsat); else ColorTemp::curvecolorfloat(0.0f, Sp , sres, parsat); //saturation dred=100.f;// in C mode protect_red=80.0f; // in C mode - dred = 100.0 * sqrt((dred*coe)/Q); + dred = 100.0f * sqrt((dred*coe)/Q); protect_red=100.0f * sqrt((protect_red*coe)/Q); sk=0; Color::skinredfloat(Jpro, hpro, sres, Sp, dred, protect_red,sk,rstprotection,ko, spro); @@ -1250,7 +1333,7 @@ if(params->colorappearance.enabled) { Cp=Cpro/100.0f; parsat=1.8f;//parsat=1.5 =>saturation ; 1.8 => chroma ; 2.5 => colorfullness (personal evaluation : for not) if(chr==-100.0f) chr=-99.8f; - if(alg!=2) ColorTemp::curvecolorfloat(chr, Cp , sres, parsat);else ColorTemp::curvecolorfloat(0.0, Cp , sres, parsat); //chroma + if(alg!=2) ColorTemp::curvecolorfloat(chr, Cp , sres, parsat);else ColorTemp::curvecolorfloat(0.0f, Cp , sres, parsat); //chroma dred=55.f; protect_red=30.0f; sk=1; @@ -1263,32 +1346,49 @@ if(params->colorappearance.enabled) { if (curveMode==ColorAppearanceParams::TC_MODE_LIGHT){ float Jj=(float) Jpro*327.68f; float Jold=Jj; + float Jold100=(float) Jpro; + float redu=25.f; + float reduc=1.f; const Lightcurve& userColCurveJ1 = static_cast(customColCurve1); userColCurveJ1.Apply(Jj); - Jj=0.7f*(Jj-Jold)+Jold;//divide sensibility - Jpro=(float)(Jj/327.68f); - - /* float coef=1.0;//32760.f/wh; - float Qq=(float) Qpro*coef; - float Qold=Qq; - const Lightcurve& userColCurveJ1 = static_cast(customColCurve1); - userColCurveJ1.Apply(Qq); - Qq=0.2*(Qq-Qold)+Qold;//divide sensibility - Qpro=(float)(Qq/coef); - Jpro=(100.0f* Qpro*Qpro) /(wh*wh); - */ - + if(Jj>Jold) { + if(Jj<65535.f) { + if(Jold < 327.68f*redu) Jj=0.3f*(Jj-Jold)+Jold;//divide sensibility + else { + reduc=LIM((100.f-Jold100)/(100.f-redu),0.f,1.f); + Jj=0.3f*reduc*(Jj-Jold)+Jold;//reduct sensibility in highlights + } + } + } + else if(Jj>10.f) Jj=0.8f*(Jj-Jold)+Jold; + else if (Jj>=0.f) Jj=0.90f*(Jj-Jold)+Jold;// not zero ==>artifacts + Jpro=(float)(Jj/327.68f); t1L=true; } else if (curveMode==ColorAppearanceParams::TC_MODE_BRIGHT){ - - float coef=32760.f/wh; - float Qq=(float) Qpro*coef; + //attention! Brightness curves are open - unlike Lightness or Lab or RGB==> rendering and algoritms will be different + float coef=((aw+4.f)*(4.f/c))/100.f; + float Qq=(float) Qpro*327.68f*(1.f/coef); + float Qold100=(float) Qpro/coef; + float Qold=Qq; + float redu=20.f; + float reduc=1.f; + const Brightcurve& userColCurveB1 = static_cast(customColCurve1); userColCurveB1.Apply(Qq); - Qq=0.3f*(Qq-Qold)+Qold;//divide sensibility - Qpro=(float)(Qq/coef); + if(Qq>Qold) { + if(Qq<65535.f) { + if(Qold < 327.68f*redu) Qq=0.25f*(Qq-Qold)+Qold;//divide sensibility + else { + reduc=LIM((100.f-Qold100)/(100.f-redu),0.f,1.f); + Qq=0.25f*reduc*(Qq-Qold)+Qold;//reduct sensibility in highlights + } + } + } + else if(Qq>10.f) Qq=0.5f*(Qq-Qold)+Qold; + else if (Qq>=0.f) Qq=0.7f*(Qq-Qold)+Qold;// not zero ==>artifacts + Qpro=(float)(Qq*(coef)/327.68f); Jpro=100.f*(Qpro*Qpro)/((4.0f/c)*(4.0f/c)*(aw+4.0f)*(aw+4.0f)); t1B=true; } @@ -1298,20 +1398,48 @@ if(params->colorappearance.enabled) { if (curveMode2==ColorAppearanceParams::TC_MODE_LIGHT){ float Jj=(float) Jpro*327.68f; float Jold=Jj; + float Jold100=(float) Jpro; + float redu=25.f; + float reduc=1.f; const Lightcurve& userColCurveJ2 = static_cast(customColCurve2); userColCurveJ2.Apply(Jj); - Jj=0.7f*(Jj-Jold)+Jold;//divide sensibility + if(Jj>Jold) { + if(Jj<65535.f) { + if(Jold < 327.68f*redu) Jj=0.3f*(Jj-Jold)+Jold;//divide sensibility + else { + reduc=LIM((100.f-Jold100)/(100.f-redu),0.f,1.f); + Jj=0.3f*reduc*(Jj-Jold)+Jold;//reduct sensibility in highlights + } + } + } + else if(Jj>10.f) {if(!t1L)Jj=0.8f*(Jj-Jold)+Jold;else Jj=0.4f*(Jj-Jold)+Jold;} + else if (Jj>=0.f){if(!t1L)Jj=0.90f*(Jj-Jold)+Jold;else Jj=0.5f*(Jj-Jold)+Jold;}// not zero ==>artifacts Jpro=(float)(Jj/327.68f); t2L=true; } else if (curveMode2==ColorAppearanceParams::TC_MODE_BRIGHT){ // - float coef=32760.f/wh; - float Qq=(float) Qpro*coef; - float Qold = Qq; + float coef=((aw+4.f)*(4.f/c))/100.f; + float Qq=(float) Qpro*327.68f*(1.f/coef); + float Qold100=(float) Qpro/coef; + + float Qold=Qq; + float redu=20.f; + float reduc=1.f; + const Brightcurve& userColCurveB2 = static_cast(customColCurve2); userColCurveB2.Apply(Qq); - Qq=0.3f*(Qq-Qold)+Qold;//divide sensibility - Qpro=(float)(Qq/coef); + if(Qq>Qold) { + if(Qq<65535.f) { + if(Qold < 327.68f*redu) Qq=0.25f*(Qq-Qold)+Qold;//divide sensibility + else { + reduc=LIM((100.f-Qold100)/(100.f-redu),0.f,1.f); + Qq=0.25f*reduc*(Qq-Qold)+Qold;//reduct sensibility in highlights + } + } + } + else if(Qq>10.f) Qq=0.5f*(Qq-Qold)+Qold; + else if (Qq>=0.f) Qq=0.7f*(Qq-Qold)+Qold;// not zero ==>artifacts + Qpro=(float)(Qq*(coef)/327.68f); Jpro=100.f*(Qpro*Qpro)/((4.0f/c)*(4.0f/c)*(aw+4.0f)*(aw+4.0f)); t2B=true; @@ -1321,10 +1449,11 @@ if(params->colorappearance.enabled) { Qold=Qq; const Lightcurve& userColCurveJ1 = static_cast(customColCurve1); userColCurveJ1.Apply(Qq); - Qq=0.15f*(Qq-Qold)+Qold;//adaptation approx... + Qq=0.05f*(Qq-Qold)+Qold;//approximative adaptation Qpro=(float)(Qq/coef); Jpro=100.f*(Qpro*Qpro)/((4.0f/c)*(4.0f/c)*(aw+4.0f)*(aw+4.0f)); } + } } @@ -1341,7 +1470,6 @@ if(params->colorappearance.enabled) { float sk=1; float ko=1.f/coef; Color::skinredfloat(Jpro, hpro, Cc, Ccold, dred, protect_red,sk,rstprotection,ko, Cpro); - // Cpro=Cc/coef; c1C=1; } else if (curveMode3==ColorAppearanceParams::TC_MODE_SATUR){ // @@ -1355,12 +1483,12 @@ if(params->colorappearance.enabled) { float coe=pow_F(fl,0.25f); float dred=100.f;// in C mode float protect_red=80.0f; // in C mode - dred = 100.0 * sqrt((dred*coe)/Qpro); - protect_red=100.0 * sqrt((protect_red*coe)/Qpro); + dred = 100.0f * sqrt((dred*coe)/Qpro); + protect_red=100.0f * sqrt((protect_red*coe)/Qpro); int sk=0; float ko=1.f/coef; Color::skinredfloat(Jpro, hpro, Ss, Sold, dred, protect_red,sk,rstprotection,ko, spro); - Qpro= ( 4.0 / c ) * sqrt( Jpro / 100.0 ) * ( aw + 4.0 ) ; + Qpro= ( 4.0f / c ) * sqrt( Jpro / 100.0f ) * ( aw + 4.0f ) ; Cpro=(spro*spro*Qpro)/(10000.0f); c1s=1; @@ -1385,7 +1513,6 @@ if(params->colorappearance.enabled) { } } //to retrieve the correct values of variables - // if(t2B && t1B) Jpro=(100.0f* Qpro*Qpro) /(wh*wh);// for brightness curve if(c1s==1) { Qpro= ( 4.0f / c ) * sqrt( Jpro / 100.0f ) * ( aw + 4.0f ) ;//for saturation curve @@ -1401,22 +1528,17 @@ if(params->colorappearance.enabled) { s=spro; if(params->colorappearance.tonecie || settings->autocielab){//use pointer for tonemapping with CIECAM and also sharpening , defringe, contrast detail - // if(params->colorappearance.tonecie || params->colorappearance.sharpcie){//use pointer for tonemapping with CIECAM and also sharpening , defringe, contrast detail float Qred= ( 4.0f / c) * ( aw + 4.0f );//estimate Q max if J=100.0 ncie->Q_p[i][j]=(float)Q+epsil;//epsil to avoid Q=0 ncie->M_p[i][j]=(float)M+epsil; ncie->J_p[i][j]=(float)J+epsil; ncie->h_p[i][j]=(float)h; ncie->C_p[i][j]=(float)C+epsil; - // ncie->s_p[i][j]=(float)s; ncie->sh_p[i][j]=(float) 32768.f*(( 4.0f / c )*sqrt( J / 100.0f ) * ( aw + 4.0f ))/Qred ; - // ncie->ch_p[i][j]=(float) 327.68*C; if(ncie->Q_p[i][j]Q_p[i][j];//minima if(ncie->Q_p[i][j]>maxQ) maxQ=ncie->Q_p[i][j];//maxima } if(!params->colorappearance.tonecie || !settings->autocielab || !params->edgePreservingDecompositionUI.enabled){ - // if(!params->edgePreservingDecompositionUI.enabled || !params->colorappearance.tonecie || !settings->autocielab){ - // if(!params->edgePreservingDecompositionUI.enabled || !params->colorappearance.tonecie || !params->colorappearance.sharpcie){ int posl, posc; float brli=327.f; float chsacol=327.f; @@ -1427,7 +1549,6 @@ if(params->colorappearance.enabled) { if (curveMode3==ColorAppearanceParams::TC_MODE_CHROMA) {chsacol=327.f;colch=0;} else if(curveMode3==ColorAppearanceParams::TC_MODE_SATUR) {chsacol=450.0f;colch=1;} else if(curveMode3==ColorAppearanceParams::TC_MODE_COLORF) {chsacol=327.0f;colch=2;} -// if(!params->colorappearance.tonecie || !settings->autocielab || !params->edgePreservingDecompositionUI.enabled ){ if(ciedata) { // Data for J Q M s and C histograms @@ -1448,7 +1569,6 @@ if(params->colorappearance.enabled) { } float xx,yy,zz; //process normal==> viewing - //float nj, nbbj, ncbj, flj, czj, dj, awj; ColorTemp::jch2xyz_ciecam02float( xx, yy, zz, J, C, h, @@ -1495,9 +1615,6 @@ if(params->colorappearance.enabled) { // End of parallelization if(!params->colorappearance.tonecie || !settings->autocielab){//normal -//if(!params->edgePreservingDecompositionUI.enabled || !params->colorappearance.tonecie || !settings->autocielab){//normal -//if(!params->edgePreservingDecompositionUI.enabled || !params->colorappearance.tonecie || !params->colorappearance.sharpcie){//normal - if(ciedata) { //update histogram J if(pW!=1){//only with improccoordinator @@ -1531,7 +1648,6 @@ if(!params->colorappearance.tonecie || !settings->autocielab){//normal #endif if(settings->autocielab) { -//if(params->colorappearance.sharpcie) { //all this treatments reduce artefacts, but can leed to slighty different results if(params->defringe.enabled) if(execsharp) ImProcFunctions::defringecam (ncie);//defringe adapted to CIECAM @@ -1584,18 +1700,17 @@ if((params->colorappearance.tonecie && (params->edgePreservingDecompositionUI.en #pragma omp for schedule(dynamic, 10) #endif for (int i=0; iedgePreservingDecompositionUI.enabled) ncie->J_p[i][j]=(100.0f* ncie->Q_p[i][j]*ncie->Q_p[i][j])/(w_h*w_h); ncie->C_p[i][j] =(ncie->M_p[i][j])/co_e; //show histogram in CIECAM mode (Q,J, M,s,C) int posl, posc; - float brli=327.; - float chsacol=327.; + float brli=327.f; + float chsacol=327.f; int libr=0; int colch=0; float sa_t;