diff --git a/rtengine/expo_before_b.cc b/rtengine/expo_before_b.cc
index a19329ece..4a225e990 100644
--- a/rtengine/expo_before_b.cc
+++ b/rtengine/expo_before_b.cc
@@ -19,93 +19,96 @@
// along with this program. If not, see .
//
////////////////////////////////////////////////////////////////
-//%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
+
+
// Jacques Desmis
// use fast-demo(provisional) from Emil Martinec
// inspired from work Guillermo Luijk and Manuel LLorens(Perfectraw)
-// I use OMP
+//
// This function uses parameters:
- // exposure (lineal): 2^(-8..0..8): currently 0.5 +3
+// exposure (linear): 2^(-8..0..8): currently 0.5 +3
// preserve (log) : 0..8 : currently 0.1 1
-//modi : 31/12/2010
-#define LIM(x,min,max) MAX(min,MIN(x,max))
-#define CLIPF(x) LIM(x,0.0,65535.0)
-
-void RawImageSource::exp_bef(float expos, float preser) {
- double dt,dT2;
- clock_t t1, t2,t3,t4,t5;
- float Yp, exposure2, K, EV;
-// float LUT[65536];
-float *LUT = new float[65536];
- int i;
- int row,col;
+void RawImageSource::processRawWhitepoint(float expos, float preser) {
int width=W, height=H;
- // I use with Dcraw FDD interpolate from Luis Sanz , very fast and good, one can change for another : here with Rawtherpee == fastdemo() from Emil Martinec
- //t1 = clock();
- //float *img = new float[H*W];//to save configuration : with RT is it necessary ??
- unsigned short** imgd;
- imgd = allocArray< unsigned short >(W,H);//with memcpy : faster than for (...)
- for (int i=0; i(W,H);
- fast_demo (0,0,W,H);//from Emil
+ // with memcpy it's faster than for (...)
+ for (int i=0; i(imgd, H);
-freeArray(imgd, H);//free memory imgd
-
- //exposure correction inspired from G.Luijk
- if(preser==0.0){ // protect highlights
-#pragma omp parallel for shared(expos)
+ // Find maximum to adjust LUTs. New float engines clips only at the very end
+ int maxVal=65535;
for(int row=0;rowmaxVal) maxVal = rawData[row][col];
+
// Exposure correction with highlight preservation
+ LUTf lut(maxVal+1);
if(expos>1){
- K=65535/expos*exp(-preser*log((double) 2));
- for(int j=0;j<=65535;j++) LUT[(int)j]=CLIPF(((65535-K*expos)/(65535-K)*(j-65535)+65535)/j);
+ float K = maxVal / expos*exp(-preser*log(2.0));
+ for (int j=0;j<=maxVal;j++)
+ lut[(int)j]=((maxVal-K*expos)/(maxVal-K)*(j-maxVal)+maxVal) / j;
#pragma omp parallel for shared(expos)
for(int row=0;rowverbose )
@@ -1295,9 +1293,7 @@ void RawImageSource::scaleColors(int winx,int winy,int winw,int winh)
if( ri->isBayer() ){
for (int row = winy; row < winy+winh; row ++){
for (int col = winx; col < winx+winw; col++) {
- int val = rawData[row][col];
- if (!val)
- continue;
+ float val = rawData[row][col];
int c = FC(row, col);
val -= cblack[c];
val *= scale_mul[c];
@@ -1307,7 +1303,7 @@ void RawImageSource::scaleColors(int winx,int winy,int winw,int winh)
}else{
for (int row = winy; row < winy+winh; row ++){
for (int col = winx; col < winx+winw; col++) {
- int val = rawData[row][3*col+0];
+ float val = rawData[row][3*col+0];
if (val){
val -= cblack[0];
val *= scale_mul[0];
diff --git a/rtengine/rawimagesource.h b/rtengine/rawimagesource.h
index bead5c509..594d1fc8d 100644
--- a/rtengine/rawimagesource.h
+++ b/rtengine/rawimagesource.h
@@ -159,7 +159,7 @@ class RawImageSource : public ImageSource {
int LinEqSolve( int nDim, float* pfMatr, float* pfVect, float* pfSolution);//Emil's CA auto correction
void CA_correct_RT (double cared, double cablue);
void ddct8x8s(int isgn, float **a);
- void exp_bef (float expos, float preser); // exposure before interpolation
+ void processRawWhitepoint (float expos, float preser); // exposure before interpolation
int cfaCleanFromMap( PixelsMap &bitmapBads );
int findHotDeadPixel( PixelsMap &bpMap, float thresh);
diff --git a/rtengine/shmap.cc b/rtengine/shmap.cc
index c81b79147..8afad563f 100644
--- a/rtengine/shmap.cc
+++ b/rtengine/shmap.cc
@@ -223,8 +223,8 @@ void SHMap::dirpyr_shmap(float ** data_fine, float ** data_coarse, int width, in
}
}
data_coarse[i][j]=CLIP((int)(val/norm));//low pass filter
- if (val<=0 || norm<=0)
- printf("val=%f norm=%f \n",val,norm);
+ /*if (val<=0 || norm<=0)
+ printf("val=%f norm=%f \n",val,norm); */
}
}