Fixed pink tint on thumbs, espc. Canon files

see issue 1437
This commit is contained in:
Oliver Duis
2012-06-26 08:00:13 +02:00
parent 28966315b9
commit b1bb0af84e
4 changed files with 28 additions and 25 deletions

View File

@@ -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);

View File

@@ -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 ) {

View File

@@ -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];}

View File

@@ -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<float>(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 {