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
ufraw-cvs@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ufraw-cvs

Reply via email to