From b1bb0af84e8bb0951cb2543b365a75900a45b9d1 Mon Sep 17 00:00:00 2001 From: Oliver Duis Date: Tue, 26 Jun 2012 08:00:13 +0200 Subject: [PATCH] Fixed pink tint on thumbs, espc. Canon files see issue 1437 --- rtengine/hilite_recon.cc | 3 --- rtengine/rawimage.cc | 23 ++++++++++++----------- rtengine/rawimage.h | 5 ++++- rtengine/rawimagesource.cc | 22 ++++++++++++---------- 4 files changed, 28 insertions(+), 25 deletions(-) diff --git a/rtengine/hilite_recon.cc b/rtengine/hilite_recon.cc index 718abdc75..9640675b4 100644 --- a/rtengine/hilite_recon.cc +++ b/rtengine/hilite_recon.cc @@ -253,9 +253,6 @@ void RawImageSource :: HLRecovery_inpaint (float** red, float** green, float** b float medpt = max_f[0]+max_f[1]+max_f[2]-whitept-clippt; float blendpt = blendthresh*clippt; - float sat = ri->get_white(); - float black = ri->get_black(); - sat -= black; float camwb[4]; for (int c=0; c<4; c++) camwb[c]=ri->get_cam_mul(c); diff --git a/rtengine/rawimage.cc b/rtengine/rawimage.cc index 3d34a6136..a1e18566c 100644 --- a/rtengine/rawimage.cc +++ b/rtengine/rawimage.cc @@ -48,7 +48,7 @@ void RawImage::get_colorsCoeff( float *pre_mul_, float *scale_mul_, float *cblac unsigned row, col, x, y, c, sum[8]; unsigned W = this->get_width(); unsigned H = this->get_height(); - int val, dark, sat; + int val, sat; double dsum[8], dmin, dmax; for (int c = 0; c < 4; c++){ @@ -106,19 +106,18 @@ skip_block: ; } if (pre_mul_[3] == 0) pre_mul_[3] = this->get_colors() < 4 ? pre_mul_[1] : 1; - dark = this->get_black(); - sat = this->get_white(); - sat -= this->get_black(); for (dmin = DBL_MAX, dmax = c = 0; c < 4; c++) { if (dmin > pre_mul_[c]) dmin = pre_mul_[c]; if (dmax < pre_mul_[c]) dmax = pre_mul_[c]; } + + sat = this->get_white() - this->get_black(); for (c = 0; c < 4; c++) scale_mul_[c] = (pre_mul_[c] /= dmax) * 65535.0 / sat; if (settings->verbose) { - fprintf(stderr,"Scaling with darkness %d, saturation %d, and\nmultipliers", dark, sat); + fprintf(stderr,"Scaling with saturation %d, and\nmultipliers", sat); for (c = 0; c < 4; c++) fprintf(stderr, " %f", pre_mul[c]); fputc('\n', stderr); @@ -204,13 +203,15 @@ int RawImage::loadRaw (bool loadData, bool closeFile) } // Setting the black and cblack - unsigned int i = cblack[3]; + unsigned int minBlack = cblack[3]; for (int c=0; c <3; c++) - if (i > cblack[c]) - i = cblack[c]; - for (int c=0; c < 4; c++) - cblack[c] -= i; - black += i; + if (minBlack > cblack[c]) + minBlack = cblack[c]; + for (int c=0; c < 4; c++) cblack[c] -= minBlack; + black += minBlack; + for (int c=0; c < 4; c++) cblack[c] += black; + calcBlack=black; // safe for compatibility with darkframe substraction + black=0; // since black is already reflected in cblack now, set it to zero } if ( closeFile ) { diff --git a/rtengine/rawimage.h b/rtengine/rawimage.h index 867ecffea..beaf84bff 100644 --- a/rtengine/rawimage.h +++ b/rtengine/rawimage.h @@ -107,6 +107,8 @@ protected: char* profile_data; // Embedded ICC color profile unsigned short* allocation; // pointer to allocated memory + unsigned calcBlack; // calculated black, like DCRAW before 9.15 + public: std::string get_filename() const { return filename;} @@ -116,7 +118,8 @@ public: bool isBayer() const { return filters!=0; } unsigned get_filters() const { return filters; } int get_colors() const { return colors;} - int get_black() const { return black;} + int get_black() const { return black;} // from DCRAW 9.15 =0, but reflected in cblack + int get_calcblack() const { return calcBlack;} // simulated like DCRAW before 9.15 int get_cblack(int i) const {return cblack[i];} int get_white() const { return maximum;} unsigned short get_whiteSample( int r, int c ) const { return white[r][c];} diff --git a/rtengine/rawimagesource.cc b/rtengine/rawimagesource.cc index 796034278..16e35d0a0 100644 --- a/rtengine/rawimagesource.cc +++ b/rtengine/rawimagesource.cc @@ -1197,13 +1197,15 @@ void RawImageSource::HLRecovery_Global(HRecParams hrp ) */ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, RawImage *riDark, RawImage *riFlatFile ) { + unsigned short black=ri->get_calcblack(); + if (ri->isBayer()) { if (!rawData) rawData = allocArray(W,H); if (riDark && W == riDark->get_width() && H == riDark->get_height()) { for (int row = 0; row < H; row++) { for (int col = 0; col < W; col++) { - rawData[row][col] = max(src->data[row][col]+ri->get_black() - riDark->data[row][col], 0); + rawData[row][col] = max(src->data[row][col]+black - riDark->data[row][col], 0); } } }else{ @@ -1239,15 +1241,15 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw //find center ave values by channel for (int m=0; m<2; m++) for (int n=0; n<2; n++) { - refcolor[m][n] = max(0.0f,cfablur[(2*(H>>2)+m)*W+2*(W>>2)+n] - ri->get_black()); + refcolor[m][n] = max(0.0f,cfablur[(2*(H>>2)+m)*W+2*(W>>2)+n] - black); } for (int m=0; m<2; m++) for (int n=0; n<2; n++) { for (int row = 0; row+m < H; row+=2) for (int col = 0; col+n < W; col+=2) { - vignettecorr = ( refcolor[m][n]/max(1e-5f,cfablur[(row+m)*W+col+n]-ri->get_black()) ); - rawData[row+m][col+n] = (rawData[row+m][col+n]-ri->get_black()) * vignettecorr + ri->get_black(); + vignettecorr = ( refcolor[m][n]/max(1e-5f,cfablur[(row+m)*W+col+n]-black) ); + rawData[row+m][col+n] = (rawData[row+m][col+n]-black) * vignettecorr + black; } } @@ -1266,9 +1268,9 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw for (int n=0; n<2; n++) { for (int row = 0; row+m < H; row+=2) for (int col = 0; col+n < W; col+=2) { - hlinecorr = (max(1e-5f,cfablur[(row+m)*W+col+n]-ri->get_black())/max(1e-5f,cfablur1[(row+m)*W+col+n]-ri->get_black()) ); - vlinecorr = (max(1e-5f,cfablur[(row+m)*W+col+n]-ri->get_black())/max(1e-5f,cfablur2[(row+m)*W+col+n]-ri->get_black()) ); - rawData[row+m][col+n] = ((rawData[row+m][col+n]-ri->get_black()) * hlinecorr * vlinecorr + ri->get_black()); + hlinecorr = (max(1e-5f,cfablur[(row+m)*W+col+n]-black)/max(1e-5f,cfablur1[(row+m)*W+col+n]-black) ); + vlinecorr = (max(1e-5f,cfablur[(row+m)*W+col+n]-black)/max(1e-5f,cfablur2[(row+m)*W+col+n]-black) ); + rawData[row+m][col+n] = ((rawData[row+m][col+n]-black) * hlinecorr * vlinecorr + black); } } free (cfablur1); @@ -1289,9 +1291,9 @@ void RawImageSource::copyOriginalPixels(const RAWParams &raw, RawImage *src, Raw if (riDark && W == riDark->get_width() && H == riDark->get_height()) { for (int row = 0; row < H; row++) { for (int col = 0; col < W; col++) { - rawData[row][3*col+0] = max(src->data[row][3*col+0]+ri->get_black() - riDark->data[row][3*col+0], 0); - rawData[row][3*col+1] = max(src->data[row][3*col+1]+ri->get_black() - riDark->data[row][3*col+1], 0); - rawData[row][3*col+2] = max(src->data[row][3*col+2]+ri->get_black() - riDark->data[row][3*col+2], 0); + rawData[row][3*col+0] = max(src->data[row][3*col+0]+black - riDark->data[row][3*col+0], 0); + rawData[row][3*col+1] = max(src->data[row][3*col+1]+black - riDark->data[row][3*col+1], 0); + rawData[row][3*col+2] = max(src->data[row][3*col+2]+black - riDark->data[row][3*col+2], 0); } } } else {