Update of /cvsroot/ufraw/ufraw
In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv15596
Modified Files:
dcraw.cc dcraw.h dcraw_api.cc
Log Message:
Update Sigma TRUE II support to match Tam Merlant's libx3f.
Index: dcraw.cc
===================================================================
RCS file: /cvsroot/ufraw/ufraw/dcraw.cc,v
retrieving revision 1.337
retrieving revision 1.338
diff -u -d -r1.337 -r1.338
--- dcraw.cc 26 May 2015 04:00:14 -0000 1.337
+++ dcraw.cc 13 Jun 2015 04:00:09 -0000 1.338
@@ -3461,43 +3461,33 @@
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wmaybe-uninitialized"
#endif
-#pragma GCC diagnostic push
-#pragma GCC diagnostic ignored "-Wunused-variable"
-void CLASS foveon_dp_interpolate()
+void CLASS sigma_true_ii_interpolate()
{
static const short hood[] = { -1,-1, -1,0, -1,1, 0,-1, 0,1, 1,-1, 1,0, 1,1 };
- short *pix, prev[3], *curve[8], (*shrink)[3];
- float cfilt=0, ddft[3][3][2], ppm[3][3][3];
- float cam_xyz[3][3], correct[3][3], last[3][3], trans[3][3];
- float chroma_dq[3], color_dq[3], diag[3][3], div[3];
- float (*black)[3], (*sgain)[3], (*sgrow)[3];
- float fsum[3], val, frow, num;
- int row, col, c, i, j, diff, sgx, irow, sum, min, max, limit;
+ short *pix, *curve[8];
+ float cfilt=0, ddft[3][3][2];
+ float cam_xyz[3][3], correct[3][3], last[3][3];
+ float chroma_dq[3], color_dq[3], diag[3][3], div[3], tempgainfact[3];
+ float fsum[3], num;
+ int row, col, c, i, j, sum, min, max, limit;
int dscr[2][2], dstb[4], (*smrow[7])[3], total[4], ipix[3];
- int work[3][3], smlast, smred, smred_p=0, dev[3];
+ int smlast, smred, smred_p=0, dev[3];
int satlev[3], keep[4], active[4], version[2], dp1=0;
unsigned dim[3], *badpix;
- double dsum=0, trsum[3];
- char str[128];
+ double dsum=0;
const char* cp;
- dcraw_message (DCRAW_VERBOSE,_("Foveon DP interpolation...\n"));
+ dcraw_message (DCRAW_VERBOSE,_("Sigma TRUE II interpolation...\n"));
foveon_load_camf();
foveon_fixed (version, 2, "ContentVersionNumber");
if (version[1] == 70) dp1=1;
+ if (!dp1) simple_coeff(4);
foveon_fixed (dscr, 4, "DarkShieldColRange");
-#if 0
- foveon_fixed (ppm[0][0], 27, "PostPolyMatrix");
-#endif
- if (foveon_camf_param ("IncludeBlocks", "SaturationLevel"))
- foveon_fixed (satlev, 3, "SaturationLevel");
- else satlev[0] = satlev[1] = satlev[2] = 0xfff; /* FIXME */
foveon_fixed (keep, 4, "KeepImageArea");
foveon_fixed (active, 4, "ActiveImageArea");
if (foveon_camf_param ("IncludeBlocks", "ChromaDQ"))
foveon_fixed (chroma_dq, 3, "ChromaDQ");
- else chroma_dq[0] = chroma_dq[1] = chroma_dq[2] = 10; /* FIXME */
foveon_fixed (color_dq, 3,
foveon_camf_param ("IncludeBlocks", "ColorDQ") ?
"ColorDQ" : "ColorDQCamRGB");
@@ -3515,14 +3505,6 @@
FORC3 ddft[i+1][c][1] /= (dstb[3]-dstb[1]+1) * (dstb[2]-dstb[0]+1);
}
-#if 0
- if (!(cp = foveon_camf_param ("WhiteBalanceIlluminants", model2)))
- { dcraw_message (DCRAW_ERROR,_("%s: Invalid white balance \"%s\"\n"),
ifname_display, model2);
- return; }
- foveon_fixed (cam_xyz, 9, cp);
- foveon_fixed (correct, 9,
- foveon_camf_param ("WhiteBalanceCorrections", model2));
-#endif
if (dp1) {
if (!(cp = foveon_camf_param ("DP1_WhiteBalanceColorCorrections", model2)))
{ dcraw_message (DCRAW_ERROR,_("%s: Invalid white balance \"%s\"\n"),
ifname_display, model2);
@@ -3548,11 +3530,6 @@
FORC3 diag[c][i] = LAST(1,1)*LAST(2,2) - LAST(1,2)*LAST(2,1);
#undef LAST
FORC3 div[c] = diag[c][0]*0.3127 + diag[c][1]*0.329 + diag[c][2]*0.3583;
-#if 0
- sprintf (str, "%sRGBNeutral", model2);
- if (foveon_camf_param ("IncludeBlocks", str))
- foveon_fixed (div, 3, str);
-#endif
if (dp1) {
if (foveon_camf_param ("IncludeBlocks", "DP1_WhiteBalanceGains"))
foveon_fixed (div, 3, foveon_camf_param ("DP1_WhiteBalanceGains",
model2));
@@ -3560,23 +3537,34 @@
if (foveon_camf_param ("IncludeBlocks", "WhiteBalanceGains"))
foveon_fixed (div, 3, foveon_camf_param ("WhiteBalanceGains", model2));
}
+ if (foveon_camf_param("IncludeBlocks", "TempGainFact")) {
+ foveon_fixed(tempgainfact, 3, "TempGainFact");
+ FORC3 div[c]*=tempgainfact[c];
+ }
+ if (foveon_camf_param("IncludeBlocks", "SensorAdjustmentGainFact")) {
+ foveon_fixed(tempgainfact, 3, "SensorAdjustmentGainFact");
+ FORC3 div[c]*=tempgainfact[c];
+ }
+ if (foveon_camf_param("IncludeBlocks", "CorrectColorGain_BR")) {
+ foveon_fixed(tempgainfact, 3, "CorrectColorGain_BR");
+ FORC3 div[c]*=tempgainfact[c];
+ }
+ if (foveon_camf_param("IncludeBlocks", "CorrectColorGain_GR")) {
+ foveon_fixed(tempgainfact, 3, "CorrectColorGain_GR");
+ FORC3 div[c]*=tempgainfact[c];
+ }
+ if (foveon_camf_param("IncludeBlocks", "CorrectColorGain_RR")) {
+ foveon_fixed(tempgainfact, 3, "CorrectColorGain_RR");
+ FORC3 div[c]*=tempgainfact[c];
+ }
+ if (foveon_camf_param("IncludeBlocks", "DespAdjust")) {
+ foveon_fixed(tempgainfact, 3, "DespAdjust");
+ FORC3 div[c]*=tempgainfact[c];
+ }
num = 0;
FORC3 if (num < div[c]) num = div[c];
FORC3 div[c] /= num;
- memset (trans, 0, sizeof trans);
- for (i=0; i < 3; i++)
- for (j=0; j < 3; j++)
- FORC3 trans[i][j] += rgb_cam[i][c] * last[c][j] * div[j];
- FORC3 trsum[c] = trans[c][0] + trans[c][1] + trans[c][2];
- dsum = (6*trsum[0] + 11*trsum[1] + 3*trsum[2]) / 20;
- for (i=0; i < 3; i++)
- FORC3 last[i][c] = trans[i][c] * dsum / trsum[i];
- memset (trans, 0, sizeof trans);
- for (i=0; i < 3; i++)
- for (j=0; j < 3; j++)
- FORC3 trans[i][j] += (i==c ? 32 : -1) * last[c][j] / 30;
-
foveon_make_curves (curve, color_dq, div, cfilt);
FORC3 chroma_dq[c] /= 3;
foveon_make_curves (curve+3, chroma_dq, div, cfilt);
@@ -3584,102 +3572,6 @@
curve[6] = foveon_make_curve (dsum, dsum, cfilt);
curve[7] = foveon_make_curve (dsum*2, dsum*2, cfilt);
-#if 0
- sgain = (float (*)[3]) foveon_camf_matrix (dim, "SpatialGain");
- if (!sgain) return;
- sgrow = (float (*)[3]) calloc (dim[1], sizeof *sgrow);
- sgx = (width + dim[1]-2) / (dim[1]-1);
-
- black = (float (*)[3]) calloc (height, sizeof *black);
- for (row=0; row < height; row++) {
- for (i=0; i < 6; i++)
- ((float *)ddft[0])[i] = ((float *)ddft[1])[i] +
- row / (height-1.0) * (((float *)ddft[2])[i] - ((float *)ddft[1])[i]);
- FORC3 black[row][c] =
- ( foveon_avg (image[row*width]+c, dscr[0], cfilt) +
- foveon_avg (image[row*width]+c, dscr[1], cfilt) * 3
- - ddft[0][c][0] ) / 4 - ddft[0][c][1];
- }
- memcpy (black, black+8, sizeof *black*8);
- memcpy (black+height-11, black+height-22, 11*sizeof *black);
- memcpy (last, black, sizeof last);
-
- for (row=1; row < height-1; row++) {
- FORC3 if (last[1][c] > last[0][c]) {
- if (last[1][c] > last[2][c])
- black[row][c] = (last[0][c] > last[2][c]) ? last[0][c]:last[2][c];
- } else
- if (last[1][c] < last[2][c])
- black[row][c] = (last[0][c] < last[2][c]) ? last[0][c]:last[2][c];
- memmove (last, last+1, 2*sizeof last[0]);
- memcpy (last[2], black[row+1], sizeof last[2]);
- }
- FORC3 black[row][c] = (last[0][c] + last[1][c])/2;
- FORC3 black[0][c] = (black[1][c] + black[3][c])/2;
-
- val = 1 - exp(-1/24.0);
- memcpy (fsum, black, sizeof fsum);
- for (row=1; row < height; row++)
- FORC3 fsum[c] += black[row][c] =
- (black[row][c] - black[row-1][c])*val + black[row-1][c];
- memcpy (last[0], black[height-1], sizeof last[0]);
- FORC3 fsum[c] /= height;
- for (row = height; row--; )
- FORC3 last[0][c] = black[row][c] =
- (black[row][c] - fsum[c] - last[0][c])*val + last[0][c];
-
- memset (total, 0, sizeof total);
- for (row=2; row < height; row+=4)
- for (col=2; col < width; col+=4) {
- FORC3 total[c] += (short) image[row*width+col][c];
- total[3]++;
- }
- for (row=0; row < height; row++)
- FORC3 black[row][c] += fsum[c]/2 + total[c]/(total[3]*100.0);
-
- for (row=0; row < height; row++) {
- for (i=0; i < 6; i++)
- ((float *)ddft[0])[i] = ((float *)ddft[1])[i] +
- row / (height-1.0) * (((float *)ddft[2])[i] - ((float *)ddft[1])[i]);
- pix = image[row*width];
- memcpy (prev, pix, sizeof prev);
- frow = row / (height-1.0) * (dim[2]-1);
- if ((irow = frow) == dim[2]-1) irow--;
- frow -= irow;
- for (i=0; i < dim[1]; i++)
- FORC3 sgrow[i][c] = sgain[ irow *dim[1]+i][c] * (1-frow) +
- sgain[(irow+1)*dim[1]+i][c] * frow;
- for (col=0; col < width; col++) {
- FORC3 {
- diff = pix[c] - prev[c];
- prev[c] = pix[c];
- ipix[c] = pix[c] + floor ((diff + (diff*diff >> 14)) * cfilt
- - ddft[0][c][1] - ddft[0][c][0] * ((float) col/width - 0.5)
- - black[row][c] );
- }
- FORC3 {
- work[0][c] = ipix[c] * ipix[c] >> 14;
- work[2][c] = ipix[c] * work[0][c] >> 14;
- work[1][2-c] = ipix[(c+1) % 3] * ipix[(c+2) % 3] >> 14;
- }
- FORC3 {
- for (val=i=0; i < 3; i++)
- for ( j=0; j < 3; j++)
- val += ppm[c][i][j] * work[i][j];
- ipix[c] = floor ((ipix[c] + floor(val)) *
- ( sgrow[col/sgx ][c] * (sgx - col%sgx) +
- sgrow[col/sgx+1][c] * (col%sgx) ) / sgx / div[c]);
- if (ipix[c] > 32000) ipix[c] = 32000;
- pix[c] = ipix[c];
- }
- pix += 4;
- }
- }
- free (black);
- free (sgrow);
- free (sgain);
-#endif
-
if (foveon_camf_param ("IncludeBlocks", "BadPixels")) {
badpix = (unsigned *) foveon_camf_matrix (dim, "BadPixels");
for (i=0; i < (int) dim[0]; i++) {
@@ -3701,7 +3593,7 @@
/* Array for 5x5 Gaussian averaging of red values */
smrow[6] = (int (*)[3]) calloc (width*5, sizeof **smrow);
- merror (smrow[6], "foveon_dp_interpolate()");
+ merror (smrow[6], "sigma_true_ii_interpolate()");
for (i=0; i < 5; i++)
smrow[i] = smrow[6] + i*width;
@@ -3733,27 +3625,30 @@
}
/* Adjust the brighter pixels for better linearity */
- min = 0xffff;
- FORC3 {
- i = satlev[c] / div[c];
- if (min > i) min = i;
- }
- limit = min * 9 >> 4;
- for (pix=image[0]; pix < image[height*width]; pix+=4) {
- if (pix[0] <= limit || pix[1] <= limit || pix[2] <= limit)
- continue;
- min = max = pix[0];
- for (c=1; c < 3; c++) {
- if (min > pix[c]) min = pix[c];
- if (max < pix[c]) max = pix[c];
+ if (foveon_camf_param ("IncludeBlocks", "SaturationLevel")) {
+ foveon_fixed (satlev, 3, "SaturationLevel");
+ min = 0xffff;
+ FORC3 {
+ i = satlev[c] / div[c];
+ if (min > i) min = i;
}
- if (min >= limit*2) {
- pix[0] = pix[1] = pix[2] = max;
- } else {
- i = 0x4000 - ((min - limit) << 14) / limit;
- i = 0x4000 - (i*i >> 14);
- i = i*i >> 14;
- FORC3 pix[c] += (max - pix[c]) * i >> 14;
+ limit = min * 9 >> 4;
+ for (pix=image[0]; pix < image[height*width]; pix+=4) {
+ if (pix[0] <= limit || pix[1] <= limit || pix[2] <= limit)
+ continue;
+ min = max = pix[0];
+ for (c=1; c < 3; c++) {
+ if (min > pix[c]) min = pix[c];
+ if (max < pix[c]) max = pix[c];
+ }
+ if (min >= limit*2) {
+ pix[0] = pix[1] = pix[2] = max;
+ } else {
+ i = 0x4000 - ((min - limit) << 14) / limit;
+ i = 0x4000 - (i*i >> 14);
+ i = i*i >> 14;
+ FORC3 pix[c] += (max - pix[c]) * i >> 14;
+ }
}
}
/*
@@ -3807,83 +3702,26 @@
}
}
-#if 0
/* Transform the image to a different colorspace */
+ min = 0xffff;
+ max = 0;
for (pix=image[0]; pix < image[height*width]; pix+=4) {
FORC3 pix[c] -= foveon_apply_curve (curve[c], pix[c]);
sum = (pix[0]+pix[1]+pix[1]+pix[2]) >> 2;
FORC3 pix[c] -= foveon_apply_curve (curve[c], pix[c]-sum);
FORC3 {
for (dsum=i=0; i < 3; i++)
- dsum += trans[c][i] * pix[i];
+ dsum += rgb_cam[c][i] * last[c][i] * div[i] * pix[i];
if (dsum < 0) dsum = 0;
if (dsum > 24000) dsum = 24000;
ipix[c] = dsum + 0.5;
}
- FORC3 pix[c] = ipix[c];
- }
-#endif
-
- /* Smooth the image bottom-to-top and save at 1/4 scale */
- shrink = (short (*)[3]) calloc ((height/4), (width/4)*sizeof *shrink);
- merror (shrink, "foveon_dp_interpolate()");
- for (row = height/4; row--; )
- for (col=0; col < width/4; col++) {
- ipix[0] = ipix[1] = ipix[2] = 0;
- for (i=0; i < 4; i++)
- for (j=0; j < 4; j++)
- FORC3 ipix[c] += image[(row*4+i)*width+col*4+j][c];
- FORC3
- if (row+2 > height/4)
- shrink[row*(width/4)+col][c] = ipix[c] >> 4;
- else
- shrink[row*(width/4)+col][c] =
- (shrink[(row+1)*(width/4)+col][c]*1840 + ipix[c]*141 + 2048) >> 12;
- }
- /* From the 1/4-scale image, smooth right-to-left */
- for (row=0; row < (height & ~3); row++) {
- ipix[0] = ipix[1] = ipix[2] = 0;
- if ((row & 3) == 0)
- for (col = width & ~3 ; col--; )
- FORC3 smrow[0][col][c] = ipix[c] =
- (shrink[(row/4)*(width/4)+col/4][c]*1485 + ipix[c]*6707 + 4096) >> 13;
-
- /* Then smooth left-to-right */
- ipix[0] = ipix[1] = ipix[2] = 0;
- for (col=0; col < (width & ~3); col++)
- FORC3 smrow[1][col][c] = ipix[c] =
- (smrow[0][col][c]*1485 + ipix[c]*6707 + 4096) >> 13;
-
- /* Smooth top-to-bottom */
- if (row == 0)
- memcpy (smrow[2], smrow[1], sizeof **smrow * width);
- else
- for (col=0; col < (width & ~3); col++)
- FORC3 smrow[2][col][c] =
- (smrow[2][col][c]*6707 + smrow[1][col][c]*1485 + 4096) >> 13;
-
- /* Adjust the chroma toward the smooth values */
- for (col=0; col < (width & ~3); col++) {
- for (i=j=30, c=0; c < 3; c++) {
- i += smrow[2][col][c];
- j += image[row*width+col][c];
- }
- j = (j << 16) / i;
- for (sum=c=0; c < 3; c++) {
- ipix[c] = foveon_apply_curve (curve[c+3],
- ((smrow[2][col][c] * j + 0x8000) >> 16) - image[row*width+col][c]);
- sum += ipix[c];
- }
- sum >>= 3;
- FORC3 {
- i = image[row*width+col][c] + ipix[c] - sum;
- if (i < 0) i = 0;
- image[row*width+col][c] = i;
- }
+ FORC3 {
+ pix[c] = ipix[c];
+ if (pix[c] < min) min = pix[c];
+ if (pix[c] > max) max = pix[c];
}
}
- free (shrink);
- free (smrow[6]);
for (i=0; i < 8; i++)
free (curve[i]);
@@ -3897,7 +3735,6 @@
width = i;
height = row;
}
-#pragma GCC diagnostic pop
void CLASS foveon_interpolate()
{
@@ -8623,7 +8460,7 @@
void CLASS simple_coeff (int index)
{
static const float table[][12] = {
- /* index 0 -- all Foveon cameras */
+ /* index 0 -- Older Foveon cameras including Sigma DP1/DP1S */
{ 1.4032,-0.2231,-0.1016,-0.5263,1.4816,0.017,-0.0112,0.0183,0.9113 },
/* index 1 -- Kodak DC20 and DC25 */
{ 2.25,0.75,-1.75,-0.25,-0.25,0.75,0.75,-0.25,-0.25,-1.75,0.75,2.25 },
@@ -8632,7 +8469,9 @@
/* index 3 -- Nikon E880, E900, and E990 */
{ -1.936280, 1.800443, -1.448486, 2.584324,
1.405365, -0.524955, -0.289090, 0.408680,
- -1.204965, 1.082304, 2.941367, -1.818705 }
+ -1.204965, 1.082304, 2.941367, -1.818705 },
+ /* index 4 -- Sigma TRUE II cameras except Sigma DP1/DP1S */
+ { 1.0832,-0.1931,-0.1016,-0.5763,1.0616,0.017,-0.0612,0.0183,0.8613 }
};
unsigned i, c;
@@ -10724,7 +10563,7 @@
for (i=0; i < height*width*4; i++)
if ((short) image[0][i] < 0) image[0][i] = 0;
} else if (load_raw == &CLASS foveon_dp_load_raw)
- foveon_dp_interpolate();
+ sigma_true_ii_interpolate();
else foveon_interpolate();
} else if (document_mode < 2)
scale_colors();
Index: dcraw.h
===================================================================
RCS file: /cvsroot/ufraw/ufraw/dcraw.h,v
retrieving revision 1.89
retrieving revision 1.90
diff -u -d -r1.89 -r1.90
--- dcraw.h 25 May 2015 04:30:11 -0000 1.89
+++ dcraw.h 13 Jun 2015 04:00:09 -0000 1.90
@@ -226,7 +226,7 @@
void foveon_make_curves
(short **curvep, float dq[3], float div[3], float filt);
int foveon_apply_curve(short *curve, int i);
- void foveon_dp_interpolate();
+ void sigma_true_ii_interpolate();
void foveon_interpolate();
void crop_masked_pixels();
void remove_zeroes();
Index: dcraw_api.cc
===================================================================
RCS file: /cvsroot/ufraw/ufraw/dcraw_api.cc,v
retrieving revision 1.103
retrieving revision 1.104
diff -u -d -r1.103 -r1.104
--- dcraw_api.cc 26 Mar 2015 14:00:14 -0000 1.103
+++ dcraw_api.cc 13 Jun 2015 04:00:09 -0000 1.104
@@ -265,7 +265,7 @@
if (d->is_foveon) {
if (d->load_raw == &DCRaw::foveon_dp_load_raw) {
d->meta_data = 0;
- d->foveon_dp_interpolate();
+ d->sigma_true_ii_interpolate();
} else d->foveon_interpolate();
h->raw.width = h->width = d->width;
h->raw.height = h->height = d->height;
------------------------------------------------------------------------------
_______________________________________________
ufraw-cvs mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/ufraw-cvs