diff --git a/rtengine/dcrop.cc b/rtengine/dcrop.cc index 36a0f62d0..cc993b811 100644 --- a/rtengine/dcrop.cc +++ b/rtengine/dcrop.cc @@ -714,70 +714,49 @@ void Crop::update (int todo) if ((todo & (M_TRANSFORM)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled) { - if( (!params.colorappearance.enabled )) { - TMatrix wprof, wiprof; - wprof = iccStore->workingSpaceMatrix( params.icm.working ); - wiprof = iccStore->workingSpaceInverseMatrix( params.icm.working ); - double wip[3][3] = { - {wiprof[0][0], wiprof[0][1], wiprof[0][2]}, - {wiprof[1][0], wiprof[1][1], wiprof[1][2]}, - {wiprof[2][0], wiprof[2][1], wiprof[2][2]} - }; + TMatrix wprof = iccStore->workingSpaceMatrix( params.icm.working ); + const float wp[3][3] = { + {static_cast(wprof[0][0]), static_cast(wprof[0][1]), static_cast(wprof[0][2])}, + {static_cast(wprof[1][0]), static_cast(wprof[1][1]), static_cast(wprof[1][2])}, + {static_cast(wprof[2][0]), static_cast(wprof[2][1]), static_cast(wprof[2][2])} + }; - double wp[3][3] = { - {wprof[0][0], wprof[0][1], wprof[0][2]}, - {wprof[1][0], wprof[1][1], wprof[1][2]}, - {wprof[2][0], wprof[2][1], wprof[2][2]} - }; - - int W = baseCrop->getWidth(); - int H = baseCrop->getHeight(); - LabImage * labcbdl; - labcbdl = new LabImage(W, H); -#ifndef _DEBUG - #pragma omp parallel for schedule(dynamic, 10) + const int W = baseCrop->getWidth(); + const int H = baseCrop->getHeight(); + LabImage labcbdl(W, H); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) #endif - for(int i = 0; i < H; i++) { - for(int j = 0; j < W; j++) { - float r = baseCrop->r(i, j); - float g = baseCrop->g(i, j); - float b = baseCrop->b(i, j); - float X, Y, Z; - float L, aa, bb; - Color::rgbxyz(r, g, b, X, Y, Z, wp); - //convert Lab - Color::XYZ2Lab(X, Y, Z, L, aa, bb); - labcbdl->L[i][j] = L; - labcbdl->a[i][j] = aa; - labcbdl->b[i][j] = bb; - } + //convert RGB => Lab + for(int i = 0; i < H; i++) { + for(int j = 0; j < W; j++) { + float X, Y, Z; + Color::rgbxyz(baseCrop->r(i, j), baseCrop->g(i, j), baseCrop->b(i, j), X, Y, Z, wp); + Color::XYZ2Lab(X, Y, Z, labcbdl.L[i][j], labcbdl.a[i][j], labcbdl.b[i][j]); } + } - parent->ipf.dirpyrequalizer (labcbdl, skip, 0); + parent->ipf.dirpyrequalizer (&labcbdl, skip, 0); + TMatrix wiprof = iccStore->workingSpaceInverseMatrix( params.icm.working ); + const float wip[3][3] = { + {static_cast(wiprof[0][0]), static_cast(wiprof[0][1]), static_cast(wiprof[0][2])}, + {static_cast(wiprof[1][0]), static_cast(wiprof[1][1]), static_cast(wiprof[1][2])}, + {static_cast(wiprof[2][0]), static_cast(wiprof[2][1]), static_cast(wiprof[2][2])} + }; -#ifndef _DEBUG - #pragma omp parallel for schedule(dynamic, 10) +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) #endif - for(int i = 0; i < H; i++) { - for(int j = 0; j < W; j++) { - float L = labcbdl->L[i][j]; - float a = labcbdl->a[i][j]; - float b = labcbdl->b[i][j]; - float x1, y1, z1; - float R, G, B; - Color::Lab2XYZ(L, a, b, x1, y1, z1); - Color::xyz2rgb(x1, y1, z1, R, G, B, wip); - baseCrop->r(i, j) = R; - baseCrop->g(i, j) = G; - baseCrop->b(i, j) = B; - } + //convert Lab => RGB + for(int i = 0; i < H; i++) { + for(int j = 0; j < W; j++) { + float X, Y, Z; + Color::Lab2XYZ(labcbdl.L[i][j], labcbdl.a[i][j], labcbdl.b[i][j], X, Y, Z); + Color::xyz2rgb(X, Y, Z, baseCrop->r(i, j), baseCrop->g(i, j), baseCrop->b(i, j), wip); } - - delete labcbdl; - } } diff --git a/rtengine/improccoordinator.cc b/rtengine/improccoordinator.cc index 84b4412ba..bcb2c05ff 100644 --- a/rtengine/improccoordinator.cc +++ b/rtengine/improccoordinator.cc @@ -388,77 +388,58 @@ void ImProcCoordinator::updatePreviewImage (int todo, Crop* cropCall) ipf.transform (orig_prev, oprevi, 0, 0, 0, 0, pW, pH, fw, fh, imgsrc->getMetaData()->getFocalLen(), imgsrc->getMetaData()->getFocalLen35mm(), imgsrc->getMetaData()->getFocusDist(), imgsrc->getRotateDegree(), false); - readyphase++; - - progress ("Preparing shadow/highlight map...", 100 * readyphase / numofphases); if ((todo & (M_TRANSFORM)) && params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled) { - if(((!params.colorappearance.enabled))) { - TMatrix wprof, wiprof; - wprof = iccStore->workingSpaceMatrix( params.icm.working ); - wiprof = iccStore->workingSpaceInverseMatrix( params.icm.working ); - double wip[3][3] = { - {wiprof[0][0], wiprof[0][1], wiprof[0][2]}, - {wiprof[1][0], wiprof[1][1], wiprof[1][2]}, - {wiprof[2][0], wiprof[2][1], wiprof[2][2]} - }; + TMatrix wprof = iccStore->workingSpaceMatrix( params.icm.working ); + const float wp[3][3] = { + {static_cast(wprof[0][0]), static_cast(wprof[0][1]), static_cast(wprof[0][2])}, + {static_cast(wprof[1][0]), static_cast(wprof[1][1]), static_cast(wprof[1][2])}, + {static_cast(wprof[2][0]), static_cast(wprof[2][1]), static_cast(wprof[2][2])} + }; - double wp[3][3] = { - {wprof[0][0], wprof[0][1], wprof[0][2]}, - {wprof[1][0], wprof[1][1], wprof[1][2]}, - {wprof[2][0], wprof[2][1], wprof[2][2]} - }; - - int W = oprevi->getWidth(); - int H = oprevi->getHeight(); - LabImage * labcbdl; - labcbdl = new LabImage(W, H); -#ifndef _DEBUG - #pragma omp parallel for schedule(dynamic, 10) + const int W = oprevi->getWidth(); + const int H = oprevi->getHeight(); + LabImage labcbdl(W, H); +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) #endif - for(int i = 0; i < H; i++) { - for(int j = 0; j < W; j++) { - float r = oprevi->r(i, j); - float g = oprevi->g(i, j); - float b = oprevi->b(i, j); - float X, Y, Z; - float L, aa, bb; - Color::rgbxyz(r, g, b, X, Y, Z, wp); - //convert Lab - Color::XYZ2Lab(X, Y, Z, L, aa, bb); - labcbdl->L[i][j] = L; - labcbdl->a[i][j] = aa; - labcbdl->b[i][j] = bb; - } + //convert RGB => Lab + for(int i = 0; i < H; i++) { + for(int j = 0; j < W; j++) { + float X, Y, Z; + Color::rgbxyz(oprevi->r(i, j), oprevi->g(i, j), oprevi->b(i, j), X, Y, Z, wp); + Color::XYZ2Lab(X, Y, Z, labcbdl.L[i][j], labcbdl.a[i][j], labcbdl.b[i][j]); } + } - ipf.dirpyrequalizer (labcbdl, scale, 0); + ipf.dirpyrequalizer (&labcbdl, scale, 0); -#ifndef _DEBUG - #pragma omp parallel for schedule(dynamic, 10) + TMatrix wiprof = iccStore->workingSpaceInverseMatrix( params.icm.working ); + const float wip[3][3] = { + {static_cast(wiprof[0][0]), static_cast(wiprof[0][1]), static_cast(wiprof[0][2])}, + {static_cast(wiprof[1][0]), static_cast(wiprof[1][1]), static_cast(wiprof[1][2])}, + {static_cast(wiprof[2][0]), static_cast(wiprof[2][1]), static_cast(wiprof[2][2])} + }; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) #endif - for(int i = 0; i < H; i++) { - for(int j = 0; j < W; j++) { - float L = labcbdl->L[i][j]; - float a = labcbdl->a[i][j]; - float b = labcbdl->b[i][j]; - float x1, y1, z1; - float R, G, B; - Color::Lab2XYZ(L, a, b, x1, y1, z1); - Color::xyz2rgb(x1, y1, z1, R, G, B, wip); - oprevi->r(i, j) = R; - oprevi->g(i, j) = G; - oprevi->b(i, j) = B; - } + for(int i = 0; i < H; i++) { + for(int j = 0; j < W; j++) { + float X, Y, Z; + Color::Lab2XYZ(labcbdl.L[i][j], labcbdl.a[i][j], labcbdl.b[i][j], X, Y, Z); + Color::xyz2rgb(X, Y, Z, oprevi->r(i, j), oprevi->g(i, j), oprevi->b(i, j), wip); } - - delete labcbdl; - } } + + + readyphase++; + progress ("Preparing shadow/highlight map...", 100 * readyphase / numofphases); + if ((todo & M_BLURMAP) && params.sh.enabled) { double radius = sqrt (double(pW * pW + pH * pH)) / 2.0; double shradius = params.sh.radius; diff --git a/rtengine/improcfun.cc b/rtengine/improcfun.cc index 87c51dd64..df8821a4b 100644 --- a/rtengine/improcfun.cc +++ b/rtengine/improcfun.cc @@ -6539,8 +6539,6 @@ void ImProcFunctions::badpixlab(LabImage* lab, double rad, int thr, int mode, fl void ImProcFunctions::dirpyrequalizer (LabImage* lab, int scale, int mode) { - printf("mode=%d\n", mode); - if (params->dirpyrequalizer.enabled && lab->W >= 8 && lab->H >= 8) { float b_l = static_cast(params->dirpyrequalizer.hueskin.value[0]) / 100.0f; float t_l = static_cast(params->dirpyrequalizer.hueskin.value[1]) / 100.0f; diff --git a/rtengine/simpleprocess.cc b/rtengine/simpleprocess.cc index 06bd755e4..1d171e09a 100644 --- a/rtengine/simpleprocess.cc +++ b/rtengine/simpleprocess.cc @@ -741,69 +741,49 @@ IImage16* processImage (ProcessingJob* pjob, int& errorCode, ProgressListener* p if (params.dirpyrequalizer.cbdlMethod == "bef" && params.dirpyrequalizer.enabled) { - if(((!params.colorappearance.enabled))) { - TMatrix wprof, wiprof; - wprof = iccStore->workingSpaceMatrix( params.icm.working ); - wiprof = iccStore->workingSpaceInverseMatrix( params.icm.working ); - double wip[3][3] = { - {wiprof[0][0], wiprof[0][1], wiprof[0][2]}, - {wiprof[1][0], wiprof[1][1], wiprof[1][2]}, - {wiprof[2][0], wiprof[2][1], wiprof[2][2]} - }; + TMatrix wprof = iccStore->workingSpaceMatrix( params.icm.working ); + const float wp[3][3] = { + {static_cast(wprof[0][0]), static_cast(wprof[0][1]), static_cast(wprof[0][2])}, + {static_cast(wprof[1][0]), static_cast(wprof[1][1]), static_cast(wprof[1][2])}, + {static_cast(wprof[2][0]), static_cast(wprof[2][1]), static_cast(wprof[2][2])} + }; - double wp[3][3] = { - {wprof[0][0], wprof[0][1], wprof[0][2]}, - {wprof[1][0], wprof[1][1], wprof[1][2]}, - {wprof[2][0], wprof[2][1], wprof[2][2]} - }; + const int W = baseImg->getWidth(); + const int H = baseImg->getHeight(); + LabImage labcbdl(W, H); - int W = baseImg->getWidth(); - int H = baseImg->getHeight(); - LabImage * labcbdl; - labcbdl = new LabImage(W, H); -#ifndef _DEBUG - #pragma omp parallel for schedule(dynamic, 10) +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) #endif - for(int i = 0; i < H; i++) { - for(int j = 0; j < W; j++) { - float r = baseImg->r(i, j); - float g = baseImg->g(i, j); - float b = baseImg->b(i, j); - float X, Y, Z; - float L, aa, bb; - Color::rgbxyz(r, g, b, X, Y, Z, wp); - //convert Lab - Color::XYZ2Lab(X, Y, Z, L, aa, bb); - labcbdl->L[i][j] = L; - labcbdl->a[i][j] = aa; - labcbdl->b[i][j] = bb; - } + for(int i = 0; i < H; i++) { + for(int j = 0; j < W; j++) { + float X, Y, Z; + Color::rgbxyz(baseImg->r(i, j), baseImg->g(i, j), baseImg->b(i, j), X, Y, Z, wp); + //convert Lab + Color::XYZ2Lab(X, Y, Z, labcbdl.L[i][j], labcbdl.a[i][j], labcbdl.b[i][j]); } + } - ipf.dirpyrequalizer (labcbdl, 1, 0); + ipf.dirpyrequalizer (&labcbdl, 1, 0); -#ifndef _DEBUG - #pragma omp parallel for schedule(dynamic, 10) + TMatrix wiprof = iccStore->workingSpaceInverseMatrix( params.icm.working ); + const float wip[3][3] = { + {static_cast(wiprof[0][0]), static_cast(wiprof[0][1]), static_cast(wiprof[0][2])}, + {static_cast(wiprof[1][0]), static_cast(wiprof[1][1]), static_cast(wiprof[1][2])}, + {static_cast(wiprof[2][0]), static_cast(wiprof[2][1]), static_cast(wiprof[2][2])} + }; + +#ifdef _OPENMP + #pragma omp parallel for schedule(dynamic,16) #endif - for(int i = 0; i < H; i++) { - for(int j = 0; j < W; j++) { - float L = labcbdl->L[i][j]; - float a = labcbdl->a[i][j]; - float b = labcbdl->b[i][j]; - float x1, y1, z1; - float R, G, B; - Color::Lab2XYZ(L, a, b, x1, y1, z1); - Color::xyz2rgb(x1, y1, z1, R, G, B, wip); - baseImg->r(i, j) = R; - baseImg->g(i, j) = G; - baseImg->b(i, j) = B; - } + for(int i = 0; i < H; i++) { + for(int j = 0; j < W; j++) { + float X, Y, Z; + Color::Lab2XYZ(labcbdl.L[i][j], labcbdl.a[i][j], labcbdl.b[i][j], X, Y, Z); + Color::xyz2rgb(X, Y, Z, baseImg->r(i, j), baseImg->g(i, j), baseImg->b(i, j), wip); } - - delete labcbdl; - } }