Optimize Local Exposure

This commit is contained in:
Desmis 2019-03-23 17:31:13 +01:00
parent 25841f7dbc
commit e81330b35d
4 changed files with 51 additions and 78 deletions

View File

@ -986,6 +986,9 @@ void Crop::update(int todo)
cclocalcurve2.clear(); cclocalcurve2.clear();
sklocalcurve2.clear(); sklocalcurve2.clear();
exlocalcurve2.clear(); exlocalcurve2.clear();
hltonecurveloc2.clear();
shtonecurveloc2.clear();
tonecurveloc2.clear();
locRETgainCurve.Reset(); locRETgainCurve.Reset();
loclhCurve.Reset(); loclhCurve.Reset();
lochhCurve.Reset(); lochhCurve.Reset();

View File

@ -955,6 +955,9 @@ void ImProcCoordinator::updatePreviewImage(int todo, bool panningRelatedChange)
cclocalcurve.clear(); cclocalcurve.clear();
sklocalcurve.clear(); sklocalcurve.clear();
exlocalcurve.clear(); exlocalcurve.clear();
hltonecurveloc.clear();
shtonecurveloc.clear();
tonecurveloc.clear();
locRETgainCurve.Reset(); locRETgainCurve.Reset();
loclhCurve.Reset(); loclhCurve.Reset();
lochhCurve.Reset(); lochhCurve.Reset();

View File

@ -1767,99 +1767,63 @@ void ImProcFunctions::exlabLocal(const local_params& lp, int bfh, int bfw, LabIm
const float shoulder = ((maxran / max(1.0f, exp_scale)) * (lp.hlcompthr / 200.0)) + 0.1; const float shoulder = ((maxran / max(1.0f, exp_scale)) * (lp.hlcompthr / 200.0)) + 0.1;
const float hlrange = maxran - shoulder; const float hlrange = maxran - shoulder;
LabImage *Ltemp = nullptr;
#define TSE 112 Ltemp = new LabImage(bfw, bfh);
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp parallel if (multiThread) #pragma omp parallel for
#endif #endif
{
char *buffer;
buffer = (char *) malloc(3 * sizeof(float) * TSE * TSE + 20 * 64 + 63); for (int ir = 0; ir < bfh; ir++)
char *data; for (int jr = 0; jr < bfw; jr++) {
data = (char*)((uintptr_t (buffer) + uintptr_t (63)) / 64 * 64); Ltemp->L[ir][jr] = bufexporig->L[ir][jr];
}
float *Ltemp = (float (*))data;
float *atemp = (float (*))((char*)Ltemp + sizeof(float) * TSE * TSE + 4 * 64);
float *btemp = (float (*))((char*)atemp + sizeof(float) * TSE * TSE + 8 * 64);
int istart;
int jstart;
int tW;
int tH;
#ifdef _OPENMP #ifdef _OPENMP
#pragma omp for schedule(dynamic) collapse(2) #pragma omp parallel for
#endif #endif
for (int ii = 0; ii < bfh; ii += TSE) for (int ir = 0; ir < bfh; ir++)
for (int jj = 0; jj < bfw; jj += TSE) { for (int jr = 0; jr < bfw; jr++) {
float L = Ltemp->L[ir][jr];
istart = ii; //highlight
jstart = jj; float tonefactor = (2 * L < MAXVALF ? hltonecurve[2 * L] : CurveFactory::hlcurve(exp_scale, comp, hlrange, 2 * L));
tH = min(ii + TSE, bfh); Ltemp->L[ir][jr] = L * tonefactor;
tW = min(jj + TSE, bfw);
for (int i = istart, ti = 0; i < tH; i++, ti++) {
for (int j = jstart, tj = 0; j < tW; j++, tj++) {
Ltemp[ti * TSE + tj] = bufexporig->L[i][j];
atemp[ti * TSE + tj] = bufexporig->a[i][j];
btemp[ti * TSE + tj] = bufexporig->b[i][j];
}
} }
#ifdef _OPENMP
#pragma omp parallel for
#endif
// float niv = maxran; for (int ir = 0; ir < bfh; ir++)
for (int jr = 0; jr < bfw; jr++) {
for (int i = istart, ti = 0; i < tH; i++, ti++) { float L = Ltemp->L[ir][jr];
for (int j = jstart, tj = 0; j < tW; j++, tj++) {
float L = Ltemp[ti * TSE + tj];
float tonefactor = (2 * L < MAXVALF ? hltonecurve[2 * L] : CurveFactory::hlcurve(exp_scale, comp, hlrange, 2 * L)); // niv));
Ltemp[ti * TSE + tj] = L * tonefactor;
}
}
for (int i = istart, ti = 0; i < tH; i++, ti++) {
for (int j = jstart, tj = 0; j < tW; j++, tj++) {
float L = Ltemp[ti * TSE + tj];
//shadow tone curve //shadow tone curve
float Y = L; float Y = L;
float tonefactor = shtonecurve[2 * Y]; float tonefactor = shtonecurve[2 * Y];
Ltemp[ti * TSE + tj] = Ltemp[ti * TSE + tj] * tonefactor; Ltemp->L[ir][jr] = 0.5f * Ltemp->L[ir][jr] * tonefactor;
}
} }
for (int i = istart, ti = 0; i < tH; i++, ti++) { #ifdef _OPENMP
for (int j = jstart, tj = 0; j < tW; j++, tj++) { #pragma omp parallel for
#endif
Ltemp[ti * TSE + tj] = tonecurve[Ltemp[ti * TSE + tj] ]; for (int ir = 0; ir < bfh; ir++)
} for (int jr = 0; jr < bfw; jr++) {
//tonecurve
Ltemp->L[ir][jr] = 0.5f * tonecurve[2.f * Ltemp->L[ir][jr]];
} }
#ifdef _OPENMP
#pragma omp parallel for
#endif
bool vasy = true; for (int ir = 0; ir < bfh; ir++)
for (int jr = 0; jr < bfw; jr++) {
if (vasy) { lab->L[ir][jr] = Ltemp->L[ir][jr];
// ready, fill lab
for (int i = istart, ti = 0; i < tH; i++, ti++) {
for (int j = jstart, tj = 0; j < tW; j++, tj++) {
lab->L[i][j] = Ltemp[ti * TSE + tj];
lab->a[i][j] = atemp[ti * TSE + tj];
lab->b[i][j] = btemp[ti * TSE + tj];
}
}
}
}
free(buffer);
} }
delete Ltemp;
} }

View File

@ -1180,6 +1180,9 @@ private:
cclocalcurve.clear(); cclocalcurve.clear();
sklocalcurve.clear(); sklocalcurve.clear();
exlocalcurve.clear(); exlocalcurve.clear();
hltonecurveloc.clear();
shtonecurveloc.clear();
tonecurveloc.clear();
if (params.locallab.spots.at(sp).inverssha) { if (params.locallab.spots.at(sp).inverssha) {