diff --git a/rtengine/expo_before_b.cc b/rtengine/expo_before_b.cc index 16f9c440a..70fe5e7cd 100644 --- a/rtengine/expo_before_b.cc +++ b/rtengine/expo_before_b.cc @@ -39,15 +39,24 @@ void RawImageSource::processRawWhitepoint(float expos, float preser) { // exposure correction inspired from G.Luijk if (fabs(preser)<0.001) { // No highlight protection - simple mutiplication - for (int c=0; c<4; c++) { - chmax[c] *= expos; - } -#pragma omp parallel for shared(expos) + for (int c=0; c<4; c++) chmax[c] *= expos; + + #pragma omp parallel for for (int row=0;rowisBayer()) { rawData[row][col] *= expos; + } else { + rawData[row][col*3] *= expos; + rawData[row][col*3+1] *= expos; + rawData[row][col*3+2] *= expos; + } } } else { + // calculate CIE luminosity + float* luminosity = (float *) new float[width*height]; + + if (ri->isBayer()) { // save old image as it's overwritten by demosaic float** imgd = allocArray< float >(W,H); @@ -57,47 +66,58 @@ void RawImageSource::processRawWhitepoint(float expos, float preser) { // Demosaic to calc luminosity fast_demosaic (0,0,W,H); - // calculate CIE luminosity - float* luminosity = (float *) new float[width*height]; - -#pragma omp parallel default(shared) - { // CIE luminosity -#pragma omp for + #pragma omp parallel for for(int row=0;row(imgd, H); + } else { + // Non-Bayers are already RGB + + // CIE luminosity + #pragma omp parallel for + for(int row=0;rowisBayer()) { if (rawData[row][col]>maxVal) maxVal = rawData[row][col]; + } else { + for (int c=0;c<3;c++) if (rawData[row][col*3+c]>maxVal) maxVal = rawData[row][col*3+c]; + } + } // Exposure correction with highlight preservation LUTf lut(maxVal+1); if(expos>1){ + // Positive exposure + float K = (float) maxVal / expos*exp(-preser*log(2.0)); for (int j=0;j<=maxVal;j++) lut[(int)j]=(((float)maxVal-K*expos)/((float)maxVal-K)*(j-maxVal)+(float) maxVal) / j; - for (int c=0; c<4; c++) { - chmax[c] *= expos; - } + for (int c=0; c<4; c++) chmax[c] *= expos; -#pragma omp parallel for shared(expos) + #pragma omp parallel for for(int row=0;rowisBayer()) { + rawData[row][col] *= fac; } else { - rawData[row][col] *= lut[luminosity[row*width+col]]; + for (int c=0;c<3;c++) rawData[row][col*3+c] *= fac; } } } else { @@ -108,20 +128,20 @@ void RawImageSource::processRawWhitepoint(float expos, float preser) { for (int j=0;j<=maxVal;j++) lut[(int)j] = exp(EV*((float)maxVal-j) / ((float)maxVal-K) * log(2.0)); -#pragma omp parallel for shared(expos) + #pragma omp parallel for for(int row=0;rowisBayer()) { + rawData[row][col] *= fac; } else { - rawData[row][col] *= lut[luminosity[row*width+col]]; - } - } - for (int c=0; c<4; c++) { - chmax[c] *= expos; + for (int c=0;c<3;c++) rawData[row][col*3+c] *= fac; } } + for (int c=0; c<4; c++) chmax[c] *= expos; + } delete[] luminosity; }