diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 596c8ab85..ce945a605 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1825,13 +1825,18 @@ void RawImageSource::dehaz(RAWParams raw, ColorManagementParams cmp, DehazParams {wprof[1][0], wprof[1][1], wprof[1][2]}, {wprof[2][0], wprof[2][1], wprof[2][2]} }; - LabImage * labdeha = new LabImage(W, H); - + // We need a buffer with original L data to allow correct blending - float *labTmp[H] ALIGNED16; - float *labTmpBuffer = new float[H * W]; - for (int i = 0; i < H; i++) { - labTmp[i] = &labTmpBuffer[i * W]; + // red, green and blue still have original size of raw, but we can't use the borders + const int HNew = H-2*border; + const int WNew = W-2*border; + + LabImage * labdeha = new LabImage(WNew, HNew); + + float *labTmp[HNew] ALIGNED16; + float *labTmpBuffer = new float[HNew * WNew]; + for (int i = 0; i < HNew; i++) { + labTmp[i] = &labTmpBuffer[i * WNew]; } // Conversion rgb -> lab is hard to vectorize because it uses a lut (that's not the main problem) @@ -1839,24 +1844,24 @@ void RawImageSource::dehaz(RAWParams raw, ColorManagementParams cmp, DehazParams #ifdef _OPENMP #pragma omp parallel for #endif - for (int i = 0; i < H; i++ ) - for (int j = 0; j < W; j++) { + for (int i = border; i < H - border; i++ ) + for (int j = border; j < W - border; j++) { float X, Y, Z, L, aa, bb; //rgb=>lab Color::rgbxyz(red[i][j], green[i][j], blue[i][j], X, Y, Z, wp); //convert Lab Color::XYZ2Lab(X, Y, Z, L, aa, bb); - labTmp[i][j] = L; + labTmp[i-border][j-border] = L; if(dehacontlutili) { L = cdcurve[L]; //apply curve to equalize histogram } - labdeha->L[i][j] = L; - labdeha->a[i][j] = aa; - labdeha->b[i][j] = bb; + labdeha->L[i-border][j-border] = L; + labdeha->a[i-border][j-border] = aa; + labdeha->b[i-border][j-border] = bb; } - MSR(labdeha->L, labTmp, W, H, lcur); + MSR(labdeha->L, labTmp, WNew, HNew, lcur); delete [] labTmpBuffer; @@ -1872,16 +1877,16 @@ void RawImageSource::dehaz(RAWParams raw, ColorManagementParams cmp, DehazParams #ifdef _OPENMP #pragma omp parallel for #endif - for (int i = 0; i < H; i++ ) { - int j = 0; + for (int i = border; i < H - border; i++ ) { + int j = border; #ifdef __SSE2__ - for (; j < W - 3; j += 4) { + for (; j < W - border - 3; j += 4) { vfloat L2, a2, b2, x_, y_, z_; vfloat R, G, B; - L2 = LVFU(labdeha->L[i][j]); - a2 = LVFU(labdeha->a[i][j]); - b2 = LVFU(labdeha->b[i][j]); + L2 = LVFU(labdeha->L[i-border][j-border]); + a2 = LVFU(labdeha->a[i-border][j-border]); + b2 = LVFU(labdeha->b[i-border][j-border]); Color::Lab2XYZ(L2, a2, b2, x_, y_, z_) ; Color::xyz2rgb(x_, y_, z_, R, G, B, wipv); _mm_storeu_ps(&red[i][j], R); @@ -1889,12 +1894,12 @@ void RawImageSource::dehaz(RAWParams raw, ColorManagementParams cmp, DehazParams _mm_storeu_ps(&blue[i][j], B); } #endif - for (; j < W; j++) { + for (; j < W - border; j++) { float L2, a2, b2, x_, y_, z_; float R, G, B; - L2 = labdeha->L[i][j]; - a2 = labdeha->a[i][j]; - b2 = labdeha->b[i][j]; + L2 = labdeha->L[i-border][j-border]; + a2 = labdeha->a[i-border][j-border]; + b2 = labdeha->b[i-border][j-border]; Color::Lab2XYZ(L2, a2, b2, x_, y_, z_) ; Color::xyz2rgb(x_, y_, z_, R, G, B, wip); red[i][j] = R;