From d7ed4be9e1cd48f5c0c953066fdc62453d125f08 Mon Sep 17 00:00:00 2001 From: jdc Date: Tue, 19 Mar 2013 13:17:22 +0100 Subject: [PATCH] Optimization for Vibrance - Lab adjustements - CIE Colour Appearance see issue1789 --- rtengine/improcfun.cc | 23 ++++++++++++++--------- rtengine/ipvibrance.cc | 7 ++++--- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 885f5252f..2b79c5a69 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -1470,7 +1470,7 @@ if(params->colorappearance.enabled) { float HH, Lprov1, Chprov1; Lprov1=lab->L[i][j]/327.68f; Chprov1=sqrt(SQR(lab->a[i][j]/327.68f) + SQR(lab->b[i][j]/327.68f)); - HH=atan2(lab->b[i][j],lab->a[i][j]); + HH=xatan2f(lab->b[i][j],lab->a[i][j]); #ifdef _DEBUG bool neg=false; @@ -1483,8 +1483,10 @@ if(params->colorappearance.enabled) { #endif lab->L[i][j]=Lprov1*327.68f; - lab->a[i][j]=327.68f*Chprov1*cos(HH); - lab->b[i][j]=327.68f*Chprov1*sin(HH); + float2 sincosval = xsincosf(HH); + + lab->a[i][j]=327.68f*Chprov1*sincosval.y; + lab->b[i][j]=327.68f*Chprov1*sincosval.x; } } @@ -1640,7 +1642,7 @@ if((params->colorappearance.tonecie && (params->edgePreservingDecompositionUI.en float HH, Lprov1, Chprov1; Lprov1=lab->L[i][j]/327.68f; Chprov1=sqrt(SQR(lab->a[i][j]/327.68f) + SQR(lab->b[i][j]/327.68f)); - HH=atan2(lab->b[i][j],lab->a[i][j]); + HH=xatan2f(lab->b[i][j],lab->a[i][j]); #ifdef _DEBUG bool neg=false; @@ -1651,10 +1653,11 @@ if((params->colorappearance.tonecie && (params->edgePreservingDecompositionUI.en //gamut control : Lab values are in gamut Color::gamutLchonly(HH,Lprov1,Chprov1, R, G, B, wipa, highlight, 0.15f, 0.96f); #endif + float2 sincosval = xsincosf(HH); lab->L[i][j]=Lprov1*327.68f; - lab->a[i][j]=327.68f*Chprov1*cos(HH); - lab->b[i][j]=327.68f*Chprov1*sin(HH); + lab->a[i][j]=327.68f*Chprov1*sincosval.y; + lab->b[i][j]=327.68f*Chprov1*sincosval.x; } } @@ -2390,7 +2393,7 @@ void ImProcFunctions::chromiLuminanceCurve (int pW, LabImage* lold, LabImage* ln for (int j=0; jL[i][j]/327.68f; float CC=sqrt(SQR(lold->a[i][j]/327.68f) + SQR(lold->b[i][j]/327.68f)); - float HH=atan2(lold->b[i][j],lold->a[i][j]); + float HH=xatan2f(lold->b[i][j],lold->a[i][j]); float Chprov=CC; float Chprov1=CC; float memChprov=Chprov; @@ -2613,8 +2616,10 @@ void ImProcFunctions::chromiLuminanceCurve (int pW, LabImage* lold, LabImage* ln else if(fabs(correctionHue) < 0.1f) HH+=0.35f*correctlum; else if(fabs(correctionHue) < 0.015f) HH+=correctlum; // correct only if correct Munsell chroma very little. */ - lnew->a[i][j]=327.68f*Chprov*cos(HH+correctionHue);// apply Munsell - lnew->b[i][j]=327.68f*Chprov*sin(HH+correctionHue); + float2 sincosval = xsincosf(HH+correctionHue); + + lnew->a[i][j]=327.68f*Chprov*sincosval.y;// apply Munsell + lnew->b[i][j]=327.68f*Chprov*sincosval.x; } } else { diff --git a/rtengine/ipvibrance.cc b/rtengine/ipvibrance.cc index a52a0cfcf..51c14e68d 100644 --- a/rtengine/ipvibrance.cc +++ b/rtengine/ipvibrance.cc @@ -207,7 +207,7 @@ void ImProcFunctions::vibrance (LabImage* lab) { //int pos = i*width+j; float LL=lab->L[i][j]/327.68f; float CC=sqrt(SQR(lab->a[i][j]/327.68f)+ SQR(lab->b[i][j]/327.68f)); - float HH=atan2(lab->b[i][j],lab->a[i][j]); + float HH=xatan2f(lab->b[i][j],lab->a[i][j]); //double pyramid: LL and HH //I try to take into account: Munsell response (human vision) and Gamut..(less response for red): preferably using Prophoto or WideGamut //blue: -1.80 -3.14 green = 2.1 3.14 green-yellow=1.4 2.1 red:0 1.4 blue-purple:-0.7 -1.4 purple: 0 -0.7 @@ -411,8 +411,9 @@ void ImProcFunctions::vibrance (LabImage* lab) { Color::AllMunsellLch(/*lumaMuns*/false, Lprov,Lprov,HH,Chprov,memChprov,correctionHue,correctlum); #endif } - aprovn=Chprov*cos(HH+correctionHue); - bprovn=Chprov*sin(HH+correctionHue); + float2 sincosval = xsincosf(HH+correctionHue); + aprovn=Chprov*sincosval.y; + bprovn=Chprov*sincosval.x; float fyy = (0.00862069f *Lprov )+ 0.137932f; float fxx = (0.002f * aprovn) + fyy;