iplocallab.cc: further cleanups

This commit is contained in:
Ingo Weyrich 2020-06-08 15:40:09 +02:00
parent 15ddc2dc2f
commit 79549dc287
2 changed files with 115 additions and 164 deletions

View File

@ -317,7 +317,7 @@ public:
const LocwavCurve& loccomprewavCurve, bool loccomprewavutili, const LocwavCurve& loccomprewavCurve, bool loccomprewavutili,
const LocwavCurve& locwavCurveden, bool locwavdenutili, const LocwavCurve& locwavCurveden, bool locwavdenutili,
const LocwavCurve& locedgwavCurve, bool locedgwavutili, const LocwavCurve& locedgwavCurve, bool locedgwavutili,
bool LHutili, bool HHutili, const LUTf& cclocalcurve, bool localcutili, LUTf& rgblocalcurve, bool localrgbutili, bool localexutili, const LUTf& exlocalcurve, const LUTf& hltonecurveloc, const LUTf& shtonecurveloc, const LUTf& tonecurveloc, const LUTf& lightCurveloc, bool LHutili, bool HHutili, const LUTf& cclocalcurve, bool localcutili, const LUTf& rgblocalcurve, bool localrgbutili, bool localexutili, const LUTf& exlocalcurve, const LUTf& hltonecurveloc, const LUTf& shtonecurveloc, const LUTf& tonecurveloc, const LUTf& lightCurveloc,
double& huerefblur, double &chromarefblur, double& lumarefblur, double &hueref, double &chromaref, double &lumaref, double &sobelref, int &lastsav, double& huerefblur, double &chromarefblur, double& lumarefblur, double &hueref, double &chromaref, double &lumaref, double &sobelref, int &lastsav,
bool prevDeltaE, int llColorMask, int llColorMaskinv, int llExpMask, int llExpMaskinv, int llSHMask, int llSHMaskinv, int llvibMask, int lllcMask, int llsharMask, int llcbMask, int llretiMask, int llsoftMask, int lltmMask, int llblMask, bool prevDeltaE, int llColorMask, int llColorMaskinv, int llExpMask, int llExpMaskinv, int llSHMask, int llSHMaskinv, int llvibMask, int lllcMask, int llsharMask, int llcbMask, int llretiMask, int llsoftMask, int lltmMask, int llblMask,
float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax); float &minCD, float &maxCD, float &mini, float &maxi, float &Tmean, float &Tsigma, float &Tmin, float &Tmax);

View File

@ -10145,7 +10145,7 @@ void ImProcFunctions::Lab_Local(
const LocwavCurve& loccomprewavCurve, bool loccomprewavutili, const LocwavCurve& loccomprewavCurve, bool loccomprewavutili,
const LocwavCurve& locwavCurveden, bool locwavdenutili, const LocwavCurve& locwavCurveden, bool locwavdenutili,
const LocwavCurve& locedgwavCurve, bool locedgwavutili, const LocwavCurve& locedgwavCurve, bool locedgwavutili,
bool LHutili, bool HHutili, const LUTf& cclocalcurve, bool localcutili, LUTf& rgblocalcurve, bool localrgbutili, bool localexutili, const LUTf& exlocalcurve, const LUTf& hltonecurveloc, const LUTf& shtonecurveloc, const LUTf& tonecurveloc, const LUTf& lightCurveloc, bool LHutili, bool HHutili, const LUTf& cclocalcurve, bool localcutili, const LUTf& rgblocalcurve, bool localrgbutili, bool localexutili, const LUTf& exlocalcurve, const LUTf& hltonecurveloc, const LUTf& shtonecurveloc, const LUTf& tonecurveloc, const LUTf& lightCurveloc,
double& huerefblur, double& chromarefblur, double& lumarefblur, double& hueref, double& chromaref, double& lumaref, double& sobelref, int &lastsav, double& huerefblur, double& chromarefblur, double& lumarefblur, double& hueref, double& chromaref, double& lumaref, double& sobelref, int &lastsav,
bool prevDeltaE, int llColorMask, int llColorMaskinv, int llExpMask, int llExpMaskinv, int llSHMask, int llSHMaskinv, int llvibMask, int lllcMask, int llsharMask, int llcbMask, int llretiMask, int llsoftMask, int lltmMask, int llblMask, bool prevDeltaE, int llColorMask, int llColorMaskinv, int llExpMask, int llExpMaskinv, int llSHMask, int llSHMaskinv, int llvibMask, int lllcMask, int llsharMask, int llcbMask, int llretiMask, int llsoftMask, int lltmMask, int llblMask,
float& minCD, float& maxCD, float& mini, float& maxi, float& Tmean, float& Tsigma, float& Tmin, float& Tmax float& minCD, float& maxCD, float& mini, float& maxi, float& Tmean, float& Tsigma, float& Tmin, float& Tmax
@ -14195,65 +14195,49 @@ void ImProcFunctions::Lab_Local(
if (rgblocalcurve && localrgbutili && lp.qualcurvemet != 0) { if (rgblocalcurve && localrgbutili && lp.qualcurvemet != 0) {
usergb = true; usergb = true;
Imagefloat *tmpImage = new Imagefloat(bfw, bfh); const std::unique_ptr<Imagefloat> tmpImage(new Imagefloat(bfw, bfh));
float *rtemp = new float[bfw * bfh]; lab2rgb(*buftemp, *(tmpImage.get()), params->icm.workingProfile);
float *gtemp = new float[bfw * bfh];
float *btemp = new float[bfw * bfh];
lab2rgb(*buftemp, *tmpImage, params->icm.workingProfile);
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16)
#endif #endif
for (int y = 0; y < bfh; y++) for (int y = 0; y < bfh; y++)
for (int x = 0; x < bfw; x++) { for (int x = 0; x < bfw; x++) {
rtemp[y * bfw + x] = tmpImage->r(y, x);
gtemp[y * bfw + x] = tmpImage->g(y, x);
btemp[y * bfw + x] = tmpImage->b(y, x);
//std //std
if (tonemod == 0) { if (tonemod == 0) {
curves::setLutVal(rgblocalcurve, rtemp[y * bfw + x], gtemp[y * bfw + x], btemp[y * bfw + x]); curves::setLutVal(rgblocalcurve, tmpImage->r(y, x), tmpImage->g(y, x), tmpImage->b(y, x));
} else { } else {
float r = CLIP(rtemp[y * bfw + x]); float r = CLIP(tmpImage->r(y, x));
float g = CLIP(gtemp[y * bfw + x]); float g = CLIP(tmpImage->g(y, x));
float b = CLIP(btemp[y * bfw + x]); float b = CLIP(tmpImage->b(y, x));
//weightstd if (tonemod == 1) { // weightstd
if (tonemod == 1) { const float r1 = rgblocalcurve[r];
float r1 = rgblocalcurve[r]; const float g1 = triangle(r, r1, g);
float g1 = triangle(r, r1, g); const float b1 = triangle(r, r1, b);
float b1 = triangle(r, r1, b);
float g2 = rgblocalcurve[g]; const float g2 = rgblocalcurve[g];
float r2 = triangle(g, g2, r); const float r2 = triangle(g, g2, r);
float b2 = triangle(g, g2, b); const float b2 = triangle(g, g2, b);
float b3 = rgblocalcurve[b]; const float b3 = rgblocalcurve[b];
float r3 = triangle(b, b3, r); const float r3 = triangle(b, b3, r);
float g3 = triangle(b, b3, g); const float g3 = triangle(b, b3, g);
r = CLIP<float>(r1 * 0.50f + r2 * 0.25f + r3 * 0.25f); r = CLIP(r1 * 0.50f + r2 * 0.25f + r3 * 0.25f);
g = CLIP<float> (g1 * 0.25f + g2 * 0.50f + g3 * 0.25f); g = CLIP(g1 * 0.25f + g2 * 0.50f + g3 * 0.25f);
b = CLIP<float> (b1 * 0.25f + b2 * 0.25f + b3 * 0.50f); b = CLIP(b1 * 0.25f + b2 * 0.25f + b3 * 0.50f);
} } else if (tonemod == 2) { // Luminance
//Luminance
if (tonemod == 2) {
float currLuminance = r * 0.2126729f + g * 0.7151521f + b * 0.0721750f; float currLuminance = r * 0.2126729f + g * 0.7151521f + b * 0.0721750f;
const float newLuminance = rgblocalcurve[currLuminance]; const float newLuminance = rgblocalcurve[currLuminance];
currLuminance = currLuminance == 0.f ? 0.00001f : currLuminance; currLuminance = currLuminance == 0.f ? 0.00001f : currLuminance;
const float coef = newLuminance / currLuminance; const float coef = newLuminance / currLuminance;
r = LIM<float> (r * coef, 0.f, 65535.f); r = LIM(r * coef, 0.f, 65535.f);
g = LIM<float> (g * coef, 0.f, 65535.f); g = LIM(g * coef, 0.f, 65535.f);
b = LIM<float> (b * coef, 0.f, 65535.f); b = LIM(b * coef, 0.f, 65535.f);
} } else if (tonemod == 3) { // Film like Adobe
//Film like Adobe
if (tonemod == 3) {
if (r >= g) { if (r >= g) {
if (g > b) { if (g > b) {
rgbtone(r, g, b, rgblocalcurve); // Case 1: r >= g > b rgbtone(r, g, b, rgblocalcurve); // Case 1: r >= g > b
@ -14277,28 +14261,17 @@ void ImProcFunctions::Lab_Local(
} }
} }
setUnlessOOG(tmpImage->r(y, x), tmpImage->g(y, x), tmpImage->b(y, x), r, g, b);
setUnlessOOG(rtemp[y * bfw + x], gtemp[y * bfw + x], btemp[y * bfw + x], r, g, b); }
} }
rgb2lab(*(tmpImage.get()), *buftemp, params->icm.workingProfile);
tmpImage->r(y, x) = rtemp[y * bfw + x];
tmpImage->g(y, x) = gtemp[y * bfw + x];
tmpImage->b(y, x) = btemp[y * bfw + x];
}
rgb2lab(*tmpImage, *buftemp, params->icm.workingProfile);
delete tmpImage;
delete [] rtemp;
delete [] gtemp;
delete [] btemp;
// end rgb curves // end rgb curves
} }
if (usergb && spez) {//special use of rgb curves ex : negative if (usergb && spez) {//special use of rgb curves ex : negative
const float achm = lp.trans / 100.f;
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16)
#endif #endif
@ -14310,7 +14283,6 @@ void ImProcFunctions::Lab_Local(
const int lox = x + xstart + cx; const int lox = x + xstart + cx;
int zone; int zone;
float localFactor = 1.f; float localFactor = 1.f;
const float achm = (float)lp.trans / 100.f;
if (lp.shapmet == 0) { if (lp.shapmet == 0) {
calcTransition(lox, loy, achm, lp, zone, localFactor); calcTransition(lox, loy, achm, lp, zone, localFactor);
@ -14325,7 +14297,6 @@ void ImProcFunctions::Lab_Local(
} }
} }
} }
} }
//others curves //others curves
@ -14343,15 +14314,15 @@ void ImProcFunctions::Lab_Local(
for (int i = 0; i < 500; i++) { for (int i = 0; i < 500; i++) {
if (lochhCurve[i] != 0.5) { if (lochhCurve[i] != 0.5) {
HHcurve = true; HHcurve = true;
break;
} }
} }
} }
float kd = 1.f;//correction to ctoning const float kd = 10.f * 0.01f * lp.strengrid;//correction to ctoning
kd = 10.f * 0.01f * lp.strengrid;
//chroma slider with curve instead of linear //chroma slider with curve instead of linear
float satreal = lp.chro; const float satreal = lp.chro;
DiagonalCurve color_satur({ DiagonalCurve color_satur({
DCT_NURBS, DCT_NURBS,
@ -14370,40 +14341,33 @@ void ImProcFunctions::Lab_Local(
}); });
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16) if (multiThread)
#endif #endif
for (int ir = 0; ir < bfh; ir++) {
for (int ir = 0; ir < bfh; ir++)
for (int jr = 0; jr < bfw; jr++) { for (int jr = 0; jr < bfw; jr++) {
float bufcolcalca = origptr->a[ir][jr]; float bufcolcalca = origptr->a[ir][jr];
float bufcolcalcb = origptr->b[ir][jr]; float bufcolcalcb = origptr->b[ir][jr];
float bufcolcalcL = origptr->L[ir][jr]; float bufcolcalcL = origptr->L[ir][jr];
if (lp.chro != 0.f) {//slider chroma with curve DCT_NURBS if (lp.chro != 0.f) {//slider chroma with curve DCT_NURBS
const float Chprov = std::sqrt(SQR(bufcolcalca) + SQR(bufcolcalcb)); float Chprov = std::sqrt(SQR(bufcolcalca) + SQR(bufcolcalcb));
float chp = Chprov;
float2 sincosval; float2 sincosval;
sincosval.y = Chprov == 0.0f ? 1.f : bufcolcalca / Chprov; sincosval.y = Chprov == 0.0f ? 1.f : bufcolcalca / Chprov;
sincosval.x = Chprov == 0.0f ? 0.f : bufcolcalcb / Chprov; sincosval.x = Chprov == 0.0f ? 0.f : bufcolcalcb / Chprov;
// 35000 must be globally good, more than 32768...and less than !! to avoid calculation min max
if (lp.chro > 0.f) { if (lp.chro > 0.f) {
float buf = LIM01(chp / 35000.f);//35000 must be globaly good, more than 32768...anf les than !! to avoid calculation min max Chprov = color_satur.getVal(LIM01(Chprov / 35000.f)) * 35000.f;
buf = color_satur.getVal(buf);
buf *= 35000.f;
chp = buf;
} else { } else {
float buf = LIM01(chp / 35000.f); Chprov = color_saturmoins.getVal(LIM01(Chprov / 35000.f)) * 35000.f;
buf = color_saturmoins.getVal(buf);
buf *= 35000.f;
chp = buf;
} }
if (lp.chro == -100.f) { if (lp.chro == -100.f) {
chp = 0.f; Chprov = 0.f;
} }
bufcolcalca = chp * sincosval.y; bufcolcalca = Chprov * sincosval.y;
bufcolcalcb = chp * sincosval.x; bufcolcalcb = Chprov * sincosval.x;
} }
if (cclocalcurve && lp.qualcurvemet != 0 && localcutili) { // C=f(C) curve if (cclocalcurve && lp.qualcurvemet != 0 && localcutili) { // C=f(C) curve
@ -14441,7 +14405,6 @@ void ImProcFunctions::Lab_Local(
bufcolcalcb = chromat * sincosval.x; bufcolcalcb = chromat * sincosval.x;
} }
if (lp.ligh != 0.f || lp.cont != 0) {//slider luminance or slider contrast with curve if (lp.ligh != 0.f || lp.cont != 0) {//slider luminance or slider contrast with curve
calclight(bufcolcalcL, bufcolcalcL, lightCurveloc); calclight(bufcolcalcL, bufcolcalcL, lightCurveloc);
} }
@ -14485,7 +14448,7 @@ void ImProcFunctions::Lab_Local(
bufcolfin->a[ir][jr] = bufcolcalca; bufcolfin->a[ir][jr] = bufcolcalca;
bufcolfin->b[ir][jr] = bufcolcalcb; bufcolfin->b[ir][jr] = bufcolcalcb;
} }
}
if (HHcurve && ctoning) {//not use ctoning and H(H) simultaneous but priority to ctoning if (HHcurve && ctoning) {//not use ctoning and H(H) simultaneous but priority to ctoning
HHcurve = false; HHcurve = false;
@ -14493,9 +14456,8 @@ void ImProcFunctions::Lab_Local(
if (!execcolor) {//if we don't use color and light sliders, curves except RGB if (!execcolor) {//if we don't use color and light sliders, curves except RGB
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16) if (multiThread)
#endif #endif
for (int ir = 0; ir < bfh; ir++) for (int ir = 0; ir < bfh; ir++)
for (int jr = 0; jr < bfw; jr++) { for (int jr = 0; jr < bfw; jr++) {
bufcolfin->L[ir][jr] = origptr->L[ir][jr]; bufcolfin->L[ir][jr] = origptr->L[ir][jr];
@ -14512,9 +14474,8 @@ void ImProcFunctions::Lab_Local(
const std::unique_ptr<LabImage> bufreser(new LabImage(bfw, bfh)); const std::unique_ptr<LabImage> bufreser(new LabImage(bfw, bfh));
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16) if (multiThread)
#endif #endif
for (int y = 0; y < bfh ; y++) { for (int y = 0; y < bfh ; y++) {
for (int x = 0; x < bfw; x++) { for (int x = 0; x < bfw; x++) {
lumreserv[y][x] = 32768.f - reserved->L[y + ystart][x + xstart]; lumreserv[y][x] = 32768.f - reserved->L[y + ystart][x + xstart];
@ -14530,53 +14491,50 @@ void ImProcFunctions::Lab_Local(
bufcolreserv->L[y][x] = lastorig->L[y + ystart][x + xstart]; bufcolreserv->L[y][x] = lastorig->L[y + ystart][x + xstart];
bufcolreserv->a[y][x] = lastorig->a[y + ystart][x + xstart]; bufcolreserv->a[y][x] = lastorig->a[y + ystart][x + xstart];
bufcolreserv->b[y][x] = lastorig->b[y + ystart][x + xstart]; bufcolreserv->b[y][x] = lastorig->b[y + ystart][x + xstart];
} else if (lp.mergemet == 4) { } else if (lp.mergemet == 4 && ctoningmerg) {
if (ctoningmerg) {
bufcolreserv->L[y][x] = merlucol * 327.68f; bufcolreserv->L[y][x] = merlucol * 327.68f;
bufcolreserv->a[y][x] = 9.f * scaledirect * a_scalemerg; bufcolreserv->a[y][x] = 9.f * scaledirect * a_scalemerg;
bufcolreserv->b[y][x] = 9.f * scaledirect * b_scalemerg; bufcolreserv->b[y][x] = 9.f * scaledirect * b_scalemerg;
} }
} }
} }
}
if (lp.strcol != 0.f) { if (lp.strcol != 0.f) {
struct grad_params gp; struct grad_params gp;
calclocalGradientParams(lp, gp, ystart, xstart, bfw, bfh, 3); calclocalGradientParams(lp, gp, ystart, xstart, bfw, bfh, 3);
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16) if (multiThread)
#endif #endif
for (int ir = 0; ir < bfh; ir++) {
for (int ir = 0; ir < bfh; ir++)
for (int jr = 0; jr < bfw; jr++) { for (int jr = 0; jr < bfw; jr++) {
const float corrFactor = ImProcFunctions::calcGradientFactor(gp, jr, ir); const float corrFactor = ImProcFunctions::calcGradientFactor(gp, jr, ir);
bufcolfin->L[ir][jr] *= corrFactor; bufcolfin->L[ir][jr] *= corrFactor;
} }
} }
}
if (lp.strcolab != 0.f) { if (lp.strcolab != 0.f) {
struct grad_params gpab; struct grad_params gpab;
calclocalGradientParams(lp, gpab, ystart, xstart, bfw, bfh, 4); calclocalGradientParams(lp, gpab, ystart, xstart, bfw, bfh, 4);
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16) if (multiThread)
#endif #endif
for (int ir = 0; ir < bfh; ir++) {
for (int ir = 0; ir < bfh; ir++)
for (int jr = 0; jr < bfw; jr++) { for (int jr = 0; jr < bfw; jr++) {
const float corrFactor = ImProcFunctions::calcGradientFactor(gpab, jr, ir); const float corrFactor = ImProcFunctions::calcGradientFactor(gpab, jr, ir);
bufcolfin->a[ir][jr] *= corrFactor; bufcolfin->a[ir][jr] *= corrFactor;
bufcolfin->b[ir][jr] *= corrFactor; bufcolfin->b[ir][jr] *= corrFactor;
} }
} }
}
if (lp.strcolh != 0.f) { if (lp.strcolh != 0.f) {
struct grad_params gph; struct grad_params gph;
calclocalGradientParams(lp, gph, ystart, xstart, bfw, bfh, 6); calclocalGradientParams(lp, gph, ystart, xstart, bfw, bfh, 6);
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16) if (multiThread)
#endif #endif
for (int ir = 0; ir < bfh; ir++) {
for (int ir = 0; ir < bfh; ir++)
for (int jr = 0; jr < bfw; jr++) { for (int jr = 0; jr < bfw; jr++) {
const float corrFactor = ImProcFunctions::calcGradientFactor(gph, jr, ir); const float corrFactor = ImProcFunctions::calcGradientFactor(gph, jr, ir);
const float aa = bufcolfin->a[ir][jr]; const float aa = bufcolfin->a[ir][jr];
@ -14603,10 +14561,11 @@ void ImProcFunctions::Lab_Local(
bufcolfin->b[ir][jr] = clipC(chrm * sincosval.x); bufcolfin->b[ir][jr] = clipC(chrm * sincosval.x);
} }
} }
}
JaggedArray<float> blend(bfw, bfh); JaggedArray<float> blend(bfw, bfh);
buildBlendMask(lumreserv, blend, bfw, bfh, conthr); buildBlendMask(lumreserv, blend, bfw, bfh, conthr);
float rm = 20.f / sk; const float rm = 20.f / sk;
if (rm > 0) { if (rm > 0) {
float **mb = blend; float **mb = blend;
@ -14629,134 +14588,124 @@ void ImProcFunctions::Lab_Local(
bufprov.reset(new LabImage(bfw, bfh)); bufprov.reset(new LabImage(bfw, bfh));
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16) if (multiThread)
#endif #endif
for (int y = 0; y < bfh ; y++) { for (int y = 0; y < bfh ; y++) {
for (int x = 0; x < bfw; x++) { for (int x = 0; x < bfw; x++) {
rdE[y][x] *= SQR(rdE[y][x]); rdE[y][x] *= SQR(rdE[y][x]);
bufprov->L[y][x] = (1.f - rdE[y][x]) * bufcolfin->L[y][x] + (rdE[y][x]) * bufcolreserv->L[y][x]; bufprov->L[y][x] = intp(rdE[y][x], bufcolreserv->L[y][x], bufcolfin->L[y][x]);
bufprov->a[y][x] = (1.f - rdE[y][x]) * bufcolfin->a[y][x] + (rdE[y][x]) * bufcolreserv->a[y][x]; bufprov->a[y][x] = intp(rdE[y][x], bufcolreserv->a[y][x], bufcolfin->a[y][x]);
bufprov->b[y][x] = (1.f - rdE[y][x]) * bufcolfin->b[y][x] + (rdE[y][x]) * bufcolreserv->b[y][x]; bufprov->b[y][x] = intp(rdE[y][x], bufcolreserv->b[y][x], bufcolfin->b[y][x]);
bufcolfin->L[y][x] = (1.f - lp.opacol) * bufcolfin->L[y][x] + (lp.opacol) * bufprov->L[y][x]; bufcolfin->L[y][x] = intp(lp.opacol, bufprov->L[y][x], bufcolfin->L[y][x]);
bufcolfin->a[y][x] = (1.f - lp.opacol) * bufcolfin->a[y][x] + (lp.opacol) * bufprov->a[y][x]; bufcolfin->a[y][x] = intp(lp.opacol, bufprov->a[y][x], bufcolfin->a[y][x]);
bufcolfin->b[y][x] = (1.f - lp.opacol) * bufcolfin->b[y][x] + (lp.opacol) * bufprov->b[y][x]; bufcolfin->b[y][x] = intp(lp.opacol, bufprov->b[y][x], bufcolfin->b[y][x]);
} }
} }
} else { } else {
bufprov.reset(new LabImage(bfw, bfh)); bufprov.reset(new LabImage(bfw, bfh));
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16) if (multiThread)
#endif #endif
for (int y = 0; y < bfh ; y++) { for (int y = 0; y < bfh ; y++) {
for (int x = 0; x < bfw; x++) { for (int x = 0; x < bfw; x++) {
bufprov->L[y][x] = (rdE[y][x]) * bufcolfin->L[y][x] + (1.f - rdE[y][x]) * bufcolreserv->L[y][x]; bufprov->L[y][x] = intp(rdE[y][x], bufcolfin->L[y][x], bufcolreserv->L[y][x]);
bufprov->a[y][x] = (rdE[y][x]) * bufcolfin->a[y][x] + (1.f - rdE[y][x]) * bufcolreserv->a[y][x]; bufprov->a[y][x] = intp(rdE[y][x], bufcolfin->a[y][x], bufcolreserv->a[y][x]);
bufprov->b[y][x] = (rdE[y][x]) * bufcolfin->b[y][x] + (1.f - rdE[y][x]) * bufcolreserv->b[y][x]; bufprov->b[y][x] = intp(rdE[y][x], bufcolfin->b[y][x], bufcolreserv->b[y][x]);
bufcolfin->L[y][x] = (lp.opacol) * bufprov->L[y][x] + (1.f - lp.opacol) * bufcolreserv->L[y][x]; bufcolfin->L[y][x] = intp(lp.opacol, bufprov->L[y][x], bufcolreserv->L[y][x]);
bufcolfin->a[y][x] = (lp.opacol) * bufprov->a[y][x] + (1.f - lp.opacol) * bufcolreserv->a[y][x]; bufcolfin->a[y][x] = intp(lp.opacol, bufprov->a[y][x], bufcolreserv->a[y][x]);
bufcolfin->b[y][x] = (lp.opacol) * bufprov->b[y][x] + (1.f - lp.opacol) * bufcolreserv->b[y][x]; bufcolfin->b[y][x] = intp(lp.opacol, bufprov->b[y][x], bufcolreserv->b[y][x]);
} }
} }
} }
if (conthr > 0.f && lp.mergemet != 4) { if (conthr > 0.f && lp.mergemet != 4) {
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16) if (multiThread)
#endif #endif
for (int y = 0; y < bfh ; y++) { for (int y = 0; y < bfh ; y++) {
for (int x = 0; x < bfw; x++) { for (int x = 0; x < bfw; x++) {
bufcolfin->L[y][x] = intp((blend[y][x]), bufcolfin->L[y][x], bufreser->L[y][x]); bufcolfin->L[y][x] = intp(blend[y][x], bufcolfin->L[y][x], bufreser->L[y][x]);
bufcolfin->a[y][x] = intp((blend[y][x]), bufcolfin->a[y][x], bufreser->a[y][x]); bufcolfin->a[y][x] = intp(blend[y][x], bufcolfin->a[y][x], bufreser->a[y][x]);
bufcolfin->b[y][x] = intp((blend[y][x]), bufcolfin->b[y][x], bufreser->b[y][x]); bufcolfin->b[y][x] = intp(blend[y][x], bufcolfin->b[y][x], bufreser->b[y][x]);
} }
} }
} }
} }
if (lp.mergecolMethod > 16) { //hue sat chroma luma if (lp.mergecolMethod > 16) { //hue sat chroma luma
bufprov.reset(new LabImage(bfw, bfh)); bufprov.reset(new LabImage(bfw, bfh));
if (lp.mergemet == 4) { if (lp.mergemet == 4) {
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16) if (multiThread)
#endif #endif
for (int y = 0; y < bfh ; y++) { for (int y = 0; y < bfh ; y++) {
for (int x = 0; x < bfw; x++) { for (int x = 0; x < bfw; x++) {
rdE[y][x] *= SQR(rdE[y][x]); rdE[y][x] *= SQR(rdE[y][x]);
bufprov->L[y][x] = (1.f - rdE[y][x]) * bufcolfin->L[y][x] + (rdE[y][x]) * bufcolreserv->L[y][x]; bufprov->L[y][x] = intp(rdE[y][x], bufcolreserv->L[y][x], bufcolfin->L[y][x]);
bufprov->a[y][x] = (1.f - rdE[y][x]) * bufcolfin->a[y][x] + (rdE[y][x]) * bufcolreserv->a[y][x]; bufprov->a[y][x] = intp(rdE[y][x], bufcolreserv->a[y][x], bufcolfin->a[y][x]);
bufprov->b[y][x] = (1.f - rdE[y][x]) * bufcolfin->b[y][x] + (rdE[y][x]) * bufcolreserv->b[y][x]; bufprov->b[y][x] = intp(rdE[y][x], bufcolreserv->b[y][x], bufcolfin->b[y][x]);
} }
} }
} else { } else {
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16) if (multiThread)
#endif #endif
for (int y = 0; y < bfh ; y++) { for (int y = 0; y < bfh ; y++) {
for (int x = 0; x < bfw; x++) { for (int x = 0; x < bfw; x++) {
bufprov->L[y][x] = (rdE[y][x]) * bufcolfin->L[y][x] + (1.f - rdE[y][x]) * bufcolreserv->L[y][x]; bufprov->L[y][x] = intp(rdE[y][x], bufcolfin->L[y][x], bufcolreserv->L[y][x]);
bufprov->a[y][x] = (rdE[y][x]) * bufcolfin->a[y][x] + (1.f - rdE[y][x]) * bufcolreserv->a[y][x]; bufprov->a[y][x] = intp(rdE[y][x], bufcolfin->a[y][x], bufcolreserv->a[y][x]);
bufprov->b[y][x] = (rdE[y][x]) * bufcolfin->b[y][x] + (1.f - rdE[y][x]) * bufcolreserv->b[y][x]; bufprov->b[y][x] = intp(rdE[y][x], bufcolfin->b[y][x], bufcolreserv->b[y][x]);
} }
} }
} }
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for schedule(dynamic,16) #pragma omp parallel for schedule(dynamic,16) if (multiThread)
#endif #endif
for (int y = 0; y < bfh ; y++) { for (int y = 0; y < bfh ; y++) {
for (int x = 0; x < bfw; x++) { for (int x = 0; x < bfw; x++) {
float huefin = xatan2f(bufprov->b[y][x], bufprov->a[y][x]);
float hueres = xatan2f(bufcolreserv->b[y][x], bufcolreserv->a[y][x]);
float chrofin = std::sqrt(SQR(bufprov->a[y][x]) + SQR(bufprov->b[y][x]));
float chrores = std::sqrt(SQR(bufcolreserv->a[y][x]) + SQR(bufcolreserv->b[y][x]));
float lumfin = bufprov->L[y][x];
float lumres = bufcolreserv->L[y][x];
if (lp.mergecolMethod == 17) { if (lp.mergecolMethod == 17) {
float2 sincosval1 = xsincosf(huefin); const float huefin = xatan2f(bufprov->b[y][x], bufprov->a[y][x]);
const float2 sincosval1 = xsincosf(huefin);
const float chrores = std::sqrt(SQR(bufcolreserv->a[y][x]) + SQR(bufcolreserv->b[y][x]));
buftemp->a[y][x] = chrores * sincosval1.y; buftemp->a[y][x] = chrores * sincosval1.y;
buftemp->b[y][x] = chrores * sincosval1.x; buftemp->b[y][x] = chrores * sincosval1.x;
buftemp->L[y][x] = lumres; buftemp->L[y][x] = bufcolreserv->L[y][x];
} else if (lp.mergecolMethod == 18) { } else if (lp.mergecolMethod == 18) {
float2 sincosval2 = xsincosf(hueres); const float hueres = xatan2f(bufcolreserv->b[y][x], bufcolreserv->a[y][x]);
const float2 sincosval2 = xsincosf(hueres);
const float chrofin = std::sqrt(SQR(bufprov->a[y][x]) + SQR(bufprov->b[y][x]));
buftemp->a[y][x] = chrofin * sincosval2.y; buftemp->a[y][x] = chrofin * sincosval2.y;
buftemp->b[y][x] = chrofin * sincosval2.x; buftemp->b[y][x] = chrofin * sincosval2.x;
buftemp->L[y][x] = lumres; buftemp->L[y][x] = bufcolreserv->L[y][x];
} else if (lp.mergecolMethod == 19) { } else if (lp.mergecolMethod == 19) {
float2 sincosval3 = xsincosf(huefin); const float huefin = xatan2f(bufprov->b[y][x], bufprov->a[y][x]);
const float2 sincosval3 = xsincosf(huefin);
const float chrofin = std::sqrt(SQR(bufprov->a[y][x]) + SQR(bufprov->b[y][x]));
buftemp->a[y][x] = chrofin * sincosval3.y; buftemp->a[y][x] = chrofin * sincosval3.y;
buftemp->b[y][x] = chrofin * sincosval3.x; buftemp->b[y][x] = chrofin * sincosval3.x;
buftemp->L[y][x] = lumres; buftemp->L[y][x] = bufcolreserv->L[y][x];
} else if (lp.mergecolMethod == 20) { } else if (lp.mergecolMethod == 20) {
float2 sincosval4 = xsincosf(hueres); const float hueres = xatan2f(bufcolreserv->b[y][x], bufcolreserv->a[y][x]);
const float2 sincosval4 = xsincosf(hueres);
const float chrores = std::sqrt(SQR(bufcolreserv->a[y][x]) + SQR(bufcolreserv->b[y][x]));
buftemp->a[y][x] = chrores * sincosval4.y; buftemp->a[y][x] = chrores * sincosval4.y;
buftemp->b[y][x] = chrores * sincosval4.x; buftemp->b[y][x] = chrores * sincosval4.x;
buftemp->L[y][x] = lumfin; buftemp->L[y][x] = bufprov->L[y][x];
} }
if (lp.mergemet == 4) { if (lp.mergemet == 4) {
bufcolfin->L[y][x] = (1.f - lp.opacol) * bufcolfin->L[y][x] + (lp.opacol) * bufprov->L[y][x]; bufcolfin->L[y][x] = intp(lp.opacol, bufprov->L[y][x], bufcolfin->L[y][x]);
bufcolfin->a[y][x] = (1.f - lp.opacol) * bufcolfin->a[y][x] + (lp.opacol) * bufprov->a[y][x]; bufcolfin->a[y][x] = intp(lp.opacol, bufprov->a[y][x], bufcolfin->a[y][x]);
bufcolfin->b[y][x] = (1.f - lp.opacol) * bufcolfin->b[y][x] + (lp.opacol) * bufprov->b[y][x]; bufcolfin->b[y][x] = intp(lp.opacol, bufprov->b[y][x], bufcolfin->b[y][x]);
} else { } else {
bufcolfin->L[y][x] = (lp.opacol) * bufprov->L[y][x] + (1.f - lp.opacol) * bufcolreserv->L[y][x]; bufcolfin->L[y][x] = intp(lp.opacol, bufprov->L[y][x], bufcolreserv->L[y][x]);
bufcolfin->a[y][x] = (lp.opacol) * bufprov->a[y][x] + (1.f - lp.opacol) * bufcolreserv->a[y][x]; bufcolfin->a[y][x] = intp(lp.opacol, bufprov->a[y][x], bufcolreserv->a[y][x]);
bufcolfin->b[y][x] = (lp.opacol) * bufprov->b[y][x] + (1.f - lp.opacol) * bufcolreserv->b[y][x]; bufcolfin->b[y][x] = intp(lp.opacol, bufprov->b[y][x], bufcolreserv->b[y][x]);
} }
} }
} }
@ -14805,6 +14754,7 @@ void ImProcFunctions::Lab_Local(
float maxG = minG; float maxG = minG;
float minB = tmpImagereserv->b(0, 0); float minB = tmpImagereserv->b(0, 0);
float maxB = minB; float maxB = minB;
if (lp.mergecolMethod == 6 || lp.mergecolMethod == 9 || lp.mergecolMethod == 10 || lp.mergecolMethod == 11) {
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel for reduction(max:maxR,maxG,maxB) reduction(min:minR,minG,minB) schedule(dynamic,16) #pragma omp parallel for reduction(max:maxR,maxG,maxB) reduction(min:minR,minG,minB) schedule(dynamic,16)
#endif #endif
@ -14818,6 +14768,7 @@ void ImProcFunctions::Lab_Local(
maxB = rtengine::max(maxB, tmpImagereserv->b(ir, jr)); maxB = rtengine::max(maxB, tmpImagereserv->b(ir, jr));
} }
} }
}
//various combinations subtract, multiply, difference, etc //various combinations subtract, multiply, difference, etc
if (lp.mergecolMethod == 1) { //subtract if (lp.mergecolMethod == 1) { //subtract