• Main Page
  • Related Pages
  • Modules
  • Data Structures
  • Files

hvirtual/cinelerra/dcraw.c

Go to the documentation of this file.
00001 /*
00002    dcraw.c -- Dave Coffin's raw photo decoder
00003    Copyright 1997-2006 by Dave Coffin, dcoffin a cybercom o net
00004 
00005    This is a command-line ANSI C program to convert raw photos from
00006    any digital camera on any computer running any operating system.
00007 
00008    Attention!  Some parts of this program are restricted under the
00009    terms of the GNU General Public License.  Such code is enclosed
00010    in "BEGIN GPL BLOCK" and "END GPL BLOCK" declarations.
00011    Any code not declared GPL is free for all uses.
00012 
00013    Starting in Revision 1.237, the code to support Foveon cameras
00014    is under GPL.
00015 
00016    To lawfully redistribute dcraw.c, you must either (a) include
00017    full source code for all executable files containing restricted
00018    functions, (b) remove these functions, re-implement them, or
00019    copy them from an earlier, non-GPL Revision of dcraw.c, or (c)
00020    purchase a license from the author.
00021 
00022    $Revision: 1.321 $
00023    $Date: 2006/03/31 21:54:29 $
00024  */
00025 
00026 #define _GNU_SOURCE
00027 #define _USE_MATH_DEFINES
00028 #include <ctype.h>
00029 #include <errno.h>
00030 #include <fcntl.h>
00031 #include <float.h>
00032 #include <limits.h>
00033 #include <math.h>
00034 #include <setjmp.h>
00035 #include <stdio.h>
00036 #include <stdlib.h>
00037 #include <string.h>
00038 #include <time.h>
00039 /*
00040    NO_JPEG disables decoding of compressed Kodak DC120 files.
00041    NO_LCMS disables the "-p" option.
00042  */
00043 
00044 // CINELERRA
00045 #define NO_LCMS
00046 
00047 #ifndef NO_JPEG
00048 #include <jpeglib.h>
00049 #endif
00050 #ifndef NO_LCMS
00051 #include <lcms.h>
00052 #endif
00053 
00054 #ifdef __CYGWIN__
00055 #include <io.h>
00056 #endif
00057 #ifdef WIN32
00058 #include <sys/utime.h>
00059 #include <winsock2.h>
00060 #pragma comment(lib, "ws2_32.lib")
00061 #define strcasecmp stricmp
00062 typedef __int64 INT64;
00063 typedef unsigned __int64 UINT64;
00064 #else
00065 #include <unistd.h>
00066 #include <utime.h>
00067 #include <netinet/in.h>
00068 typedef long long INT64;
00069 typedef unsigned long long UINT64;
00070 #endif
00071 
00072 #ifdef LJPEG_DECODE
00073 #error Please compile dcraw.c by itself.
00074 #error Do not link it with ljpeg_decode.
00075 #endif
00076 
00077 #ifndef LONG_BIT
00078 #define LONG_BIT (8 * sizeof (long))
00079 #endif
00080 
00081 #define ushort UshORt
00082 typedef unsigned char uchar;
00083 typedef unsigned short ushort;
00084 
00085 /*
00086    All global variables are defined here, and all functions that
00087    access them are prefixed with "CLASS".  Note that a thread-safe
00088    C++ class cannot have non-const static local variables.
00089  */
00090 
00091 
00092 
00093 // CINELERRA
00094 char dcraw_info[1024];
00095 float **dcraw_data;
00096 int dcraw_alpha;
00097 float dcraw_matrix[9];
00098 
00099 
00100 FILE *ifp;
00101 short order;
00102 char *ifname, make[64], model[72], model2[64], *meta_data, cdesc[5];
00103 float flash_used, canon_ev, iso_speed, shutter, aperture, focal_len;
00104 time_t timestamp;
00105 unsigned shot_order, kodak_cbpp, filters;
00106 int profile_offset, profile_length;
00107 int thumb_offset, thumb_length, thumb_width, thumb_height, thumb_misc;
00108 int data_offset, strip_offset, curve_offset, meta_offset, meta_length;
00109 int tiff_nifds, tiff_flip, tiff_bps, tiff_compress;
00110 int raw_height, raw_width, top_margin, left_margin;
00111 int height, width, fuji_width, colors, tiff_samples;
00112 int black, maximum, clip_max, raw_color, use_gamma;
00113 int iheight, iwidth, shrink, flip, xmag, ymag;
00114 int zero_after_ff, is_raw, dng_version, is_foveon;
00115 ushort (*image)[4], white[8][8], curve[0x1000], cr2_slice[3];
00116 float bright=1, red_scale=1, blue_scale=1, sigma_d=0, sigma_r=0;
00117 int four_color_rgb=0, document_mode=0, clip_color=1;
00118 int verbose=0, use_auto_wb=0, use_camera_wb=0, output_color=1;
00119 int fuji_layout, fuji_secondary, use_secondary=0;
00120 float cam_mul[4], pre_mul[4], rgb_cam[3][4];    /* RGB from camera color */
00121 const double xyz_rgb[3][3] = {                  /* XYZ from RGB */
00122   { 0.412453, 0.357580, 0.180423 },
00123   { 0.212671, 0.715160, 0.072169 },
00124   { 0.019334, 0.119193, 0.950227 } };
00125 const float d65_white[3] = { 0.950456, 1, 1.088754 };
00126 #define camera_red  cam_mul[0]
00127 #define camera_blue cam_mul[2]
00128 int histogram[4][0x2000];
00129 void write_ppm(FILE *);
00130 void (*write_thumb)(FILE *), (*write_fun)(FILE *);
00131 void (*load_raw)(), (*thumb_load_raw)();
00132 jmp_buf failure;
00133 
00134 struct decode {
00135   struct decode *branch[2];
00136   int leaf;
00137 } first_decode[2048], *second_decode, *free_decode;
00138 
00139 struct {
00140   int width, height, bps, comp, phint, offset, flip, samples, bytes;
00141 } tiff_ifd[10];
00142 
00143 #define CLASS
00144 
00145 #define FORC3 for (c=0; c < 3; c++)
00146 #define FORC4 for (c=0; c < 4; c++)
00147 #define FORCC for (c=0; c < colors; c++)
00148 
00149 #define SQR(x) ((x)*(x))
00150 #define ABS(x) (((int)(x) ^ ((int)(x) >> 31)) - ((int)(x) >> 31))
00151 #define MIN(a,b) ((a) < (b) ? (a) : (b))
00152 #define MAX(a,b) ((a) > (b) ? (a) : (b))
00153 #define LIM(x,min,max) MAX(min,MIN(x,max))
00154 #define ULIM(x,y,z) ((y) < (z) ? LIM(x,y,z) : LIM(x,z,y))
00155 #define CLIP(x) LIM(x,0,clip_max)
00156 #define SWAP(a,b) { a ^= b; a ^= (b ^= a); }
00157 
00158 /*
00159    In order to inline this calculation, I make the risky
00160    assumption that all filter patterns can be described
00161    by a repeating pattern of eight rows and two columns
00162 
00163    Return values are either 0/1/2/3 = G/M/C/Y or 0/1/2/3 = R/G1/B/G2
00164  */
00165 #define FC(row,col) \
00166         (filters >> ((((row) << 1 & 14) + ((col) & 1)) << 1) & 3)
00167 
00168 #define BAYER(row,col) \
00169         image[((row) >> shrink)*iwidth + ((col) >> shrink)][FC(row,col)]
00170 
00171 /*
00172         PowerShot 600   PowerShot A50   PowerShot Pro70 Pro90 & G1
00173         0xe1e4e1e4:     0x1b4e4b1e:     0x1e4b4e1b:     0xb4b4b4b4:
00174 
00175           0 1 2 3 4 5     0 1 2 3 4 5     0 1 2 3 4 5     0 1 2 3 4 5
00176         0 G M G M G M   0 C Y C Y C Y   0 Y C Y C Y C   0 G M G M G M
00177         1 C Y C Y C Y   1 M G M G M G   1 M G M G M G   1 Y C Y C Y C
00178         2 M G M G M G   2 Y C Y C Y C   2 C Y C Y C Y
00179         3 C Y C Y C Y   3 G M G M G M   3 G M G M G M
00180                         4 C Y C Y C Y   4 Y C Y C Y C
00181         PowerShot A5    5 G M G M G M   5 G M G M G M
00182         0x1e4e1e4e:     6 Y C Y C Y C   6 C Y C Y C Y
00183                         7 M G M G M G   7 M G M G M G
00184           0 1 2 3 4 5
00185         0 C Y C Y C Y
00186         1 G M G M G M
00187         2 C Y C Y C Y
00188         3 M G M G M G
00189 
00190    All RGB cameras use one of these Bayer grids:
00191 
00192         0x16161616:     0x61616161:     0x49494949:     0x94949494:
00193 
00194           0 1 2 3 4 5     0 1 2 3 4 5     0 1 2 3 4 5     0 1 2 3 4 5
00195         0 B G B G B G   0 G R G R G R   0 G B G B G B   0 R G R G R G
00196         1 G R G R G R   1 B G B G B G   1 R G R G R G   1 G B G B G B
00197         2 B G B G B G   2 G R G R G R   2 G B G B G B   2 R G R G R G
00198         3 G R G R G R   3 B G B G B G   3 R G R G R G   3 G B G B G B
00199  */
00200 
00201 #ifndef __GLIBC__
00202 char *my_memmem (char *haystack, size_t haystacklen,
00203               char *needle, size_t needlelen)
00204 {
00205   char *c;
00206   for (c = haystack; c <= haystack + haystacklen - needlelen; c++)
00207     if (!memcmp (c, needle, needlelen))
00208       return c;
00209   return NULL;
00210 }
00211 #define memmem my_memmem
00212 #endif
00213 
00214 void CLASS merror (void *ptr, char *where)
00215 {
00216   if (ptr) return;
00217   fprintf (stderr, "%s: Out of memory in %s\n", ifname, where);
00218   longjmp (failure, 1);
00219 }
00220 
00221 ushort CLASS sget2 (uchar *s)
00222 {
00223   if (order == 0x4949)          /* "II" means little-endian */
00224     return s[0] | s[1] << 8;
00225   else                          /* "MM" means big-endian */
00226     return s[0] << 8 | s[1];
00227 }
00228 
00229 ushort CLASS get2()
00230 {
00231   uchar str[2] = { 0xff,0xff };
00232   fread (str, 1, 2, ifp);
00233   return sget2(str);
00234 }
00235 
00236 int CLASS sget4 (uchar *s)
00237 {
00238   if (order == 0x4949)
00239     return s[0] | s[1] << 8 | s[2] << 16 | s[3] << 24;
00240   else
00241     return s[0] << 24 | s[1] << 16 | s[2] << 8 | s[3];
00242 }
00243 #define sget4(s) sget4((uchar *)s)
00244 
00245 int CLASS get4()
00246 {
00247   uchar str[4] = { 0xff,0xff,0xff,0xff };
00248   fread (str, 1, 4, ifp);
00249   return sget4(str);
00250 }
00251 
00252 int CLASS getint (int type)
00253 {
00254   return type == 3 ? get2() : get4();
00255 }
00256 
00257 float CLASS int_to_float (int i)
00258 {
00259   union { int i; float f; } u;
00260   u.i = i;
00261   return u.f;
00262 }
00263 
00264 double CLASS getreal (int type)
00265 {
00266   double num;
00267   switch (type) {
00268     case 3: return (unsigned short) get2();
00269     case 4: return (unsigned int) get4();
00270     case 5:  num = (unsigned int) get4();
00271       return num / (unsigned int) get4();
00272     case 8: return (signed short) get2();
00273     case 9: return (signed int) get4();
00274     case 10: num = (signed int) get4();
00275       return num / (signed int) get4();
00276     case 11: return int_to_float (get4());
00277     case 12:
00278       fprintf (stderr, "%s: TIFF doubles not supported!\n", ifname);
00279       longjmp (failure, 4);
00280     default: return fgetc(ifp);
00281   }
00282 }
00283 #define getrat() getreal(10)
00284 
00285 void CLASS read_shorts (ushort *pixel, int count)
00286 {
00287   fread (pixel, 2, count, ifp);
00288   if ((order == 0x4949) == (ntohs(0x1234) == 0x1234))
00289     swab (pixel, pixel, count*2);
00290 }
00291 
00292 void CLASS canon_600_fixed_wb (int temp)
00293 {
00294   static const short mul[4][5] = {
00295     {  667, 358,397,565,452 },
00296     {  731, 390,367,499,517 },
00297     { 1119, 396,348,448,537 },
00298     { 1399, 485,431,508,688 } };
00299   int lo, hi, i;
00300   float frac=0;
00301 
00302   for (lo=4; --lo; )
00303     if (*mul[lo] <= temp) break;
00304   for (hi=0; hi < 3; hi++)
00305     if (*mul[hi] >= temp) break;
00306   if (lo != hi)
00307     frac = (float) (temp - *mul[lo]) / (*mul[hi] - *mul[lo]);
00308   for (i=1; i < 5; i++)
00309     pre_mul[i-1] = 1 / (frac * mul[hi][i] + (1-frac) * mul[lo][i]);
00310 }
00311 
00312 /* Return values:  0 = white  1 = near white  2 = not white */
00313 int CLASS canon_600_color (int ratio[2], int mar)
00314 {
00315   int clipped=0, target, miss;
00316 
00317   if (flash_used) {
00318     if (ratio[1] < -104)
00319       { ratio[1] = -104; clipped = 1; }
00320     if (ratio[1] >   12)
00321       { ratio[1] =   12; clipped = 1; }
00322   } else {
00323     if (ratio[1] < -264 || ratio[1] > 461) return 2;
00324     if (ratio[1] < -50)
00325       { ratio[1] = -50; clipped = 1; }
00326     if (ratio[1] > 307)
00327       { ratio[1] = 307; clipped = 1; }
00328   }
00329   target = flash_used || ratio[1] < 197
00330         ? -38 - (398 * ratio[1] >> 10)
00331         : -123 + (48 * ratio[1] >> 10);
00332   if (target - mar <= ratio[0] &&
00333       target + 20  >= ratio[0] && !clipped) return 0;
00334   miss = target - ratio[0];
00335   if (abs(miss) >= mar*4) return 2;
00336   if (miss < -20) miss = -20;
00337   if (miss > mar) miss = mar;
00338   ratio[0] = target - miss;
00339   return 1;
00340 }
00341 
00342 void CLASS canon_600_auto_wb()
00343 {
00344   int mar, row, col, i, j, st, count[] = { 0,0 };
00345   int test[8], total[2][8], ratio[2][2], stat[2];
00346 
00347   memset (&total, 0, sizeof total);
00348   i = canon_ev + 0.5;
00349   if      (i < 10) mar = 150;
00350   else if (i > 12) mar = 20;
00351   else mar = 280 - 20 * i;
00352   if (flash_used) mar = 80;
00353   for (row=14; row < height-14; row+=4)
00354     for (col=10; col < width; col+=2) {
00355       for (i=0; i < 8; i++)
00356         test[(i & 4) + FC(row+(i >> 1),col+(i & 1))] =
00357                     BAYER(row+(i >> 1),col+(i & 1));
00358       for (i=0; i < 8; i++)
00359         if (test[i] < 150 || test[i] > 1500) goto next;
00360       for (i=0; i < 4; i++)
00361         if (abs(test[i] - test[i+4]) > 50) goto next;
00362       for (i=0; i < 2; i++) {
00363         for (j=0; j < 4; j+=2)
00364           ratio[i][j >> 1] = ((test[i*4+j+1]-test[i*4+j]) << 10) / test[i*4+j];
00365         stat[i] = canon_600_color (ratio[i], mar);
00366       }
00367       if ((st = stat[0] | stat[1]) > 1) goto next;
00368       for (i=0; i < 2; i++)
00369         if (stat[i])
00370           for (j=0; j < 2; j++)
00371             test[i*4+j*2+1] = test[i*4+j*2] * (0x400 + ratio[i][j]) >> 10;
00372       for (i=0; i < 8; i++)
00373         total[st][i] += test[i];
00374       count[st]++;
00375 next: continue;
00376     }
00377   if (count[0] | count[1]) {
00378     st = count[0]*200 < count[1];
00379     for (i=0; i < 4; i++)
00380       pre_mul[i] = 1.0 / (total[st][i] + total[st][i+4]);
00381   }
00382 }
00383 
00384 void CLASS canon_600_coeff()
00385 {
00386   static const short table[6][12] = {
00387     { -190,702,-1878,2390,   1861,-1349,905,-393, -432,944,2617,-2105  },
00388     { -1203,1715,-1136,1648, 1388,-876,267,245,  -1641,2153,3921,-3409 },
00389     { -615,1127,-1563,2075,  1437,-925,509,3,     -756,1268,2519,-2007 },
00390     { -190,702,-1886,2398,   2153,-1641,763,-251, -452,964,3040,-2528  },
00391     { -190,702,-1878,2390,   1861,-1349,905,-393, -432,944,2617,-2105  },
00392     { -807,1319,-1785,2297,  1388,-876,769,-257,  -230,742,2067,-1555  } };
00393   int t=0, i, c;
00394   float mc, yc;
00395 
00396   mc = pre_mul[1] / pre_mul[2];
00397   yc = pre_mul[3] / pre_mul[2];
00398   if (mc > 1 && mc <= 1.28 && yc < 0.8789) t=1;
00399   if (mc > 1.28 && mc <= 2) {
00400     if  (yc < 0.8789) t=3;
00401     else if (yc <= 2) t=4;
00402   }
00403   if (flash_used) t=5;
00404   for (raw_color = i=0; i < 3; i++)
00405     FORCC rgb_cam[i][c] = table[t][i*4 + c] / 1024.0;
00406 }
00407 
00408 void CLASS canon_600_load_raw()
00409 {
00410   uchar  data[1120], *dp;
00411   ushort pixel[896], *pix;
00412   int irow, row, col, val;
00413   static const short mul[4][2] =
00414   { { 1141,1145 }, { 1128,1109 }, { 1178,1149 }, { 1128,1109 } };
00415 
00416   for (irow=row=0; irow < height; irow++)
00417   {
00418     fread (data, 1120, 1, ifp);
00419     for (dp=data, pix=pixel; dp < data+1120; dp+=10, pix+=8)
00420     {
00421       pix[0] = (dp[0] << 2) + (dp[1] >> 6    );
00422       pix[1] = (dp[2] << 2) + (dp[1] >> 4 & 3);
00423       pix[2] = (dp[3] << 2) + (dp[1] >> 2 & 3);
00424       pix[3] = (dp[4] << 2) + (dp[1]      & 3);
00425       pix[4] = (dp[5] << 2) + (dp[9]      & 3);
00426       pix[5] = (dp[6] << 2) + (dp[9] >> 2 & 3);
00427       pix[6] = (dp[7] << 2) + (dp[9] >> 4 & 3);
00428       pix[7] = (dp[8] << 2) + (dp[9] >> 6    );
00429     }
00430     for (col=0; col < width; col++)
00431       BAYER(row,col) = pixel[col];
00432     for (col=width; col < 896; col++)
00433       black += pixel[col];
00434     if ((row+=2) > height) row = 1;
00435   }
00436   black = black / ((896 - width) * height) - 4;
00437   for (row=0; row < height; row++)
00438     for (col=0; col < width; col++) {
00439       val = (BAYER(row,col) - black) * mul[row & 3][col & 1] >> 9;
00440       if (val < 0) val = 0;
00441       BAYER(row,col) = val;
00442     }
00443   canon_600_fixed_wb(1311);
00444   canon_600_auto_wb();
00445   canon_600_coeff();
00446   maximum = (0x3ff - black) * 1109 >> 9;
00447   black = 0;
00448 }
00449 
00450 void CLASS canon_a5_load_raw()
00451 {
00452   uchar  data[1940], *dp;
00453   ushort pixel[1552], *pix;
00454   int row, col;
00455 
00456   for (row=0; row < height; row++) {
00457     fread (data, raw_width * 10 / 8, 1, ifp);
00458     for (dp=data, pix=pixel; pix < pixel+raw_width; dp+=10, pix+=8)
00459     {
00460       pix[0] = (dp[1] << 2) + (dp[0] >> 6);
00461       pix[1] = (dp[0] << 4) + (dp[3] >> 4);
00462       pix[2] = (dp[3] << 6) + (dp[2] >> 2);
00463       pix[3] = (dp[2] << 8) + (dp[5]     );
00464       pix[4] = (dp[4] << 2) + (dp[7] >> 6);
00465       pix[5] = (dp[7] << 4) + (dp[6] >> 4);
00466       pix[6] = (dp[6] << 6) + (dp[9] >> 2);
00467       pix[7] = (dp[9] << 8) + (dp[8]     );
00468     }
00469     for (col=0; col < width; col++)
00470       BAYER(row,col) = (pixel[col] & 0x3ff);
00471     for (col=width; col < raw_width; col++)
00472       black += pixel[col] & 0x3ff;
00473   }
00474   if (raw_width > width)
00475     black /= (raw_width - width) * height;
00476   maximum = 0x3ff;
00477 }
00478 
00479 /*
00480    getbits(-1) initializes the buffer
00481    getbits(n) where 0 <= n <= 25 returns an n-bit integer
00482  */
00483 unsigned CLASS getbits (int nbits)
00484 {
00485   static unsigned bitbuf=0;
00486   static int vbits=0, reset=0;
00487   unsigned c;
00488 
00489   if (nbits == -1)
00490     return bitbuf = vbits = reset = 0;
00491   if (nbits == 0 || reset) return 0;
00492   while (vbits < nbits) {
00493     c = fgetc(ifp);
00494     if ((reset = zero_after_ff && c == 0xff && fgetc(ifp))) return 0;
00495     bitbuf = (bitbuf << 8) + c;
00496     vbits += 8;
00497   }
00498   vbits -= nbits;
00499   return bitbuf << (32-nbits-vbits) >> (32-nbits);
00500 }
00501 
00502 void CLASS init_decoder()
00503 {
00504   memset (first_decode, 0, sizeof first_decode);
00505   free_decode = first_decode;
00506 }
00507 
00508 /*
00509    Construct a decode tree according the specification in *source.
00510    The first 16 bytes specify how many codes should be 1-bit, 2-bit
00511    3-bit, etc.  Bytes after that are the leaf values.
00512 
00513    For example, if the source is
00514 
00515     { 0,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0,
00516       0x04,0x03,0x05,0x06,0x02,0x07,0x01,0x08,0x09,0x00,0x0a,0x0b,0xff  },
00517 
00518    then the code is
00519 
00520         00              0x04
00521         010             0x03
00522         011             0x05
00523         100             0x06
00524         101             0x02
00525         1100            0x07
00526         1101            0x01
00527         11100           0x08
00528         11101           0x09
00529         11110           0x00
00530         111110          0x0a
00531         1111110         0x0b
00532         1111111         0xff
00533  */
00534 uchar * CLASS make_decoder (const uchar *source, int level)
00535 {
00536   struct decode *cur;
00537   static int leaf;
00538   int i, next;
00539 
00540   if (level==0) leaf=0;
00541   cur = free_decode++;
00542   if (free_decode > first_decode+2048) {
00543     fprintf (stderr, "%s: decoder table overflow\n", ifname);
00544     longjmp (failure, 2);
00545   }
00546   for (i=next=0; i <= leaf && next < 16; )
00547     i += source[next++];
00548   if (i > leaf) {
00549     if (level < next) {
00550       cur->branch[0] = free_decode;
00551       make_decoder (source, level+1);
00552       cur->branch[1] = free_decode;
00553       make_decoder (source, level+1);
00554     } else
00555       cur->leaf = source[16 + leaf++];
00556   }
00557   return (uchar *) source + 16 + leaf;
00558 }
00559 
00560 void CLASS crw_init_tables (unsigned table)
00561 {
00562   static const uchar first_tree[3][29] = {
00563     { 0,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0,
00564       0x04,0x03,0x05,0x06,0x02,0x07,0x01,0x08,0x09,0x00,0x0a,0x0b,0xff  },
00565     { 0,2,2,3,1,1,1,1,2,0,0,0,0,0,0,0,
00566       0x03,0x02,0x04,0x01,0x05,0x00,0x06,0x07,0x09,0x08,0x0a,0x0b,0xff  },
00567     { 0,0,6,3,1,1,2,0,0,0,0,0,0,0,0,0,
00568       0x06,0x05,0x07,0x04,0x08,0x03,0x09,0x02,0x00,0x0a,0x01,0x0b,0xff  },
00569   };
00570   static const uchar second_tree[3][180] = {
00571     { 0,2,2,2,1,4,2,1,2,5,1,1,0,0,0,139,
00572       0x03,0x04,0x02,0x05,0x01,0x06,0x07,0x08,
00573       0x12,0x13,0x11,0x14,0x09,0x15,0x22,0x00,0x21,0x16,0x0a,0xf0,
00574       0x23,0x17,0x24,0x31,0x32,0x18,0x19,0x33,0x25,0x41,0x34,0x42,
00575       0x35,0x51,0x36,0x37,0x38,0x29,0x79,0x26,0x1a,0x39,0x56,0x57,
00576       0x28,0x27,0x52,0x55,0x58,0x43,0x76,0x59,0x77,0x54,0x61,0xf9,
00577       0x71,0x78,0x75,0x96,0x97,0x49,0xb7,0x53,0xd7,0x74,0xb6,0x98,
00578       0x47,0x48,0x95,0x69,0x99,0x91,0xfa,0xb8,0x68,0xb5,0xb9,0xd6,
00579       0xf7,0xd8,0x67,0x46,0x45,0x94,0x89,0xf8,0x81,0xd5,0xf6,0xb4,
00580       0x88,0xb1,0x2a,0x44,0x72,0xd9,0x87,0x66,0xd4,0xf5,0x3a,0xa7,
00581       0x73,0xa9,0xa8,0x86,0x62,0xc7,0x65,0xc8,0xc9,0xa1,0xf4,0xd1,
00582       0xe9,0x5a,0x92,0x85,0xa6,0xe7,0x93,0xe8,0xc1,0xc6,0x7a,0x64,
00583       0xe1,0x4a,0x6a,0xe6,0xb3,0xf1,0xd3,0xa5,0x8a,0xb2,0x9a,0xba,
00584       0x84,0xa4,0x63,0xe5,0xc5,0xf3,0xd2,0xc4,0x82,0xaa,0xda,0xe4,
00585       0xf2,0xca,0x83,0xa3,0xa2,0xc3,0xea,0xc2,0xe2,0xe3,0xff,0xff  },
00586     { 0,2,2,1,4,1,4,1,3,3,1,0,0,0,0,140,
00587       0x02,0x03,0x01,0x04,0x05,0x12,0x11,0x06,
00588       0x13,0x07,0x08,0x14,0x22,0x09,0x21,0x00,0x23,0x15,0x31,0x32,
00589       0x0a,0x16,0xf0,0x24,0x33,0x41,0x42,0x19,0x17,0x25,0x18,0x51,
00590       0x34,0x43,0x52,0x29,0x35,0x61,0x39,0x71,0x62,0x36,0x53,0x26,
00591       0x38,0x1a,0x37,0x81,0x27,0x91,0x79,0x55,0x45,0x28,0x72,0x59,
00592       0xa1,0xb1,0x44,0x69,0x54,0x58,0xd1,0xfa,0x57,0xe1,0xf1,0xb9,
00593       0x49,0x47,0x63,0x6a,0xf9,0x56,0x46,0xa8,0x2a,0x4a,0x78,0x99,
00594       0x3a,0x75,0x74,0x86,0x65,0xc1,0x76,0xb6,0x96,0xd6,0x89,0x85,
00595       0xc9,0xf5,0x95,0xb4,0xc7,0xf7,0x8a,0x97,0xb8,0x73,0xb7,0xd8,
00596       0xd9,0x87,0xa7,0x7a,0x48,0x82,0x84,0xea,0xf4,0xa6,0xc5,0x5a,
00597       0x94,0xa4,0xc6,0x92,0xc3,0x68,0xb5,0xc8,0xe4,0xe5,0xe6,0xe9,
00598       0xa2,0xa3,0xe3,0xc2,0x66,0x67,0x93,0xaa,0xd4,0xd5,0xe7,0xf8,
00599       0x88,0x9a,0xd7,0x77,0xc4,0x64,0xe2,0x98,0xa5,0xca,0xda,0xe8,
00600       0xf3,0xf6,0xa9,0xb2,0xb3,0xf2,0xd2,0x83,0xba,0xd3,0xff,0xff  },
00601     { 0,0,6,2,1,3,3,2,5,1,2,2,8,10,0,117,
00602       0x04,0x05,0x03,0x06,0x02,0x07,0x01,0x08,
00603       0x09,0x12,0x13,0x14,0x11,0x15,0x0a,0x16,0x17,0xf0,0x00,0x22,
00604       0x21,0x18,0x23,0x19,0x24,0x32,0x31,0x25,0x33,0x38,0x37,0x34,
00605       0x35,0x36,0x39,0x79,0x57,0x58,0x59,0x28,0x56,0x78,0x27,0x41,
00606       0x29,0x77,0x26,0x42,0x76,0x99,0x1a,0x55,0x98,0x97,0xf9,0x48,
00607       0x54,0x96,0x89,0x47,0xb7,0x49,0xfa,0x75,0x68,0xb6,0x67,0x69,
00608       0xb9,0xb8,0xd8,0x52,0xd7,0x88,0xb5,0x74,0x51,0x46,0xd9,0xf8,
00609       0x3a,0xd6,0x87,0x45,0x7a,0x95,0xd5,0xf6,0x86,0xb4,0xa9,0x94,
00610       0x53,0x2a,0xa8,0x43,0xf5,0xf7,0xd4,0x66,0xa7,0x5a,0x44,0x8a,
00611       0xc9,0xe8,0xc8,0xe7,0x9a,0x6a,0x73,0x4a,0x61,0xc7,0xf4,0xc6,
00612       0x65,0xe9,0x72,0xe6,0x71,0x91,0x93,0xa6,0xda,0x92,0x85,0x62,
00613       0xf3,0xc5,0xb2,0xa4,0x84,0xba,0x64,0xa5,0xb3,0xd2,0x81,0xe5,
00614       0xd3,0xaa,0xc4,0xca,0xf2,0xb1,0xe4,0xd1,0x83,0x63,0xea,0xc3,
00615       0xe2,0x82,0xf1,0xa3,0xc2,0xa1,0xc1,0xe3,0xa2,0xe1,0xff,0xff  }
00616   };
00617   if (table > 2) table = 2;
00618   init_decoder();
00619   make_decoder ( first_tree[table], 0);
00620   second_decode = free_decode;
00621   make_decoder (second_tree[table], 0);
00622 }
00623 
00624 /*
00625    Return 0 if the image starts with compressed data,
00626    1 if it starts with uncompressed low-order bits.
00627 
00628    In Canon compressed data, 0xff is always followed by 0x00.
00629  */
00630 int CLASS canon_has_lowbits()
00631 {
00632   uchar test[0x4000];
00633   int ret=1, i;
00634 
00635   fseek (ifp, 0, SEEK_SET);
00636   fread (test, 1, sizeof test, ifp);
00637   for (i=540; i < sizeof test - 1; i++)
00638     if (test[i] == 0xff) {
00639       if (test[i+1]) return 1;
00640       ret=0;
00641     }
00642   return ret;
00643 }
00644 
00645 void CLASS canon_compressed_load_raw()
00646 {
00647   ushort *pixel, *prow;
00648   int lowbits, i, row, r, col, save, val;
00649   unsigned irow, icol;
00650   struct decode *decode, *dindex;
00651   int block, diffbuf[64], leaf, len, diff, carry=0, pnum=0, base[2];
00652   uchar c;
00653 
00654   crw_init_tables (tiff_compress);
00655   pixel = calloc (raw_width*8, sizeof *pixel);
00656   merror (pixel, "canon_compressed_load_raw()");
00657   lowbits = canon_has_lowbits();
00658   if (!lowbits) maximum = 0x3ff;
00659   fseek (ifp, 540 + lowbits*raw_height*raw_width/4, SEEK_SET);
00660   zero_after_ff = 1;
00661   getbits(-1);
00662   for (row = 0; row < raw_height; row += 8) {
00663     for (block=0; block < raw_width >> 3; block++) {
00664       memset (diffbuf, 0, sizeof diffbuf);
00665       decode = first_decode;
00666       for (i=0; i < 64; i++ ) {
00667         for (dindex=decode; dindex->branch[0]; )
00668           dindex = dindex->branch[getbits(1)];
00669         leaf = dindex->leaf;
00670         decode = second_decode;
00671         if (leaf == 0 && i) break;
00672         if (leaf == 0xff) continue;
00673         i  += leaf >> 4;
00674         len = leaf & 15;
00675         if (len == 0) continue;
00676         diff = getbits(len);
00677         if ((diff & (1 << (len-1))) == 0)
00678           diff -= (1 << len) - 1;
00679         if (i < 64) diffbuf[i] = diff;
00680       }
00681       diffbuf[0] += carry;
00682       carry = diffbuf[0];
00683       for (i=0; i < 64; i++ ) {
00684         if (pnum++ % raw_width == 0)
00685           base[0] = base[1] = 512;
00686         pixel[(block << 6) + i] = ( base[i & 1] += diffbuf[i] );
00687       }
00688     }
00689     if (lowbits) {
00690       save = ftell(ifp);
00691       fseek (ifp, 26 + row*raw_width/4, SEEK_SET);
00692       for (prow=pixel, i=0; i < raw_width*2; i++) {
00693         c = fgetc(ifp);
00694         for (r=0; r < 8; r+=2, prow++) {
00695           val = (*prow << 2) + ((c >> r) & 3);
00696           if (raw_width == 2672 && val < 512) val += 2;
00697           *prow = val;
00698         }
00699       }
00700       fseek (ifp, save, SEEK_SET);
00701     }
00702     for (r=0; r < 8; r++) {
00703       irow = row - top_margin + r;
00704       if (irow >= height) continue;
00705       for (col = 0; col < raw_width; col++) {
00706         icol = col - left_margin;
00707         if (icol < width)
00708           BAYER(irow,icol) = pixel[r*raw_width+col];
00709         else
00710           black += pixel[r*raw_width+col];
00711       }
00712     }
00713   }
00714   free (pixel);
00715   if (raw_width > width)
00716     black /= (raw_width - width) * height;
00717 }
00718 
00719 /*
00720    Not a full implementation of Lossless JPEG, just
00721    enough to decode Canon, Kodak and Adobe DNG images.
00722  */
00723 struct jhead {
00724   int bits, high, wide, clrs, restart, vpred[4];
00725   struct decode *huff[4];
00726   ushort *row;
00727 };
00728 
00729 int CLASS ljpeg_start (struct jhead *jh, int info_only)
00730 {
00731   int i, tag, len;
00732   uchar data[0x10000], *dp;
00733 
00734   init_decoder();
00735   for (i=0; i < 4; i++)
00736     jh->huff[i] = free_decode;
00737   jh->restart = INT_MAX;
00738   fread (data, 2, 1, ifp);
00739   if (data[1] != 0xd8) return 0;
00740   do {
00741     fread (data, 2, 2, ifp);
00742     tag =  data[0] << 8 | data[1];
00743     len = (data[2] << 8 | data[3]) - 2;
00744     if (tag <= 0xff00) return 0;
00745     fread (data, 1, len, ifp);
00746     switch (tag) {
00747       case 0xffc0:
00748       case 0xffc3:
00749         jh->bits = data[0];
00750         jh->high = data[1] << 8 | data[2];
00751         jh->wide = data[3] << 8 | data[4];
00752         jh->clrs = data[5];
00753         break;
00754       case 0xffc4:
00755         if (info_only) break;
00756         for (dp = data; dp < data+len && *dp < 4; ) {
00757           jh->huff[*dp] = free_decode;
00758           dp = make_decoder (++dp, 0);
00759         }
00760         break;
00761       case 0xffdd:
00762         jh->restart = data[0] << 8 | data[1];
00763     }
00764   } while (tag != 0xffda);
00765   if (info_only) return 1;
00766   jh->row = calloc (jh->wide*jh->clrs, 2);
00767   merror (jh->row, " jpeg_start()");
00768   return zero_after_ff = 1;
00769 }
00770 
00771 int CLASS ljpeg_diff (struct decode *dindex)
00772 {
00773   int len, diff;
00774 
00775   while (dindex->branch[0])
00776     dindex = dindex->branch[getbits(1)];
00777   len = dindex->leaf;
00778   if (len == 16 && (!dng_version || dng_version >= 0x1010000))
00779     return -32768;
00780   diff = getbits(len);
00781   if ((diff & (1 << (len-1))) == 0)
00782     diff -= (1 << len) - 1;
00783   return diff;
00784 }
00785 
00786 void CLASS ljpeg_row (int jrow, struct jhead *jh)
00787 {
00788   int col, c, diff;
00789   ushort *outp=jh->row;
00790 
00791   if (jrow * jh->wide % jh->restart == 0) {
00792     FORC4 jh->vpred[c] = 1 << (jh->bits-1);
00793     if (jrow) get2();                   /* Eat the FF Dx marker */
00794     getbits(-1);
00795   }
00796   for (col=0; col < jh->wide; col++)
00797     for (c=0; c < jh->clrs; c++) {
00798       diff = ljpeg_diff (jh->huff[c]);
00799       *outp = col ? outp[-jh->clrs]+diff : (jh->vpred[c] += diff);
00800       outp++;
00801     }
00802 }
00803 
00804 void CLASS lossless_jpeg_load_raw()
00805 {
00806   int jwide, jrow, jcol, val, jidx, i, j, row=0, col=0;
00807   struct jhead jh;
00808   int min=INT_MAX;
00809 
00810   if (!ljpeg_start (&jh, 0)) return;
00811   jwide = jh.wide * jh.clrs;
00812 
00813   for (jrow=0; jrow < jh.high; jrow++) {
00814     ljpeg_row (jrow, &jh);
00815     for (jcol=0; jcol < jwide; jcol++) {
00816       val = jh.row[jcol];
00817       if (jh.bits <= 12)
00818         val = curve[val];
00819       if (cr2_slice[0]) {
00820         jidx = jrow*jwide + jcol;
00821         i = jidx / (cr2_slice[1]*jh.high);
00822         if ((j = i >= cr2_slice[0]))
00823                  i  = cr2_slice[0];
00824         jidx -= i * (cr2_slice[1]*jh.high);
00825         row = jidx / cr2_slice[1+j];
00826         col = jidx % cr2_slice[1+j] + i*cr2_slice[1];
00827       }
00828       if ((unsigned) (row-top_margin) < height) {
00829         if ((unsigned) (col-left_margin) < width) {
00830           BAYER(row-top_margin,col-left_margin) = val;
00831           if (min > val) min = val;
00832         } else black += val;
00833       }
00834       if (++col >= raw_width)
00835         col = (row++,0);
00836     }
00837   }
00838   free (jh.row);
00839   if (raw_width > width)
00840     black /= (raw_width - width) * height;
00841   if (!strcasecmp(make,"KODAK"))
00842     black = min;
00843 }
00844 
00845 void CLASS adobe_copy_pixel (int row, int col, ushort **rp)
00846 {
00847   unsigned r, c;
00848 
00849   r = row -= top_margin;
00850   c = col -= left_margin;
00851   if (fuji_secondary && use_secondary) (*rp)++;
00852   if (filters) {
00853     if (fuji_width) {
00854       r = row + fuji_width - 1 - (col >> 1);
00855       c = row + ((col+1) >> 1);
00856     }
00857     if (r < height && c < width)
00858       BAYER(r,c) = **rp < 0x1000 ? curve[**rp] : **rp;
00859     *rp += 1 + fuji_secondary;
00860   } else {
00861     if (r < height && c < width)
00862       for (c=0; c < tiff_samples; c++)
00863         image[row*width+col][c] = (*rp)[c] < 0x1000 ? curve[(*rp)[c]]:(*rp)[c];
00864     *rp += tiff_samples;
00865   }
00866   if (fuji_secondary && use_secondary) (*rp)--;
00867 }
00868 
00869 void CLASS adobe_dng_load_raw_lj()
00870 {
00871   int save, twide, trow=0, tcol=0, jrow, jcol;
00872   struct jhead jh;
00873   ushort *rp;
00874 
00875   while (1) {
00876     save = ftell(ifp);
00877     fseek (ifp, get4(), SEEK_SET);
00878     if (!ljpeg_start (&jh, 0)) break;
00879     if (trow >= raw_height) break;
00880     if (jh.high > raw_height-trow)
00881         jh.high = raw_height-trow;
00882     twide = jh.wide;
00883     if (filters) twide *= jh.clrs;
00884     else         colors = jh.clrs;
00885     if (fuji_secondary) twide /= 2;
00886     if (twide > raw_width-tcol)
00887         twide = raw_width-tcol;
00888 
00889     for (jrow=0; jrow < jh.high; jrow++) {
00890       ljpeg_row (jrow, &jh);
00891       for (rp=jh.row, jcol=0; jcol < twide; jcol++)
00892         adobe_copy_pixel (trow+jrow, tcol+jcol, &rp);
00893     }
00894     fseek (ifp, save+4, SEEK_SET);
00895     if ((tcol += twide) >= raw_width) {
00896       tcol = 0;
00897       trow += jh.high;
00898     }
00899     free (jh.row);
00900   }
00901 }
00902 
00903 void CLASS adobe_dng_load_raw_nc()
00904 {
00905   ushort *pixel, *rp;
00906   int row, col;
00907 
00908   pixel = calloc (raw_width * tiff_samples, sizeof *pixel);
00909   merror (pixel, "adobe_dng_load_raw_nc()");
00910   for (row=0; row < raw_height; row++) {
00911     if (tiff_bps == 16)
00912       read_shorts (pixel, raw_width * tiff_samples);
00913     else {
00914       getbits(-1);
00915       for (col=0; col < raw_width * tiff_samples; col++)
00916         pixel[col] = getbits(tiff_bps);
00917     }
00918     for (rp=pixel, col=0; col < raw_width; col++)
00919       adobe_copy_pixel (row, col, &rp);
00920   }
00921   free (pixel);
00922 }
00923 
00924 void CLASS nikon_compressed_load_raw()
00925 {
00926   static const uchar nikon_tree[] = {
00927     0,1,5,1,1,1,1,1,1,2,0,0,0,0,0,0,
00928     5,4,3,6,2,7,1,0,8,9,11,10,12
00929   };
00930   int csize, row, col, i, diff;
00931   ushort vpred[4], hpred[2], *curve;
00932 
00933   init_decoder();
00934   make_decoder (nikon_tree, 0);
00935 
00936   fseek (ifp, curve_offset, SEEK_SET);
00937   read_shorts (vpred, 4);
00938   csize = get2();
00939   curve = calloc (csize, sizeof *curve);
00940   merror (curve, "nikon_compressed_load_raw()");
00941   read_shorts (curve, csize);
00942 
00943   fseek (ifp, data_offset, SEEK_SET);
00944   getbits(-1);
00945 
00946   for (row=0; row < height; row++)
00947     for (col=0; col < raw_width; col++)
00948     {
00949       diff = ljpeg_diff (first_decode);
00950       if (col < 2) {
00951         i = 2*(row & 1) + (col & 1);
00952         vpred[i] += diff;
00953         hpred[col] = vpred[i];
00954       } else
00955         hpred[col & 1] += diff;
00956       if ((unsigned) (col-left_margin) >= width) continue;
00957       diff = hpred[col & 1];
00958       if (diff >= csize) diff = csize-1;
00959       BAYER(row,col-left_margin) = curve[diff];
00960     }
00961   free (curve);
00962 }
00963 
00964 void CLASS nikon_load_raw()
00965 {
00966   int irow, row, col, i;
00967 
00968   getbits(-1);
00969   for (irow=0; irow < height; irow++) {
00970     row = irow;
00971     if (make[0] == 'O' || model[0] == 'E') {
00972       row = irow * 2 % height + irow / (height/2);
00973       if (row == 1 && data_offset == 0) {
00974         fseek (ifp, 0, SEEK_END);
00975         fseek (ifp, ftell(ifp)/2, SEEK_SET);
00976         getbits(-1);
00977       }
00978     }
00979     for (col=0; col < raw_width; col++) {
00980       i = getbits(12);
00981       if ((unsigned) (col-left_margin) < width)
00982         BAYER(row,col-left_margin) = i;
00983       if (tiff_compress == 34713 && (col % 10) == 9)
00984         getbits(8);
00985     }
00986   }
00987 }
00988 
00989 /*
00990    Figure out if a NEF file is compressed.  These fancy heuristics
00991    are only needed for the D100, thanks to a bug in some cameras
00992    that tags all images as "compressed".
00993  */
00994 int CLASS nikon_is_compressed()
00995 {
00996   uchar test[256];
00997   int i;
00998 
00999   if (tiff_compress != 34713)
01000     return 0;
01001   if (strcmp(model,"D100"))
01002     return 1;
01003   fseek (ifp, data_offset, SEEK_SET);
01004   fread (test, 1, 256, ifp);
01005   for (i=15; i < 256; i+=16)
01006     if (test[i]) return 1;
01007   return 0;
01008 }
01009 
01010 /*
01011    Returns 1 for a Coolpix 995, 0 for anything else.
01012  */
01013 int CLASS nikon_e995()
01014 {
01015   int i, histo[256];
01016   const uchar often[] = { 0x00, 0x55, 0xaa, 0xff };
01017 
01018   memset (histo, 0, sizeof histo);
01019   fseek (ifp, -2000, SEEK_END);
01020   for (i=0; i < 2000; i++)
01021     histo[fgetc(ifp)]++;
01022   for (i=0; i < 4; i++)
01023     if (histo[often[i]] < 200)
01024       return 0;
01025   return 1;
01026 }
01027 
01028 /*
01029    Returns 1 for a Coolpix 2100, 0 for anything else.
01030  */
01031 int CLASS nikon_e2100()
01032 {
01033   uchar t[12];
01034   int i;
01035 
01036   fseek (ifp, 0, SEEK_SET);
01037   for (i=0; i < 1024; i++) {
01038     fread (t, 1, 12, ifp);
01039     if (((t[2] & t[4] & t[7] & t[9]) >> 4
01040         & t[1] & t[6] & t[8] & t[11] & 3) != 3)
01041       return 0;
01042   }
01043   return 1;
01044 }
01045 
01046 /*
01047    Returns 0 for a Pentax Optio 33WR,
01048            1 for a Nikon E3700,
01049            2 for an Olympus C740UZ.
01050  */
01051 int CLASS nikon_3700()
01052 {
01053   int i, sum[] = { 0, 0 };
01054   uchar tail[952];
01055 
01056   fseek (ifp, -sizeof tail, SEEK_END);
01057   fread (tail, 1, sizeof tail, ifp);
01058   for (i=0; i < sizeof tail; i++)
01059     sum[(i>>2) & 1] += tail[i];
01060   if (sum[1] > 4*sum[0]) return 2;
01061   return sum[0] > 4*sum[1];
01062 }
01063 
01064 /*
01065    Separates a Minolta DiMAGE Z2 from a Nikon E4300.
01066  */
01067 int CLASS minolta_z2()
01068 {
01069   int i;
01070   char tail[424];
01071 
01072   fseek (ifp, -sizeof tail, SEEK_END);
01073   fread (tail, 1, sizeof tail, ifp);
01074   for (i=0; i < sizeof tail; i++)
01075     if (tail[i]) return 1;
01076   return 0;
01077 }
01078 
01079 /* Here raw_width is in bytes, not pixels. */
01080 void CLASS nikon_e900_load_raw()
01081 {
01082   int offset=0, irow, row, col;
01083 
01084   for (irow=0; irow < height; irow++) {
01085     row = irow * 2 % height;
01086     if (row == 1)
01087       offset = - (-offset & -4096);
01088     fseek (ifp, offset, SEEK_SET);
01089     offset += raw_width;
01090     getbits(-1);
01091     for (col=0; col < width; col++)
01092       BAYER(row,col) = getbits(10);
01093   }
01094 }
01095 
01096 void CLASS nikon_e2100_load_raw()
01097 {
01098   uchar   data[3456], *dp;
01099   ushort pixel[2304], *pix;
01100   int row, col;
01101 
01102   for (row=0; row <= height; row+=2) {
01103     if (row == height) {
01104       fseek (ifp, ((width==1616) << 13) - (-ftell(ifp) & -2048), SEEK_SET);
01105       row = 1;
01106     }
01107     fread (data, 1, width*3/2, ifp);
01108     for (dp=data, pix=pixel; pix < pixel+width; dp+=12, pix+=8) {
01109       pix[0] = (dp[2] >> 4) + (dp[ 3] << 4);
01110       pix[1] = (dp[2] << 8) +  dp[ 1];
01111       pix[2] = (dp[7] >> 4) + (dp[ 0] << 4);
01112       pix[3] = (dp[7] << 8) +  dp[ 6];
01113       pix[4] = (dp[4] >> 4) + (dp[ 5] << 4);
01114       pix[5] = (dp[4] << 8) +  dp[11];
01115       pix[6] = (dp[9] >> 4) + (dp[10] << 4);
01116       pix[7] = (dp[9] << 8) +  dp[ 8];
01117     }
01118     for (col=0; col < width; col++)
01119       BAYER(row,col) = (pixel[col] & 0xfff);
01120   }
01121 }
01122 
01123 /*
01124    The Fuji Super CCD is just a Bayer grid rotated 45 degrees.
01125  */
01126 void CLASS fuji_load_raw()
01127 {
01128   ushort *pixel;
01129   int row, col, r, c;
01130 
01131   pixel = calloc (raw_width, sizeof *pixel);
01132   merror (pixel, "fuji_load_raw()");
01133   for (row=0; row < raw_height; row++) {
01134     read_shorts (pixel, raw_width);
01135     for (col=0; col < fuji_width << !fuji_layout; col++) {
01136       if (fuji_layout) {
01137         r = fuji_width - 1 - col + (row >> 1);
01138         c = col + ((row+1) >> 1);
01139       } else {
01140         r = fuji_width - 1 + row - (col >> 1);
01141         c = row + ((col+1) >> 1);
01142       }
01143       BAYER(r,c) = pixel[col];
01144     }
01145   }
01146   free (pixel);
01147 }
01148 
01149 void CLASS jpeg_thumb (FILE *tfp)
01150 {
01151   char *thumb = malloc (thumb_length);
01152   merror (thumb, "jpeg_thumb()");
01153   fread  (thumb, 1, thumb_length, ifp);
01154   thumb[0] = 0xff;
01155   fwrite (thumb, 1, thumb_length, tfp);
01156   free (thumb);
01157 }
01158 
01159 void CLASS ppm_thumb (FILE *tfp)
01160 {
01161   char *thumb = malloc (thumb_length);
01162   merror (thumb, "ppm_thumb()");
01163   fprintf (tfp, "P6\n%d %d\n255\n", thumb_width, thumb_height);
01164   fread  (thumb, 1, thumb_length, ifp);
01165   fwrite (thumb, 1, thumb_length, tfp);
01166   free (thumb);
01167 }
01168 
01169 void CLASS layer_thumb (FILE *tfp)
01170 {
01171   int i, c;
01172   char *thumb;
01173   colors = thumb_misc >> 5;
01174   thumb = malloc (thumb_length*colors);
01175   merror (thumb, "layer_thumb()");
01176   fprintf (tfp, "P%d\n%d %d\n255\n",
01177         5 + (thumb_misc >> 6), thumb_width, thumb_height);
01178   fread (thumb, thumb_length, colors, ifp);
01179   for (i=0; i < thumb_length; i++)
01180     FORCC putc (thumb[i+thumb_length*c], tfp);
01181   free (thumb);
01182 }
01183 
01184 void CLASS rollei_thumb (FILE *tfp)
01185 {
01186   int i, size = thumb_width * thumb_height;
01187   ushort *thumb = calloc (size, 2);
01188   merror (thumb, "rollei_thumb()");
01189   fprintf (tfp, "P6\n%d %d\n255\n", thumb_width, thumb_height);
01190   read_shorts (thumb, size);
01191   for (i=0; i < size; i++) {
01192     putc (thumb[i] << 3, tfp);
01193     putc (thumb[i] >> 5  << 2, tfp);
01194     putc (thumb[i] >> 11 << 3, tfp);
01195   }
01196   free (thumb);
01197 }
01198 
01199 void CLASS rollei_load_raw()
01200 {
01201   uchar pixel[10];
01202   unsigned iten=0, isix, i, buffer=0, row, col, todo[16];
01203 
01204   isix = raw_width * raw_height * 5 / 8;
01205   while (fread (pixel, 1, 10, ifp) == 10) {
01206     for (i=0; i < 10; i+=2) {
01207       todo[i]   = iten++;
01208       todo[i+1] = pixel[i] << 8 | pixel[i+1];
01209       buffer    = pixel[i] >> 2 | buffer << 6;
01210     }
01211     for (   ; i < 16; i+=2) {
01212       todo[i]   = isix++;
01213       todo[i+1] = buffer >> (14-i)*5;
01214     }
01215     for (i=0; i < 16; i+=2) {
01216       row = todo[i] / raw_width - top_margin;
01217       col = todo[i] % raw_width - left_margin;
01218       if (row < height && col < width)
01219         BAYER(row,col) = (todo[i+1] & 0x3ff);
01220     }
01221   }
01222   maximum = 0x3ff;
01223 }
01224 
01225 int CLASS bayer (unsigned row, unsigned col)
01226 {
01227   return (row < height && col < width) ? BAYER(row,col) : 0;
01228 }
01229 
01230 void CLASS phase_one_correct()
01231 {
01232   unsigned entries, tag, data, save, col, row, type;
01233   int len, i, j, val[4], dev[4], sum, max;
01234   static const signed char dir[12][2] =
01235     { {-1,-1}, {-1,1}, {1,-1}, {1,1}, {-2,0}, {0,-2}, {0,2}, {2,0},
01236       {-2,-2}, {-2,2}, {2,-2}, {2,2} };
01237 
01238   if (!meta_length) return;
01239   fseek (ifp, meta_offset, SEEK_SET);
01240   order = get2();
01241   fseek (ifp, 6, SEEK_CUR);
01242   fseek (ifp, meta_offset+get4(), SEEK_SET);
01243   entries = get4();  get4();
01244   while (entries--) {
01245     tag  = get4();
01246     len  = get4();
01247     data = get4();
01248     save = ftell(ifp);
01249     fseek (ifp, meta_offset+data, SEEK_SET);
01250     if (tag == 0x400)                           /* Sensor defects */
01251       while ((len -= 8) >= 0) {
01252         col  = get2() - left_margin;
01253         row  = get2() - top_margin;
01254         type = get2(); get2();
01255         if (col >= width) continue;
01256         if (type == 131)                        /* Bad column */
01257           for (row=0; row < height; row++)
01258             if (FC(row,col) == 1) {
01259               for (sum=i=0; i < 4; i++)
01260                 sum += val[i] = bayer (row+dir[i][0], col+dir[i][1]);
01261               for (max=i=0; i < 4; i++) {
01262                 dev[i] = abs((val[i] << 2) - sum);
01263                 if (dev[max] < dev[i]) max = i;
01264               }
01265               BAYER(row,col) = (sum - val[max])/3.0 + 0.5;
01266             } else {
01267               for (sum=0, i=8; i < 12; i++)
01268                 sum += bayer (row+dir[i][0], col+dir[i][1]);
01269               BAYER(row,col) = 0.5 + sum * 0.0732233 +
01270                 (bayer(row,col-2) + bayer(row,col+2)) * 0.3535534;
01271             }
01272         else if (type == 129) {                 /* Bad pixel */
01273           if (row >= height) continue;
01274           j = (FC(row,col) != 1) * 4;
01275           for (sum=0, i=j; i < j+8; i++)
01276             sum += bayer (row+dir[i][0], col+dir[i][1]);
01277           BAYER(row,col) = (sum + 4) >> 3;
01278         }
01279       }
01280     fseek (ifp, save, SEEK_SET);
01281   }
01282 }
01283 
01284 void CLASS phase_one_load_raw()
01285 {
01286   int row, col, a, b;
01287   ushort *pixel, akey, bkey, mask;
01288 
01289   fseek (ifp, curve_offset, SEEK_SET);
01290   akey = get2();
01291   bkey = get2();
01292   mask = tiff_compress == 1 ? 0x5555:0x1354;
01293   fseek (ifp, data_offset + top_margin*raw_width*2, SEEK_SET);
01294   pixel = calloc (raw_width, sizeof *pixel);
01295   merror (pixel, "phase_one_load_raw()");
01296   for (row=0; row < height; row++) {
01297     read_shorts (pixel, raw_width);
01298     for (col=0; col < raw_width; col+=2) {
01299       a = pixel[col+0] ^ akey;
01300       b = pixel[col+1] ^ bkey;
01301       pixel[col+0] = (a & mask) | (b & ~mask);
01302       pixel[col+1] = (b & mask) | (a & ~mask);
01303     }
01304     for (col=0; col < width; col++)
01305       BAYER(row,col) = pixel[col+left_margin];
01306   }
01307   free (pixel);
01308   maximum = 0xffff;
01309   phase_one_correct();
01310 }
01311 
01312 unsigned CLASS ph1_bits (int nbits)
01313 {
01314   static UINT64 bitbuf=0;
01315   static int vbits=0;
01316 
01317   if (nbits == 0)
01318     return bitbuf = vbits = 0;
01319   if (vbits < nbits) {
01320     bitbuf = bitbuf << 32 | (unsigned) get4();
01321     vbits += 32;
01322   }
01323   vbits -= nbits;
01324   return bitbuf << (64 - nbits - vbits) >> (64 - nbits);
01325 }
01326 
01327 void CLASS phase_one_load_raw_c()
01328 {
01329   static const int length[] = { 8,7,6,9,11,10,5,12,14,13 };
01330   int *offset, len[2], pred[2], row, col, i, j;
01331   ushort *pixel;
01332 
01333   pixel = calloc (raw_width + raw_height*2, 2);
01334   merror (pixel, "phase_one_load_raw_c()");
01335   offset = (int *) (pixel + raw_width);
01336   fseek (ifp, strip_offset, SEEK_SET);
01337   for (row=0; row < raw_height; row++)
01338     offset[row] = get4();
01339   for (row=0; row < raw_height; row++) {
01340     fseek (ifp, data_offset + offset[row], SEEK_SET);
01341     ph1_bits(0);
01342     pred[0] = pred[1] = 0;
01343     for (col=0; col < raw_width; col++) {
01344       if (col >= (raw_width & -8))
01345         len[0] = len[1] = 14;
01346       else if ((col & 7) == 0)
01347         for (i=0; i < 2; i++) {
01348           for (j=0; j < 5 && !ph1_bits(1); j++);
01349           if (j--) len[i] = length[j*2 + ph1_bits(1)];
01350         }
01351       if ((i = len[col & 1]) == 14)
01352         pixel[col] = pred[col & 1] = ph1_bits(16);
01353       else
01354         pixel[col] = pred[col & 1] += ph1_bits(i) + 1 - (1 << (i - 1));
01355     }
01356     if ((unsigned) (row-top_margin) < height)
01357       for (col=0; col < width; col++)
01358         BAYER(row-top_margin,col) = pixel[col+left_margin];
01359   }
01360   free (pixel);
01361   maximum = 0x3fff;
01362   phase_one_correct();
01363 }
01364 
01365 void CLASS hdr_load_raw()
01366 {
01367   ushort *pixel;
01368   int r, c, row, col;
01369 
01370   pixel = calloc (raw_width, sizeof *pixel);
01371   merror (pixel, "hdr_load_raw()");
01372   for (r=0; r < height-32; r+=32)
01373     FORC3 for (row=r; row < r+32; row++) {
01374       read_shorts (pixel, raw_width);
01375       for (col=0; col < width; col++)
01376         image[row*width+col][c] = pixel[col];
01377     }
01378   free (pixel);
01379 }
01380 
01381 /* Here raw_width is in bytes, not pixels. */
01382 void CLASS packed_12_load_raw()
01383 {
01384   int row, col;
01385 
01386   getbits(-1);
01387   for (row=0; row < height; row++) {
01388     for (col=0; col < width; col++)
01389       BAYER(row,col) = getbits(12);
01390     for (col = width*3/2; col < raw_width; col++)
01391       getbits(8);
01392   }
01393 }
01394 
01395 void CLASS unpacked_load_raw()
01396 {
01397   ushort *pixel;
01398   int row, col;
01399 
01400   pixel = calloc (raw_width, sizeof *pixel);
01401   merror (pixel, "unpacked_load_raw()");
01402   for (row=0; row < height; row++) {
01403     read_shorts (pixel, raw_width);
01404     for (col=0; col < width; col++)
01405       BAYER(row,col) = pixel[col];
01406   }
01407   free (pixel);
01408 }
01409 
01410 void CLASS olympus_e300_load_raw()
01411 {
01412   uchar  *data,  *dp;
01413   ushort *pixel, *pix;
01414   int dwide, row, col, bls=width, ble=raw_width;
01415 
01416   if (raw_width == 3360) bls += 4;
01417   if (raw_width == 3280) ble = bls + 8;
01418   dwide = raw_width * 16 / 10;
01419   data = malloc (dwide + raw_width*2);
01420   merror (data, "olympus_e300_load_raw()");
01421   pixel = (ushort *) (data + dwide);
01422   for (row=0; row < height; row++) {
01423     fread (data, 1, dwide, ifp);
01424     for (dp=data, pix=pixel; pix < pixel+raw_width; dp+=3, pix+=2) {
01425       if (((dp-data) & 15) == 15) dp++;
01426       pix[0] = dp[1] << 8 | dp[0];
01427       pix[1] = dp[2] << 4 | dp[1] >> 4;
01428     }
01429     for (col=0; col < width; col++)
01430       BAYER(row,col) = (pixel[col] & 0xfff);
01431     for (col=bls; col < ble; col++)
01432       black += pixel[col] & 0xfff;
01433   }
01434   if (ble > bls) black /= (ble - bls) * height;
01435   free (data);
01436 }
01437 
01438 void CLASS olympus_cseries_load_raw()
01439 {
01440   int irow, row, col;
01441 
01442   for (irow=0; irow < height; irow++) {
01443     row = irow * 2 % height + irow / (height/2);
01444     if (row < 2) {
01445       fseek (ifp, data_offset - row*(-width*height*3/4 & -2048), SEEK_SET);
01446       getbits(-1);
01447     }
01448     for (col=0; col < width; col++)
01449       BAYER(row,col) = getbits(12);
01450   }
01451 }
01452 
01453 void CLASS minolta_rd175_load_raw()
01454 {
01455   uchar pixel[768];
01456   unsigned irow, box, row, col;
01457 
01458   for (irow=0; irow < 1481; irow++) {
01459     fread (pixel, 1, 768, ifp);
01460     box = irow / 82;
01461     row = irow % 82 * 12 + ((box < 12) ? box | 1 : (box-12)*2);
01462     switch (irow) {
01463       case 1477: case 1479: continue;
01464       case 1476: row = 984; break;
01465       case 1480: row = 985; break;
01466       case 1478: row = 985; box = 1;
01467     }
01468     if ((box < 12) && (box & 1)) {
01469       for (col=0; col < 1533; col++, row ^= 1)
01470         if (col != 1) BAYER(row,col) = (col+1) & 2 ?
01471                    pixel[col/2-1] + pixel[col/2+1] : pixel[col/2] << 1;
01472       BAYER(row,1)    = pixel[1]   << 1;
01473       BAYER(row,1533) = pixel[765] << 1;
01474     } else
01475       for (col=row & 1; col < 1534; col+=2)
01476         BAYER(row,col) = pixel[col/2] << 1;
01477   }
01478   maximum = 0xff << 1;
01479 }
01480 
01481 void CLASS eight_bit_load_raw()
01482 {
01483   uchar *pixel;
01484   int row, col;
01485 
01486   pixel = calloc (raw_width, sizeof *pixel);
01487   merror (pixel, "eight_bit_load_raw()");
01488   for (row=0; row < height; row++) {
01489     fread (pixel, 1, raw_width, ifp);
01490     for (col=0; col < width; col++)
01491       BAYER(row,col) = pixel[col];
01492   }
01493   free (pixel);
01494   maximum = 0xff;
01495 }
01496 
01497 void CLASS casio_qv5700_load_raw()
01498 {
01499   uchar  data[3232],  *dp;
01500   ushort pixel[2576], *pix;
01501   int row, col;
01502 
01503   for (row=0; row < height; row++) {
01504     fread (data, 1, 3232, ifp);
01505     for (dp=data, pix=pixel; dp < data+3220; dp+=5, pix+=4) {
01506       pix[0] = (dp[0] << 2) + (dp[1] >> 6);
01507       pix[1] = (dp[1] << 4) + (dp[2] >> 4);
01508       pix[2] = (dp[2] << 6) + (dp[3] >> 2);
01509       pix[3] = (dp[3] << 8) + (dp[4]     );
01510     }
01511     for (col=0; col < width; col++)
01512       BAYER(row,col) = (pixel[col] & 0x3ff);
01513   }
01514   maximum = 0x3fc;
01515 }
01516 
01517 void CLASS nucore_load_raw()
01518 {
01519   ushort *pixel;
01520   int irow, row, col;
01521 
01522   pixel = calloc (width, 2);
01523   merror (pixel, "nucore_load_raw()");
01524   for (irow=0; irow < height; irow++) {
01525     read_shorts (pixel, width);
01526     row = irow/2 + height/2 * (irow & 1);
01527     for (col=0; col < width; col++)
01528       BAYER(row,col) = pixel[col];
01529   }
01530   free (pixel);
01531 }
01532 
01533 const int * CLASS make_decoder_int (const int *source, int level)
01534 {
01535   struct decode *cur;
01536 
01537   cur = free_decode++;
01538   if (level < source[0]) {
01539     cur->branch[0] = free_decode;
01540     source = make_decoder_int (source, level+1);
01541     cur->branch[1] = free_decode;
01542     source = make_decoder_int (source, level+1);
01543   } else {
01544     cur->leaf = source[1];
01545     source += 2;
01546   }
01547   return source;
01548 }
01549 
01550 int CLASS radc_token (int tree)
01551 {
01552   int t;
01553   static struct decode *dstart[18], *dindex;
01554   static const int *s, source[] = {
01555     1,1, 2,3, 3,4, 4,2, 5,7, 6,5, 7,6, 7,8,
01556     1,0, 2,1, 3,3, 4,4, 5,2, 6,7, 7,6, 8,5, 8,8,
01557     2,1, 2,3, 3,0, 3,2, 3,4, 4,6, 5,5, 6,7, 6,8,
01558     2,0, 2,1, 2,3, 3,2, 4,4, 5,6, 6,7, 7,5, 7,8,
01559     2,1, 2,4, 3,0, 3,2, 3,3, 4,7, 5,5, 6,6, 6,8,
01560     2,3, 3,1, 3,2, 3,4, 3,5, 3,6, 4,7, 5,0, 5,8,
01561     2,3, 2,6, 3,0, 3,1, 4,4, 4,5, 4,7, 5,2, 5,8,
01562     2,4, 2,7, 3,3, 3,6, 4,1, 4,2, 4,5, 5,0, 5,8,
01563     2,6, 3,1, 3,3, 3,5, 3,7, 3,8, 4,0, 5,2, 5,4,
01564     2,0, 2,1, 3,2, 3,3, 4,4, 4,5, 5,6, 5,7, 4,8,
01565     1,0, 2,2, 2,-2,
01566     1,-3, 1,3,
01567     2,-17, 2,-5, 2,5, 2,17,
01568     2,-7, 2,2, 2,9, 2,18,
01569     2,-18, 2,-9, 2,-2, 2,7,
01570     2,-28, 2,28, 3,-49, 3,-9, 3,9, 4,49, 5,-79, 5,79,
01571     2,-1, 2,13, 2,26, 3,39, 4,-16, 5,55, 6,-37, 6,76,
01572     2,-26, 2,-13, 2,1, 3,-39, 4,16, 5,-55, 6,-76, 6,37
01573   };
01574 
01575   if (free_decode == first_decode)
01576     for (s=source, t=0; t < 18; t++) {
01577       dstart[t] = free_decode;
01578       s = make_decoder_int (s, 0);
01579     }
01580   if (tree == 18) {
01581     if (kodak_cbpp == 243)
01582       return (getbits(6) << 2) + 2;     /* most DC50 photos */
01583     else
01584       return (getbits(5) << 3) + 4;     /* DC40, Fotoman Pixtura */
01585   }
01586   for (dindex = dstart[tree]; dindex->branch[0]; )
01587     dindex = dindex->branch[getbits(1)];
01588   return dindex->leaf;
01589 }
01590 
01591 #define FORYX for (y=1; y < 3; y++) for (x=col+1; x >= col; x--)
01592 
01593 #define PREDICTOR (c ? (buf[c][y-1][x] + buf[c][y][x+1]) / 2 \
01594 : (buf[c][y-1][x+1] + 2*buf[c][y-1][x] + buf[c][y][x+1]) / 4)
01595 
01596 void CLASS kodak_radc_load_raw()
01597 {
01598   int row, col, tree, nreps, rep, step, i, c, s, r, x, y, val;
01599   short last[3] = { 16,16,16 }, mul[3], buf[3][3][386];
01600 
01601   init_decoder();
01602   getbits(-1);
01603   for (i=0; i < sizeof(buf)/sizeof(short); i++)
01604     buf[0][0][i] = 2048;
01605   for (row=0; row < height; row+=4) {
01606     FORC3 mul[c] = getbits(6);
01607     FORC3 {
01608       val = ((0x1000000/last[c] + 0x7ff) >> 12) * mul[c];
01609       s = val > 65564 ? 10:12;
01610       x = ~(-1 << (s-1));
01611       val <<= 12-s;
01612       for (i=0; i < sizeof(buf[0])/sizeof(short); i++)
01613         buf[c][0][i] = (buf[c][0][i] * val + x) >> s;
01614       last[c] = mul[c];
01615       for (r=0; r <= !c; r++) {
01616         buf[c][1][width/2] = buf[c][2][width/2] = mul[c] << 7;
01617         for (tree=1, col=width/2; col > 0; ) {
01618           if ((tree = radc_token(tree))) {
01619             col -= 2;
01620             if (tree == 8)
01621               FORYX buf[c][y][x] = radc_token(tree+10) * mul[c];
01622             else
01623               FORYX buf[c][y][x] = radc_token(tree+10) * 16 + PREDICTOR;
01624           } else
01625             do {
01626               nreps = (col > 2) ? radc_token(9) + 1 : 1;
01627               for (rep=0; rep < 8 && rep < nreps && col > 0; rep++) {
01628                 col -= 2;
01629                 FORYX buf[c][y][x] = PREDICTOR;
01630                 if (rep & 1) {
01631                   step = radc_token(10) << 4;
01632                   FORYX buf[c][y][x] += step;
01633                 }
01634               }
01635             } while (nreps == 9);
01636         }
01637         for (y=0; y < 2; y++)
01638           for (x=0; x < width/2; x++) {
01639             val = (buf[c][y+1][x] << 4) / mul[c];
01640             if (val < 0) val = 0;
01641             if (c)
01642               BAYER(row+y*2+c-1,x*2+2-c) = val;
01643             else
01644               BAYER(row+r*2+y,x*2+y) = val;
01645           }
01646         memcpy (buf[c][0]+!c, buf[c][2], sizeof buf[c][0]-2*!c);
01647       }
01648     }
01649     for (y=row; y < row+4; y++)
01650       for (x=0; x < width; x++)
01651         if ((x+y) & 1) {
01652           val = (BAYER(y,x)-2048)*2 + (BAYER(y,x-1)+BAYER(y,x+1))/2;
01653           if (val < 0) val = 0;
01654           BAYER(y,x) = val;
01655         }
01656   }
01657   maximum = 10000;
01658 }
01659 
01660 #undef FORYX
01661 #undef PREDICTOR
01662 
01663 #ifdef NO_JPEG
01664 void CLASS kodak_jpeg_load_raw() {}
01665 #else
01666 
01667 METHODDEF(boolean)
01668 fill_input_buffer (j_decompress_ptr cinfo)
01669 {
01670   static uchar jpeg_buffer[4096];
01671   size_t nbytes;
01672 
01673   nbytes = fread (jpeg_buffer, 1, 4096, ifp);
01674   swab (jpeg_buffer, jpeg_buffer, nbytes);
01675   cinfo->src->next_input_byte = jpeg_buffer;
01676   cinfo->src->bytes_in_buffer = nbytes;
01677   return TRUE;
01678 }
01679 
01680 void CLASS kodak_jpeg_load_raw()
01681 {
01682   struct jpeg_decompress_struct cinfo;
01683   struct jpeg_error_mgr jerr;
01684   JSAMPARRAY buf;
01685   JSAMPLE (*pixel)[3];
01686   int row, col;
01687 
01688   cinfo.err = jpeg_std_error (&jerr);
01689   jpeg_create_decompress (&cinfo);
01690   jpeg_stdio_src (&cinfo, ifp);
01691   cinfo.src->fill_input_buffer = fill_input_buffer;
01692   jpeg_read_header (&cinfo, TRUE);
01693   jpeg_start_decompress (&cinfo);
01694   if ((cinfo.output_width      != width  ) ||
01695       (cinfo.output_height*2   != height ) ||
01696       (cinfo.output_components != 3      )) {
01697     fprintf (stderr, "%s: incorrect JPEG dimensions\n", ifname);
01698     jpeg_destroy_decompress (&cinfo);
01699     longjmp (failure, 3);
01700   }
01701   buf = (*cinfo.mem->alloc_sarray)
01702                 ((j_common_ptr) &cinfo, JPOOL_IMAGE, width*3, 1);
01703 
01704   while (cinfo.output_scanline < cinfo.output_height) {
01705     row = cinfo.output_scanline * 2;
01706     jpeg_read_scanlines (&cinfo, buf, 1);
01707     pixel = (void *) buf[0];
01708     for (col=0; col < width; col+=2) {
01709       BAYER(row+0,col+0) = pixel[col+0][1] << 1;
01710       BAYER(row+1,col+1) = pixel[col+1][1] << 1;
01711       BAYER(row+0,col+1) = pixel[col][0] + pixel[col+1][0];
01712       BAYER(row+1,col+0) = pixel[col][2] + pixel[col+1][2];
01713     }
01714   }
01715   jpeg_finish_decompress (&cinfo);
01716   jpeg_destroy_decompress (&cinfo);
01717   maximum = 0xff << 1;
01718 }
01719 #endif
01720 
01721 void CLASS kodak_dc120_load_raw()
01722 {
01723   static const int mul[4] = { 162, 192, 187,  92 };
01724   static const int add[4] = {   0, 636, 424, 212 };
01725   uchar pixel[848];
01726   int row, shift, col;
01727 
01728   for (row=0; row < height; row++) {
01729     fread (pixel, 848, 1, ifp);
01730     shift = row * mul[row & 3] + add[row & 3];
01731     for (col=0; col < width; col++)
01732       BAYER(row,col) = (ushort) pixel[(col + shift) % 848];
01733   }
01734   maximum = 0xff;
01735 }
01736 
01737 void CLASS kodak_easy_load_raw()
01738 {
01739   uchar *pixel;
01740   unsigned row, col, icol;
01741 
01742   if (raw_width > width)
01743     black = 0;
01744   pixel = calloc (raw_width, sizeof *pixel);
01745   merror (pixel, "kodak_easy_load_raw()");
01746   for (row=0; row < height; row++) {
01747     fread (pixel, 1, raw_width, ifp);
01748     for (col=0; col < raw_width; col++) {
01749       icol = col - left_margin;
01750       if (icol < width)
01751         BAYER(row,icol) = (ushort) curve[pixel[col]];
01752       else
01753         black += curve[pixel[col]];
01754     }
01755   }
01756   free (pixel);
01757   if (raw_width > width)
01758     black /= (raw_width - width) * height;
01759   if (!strncmp(model,"DC2",3))
01760     black = 0;
01761   maximum = curve[0xff];
01762 }
01763 
01764 int CLASS kodak_65000_decode (short *out, int bsize)
01765 {
01766   uchar c, blen[768];
01767   ushort raw[6];
01768   INT64 bitbuf=0;
01769   int save, bits=0, i, j, len, diff;
01770 
01771   save = ftell(ifp);
01772   bsize = (bsize + 3) & -4;
01773   for (i=0; i < bsize; i+=2) {
01774     c = fgetc(ifp);
01775     if ((blen[i  ] = c & 15) > 12 ||
01776         (blen[i+1] = c >> 4) > 12 ) {
01777       fseek (ifp, save, SEEK_SET);
01778       for (i=0; i < bsize; i+=8) {
01779         read_shorts (raw, 6);
01780         out[i  ] = raw[0] >> 12 << 8 | raw[2] >> 12 << 4 | raw[4] >> 12;
01781         out[i+1] = raw[1] >> 12 << 8 | raw[3] >> 12 << 4 | raw[5] >> 12;
01782         for (j=0; j < 6; j++)
01783           out[i+2+j] = raw[j] & 0xfff;
01784       }
01785       return 1;
01786     }
01787   }
01788   if ((bsize & 7) == 4) {
01789     bitbuf  = fgetc(ifp) << 8;
01790     bitbuf += fgetc(ifp);
01791     bits = 16;
01792   }
01793   for (i=0; i < bsize; i++) {
01794     len = blen[i];
01795     if (bits < len) {
01796       for (j=0; j < 32; j+=8)
01797         bitbuf += (INT64) fgetc(ifp) << (bits+(j^8));
01798       bits += 32;
01799     }
01800     diff = bitbuf & (0xffff >> (16-len));
01801     bitbuf >>= len;
01802     bits -= len;
01803     if ((diff & (1 << (len-1))) == 0)
01804       diff -= (1 << len) - 1;
01805     out[i] = diff;
01806   }
01807   return 0;
01808 }
01809 
01810 void CLASS kodak_65000_load_raw()
01811 {
01812   short buf[256];
01813   int row, col, len, pred[2], ret, i;
01814 
01815   for (row=0; row < height; row++)
01816     for (col=0; col < width; col+=256) {
01817       pred[0] = pred[1] = 0;
01818       len = MIN (256, width-col);
01819       ret = kodak_65000_decode (buf, len);
01820       for (i=0; i < len; i++)
01821         BAYER(row,col+i) = curve[ret ? buf[i] : (pred[i & 1] += buf[i])];
01822     }
01823 }
01824 
01825 void CLASS kodak_ycbcr_load_raw()
01826 {
01827   short buf[384], *bp;
01828   int row, col, len, c, i, j, k, y[2][2], cb, cr, rgb[3];
01829   ushort *ip;
01830 
01831   for (row=0; row < height; row+=2)
01832     for (col=0; col < width; col+=128) {
01833       len = MIN (128, width-col);
01834       kodak_65000_decode (buf, len*3);
01835       y[0][1] = y[1][1] = cb = cr = 0;
01836       for (bp=buf, i=0; i < len; i+=2, bp+=2) {
01837         cb += bp[4];
01838         cr += bp[5];
01839         rgb[1] = -((cb + cr + 2) >> 2);
01840         rgb[2] = rgb[1] + cb;
01841         rgb[0] = rgb[1] + cr;
01842         for (j=0; j < 2; j++)
01843           for (k=0; k < 2; k++) {
01844             y[j][k] = y[j][k^1] + *bp++;
01845             ip = image[(row+j)*width + col+i+k];
01846             FORC3 ip[c] = curve[LIM(y[j][k]+rgb[c], 0, 0xfff)];
01847           }
01848       }
01849     }
01850 }
01851 
01852 void CLASS kodak_rgb_load_raw()
01853 {
01854   short buf[768], *bp;
01855   int row, col, len, c, i, rgb[3];
01856   ushort *ip=image[0];
01857 
01858   for (row=0; row < height; row++)
01859     for (col=0; col < width; col+=256) {
01860       len = MIN (256, width-col);
01861       kodak_65000_decode (buf, len*3);
01862       memset (rgb, 0, sizeof rgb);
01863       for (bp=buf, i=0; i < len; i++, ip+=4)
01864         FORC3 ip[c] = (rgb[c] += *bp++) & 0xfff;
01865     }
01866 }
01867 
01868 void CLASS kodak_thumb_load_raw()
01869 {
01870   int row, col;
01871   colors = thumb_misc >> 5;
01872   for (row=0; row < height; row++)
01873     for (col=0; col < width; col++)
01874       read_shorts (image[row*width+col], colors);
01875   maximum = (1 << (thumb_misc & 31)) - 1;
01876 }
01877 
01878 void CLASS sony_decrypt (unsigned *data, int len, int start, int key)
01879 {
01880   static unsigned pad[128], p;
01881 
01882   if (start) {
01883     for (p=0; p < 4; p++)
01884       pad[p] = key = key * 48828125 + 1;
01885     pad[3] = pad[3] << 1 | (pad[0]^pad[2]) >> 31;
01886     for (p=4; p < 127; p++)
01887       pad[p] = (pad[p-4]^pad[p-2]) << 1 | (pad[p-3]^pad[p-1]) >> 31;
01888     for (p=0; p < 127; p++)
01889       pad[p] = htonl(pad[p]);
01890   }
01891   while (len--)
01892     *data++ ^= pad[p++ & 127] = pad[(p+1) & 127] ^ pad[(p+65) & 127];
01893 }
01894 
01895 void CLASS sony_load_raw()
01896 {
01897   uchar head[40];
01898   ushort *pixel;
01899   unsigned i, key, row, col;
01900 
01901   fseek (ifp, 200896, SEEK_SET);
01902   fseek (ifp, (unsigned) fgetc(ifp)*4 - 1, SEEK_CUR);
01903   order = 0x4d4d;
01904   key = get4();
01905   fseek (ifp, 164600, SEEK_SET);
01906   fread (head, 1, 40, ifp);
01907   sony_decrypt ((void *) head, 10, 1, key);
01908   for (i=26; i-- > 22; )
01909     key = key << 8 | head[i];
01910   fseek (ifp, data_offset, SEEK_SET);
01911   pixel = calloc (raw_width, sizeof *pixel);
01912   merror (pixel, "sony_load_raw()");
01913   for (row=0; row < height; row++) {
01914     fread (pixel, 2, raw_width, ifp);
01915     sony_decrypt ((void *) pixel, raw_width/2, !row, key);
01916     for (col=9; col < left_margin; col++)
01917       black += ntohs(pixel[col]);
01918     for (col=0; col < width; col++)
01919       BAYER(row,col) = ntohs(pixel[col+left_margin]);
01920   }
01921   free (pixel);
01922   if (left_margin > 9)
01923     black /= (left_margin-9) * height;
01924   maximum = 0x3ff0;
01925 }
01926 
01927 #define HOLE(row) ((holes >> (((row) - raw_height) & 7)) & 1)
01928 
01929 /* Kudos to Rich Taylor for figuring out SMaL's compression algorithm. */
01930 void CLASS smal_decode_segment (unsigned seg[2][2], int holes)
01931 {
01932   uchar hist[3][13] = {
01933     { 7, 7, 0, 0, 63, 55, 47, 39, 31, 23, 15, 7, 0 },
01934     { 7, 7, 0, 0, 63, 55, 47, 39, 31, 23, 15, 7, 0 },
01935     { 3, 3, 0, 0, 63,     47,     31,     15,    0 } };
01936   int low, high=0xff, carry=0, nbits=8;
01937   int s, count, bin, next, i, sym[3];
01938   uchar diff, pred[]={0,0};
01939   ushort data=0, range=0;
01940   unsigned pix, row, col;
01941 
01942   fseek (ifp, seg[0][1]+1, SEEK_SET);
01943   getbits(-1);
01944   for (pix=seg[0][0]; pix < seg[1][0]; pix++) {
01945     for (s=0; s < 3; s++) {
01946       data = data << nbits | getbits(nbits);
01947       if (carry < 0)
01948         carry = (nbits += carry+1) < 1 ? nbits-1 : 0;
01949       while (--nbits >= 0)
01950         if ((data >> nbits & 0xff) == 0xff) break;
01951       if (nbits > 0)
01952           data = ((data & ((1 << (nbits-1)) - 1)) << 1) |
01953         ((data + (((data & (1 << (nbits-1)))) << 1)) & (-1 << nbits));
01954       if (nbits >= 0) {
01955         data += getbits(1);
01956         carry = nbits - 8;
01957       }
01958       count = ((((data-range+1) & 0xffff) << 2) - 1) / (high >> 4);
01959       for (bin=0; hist[s][bin+5] > count; bin++);
01960                 low = hist[s][bin+5] * (high >> 4) >> 2;
01961       if (bin) high = hist[s][bin+4] * (high >> 4) >> 2;
01962       high -= low;
01963       for (nbits=0; high << nbits < 128; nbits++);
01964       range = (range+low) << nbits;
01965       high <<= nbits;
01966       next = hist[s][1];
01967       if (++hist[s][2] > hist[s][3]) {
01968         next = (next+1) & hist[s][0];
01969         hist[s][3] = (hist[s][next+4] - hist[s][next+5]) >> 2;
01970         hist[s][2] = 1;
01971       }
01972       if (hist[s][hist[s][1]+4] - hist[s][hist[s][1]+5] > 1) {
01973         if (bin < hist[s][1])
01974           for (i=bin; i < hist[s][1]; i++) hist[s][i+5]--;
01975         else if (next <= bin)
01976           for (i=hist[s][1]; i < bin; i++) hist[s][i+5]++;
01977       }
01978       hist[s][1] = next;
01979       sym[s] = bin;
01980     }
01981     diff = sym[2] << 5 | sym[1] << 2 | (sym[0] & 3);
01982     if (sym[0] & 4)
01983       diff = diff ? -diff : 0x80;
01984     if (ftell(ifp) + 12 >= seg[1][1])
01985       diff = 0;
01986     pred[pix & 1] += diff;
01987     row = pix / raw_width - top_margin;
01988     col = pix % raw_width - left_margin;
01989     if (row < height && col < width)
01990       BAYER(row,col) = pred[pix & 1];
01991     if (!(pix & 1) && HOLE(row)) pix += 2;
01992   }
01993   maximum = 0xff;
01994 }
01995 
01996 void CLASS smal_v6_load_raw()
01997 {
01998   unsigned seg[2][2];
01999 
02000   fseek (ifp, 16, SEEK_SET);  
02001   seg[0][0] = 0;
02002   seg[0][1] = get2();
02003   seg[1][0] = raw_width * raw_height;
02004   seg[1][1] = INT_MAX;
02005   smal_decode_segment (seg, 0);
02006   use_gamma = 0;
02007 }
02008 
02009 int CLASS median4 (int *p)
02010 {
02011   int min, max, sum, i;
02012 
02013   min = max = sum = p[0];
02014   for (i=1; i < 4; i++) {
02015     sum += p[i];
02016     if (min > p[i]) min = p[i];
02017     if (max < p[i]) max = p[i];
02018   }
02019   return (sum - min - max) >> 1;
02020 }
02021 
02022 void CLASS fill_holes (int holes)
02023 {
02024   int row, col, val[4];
02025 
02026   for (row=2; row < height-2; row++) {
02027     if (!HOLE(row)) continue;
02028     for (col=1; col < width-1; col+=4) {
02029       val[0] = BAYER(row-1,col-1);
02030       val[1] = BAYER(row-1,col+1);
02031       val[2] = BAYER(row+1,col-1);
02032       val[3] = BAYER(row+1,col+1);
02033       BAYER(row,col) = median4(val);
02034     }
02035     for (col=2; col < width-2; col+=4)
02036       if (HOLE(row-2) || HOLE(row+2))
02037         BAYER(row,col) = (BAYER(row,col-2) + BAYER(row,col+2)) >> 1;
02038       else {
02039         val[0] = BAYER(row,col-2);
02040         val[1] = BAYER(row,col+2);
02041         val[2] = BAYER(row-2,col);
02042         val[3] = BAYER(row+2,col);
02043         BAYER(row,col) = median4(val);
02044       }
02045   }
02046 }
02047 
02048 void CLASS smal_v9_load_raw()
02049 {
02050   unsigned seg[256][2], offset, nseg, holes, i;
02051 
02052   fseek (ifp, 67, SEEK_SET);
02053   offset = get4();
02054   nseg = fgetc(ifp);
02055   fseek (ifp, offset, SEEK_SET);
02056   for (i=0; i < nseg*2; i++)
02057     seg[0][i] = get4() + data_offset*(i & 1);
02058   fseek (ifp, 78, SEEK_SET);
02059   holes = fgetc(ifp);
02060   fseek (ifp, 88, SEEK_SET);
02061   seg[nseg][0] = raw_height * raw_width;
02062   seg[nseg][1] = get4() + data_offset;
02063   for (i=0; i < nseg; i++)
02064     smal_decode_segment (seg+i, holes);
02065   if (holes) fill_holes (holes);
02066 }
02067 
02068 /* BEGIN GPL BLOCK */
02069 
02070 void CLASS foveon_decoder (unsigned size, unsigned code)
02071 {
02072   static unsigned huff[1024];
02073   struct decode *cur;
02074   int i, len;
02075 
02076   if (!code) {
02077     for (i=0; i < size; i++)
02078       huff[i] = get4();
02079     init_decoder();
02080   }
02081   cur = free_decode++;
02082   if (free_decode > first_decode+2048) {
02083     fprintf (stderr, "%s: decoder table overflow\n", ifname);
02084     longjmp (failure, 2);
02085   }
02086   if (code)
02087     for (i=0; i < size; i++)
02088       if (huff[i] == code) {
02089         cur->leaf = i;
02090         return;
02091       }
02092   if ((len = code >> 27) > 26) return;
02093   code = (len+1) << 27 | (code & 0x3ffffff) << 1;
02094 
02095   cur->branch[0] = free_decode;
02096   foveon_decoder (size, code);
02097   cur->branch[1] = free_decode;
02098   foveon_decoder (size, code+1);
02099 }
02100 
02101 void CLASS foveon_thumb (FILE *tfp)
02102 {
02103   int bwide, row, col, bit=-1, c, i;
02104   char *buf;
02105   struct decode *dindex;
02106   short pred[3];
02107   unsigned bitbuf=0;
02108 
02109   bwide = get4();
02110   fprintf (tfp, "P6\n%d %d\n255\n", thumb_width, thumb_height);
02111   if (bwide > 0) {
02112     buf = malloc (bwide);
02113     merror (buf, "foveon_thumb()");
02114     for (row=0; row < thumb_height; row++) {
02115       fread  (buf, 1, bwide, ifp);
02116       fwrite (buf, 3, thumb_width, tfp);
02117     }
02118     free (buf);
02119     return;
02120   }
02121   foveon_decoder (256, 0);
02122 
02123   for (row=0; row < thumb_height; row++) {
02124     memset (pred, 0, sizeof pred);
02125     if (!bit) get4();
02126     for (col=bit=0; col < thumb_width; col++)
02127       FORC3 {
02128         for (dindex=first_decode; dindex->branch[0]; ) {
02129           if ((bit = (bit-1) & 31) == 31)
02130             for (i=0; i < 4; i++)
02131               bitbuf = (bitbuf << 8) + fgetc(ifp);
02132           dindex = dindex->branch[bitbuf >> bit & 1];
02133         }
02134         pred[c] += dindex->leaf;
02135         fputc (pred[c], tfp);
02136       }
02137   }
02138 }
02139 
02140 void CLASS foveon_load_camf()
02141 {
02142   unsigned key, i, val;
02143 
02144   fseek (ifp, meta_offset, SEEK_SET);
02145   key = get4();
02146   fread (meta_data, 1, meta_length, ifp);
02147   for (i=0; i < meta_length; i++) {
02148     key = (key * 1597 + 51749) % 244944;
02149     val = key * (INT64) 301593171 >> 24;
02150     meta_data[i] ^= ((((key << 8) - val) >> 1) + val) >> 17;
02151   }
02152 }
02153 
02154 void CLASS foveon_load_raw()
02155 {
02156   struct decode *dindex;
02157   short diff[1024], pred[3];
02158   unsigned bitbuf=0;
02159   int fixed, row, col, bit=-1, c, i;
02160 
02161   fixed = get4();
02162   read_shorts ((ushort *) diff, 1024);
02163   if (!fixed) foveon_decoder (1024, 0);
02164 
02165   for (row=0; row < height; row++) {
02166     memset (pred, 0, sizeof pred);
02167     if (!bit && !fixed) get4();
02168     for (col=bit=0; col < width; col++) {
02169       if (fixed) {
02170         bitbuf = get4();
02171         FORC3 pred[2-c] += diff[bitbuf >> c*10 & 0x3ff];
02172       }
02173       else FORC3 {
02174         for (dindex=first_decode; dindex->branch[0]; ) {
02175           if ((bit = (bit-1) & 31) == 31)
02176             for (i=0; i < 4; i++)
02177               bitbuf = (bitbuf << 8) + fgetc(ifp);
02178           dindex = dindex->branch[bitbuf >> bit & 1];
02179         }
02180         pred[c] += diff[dindex->leaf];
02181       }
02182       FORC3 image[row*width+col][c] = pred[c];
02183     }
02184   }
02185   if (document_mode)
02186     for (i=0; i < height*width*4; i++)
02187       if ((short) image[0][i] < 0) image[0][i] = 0;
02188   foveon_load_camf();
02189   clip_max = 0xffff;
02190 }
02191 
02192 char * CLASS foveon_camf_param (char *block, char *param)
02193 {
02194   unsigned idx, num;
02195   char *pos, *cp, *dp;
02196 
02197   for (idx=0; idx < meta_length; idx += sget4(pos+8)) {
02198     pos = meta_data + idx;
02199     if (strncmp (pos, "CMb", 3)) break;
02200     if (pos[3] != 'P') continue;
02201     if (strcmp (block, pos+sget4(pos+12))) continue;
02202     cp = pos + sget4(pos+16);
02203     num = sget4(cp);
02204     dp = pos + sget4(cp+4);
02205     while (num--) {
02206       cp += 8;
02207       if (!strcmp (param, dp+sget4(cp)))
02208         return dp+sget4(cp+4);
02209     }
02210   }
02211   return NULL;
02212 }
02213 
02214 void * CLASS foveon_camf_matrix (int dim[3], char *name)
02215 {
02216   unsigned i, idx, type, ndim, size, *mat;
02217   char *pos, *cp, *dp;
02218 
02219   for (idx=0; idx < meta_length; idx += sget4(pos+8)) {
02220     pos = meta_data + idx;
02221     if (strncmp (pos, "CMb", 3)) break;
02222     if (pos[3] != 'M') continue;
02223     if (strcmp (name, pos+sget4(pos+12))) continue;
02224     dim[0] = dim[1] = dim[2] = 1;
02225     cp = pos + sget4(pos+16);
02226     type = sget4(cp);
02227     if ((ndim = sget4(cp+4)) > 3) break;
02228     dp = pos + sget4(cp+8);
02229     for (i=ndim; i--; ) {
02230       cp += 12;
02231       dim[i] = sget4(cp);
02232     }
02233     if ((size = dim[0]*dim[1]*dim[2]) > meta_length/4) break;
02234     mat = malloc (size * 4);
02235     merror (mat, "foveon_camf_matrix()");
02236     for (i=0; i < size; i++)
02237       if (type && type != 6)
02238         mat[i] = sget4(dp + i*4);
02239       else
02240         mat[i] = sget4(dp + i*2) & 0xffff;
02241     return mat;
02242   }
02243   fprintf (stderr, "%s: \"%s\" matrix not found!\n", ifname, name);
02244   return NULL;
02245 }
02246 
02247 int CLASS foveon_fixed (void *ptr, int size, char *name)
02248 {
02249   void *dp;
02250   int dim[3];
02251 
02252   dp = foveon_camf_matrix (dim, name);
02253   if (!dp) return 0;
02254   memcpy (ptr, dp, size*4);
02255   free (dp);
02256   return 1;
02257 }
02258 
02259 float CLASS foveon_avg (short *pix, int range[2], float cfilt)
02260 {
02261   int i;
02262   float val, min=FLT_MAX, max=-FLT_MAX, sum=0;
02263 
02264   for (i=range[0]; i <= range[1]; i++) {
02265     sum += val = pix[i*4] + (pix[i*4]-pix[(i-1)*4]) * cfilt;
02266     if (min > val) min = val;
02267     if (max < val) max = val;
02268   }
02269   return (sum - min - max) / (range[1] - range[0] - 1);
02270 }
02271 
02272 short * CLASS foveon_make_curve (double max, double mul, double filt)
02273 {
02274   short *curve;
02275   int i, size;
02276   double x;
02277 
02278   if (!filt) filt = 0.8;
02279   size = 4*M_PI*max / filt;
02280   curve = calloc (size+1, sizeof *curve);
02281   merror (curve, "foveon_make_curve()");
02282   curve[0] = size;
02283   for (i=0; i < size; i++) {
02284     x = i*filt/max/4;
02285     curve[i+1] = (cos(x)+1)/2 * tanh(i*filt/mul) * mul + 0.5;
02286   }
02287   return curve;
02288 }
02289 
02290 void CLASS foveon_make_curves
02291         (short **curvep, float dq[3], float div[3], float filt)
02292 {
02293   double mul[3], max=0;
02294   int c;
02295 
02296   FORC3 mul[c] = dq[c]/div[c];
02297   FORC3 if (max < mul[c]) max = mul[c];
02298   FORC3 curvep[c] = foveon_make_curve (max, mul[c], filt);
02299 }
02300 
02301 int CLASS foveon_apply_curve (short *curve, int i)
02302 {
02303   if (abs(i) >= curve[0]) return 0;
02304   return i < 0 ? -curve[1-i] : curve[1+i];
02305 }
02306 
02307 #define image ((short (*)[4]) image)
02308 
02309 void CLASS foveon_interpolate()
02310 {
02311   static const short hood[] = { -1,-1, -1,0, -1,1, 0,-1, 0,1, 1,-1, 1,0, 1,1 };
02312   short *pix, prev[3], *curve[8], (*shrink)[3];
02313   float cfilt=0, ddft[3][3][2], ppm[3][3][3];
02314   float cam_xyz[3][3], correct[3][3], last[3][3], trans[3][3];
02315   float chroma_dq[3], color_dq[3], diag[3][3], div[3];
02316   float (*black)[3], (*sgain)[3], (*sgrow)[3];
02317   float fsum[3], val, frow, num;
02318   int row, col, c, i, j, diff, sgx, irow, sum, min, max, limit;
02319   int dim[3], dscr[2][2], dstb[4], (*smrow[7])[3], total[4], ipix[3];
02320   int work[3][3], smlast, smred, smred_p=0, dev[3];
02321   int satlev[3], keep[4], active[4];
02322   unsigned *badpix;
02323   double dsum=0, trsum[3];
02324   char str[128], *cp;
02325 
02326   if (verbose)
02327     fprintf (stderr, "Foveon interpolation...\n");
02328 
02329   foveon_fixed (dscr, 4, "DarkShieldColRange");
02330   foveon_fixed (ppm[0][0], 27, "PostPolyMatrix");
02331   foveon_fixed (satlev, 3, "SaturationLevel");
02332   foveon_fixed (keep, 4, "KeepImageArea");
02333   foveon_fixed (active, 4, "ActiveImageArea");
02334   foveon_fixed (chroma_dq, 3, "ChromaDQ");
02335   foveon_fixed (color_dq, 3,
02336         foveon_camf_param ("IncludeBlocks", "ColorDQ") ?
02337                 "ColorDQ" : "ColorDQCamRGB");
02338   if (foveon_camf_param ("IncludeBlocks", "ColumnFilter"))
02339                  foveon_fixed (&cfilt, 1, "ColumnFilter");
02340 
02341   memset (ddft, 0, sizeof ddft);
02342   if (!foveon_camf_param ("IncludeBlocks", "DarkDrift")
02343          || !foveon_fixed (ddft[1][0], 12, "DarkDrift"))
02344     for (i=0; i < 2; i++) {
02345       foveon_fixed (dstb, 4, i ? "DarkShieldBottom":"DarkShieldTop");
02346       for (row = dstb[1]; row <= dstb[3]; row++)
02347         for (col = dstb[0]; col <= dstb[2]; col++)
02348           FORC3 ddft[i+1][c][1] += (short) image[row*width+col][c];
02349       FORC3 ddft[i+1][c][1] /= (dstb[3]-dstb[1]+1) * (dstb[2]-dstb[0]+1);
02350     }
02351 
02352   if (!(cp = foveon_camf_param ("WhiteBalanceIlluminants", model2)))
02353   { fprintf (stderr, "%s: Invalid white balance \"%s\"\n", ifname, model2);
02354     return; }
02355   foveon_fixed (cam_xyz, 9, cp);
02356   foveon_fixed (correct, 9,
02357         foveon_camf_param ("WhiteBalanceCorrections", model2));
02358   memset (last, 0, sizeof last);
02359   for (i=0; i < 3; i++)
02360     for (j=0; j < 3; j++)
02361       FORC3 last[i][j] += correct[i][c] * cam_xyz[c][j];
02362 
02363   sprintf (str, "%sRGBNeutral", model2);
02364   if (foveon_camf_param ("IncludeBlocks", str))
02365     foveon_fixed (div, 3, str);
02366   else {
02367     #define LAST(x,y) last[(i+x)%3][(c+y)%3]
02368     for (i=0; i < 3; i++)
02369       FORC3 diag[c][i] = LAST(1,1)*LAST(2,2) - LAST(1,2)*LAST(2,1);
02370     #undef LAST
02371     FORC3 div[c] = diag[c][0]*0.3127 + diag[c][1]*0.329 + diag[c][2]*0.3583;
02372   }
02373   num = 0;
02374   FORC3 if (num < div[c]) num = div[c];
02375   FORC3 div[c] /= num;
02376 
02377   memset (trans, 0, sizeof trans);
02378   for (i=0; i < 3; i++)
02379     for (j=0; j < 3; j++)
02380       FORC3 trans[i][j] += rgb_cam[i][c] * last[c][j] * div[j];
02381   FORC3 trsum[c] = trans[c][0] + trans[c][1] + trans[c][2];
02382   dsum = (6*trsum[0] + 11*trsum[1] + 3*trsum[2]) / 20;
02383   for (i=0; i < 3; i++)
02384     FORC3 last[i][c] = trans[i][c] * dsum / trsum[i];
02385   memset (trans, 0, sizeof trans);
02386   for (i=0; i < 3; i++)
02387     for (j=0; j < 3; j++)
02388       FORC3 trans[i][j] += (i==c ? 32 : -1) * last[c][j] / 30;
02389 
02390   foveon_make_curves (curve, color_dq, div, cfilt);
02391   FORC3 chroma_dq[c] /= 3;
02392   foveon_make_curves (curve+3, chroma_dq, div, cfilt);
02393   FORC3 dsum += chroma_dq[c] / div[c];
02394   curve[6] = foveon_make_curve (dsum, dsum, cfilt);
02395   curve[7] = foveon_make_curve (dsum*2, dsum*2, cfilt);
02396 
02397   sgain = foveon_camf_matrix (dim, "SpatialGain");
02398   if (!sgain) return;
02399   sgrow = calloc (dim[1], sizeof *sgrow);
02400   sgx = (width + dim[1]-2) / (dim[1]-1);
02401 
02402   black = calloc (height, sizeof *black);
02403   for (row=0; row < height; row++) {
02404     for (i=0; i < 6; i++)
02405       ddft[0][0][i] = ddft[1][0][i] +
02406         row / (height-1.0) * (ddft[2][0][i] - ddft[1][0][i]);
02407     FORC3 black[row][c] =
02408         ( foveon_avg (image[row*width]+c, dscr[0], cfilt) +
02409           foveon_avg (image[row*width]+c, dscr[1], cfilt) * 3
02410           - ddft[0][c][0] ) / 4 - ddft[0][c][1];
02411   }
02412   memcpy (black, black+8, sizeof *black*8);
02413   memcpy (black+height-11, black+height-22, 11*sizeof *black);
02414   memcpy (last, black, sizeof last);
02415 
02416   for (row=1; row < height-1; row++) {
02417     FORC3 if (last[1][c] > last[0][c]) {
02418         if (last[1][c] > last[2][c])
02419           black[row][c] = (last[0][c] > last[2][c]) ? last[0][c]:last[2][c];
02420       } else
02421         if (last[1][c] < last[2][c])
02422           black[row][c] = (last[0][c] < last[2][c]) ? last[0][c]:last[2][c];
02423     memmove (last, last+1, 2*sizeof last[0]);
02424     memcpy (last[2], black[row+1], sizeof last[2]);
02425   }
02426   FORC3 black[row][c] = (last[0][c] + last[1][c])/2;
02427   FORC3 black[0][c] = (black[1][c] + black[3][c])/2;
02428 
02429   val = 1 - exp(-1/24.0);
02430   memcpy (fsum, black, sizeof fsum);
02431   for (row=1; row < height; row++)
02432     FORC3 fsum[c] += black[row][c] =
02433         (black[row][c] - black[row-1][c])*val + black[row-1][c];
02434   memcpy (last[0], black[height-1], sizeof last[0]);
02435   FORC3 fsum[c] /= height;
02436   for (row = height; row--; )
02437     FORC3 last[0][c] = black[row][c] =
02438         (black[row][c] - fsum[c] - last[0][c])*val + last[0][c];
02439 
02440   memset (total, 0, sizeof total);
02441   for (row=2; row < height; row+=4)
02442     for (col=2; col < width; col+=4) {
02443       FORC3 total[c] += (short) image[row*width+col][c];
02444       total[3]++;
02445     }
02446   for (row=0; row < height; row++)
02447     FORC3 black[row][c] += fsum[c]/2 + total[c]/(total[3]*100.0);
02448 
02449   for (row=0; row < height; row++) {
02450     for (i=0; i < 6; i++)
02451       ddft[0][0][i] = ddft[1][0][i] +
02452         row / (height-1.0) * (ddft[2][0][i] - ddft[1][0][i]);
02453     pix = image[row*width];
02454     memcpy (prev, pix, sizeof prev);
02455     frow = row / (height-1.0) * (dim[2]-1);
02456     if ((irow = frow) == dim[2]-1) irow--;
02457     frow -= irow;
02458     for (i=0; i < dim[1]; i++)
02459       FORC3 sgrow[i][c] = sgain[ irow   *dim[1]+i][c] * (1-frow) +
02460                           sgain[(irow+1)*dim[1]+i][c] *    frow;
02461     for (col=0; col < width; col++) {
02462       FORC3 {
02463         diff = pix[c] - prev[c];
02464         prev[c] = pix[c];
02465         ipix[c] = pix[c] + floor ((diff + (diff*diff >> 14)) * cfilt
02466                 - ddft[0][c][1] - ddft[0][c][0] * ((float) col/width - 0.5)
02467                 - black[row][c] );
02468       }
02469       FORC3 {
02470         work[0][c] = ipix[c] * ipix[c] >> 14;
02471         work[2][c] = ipix[c] * work[0][c] >> 14;
02472         work[1][2-c] = ipix[(c+1) % 3] * ipix[(c+2) % 3] >> 14;
02473       }
02474       FORC3 {
02475         for (val=i=0; i < 3; i++)
02476           for (  j=0; j < 3; j++)
02477             val += ppm[c][i][j] * work[i][j];
02478         ipix[c] = floor ((ipix[c] + floor(val)) *
02479                 ( sgrow[col/sgx  ][c] * (sgx - col%sgx) +
02480                   sgrow[col/sgx+1][c] * (col%sgx) ) / sgx / div[c]);
02481         if (ipix[c] > 32000) ipix[c] = 32000;
02482         pix[c] = ipix[c];
02483       }
02484       pix += 4;
02485     }
02486   }
02487   free (black);
02488   free (sgrow);
02489   free (sgain);
02490 
02491   if ((badpix = foveon_camf_matrix (dim, "BadPixels"))) {
02492     for (i=0; i < dim[0]; i++) {
02493       col = (badpix[i] >> 8 & 0xfff) - keep[0];
02494       row = (badpix[i] >> 20       ) - keep[1];
02495       if ((unsigned)(row-1) > height-3 || (unsigned)(col-1) > width-3)
02496         continue;
02497       memset (fsum, 0, sizeof fsum);
02498       for (sum=j=0; j < 8; j++)
02499         if (badpix[i] & (1 << j)) {
02500           FORC3 fsum[c] += (short)
02501                 image[(row+hood[j*2])*width+col+hood[j*2+1]][c];
02502           sum++;
02503         }
02504       if (sum) FORC3 image[row*width+col][c] = fsum[c]/sum;
02505     }
02506     free (badpix);
02507   }
02508 
02509   /* Array for 5x5 Gaussian averaging of red values */
02510   smrow[6] = calloc (width*5, sizeof **smrow);
02511   merror (smrow[6], "foveon_interpolate()");
02512   for (i=0; i < 5; i++)
02513     smrow[i] = smrow[6] + i*width;
02514 
02515   /* Sharpen the reds against these Gaussian averages */
02516   for (smlast=-1, row=2; row < height-2; row++) {
02517     while (smlast < row+2) {
02518       for (i=0; i < 6; i++)
02519         smrow[(i+5) % 6] = smrow[i];
02520       pix = image[++smlast*width+2];
02521       for (col=2; col < width-2; col++) {
02522         smrow[4][col][0] =
02523           (pix[0]*6 + (pix[-4]+pix[4])*4 + pix[-8]+pix[8] + 8) >> 4;
02524         pix += 4;
02525       }
02526     }
02527     pix = image[row*width+2];
02528     for (col=2; col < width-2; col++) {
02529       smred = ( 6 *  smrow[2][col][0]
02530               + 4 * (smrow[1][col][0] + smrow[3][col][0])
02531               +      smrow[0][col][0] + smrow[4][col][0] + 8 ) >> 4;
02532       if (col == 2)
02533         smred_p = smred;
02534       i = pix[0] + ((pix[0] - ((smred*7 + smred_p) >> 3)) >> 3);
02535       if (i > 32000) i = 32000;
02536       pix[0] = i;
02537       smred_p = smred;
02538       pix += 4;
02539     }
02540   }
02541 
02542   /* Adjust the brighter pixels for better linearity */
02543   min = 0xffff;
02544   FORC3 {
02545     i = satlev[c] / div[c];
02546     if (min > i) min = i;
02547   }
02548   limit = min * 9 >> 4;
02549   for (pix=image[0]; pix < image[height*width]; pix+=4) {
02550     if (pix[0] <= limit || pix[1] <= limit || pix[2] <= limit)
02551       continue;
02552     min = max = pix[0];
02553     for (c=1; c < 3; c++) {
02554       if (min > pix[c]) min = pix[c];
02555       if (max < pix[c]) max = pix[c];
02556     }
02557     if (min >= limit*2) {
02558       pix[0] = pix[1] = pix[2] = max;
02559     } else {
02560       i = 0x4000 - ((min - limit) << 14) / limit;
02561       i = 0x4000 - (i*i >> 14);
02562       i = i*i >> 14;
02563       FORC3 pix[c] += (max - pix[c]) * i >> 14;
02564     }
02565   }
02566 /*
02567    Because photons that miss one detector often hit another,
02568    the sum R+G+B is much less noisy than the individual colors.
02569    So smooth the hues without smoothing the total.
02570  */
02571   for (smlast=-1, row=2; row < height-2; row++) {
02572     while (smlast < row+2) {
02573       for (i=0; i < 6; i++)
02574         smrow[(i+5) % 6] = smrow[i];
02575       pix = image[++smlast*width+2];
02576       for (col=2; col < width-2; col++) {
02577         FORC3 smrow[4][col][c] = (pix[c-4]+2*pix[c]+pix[c+4]+2) >> 2;
02578         pix += 4;
02579       }
02580     }
02581     pix = image[row*width+2];
02582     for (col=2; col < width-2; col++) {
02583       FORC3 dev[c] = -foveon_apply_curve (curve[7], pix[c] -
02584         ((smrow[1][col][c] + 2*smrow[2][col][c] + smrow[3][col][c]) >> 2));
02585       sum = (dev[0] + dev[1] + dev[2]) >> 3;
02586       FORC3 pix[c] += dev[c] - sum;
02587       pix += 4;
02588     }
02589   }
02590   for (smlast=-1, row=2; row < height-2; row++) {
02591     while (smlast < row+2) {
02592       for (i=0; i < 6; i++)
02593         smrow[(i+5) % 6] = smrow[i];
02594       pix = image[++smlast*width+2];
02595       for (col=2; col < width-2; col++) {
02596         FORC3 smrow[4][col][c] =
02597                 (pix[c-8]+pix[c-4]+pix[c]+pix[c+4]+pix[c+8]+2) >> 2;
02598         pix += 4;
02599       }
02600     }
02601     pix = image[row*width+2];
02602     for (col=2; col < width-2; col++) {
02603       for (total[3]=375, sum=60, c=0; c < 3; c++) {
02604         for (total[c]=i=0; i < 5; i++)
02605           total[c] += smrow[i][col][c];
02606         total[3] += total[c];
02607         sum += pix[c];
02608       }
02609       if (sum < 0) sum = 0;
02610       j = total[3] > 375 ? (sum << 16) / total[3] : sum * 174;
02611       FORC3 pix[c] += foveon_apply_curve (curve[6],
02612                 ((j*total[c] + 0x8000) >> 16) - pix[c]);
02613       pix += 4;
02614     }
02615   }
02616 
02617   /* Transform the image to a different colorspace */
02618   for (pix=image[0]; pix < image[height*width]; pix+=4) {
02619     FORC3 pix[c] -= foveon_apply_curve (curve[c], pix[c]);
02620     sum = (pix[0]+pix[1]+pix[1]+pix[2]) >> 2;
02621     FORC3 pix[c] -= foveon_apply_curve (curve[c], pix[c]-sum);
02622     FORC3 {
02623       for (dsum=i=0; i < 3; i++)
02624         dsum += trans[c][i] * pix[i];
02625       if (dsum < 0)  dsum = 0;
02626       if (dsum > 24000) dsum = 24000;
02627       ipix[c] = dsum + 0.5;
02628     }
02629     FORC3 pix[c] = ipix[c];
02630   }
02631 
02632   /* Smooth the image bottom-to-top and save at 1/4 scale */
02633   shrink = calloc ((width/4) * (height/4), sizeof *shrink);
02634   merror (shrink, "foveon_interpolate()");
02635   for (row = height/4; row--; )
02636     for (col=0; col < width/4; col++) {
02637       ipix[0] = ipix[1] = ipix[2] = 0;
02638       for (i=0; i < 4; i++)
02639         for (j=0; j < 4; j++)
02640           FORC3 ipix[c] += image[(row*4+i)*width+col*4+j][c];
02641       FORC3
02642         if (row+2 > height/4)
02643           shrink[row*(width/4)+col][c] = ipix[c] >> 4;
02644         else
02645           shrink[row*(width/4)+col][c] =
02646             (shrink[(row+1)*(width/4)+col][c]*1840 + ipix[c]*141 + 2048) >> 12;
02647     }
02648   /* From the 1/4-scale image, smooth right-to-left */
02649   for (row=0; row < (height & ~3); row++) {
02650     ipix[0] = ipix[1] = ipix[2] = 0;
02651     if ((row & 3) == 0)
02652       for (col = width & ~3 ; col--; )
02653         FORC3 smrow[0][col][c] = ipix[c] =
02654           (shrink[(row/4)*(width/4)+col/4][c]*1485 + ipix[c]*6707 + 4096) >> 13;
02655 
02656   /* Then smooth left-to-right */
02657     ipix[0] = ipix[1] = ipix[2] = 0;
02658     for (col=0; col < (width & ~3); col++)
02659       FORC3 smrow[1][col][c] = ipix[c] =
02660         (smrow[0][col][c]*1485 + ipix[c]*6707 + 4096) >> 13;
02661 
02662   /* Smooth top-to-bottom */
02663     if (row == 0)
02664       memcpy (smrow[2], smrow[1], sizeof **smrow * width);
02665     else
02666       for (col=0; col < (width & ~3); col++)
02667         FORC3 smrow[2][col][c] =
02668           (smrow[2][col][c]*6707 + smrow[1][col][c]*1485 + 4096) >> 13;
02669 
02670   /* Adjust the chroma toward the smooth values */
02671     for (col=0; col < (width & ~3); col++) {
02672       for (i=j=30, c=0; c < 3; c++) {
02673         i += smrow[2][col][c];
02674         j += image[row*width+col][c];
02675       }
02676       j = (j << 16) / i;
02677       for (sum=c=0; c < 3; c++) {
02678         ipix[c] = foveon_apply_curve (curve[c+3],
02679           ((smrow[2][col][c] * j + 0x8000) >> 16) - image[row*width+col][c]);
02680         sum += ipix[c];
02681       }
02682       sum >>= 3;
02683       FORC3 {
02684         i = image[row*width+col][c] + ipix[c] - sum;
02685         if (i < 0) i = 0;
02686         image[row*width+col][c] = i;
02687       }
02688     }
02689   }
02690   free (shrink);
02691   free (smrow[6]);
02692   for (i=0; i < 8; i++)
02693     free (curve[i]);
02694 
02695   /* Trim off the black border */
02696   active[1] -= keep[1];
02697   active[3] -= 2;
02698   i = active[2] - active[0];
02699   for (row = 0; row < active[3]-active[1]; row++)
02700     memcpy (image[row*i], image[(row+active[1])*width+active[0]],
02701          i * sizeof *image);
02702   width = i;
02703   height = row;
02704 }
02705 #undef image
02706 
02707 /* END GPL BLOCK */
02708 
02709 /*
02710    Seach from the current directory up to the root looking for
02711    a ".badpixels" file, and fix those pixels now.
02712  */
02713 void CLASS bad_pixels()
02714 {
02715   FILE *fp=NULL;
02716   char *fname, *cp, line[128];
02717   int len, time, row, col, r, c, rad, tot, n, fixed=0;
02718 
02719   if (!filters) return;
02720   for (len=32 ; ; len *= 2) {
02721     fname = malloc (len);
02722     if (!fname) return;
02723     if (getcwd (fname, len-16)) break;
02724     free (fname);
02725     if (errno != ERANGE) return;
02726   }
02727 #if defined(WIN32) || defined(DJGPP)
02728   if (fname[1] == ':')
02729     memmove (fname, fname+2, len-2);
02730   for (cp=fname; *cp; cp++)
02731     if (*cp == '\\') *cp = '/';
02732 #endif
02733   cp = fname + strlen(fname);
02734   if (cp[-1] == '/') cp--;
02735   while (*fname == '/') {
02736     strcpy (cp, "/.badpixels");
02737     if ((fp = fopen (fname, "r"))) break;
02738     if (cp == fname) break;
02739     while (*--cp != '/');
02740   }
02741   free (fname);
02742   if (!fp) return;
02743   while (fgets (line, 128, fp)) {
02744     cp = strchr (line, '#');
02745     if (cp) *cp = 0;
02746     if (sscanf (line, "%d %d %d", &col, &row, &time) != 3) continue;
02747     if ((unsigned) col >= width || (unsigned) row >= height) continue;
02748     if (time > timestamp) continue;
02749     for (tot=n=0, rad=1; rad < 3 && n==0; rad++)
02750       for (r = row-rad; r <= row+rad; r++)
02751         for (c = col-rad; c <= col+rad; c++)
02752           if ((unsigned) r < height && (unsigned) c < width &&
02753                 (r != row || c != col) && FC(r,c) == FC(row,col)) {
02754             tot += BAYER(r,c);
02755             n++;
02756           }
02757     BAYER(row,col) = tot/n;
02758     if (verbose) {
02759       if (!fixed++)
02760         fprintf (stderr, "Fixed bad pixels at:");
02761       fprintf (stderr, " %d,%d", col, row);
02762     }
02763   }
02764   if (fixed) fputc ('\n', stderr);
02765   fclose (fp);
02766 }
02767 
02768 void CLASS pseudoinverse (double (*in)[3], double (*out)[3], int size)
02769 {
02770   double work[3][6], num;
02771   int i, j, k;
02772 
02773   for (i=0; i < 3; i++) {
02774     for (j=0; j < 6; j++)
02775       work[i][j] = j == i+3;
02776     for (j=0; j < 3; j++)
02777       for (k=0; k < size; k++)
02778         work[i][j] += in[k][i] * in[k][j];
02779   }
02780   for (i=0; i < 3; i++) {
02781     num = work[i][i];
02782     for (j=0; j < 6; j++)
02783       work[i][j] /= num;
02784     for (k=0; k < 3; k++) {
02785       if (k==i) continue;
02786       num = work[k][i];
02787       for (j=0; j < 6; j++)
02788         work[k][j] -= work[i][j] * num;
02789     }
02790   }
02791   for (i=0; i < size; i++)
02792     for (j=0; j < 3; j++)
02793       for (out[i][j]=k=0; k < 3; k++)
02794         out[i][j] += work[j][k+3] * in[i][k];
02795 }
02796 
02797 void CLASS cam_xyz_coeff (double cam_xyz[4][3])
02798 {
02799   double cam_rgb[4][3], inverse[4][3], num;
02800   int i, j, k;
02801 
02802   for (i=0; i < colors; i++)            /* Multiply out XYZ colorspace */
02803     for (j=0; j < 3; j++)
02804       for (cam_rgb[i][j] = k=0; k < 3; k++)
02805         cam_rgb[i][j] += cam_xyz[i][k] * xyz_rgb[k][j];
02806 
02807   for (i=0; i < colors; i++) {          /* Normalize cam_rgb so that */
02808     for (num=j=0; j < 3; j++)           /* cam_rgb * (1,1,1) is (1,1,1,1) */
02809       num += cam_rgb[i][j];
02810     for (j=0; j < 3; j++)
02811       cam_rgb[i][j] /= num;
02812     pre_mul[i] = 1 / num;
02813   }
02814   pseudoinverse (cam_rgb, inverse, colors);
02815   for (raw_color = i=0; i < 3; i++)
02816     for (j=0; j < colors; j++)
02817       rgb_cam[i][j] = inverse[j][i];
02818 }
02819 
02820 #ifdef COLORCHECK
02821 void CLASS colorcheck()
02822 {
02823 #define NSQ 24
02824 // Coordinates of the GretagMacbeth ColorChecker squares
02825 // width, height, 1st_column, 1st_row
02826   static const int cut[NSQ][4] = {
02827     { 241, 231, 234, 274 },
02828     { 251, 235, 534, 274 },
02829     { 255, 239, 838, 272 },
02830     { 255, 240, 1146, 274 },
02831     { 251, 237, 1452, 278 },
02832     { 243, 238, 1758, 288 },
02833     { 253, 253, 218, 558 },
02834     { 255, 249, 524, 562 },
02835     { 261, 253, 830, 562 },
02836     { 260, 255, 1144, 564 },
02837     { 261, 255, 1450, 566 },
02838     { 247, 247, 1764, 576 },
02839     { 255, 251, 212, 862 },
02840     { 259, 259, 518, 862 },
02841     { 263, 261, 826, 864 },
02842     { 265, 263, 1138, 866 },
02843     { 265, 257, 1450, 872 },
02844     { 257, 255, 1762, 874 },
02845     { 257, 253, 212, 1164 },
02846     { 262, 251, 516, 1172 },
02847     { 263, 257, 826, 1172 },
02848     { 263, 255, 1136, 1176 },
02849     { 255, 252, 1452, 1182 },
02850     { 257, 253, 1760, 1180 } };
02851 // ColorChecker Chart under 6500-kelvin illumination
02852   static const double gmb_xyY[NSQ][3] = {
02853     { 0.400, 0.350, 10.1 },             // Dark Skin
02854     { 0.377, 0.345, 35.8 },             // Light Skin
02855     { 0.247, 0.251, 19.3 },             // Blue Sky
02856     { 0.337, 0.422, 13.3 },             // Foliage
02857     { 0.265, 0.240, 24.3 },             // Blue Flower
02858     { 0.261, 0.343, 43.1 },             // Bluish Green
02859     { 0.506, 0.407, 30.1 },             // Orange
02860     { 0.211, 0.175, 12.0 },             // Purplish Blue
02861     { 0.453, 0.306, 19.8 },             // Moderate Red
02862     { 0.285, 0.202, 6.6 },              // Purple
02863     { 0.380, 0.489, 44.3 },             // Yellow Green
02864     { 0.473, 0.438, 43.1 },             // Orange Yellow
02865     { 0.187, 0.129, 6.1 },              // Blue
02866     { 0.305, 0.478, 23.4 },             // Green
02867     { 0.539, 0.313, 12.0 },             // Red
02868     { 0.448, 0.470, 59.1 },             // Yellow
02869     { 0.364, 0.233, 19.8 },             // Magenta
02870     { 0.196, 0.252, 19.8 },             // Cyan
02871     { 0.310, 0.316, 90.0 },             // White
02872     { 0.310, 0.316, 59.1 },             // Neutral 8
02873     { 0.310, 0.316, 36.2 },             // Neutral 6.5
02874     { 0.310, 0.316, 19.8 },             // Neutral 5
02875     { 0.310, 0.316, 9.0 },              // Neutral 3.5
02876     { 0.310, 0.316, 3.1 } };            // Black
02877   double gmb_cam[NSQ][4], gmb_xyz[NSQ][3];
02878   double inverse[NSQ][3], cam_xyz[4][3], num;
02879   int c, i, j, k, sq, row, col, count[4];
02880 
02881   memset (gmb_cam, 0, sizeof gmb_cam);
02882   for (sq=0; sq < NSQ; sq++) {
02883     FORCC count[c] = 0;
02884     for   (row=cut[sq][3]; row < cut[sq][3]+cut[sq][1]; row++)
02885       for (col=cut[sq][2]; col < cut[sq][2]+cut[sq][0]; col++) {
02886         c = FC(row,col);
02887         if (c >= colors) c -= 2;
02888         gmb_cam[sq][c] += BAYER(row,col);
02889         count[c]++;
02890       }
02891     FORCC gmb_cam[sq][c] = gmb_cam[sq][c]/count[c] - black;
02892     gmb_xyz[sq][0] = gmb_xyY[sq][2] * gmb_xyY[sq][0] / gmb_xyY[sq][1];
02893     gmb_xyz[sq][1] = gmb_xyY[sq][2];
02894     gmb_xyz[sq][2] = gmb_xyY[sq][2] *
02895                 (1 - gmb_xyY[sq][0] - gmb_xyY[sq][1]) / gmb_xyY[sq][1];
02896   }
02897   pseudoinverse (gmb_xyz, inverse, NSQ);
02898   for (i=0; i < colors; i++)
02899     for (j=0; j < 3; j++)
02900       for (cam_xyz[i][j] = k=0; k < NSQ; k++)
02901         cam_xyz[i][j] += gmb_cam[k][i] * inverse[k][j];
02902   cam_xyz_coeff (cam_xyz);
02903   if (verbose) {
02904     printf ("    { \"%s %s\", %d,\n\t{", make, model, black);
02905     num = 10000 / (cam_xyz[1][0] + cam_xyz[1][1] + cam_xyz[1][2]);
02906     FORCC for (j=0; j < 3; j++)
02907       printf ("%c%d", (c | j) ? ',':' ', (int) (cam_xyz[c][j] * num + 0.5));
02908     puts (" } },");
02909   }
02910 #undef NSQ
02911 }
02912 #endif
02913 
02914 void CLASS scale_colors()
02915 {
02916   int row, col, x, y, c, val, shift=0;
02917   int min[4], max[4], sum[8];
02918   double dsum[8], dmin;
02919 
02920   maximum -= black;
02921   if (use_auto_wb || (use_camera_wb && camera_red == -1)) {
02922     FORC4 min[c] = INT_MAX;
02923     FORC4 max[c] = 0;
02924     memset (dsum, 0, sizeof dsum);
02925     for (row=0; row < height-7; row++)
02926       for (col=0; col < width-7; col++) {
02927         memset (sum, 0, sizeof sum);
02928         for (y=row; y < row+7; y++)
02929           for (x=col; x < col+7; x++)
02930             FORC4 {
02931               val = image[y*width+x][c];
02932               if (!val) continue;
02933               if (min[c] > val) min[c] = val;
02934               if (max[c] < val) max[c] = val;
02935               val -= black;
02936               if (val > maximum-25) goto skip_block;
02937               if (val < 0) val = 0;
02938               sum[c] += val;
02939               sum[c+4]++;
02940             }
02941         for (c=0; c < 8; c++) dsum[c] += sum[c];
02942 skip_block:
02943         continue;
02944       }
02945     FORC4 if (dsum[c]) pre_mul[c] = dsum[c+4] / dsum[c];
02946   }
02947   if (use_camera_wb && camera_red != -1) {
02948     memset (sum, 0, sizeof sum);
02949     for (row=0; row < 8; row++)
02950       for (col=0; col < 8; col++) {
02951         c = FC(row,col);
02952         if ((val = white[row][col] - black) > 0)
02953           sum[c] += val;
02954         sum[c+4]++;
02955       }
02956     if (sum[0] && sum[1] && sum[2] && sum[3])
02957       FORC4 pre_mul[c] = (float) sum[c+4] / sum[c];
02958     else if (camera_red && camera_blue)
02959       memcpy (pre_mul, cam_mul, sizeof pre_mul);
02960     else
02961       fprintf (stderr, "%s: Cannot use camera white balance.\n", ifname);
02962   }
02963   if (raw_color || !output_color) {
02964     pre_mul[0] *= red_scale;
02965     pre_mul[2] *= blue_scale;
02966   }
02967   if (pre_mul[3] == 0) pre_mul[3] = colors < 4 ? pre_mul[1] : 1;
02968   dmin = DBL_MAX;
02969   FORC4 if (dmin > pre_mul[c])
02970             dmin = pre_mul[c];
02971   FORC4 pre_mul[c] /= dmin;
02972 
02973   while (maximum << shift < 0x8000) shift++;
02974   FORC4 pre_mul[c] *= 1 << shift;
02975   maximum <<= shift;
02976 
02977   if (write_fun != write_ppm || bright < 1) {
02978     maximum *= bright;
02979     if (maximum > 0xffff)
02980         maximum = 0xffff;
02981     FORC4 pre_mul[c] *= bright;
02982   }
02983   if (verbose) {
02984     fprintf (stderr, "Scaling with black=%d, pre_mul[] =", black);
02985     FORC4 fprintf (stderr, " %f", pre_mul[c]);
02986     fputc ('\n', stderr);
02987   }
02988   clip_max = clip_color ? maximum : 0xffff;
02989   for (row=0; row < height; row++)
02990     for (col=0; col < width; col++)
02991       FORC4 {
02992         val = image[row*width+col][c];
02993         if (!val) continue;
02994         val -= black;
02995         val *= pre_mul[c];
02996         image[row*width+col][c] = CLIP(val);
02997       }
02998   if (filters && colors == 3) {
02999     if (four_color_rgb) {
03000       colors++;
03001       FORC3 rgb_cam[c][3] = rgb_cam[c][1] /= 2;
03002     } else {
03003       for (row = FC(1,0) >> 1; row < height; row+=2)
03004         for (col = FC(row,1) & 1; col < width; col+=2)
03005           image[row*width+col][1] = image[row*width+col][3];
03006       filters &= ~((filters & 0x55555555) << 1);
03007     }
03008   }
03009 }
03010 
03011 void CLASS border_interpolate (int border)
03012 {
03013   unsigned row, col, y, x, c, sum[8];
03014 
03015   for (row=0; row < height; row++)
03016     for (col=0; col < width; col++) {
03017       if (col==border && row >= border && row < height-border)
03018         col = width-border;
03019       memset (sum, 0, sizeof sum);
03020       for (y=row-1; y != row+2; y++)
03021         for (x=col-1; x != col+2; x++)
03022           if (y < height && x < width) {
03023             sum[FC(y,x)] += BAYER(y,x);
03024             sum[FC(y,x)+4]++;
03025           }
03026       FORCC if (c != FC(row,col))
03027         image[row*width+col][c] = sum[c] / sum[c+4];
03028     }
03029 }
03030 
03031 void CLASS lin_interpolate()
03032 {
03033   int code[8][2][32], *ip, sum[4];
03034   int c, i, x, y, row, col, shift, color;
03035   ushort *pix;
03036 
03037   if (verbose) fprintf (stderr, "Bilinear interpolation...\n");
03038 
03039   border_interpolate(1);
03040   for (row=0; row < 8; row++)
03041   {
03042     for (col=0; col < 2; col++) 
03043     {
03044       ip = code[row][col];
03045       memset (sum, 0, sizeof sum);
03046       for (y=-1; y <= 1; y++)
03047       {
03048         for (x=-1; x <= 1; x++) 
03049         {
03050           shift = (y==0) + (x==0);
03051           if (shift == 2) continue;
03052           color = FC(row+y,col+x);
03053           *ip++ = (width*y + x)*4 + color;
03054           *ip++ = shift;
03055           *ip++ = color;
03056           sum[color] += 1 << shift;
03057         }
03058       }
03059 
03060       FORCC
03061       {
03062         if (c != FC(row,col)) 
03063         {
03064           *ip++ = c;
03065           *ip++ = sum[c];
03066         }
03067       }
03068     }
03069   }
03070 
03071   for (row=1; row < height-1; row++)
03072   {
03073     for (col=1; col < width-1; col++) 
03074     {
03075       pix = image[row*width+col];
03076       ip = code[row & 7][col & 1];
03077       memset (sum, 0, sizeof sum);
03078       for (i=8; i--; ip+=3)
03079         sum[ip[2]] += pix[ip[0]] << ip[1];
03080       for (i=colors; --i; ip+=2)
03081         pix[ip[0]] = sum[ip[0]] / ip[1];
03082     }
03083   }
03084 }
03085 
03086 /*
03087    This algorithm is officially called:
03088 
03089    "Interpolation using a Threshold-based variable number of gradients"
03090 
03091    described in http://www-ise.stanford.edu/~tingchen/algodep/vargra.html
03092 
03093    I've extended the basic idea to work with non-Bayer filter arrays.
03094    Gradients are numbered clockwise from NW=0 to W=7.
03095  */
03096 void CLASS vng_interpolate()
03097 {
03098   static const signed char *cp, terms[] = {
03099     -2,-2,+0,-1,0,0x01, -2,-2,+0,+0,1,0x01, -2,-1,-1,+0,0,0x01,
03100     -2,-1,+0,-1,0,0x02, -2,-1,+0,+0,0,0x03, -2,-1,+0,+1,1,0x01,
03101     -2,+0,+0,-1,0,0x06, -2,+0,+0,+0,1,0x02, -2,+0,+0,+1,0,0x03,
03102     -2,+1,-1,+0,0,0x04, -2,+1,+0,-1,1,0x04, -2,+1,+0,+0,0,0x06,
03103     -2,+1,+0,+1,0,0x02, -2,+2,+0,+0,1,0x04, -2,+2,+0,+1,0,0x04,
03104     -1,-2,-1,+0,0,0x80, -1,-2,+0,-1,0,0x01, -1,-2,+1,-1,0,0x01,
03105     -1,-2,+1,+0,1,0x01, -1,-1,-1,+1,0,0x88, -1,-1,+1,-2,0,0x40,
03106     -1,-1,+1,-1,0,0x22, -1,-1,+1,+0,0,0x33, -1,-1,+1,+1,1,0x11,
03107     -1,+0,-1,+2,0,0x08, -1,+0,+0,-1,0,0x44, -1,+0,+0,+1,0,0x11,
03108     -1,+0,+1,-2,1,0x40, -1,+0,+1,-1,0,0x66, -1,+0,+1,+0,1,0x22,
03109     -1,+0,+1,+1,0,0x33, -1,+0,+1,+2,1,0x10, -1,+1,+1,-1,1,0x44,
03110     -1,+1,+1,+0,0,0x66, -1,+1,+1,+1,0,0x22, -1,+1,+1,+2,0,0x10,
03111     -1,+2,+0,+1,0,0x04, -1,+2,+1,+0,1,0x04, -1,+2,+1,+1,0,0x04,
03112     +0,-2,+0,+0,1,0x80, +0,-1,+0,+1,1,0x88, +0,-1,+1,-2,0,0x40,
03113     +0,-1,+1,+0,0,0x11, +0,-1,+2,-2,0,0x40, +0,-1,+2,-1,0,0x20,
03114     +0,-1,+2,+0,0,0x30, +0,-1,+2,+1,1,0x10, +0,+0,+0,+2,1,0x08,
03115     +0,+0,+2,-2,1,0x40, +0,+0,+2,-1,0,0x60, +0,+0,+2,+0,1,0x20,
03116     +0,+0,+2,+1,0,0x30, +0,+0,+2,+2,1,0x10, +0,+1,+1,+0,0,0x44,
03117     +0,+1,+1,+2,0,0x10, +0,+1,+2,-1,1,0x40, +0,+1,+2,+0,0,0x60,
03118     +0,+1,+2,+1,0,0x20, +0,+1,+2,+2,0,0x10, +1,-2,+1,+0,0,0x80,
03119     +1,-1,+1,+1,0,0x88, +1,+0,+1,+2,0,0x08, +1,+0,+2,-1,0,0x40,
03120     +1,+0,+2,+1,0,0x10
03121   }, chood[] = { -1,-1, -1,0, -1,+1, 0,+1, +1,+1, +1,0, +1,-1, 0,-1 };
03122   ushort (*brow[5])[4], *pix;
03123   int code[8][2][320], *ip, gval[8], gmin, gmax, sum[4];
03124   int row, col, x, y, x1, x2, y1, y2, t, weight, grads, color, diag;
03125   int g, diff, thold, num, c;
03126 
03127   lin_interpolate();
03128   if (verbose) fprintf (stderr, "VNG interpolation...\n");
03129 
03130   for (row=0; row < 8; row++) {         /* Precalculate for VNG */
03131     for (col=0; col < 2; col++) {
03132       ip = code[row][col];
03133       for (cp=terms, t=0; t < 64; t++) {
03134         y1 = *cp++;  x1 = *cp++;
03135         y2 = *cp++;  x2 = *cp++;
03136         weight = *cp++;
03137         grads = *cp++;
03138         color = FC(row+y1,col+x1);
03139         if (FC(row+y2,col+x2) != color) continue;
03140         diag = (FC(row,col+1) == color && FC(row+1,col) == color) ? 2:1;
03141         if (abs(y1-y2) == diag && abs(x1-x2) == diag) continue;
03142         *ip++ = (y1*width + x1)*4 + color;
03143         *ip++ = (y2*width + x2)*4 + color;
03144         *ip++ = weight;
03145         for (g=0; g < 8; g++)
03146           if (grads & 1<<g) *ip++ = g;
03147         *ip++ = -1;
03148       }
03149       *ip++ = INT_MAX;
03150       for (cp=chood, g=0; g < 8; g++) {
03151         y = *cp++;  x = *cp++;
03152         *ip++ = (y*width + x) * 4;
03153         color = FC(row,col);
03154         if (FC(row+y,col+x) != color && FC(row+y*2,col+x*2) == color)
03155           *ip++ = (y*width + x) * 8 + color;
03156         else
03157           *ip++ = 0;
03158       }
03159     }
03160   }
03161   brow[4] = calloc (width*3, sizeof **brow);
03162   merror (brow[4], "vng_interpolate()");
03163   for (row=0; row < 3; row++)
03164     brow[row] = brow[4] + row*width;
03165   for (row=2; row < height-2; row++) {          /* Do VNG interpolation */
03166     for (col=2; col < width-2; col++) {
03167       pix = image[row*width+col];
03168       ip = code[row & 7][col & 1];
03169       memset (gval, 0, sizeof gval);
03170       while ((g = ip[0]) != INT_MAX) {          /* Calculate gradients */
03171         diff = ABS(pix[g] - pix[ip[1]]) << ip[2];
03172         gval[ip[3]] += diff;
03173         ip += 5;
03174         if ((g = ip[-1]) == -1) continue;
03175         gval[g] += diff;
03176         while ((g = *ip++) != -1)
03177           gval[g] += diff;
03178       }
03179       ip++;
03180       gmin = gmax = gval[0];                    /* Choose a threshold */
03181       for (g=1; g < 8; g++) {
03182         if (gmin > gval[g]) gmin = gval[g];
03183         if (gmax < gval[g]) gmax = gval[g];
03184       }
03185       if (gmax == 0) {
03186         memcpy (brow[2][col], pix, sizeof *image);
03187         continue;
03188       }
03189       thold = gmin + (gmax >> 1);
03190       memset (sum, 0, sizeof sum);
03191       color = FC(row,col);
03192       for (num=g=0; g < 8; g++,ip+=2) {         /* Average the neighbors */
03193         if (gval[g] <= thold) {
03194           FORCC
03195             if (c == color && ip[1])
03196               sum[c] += (pix[c] + pix[ip[1]]) >> 1;
03197             else
03198               sum[c] += pix[ip[0] + c];
03199           num++;
03200         }
03201       }
03202       FORCC {                                   /* Save to buffer */
03203         t = pix[color];
03204         if (c != color)
03205           t += (sum[c] - sum[color]) / num;
03206         brow[2][col][c] = CLIP(t);
03207       }
03208     }
03209     if (row > 3)                                /* Write buffer to image */
03210       memcpy (image[(row-2)*width+2], brow[0]+2, (width-4)*sizeof *image);
03211     for (g=0; g < 4; g++)
03212       brow[(g-1) & 3] = brow[g];
03213   }
03214   memcpy (image[(row-2)*width+2], brow[0]+2, (width-4)*sizeof *image);
03215   memcpy (image[(row-1)*width+2], brow[1]+2, (width-4)*sizeof *image);
03216   free (brow[4]);
03217 }
03218 
03219 void CLASS cam_to_cielab (ushort cam[4], float lab[3])
03220 {
03221   int c, i, j, k;
03222   float r, xyz[3];
03223   static float cbrt[0x10000], xyz_cam[3][4];
03224 
03225   if (cam == NULL) {
03226     for (i=0; i < 0x10000; i++) {
03227       r = (float) i / maximum;
03228       cbrt[i] = r > 0.008856 ? pow(r,1/3.0) : 7.787*r + 16/116.0;
03229     }
03230     for (i=0; i < 3; i++)
03231       for (j=0; j < colors; j++)
03232         for (xyz_cam[i][j] = k=0; k < 3; k++)
03233           xyz_cam[i][j] += xyz_rgb[i][k] * rgb_cam[k][j] / d65_white[i];
03234   } else {
03235     for (i=0; i < 3; i++) {
03236       for (xyz[i]=0.5, c=0; c < colors; c++)
03237         xyz[i] += xyz_cam[i][c] * cam[c];
03238       xyz[i] = cbrt[CLIP((int) xyz[i])];
03239     }
03240     lab[0] = 116 * xyz[1] - 16;
03241     lab[1] = 500 * (xyz[0] - xyz[1]);
03242     lab[2] = 200 * (xyz[1] - xyz[2]);
03243   }
03244 }
03245 
03246 /*
03247    Adaptive Homogeneity-Directed interpolation is based on
03248    the work of Keigo Hirakawa, Thomas Parks, and Paul Lee.
03249  */
03250 #define TS 256          /* Tile Size */
03251 
03252 void CLASS ahd_interpolate()
03253 {
03254   int i, j, top, left, row, col, tr, tc, fc, c, d, val, hm[2];
03255   ushort (*pix)[4], (*rix)[3];
03256   static const int dir[4] = { -1, 1, -TS, TS };
03257   unsigned ldiff[2][4], abdiff[2][4], leps, abeps;
03258   float flab[3];
03259   ushort (*rgb)[TS][TS][3];
03260    short (*lab)[TS][TS][3];
03261    char (*homo)[TS][TS], *buffer;
03262 
03263   if (verbose) fprintf (stderr, "AHD interpolation...\n");
03264 
03265   border_interpolate(3);
03266   buffer = malloc (26*TS*TS);                   /* 1664 kB */
03267   merror (buffer, "ahd_interpolate()");
03268   rgb  = (void *) buffer;
03269   lab  = (void *) (buffer + 12*TS*TS);
03270   homo = (void *) (buffer + 24*TS*TS);
03271 
03272   for (top=0; top < height; top += TS-6)
03273     for (left=0; left < width; left += TS-6) {
03274       memset (rgb, 0, 12*TS*TS);
03275 
03276 /*  Interpolate green horizontally and vertically:              */
03277       for (row = top < 2 ? 2:top; row < top+TS && row < height-2; row++) {
03278         col = left + (FC(row,left) == 1);
03279         if (col < 2) col += 2;
03280         for (fc = FC(row,col); col < left+TS && col < width-2; col+=2) {
03281           pix = image + row*width+col;
03282           val = ((pix[-1][1] + pix[0][fc] + pix[1][1]) * 2
03283                 - pix[-2][fc] - pix[2][fc]) >> 2;
03284           rgb[0][row-top][col-left][1] = ULIM(val,pix[-1][1],pix[1][1]);
03285           val = ((pix[-width][1] + pix[0][fc] + pix[width][1]) * 2
03286                 - pix[-2*width][fc] - pix[2*width][fc]) >> 2;
03287           rgb[1][row-top][col-left][1] = ULIM(val,pix[-width][1],pix[width][1]);
03288         }
03289       }
03290 /*  Interpolate red and blue, and convert to CIELab:            */
03291       for (d=0; d < 2; d++)
03292         for (row=top+1; row < top+TS-1 && row < height-1; row++)
03293           for (col=left+1; col < left+TS-1 && col < width-1; col++) {
03294             pix = image + row*width+col;
03295             rix = &rgb[d][row-top][col-left];
03296             if ((c = 2 - FC(row,col)) == 1) {
03297               c = FC(row+1,col);
03298               val = pix[0][1] + (( pix[-1][2-c] + pix[1][2-c]
03299                                  - rix[-1][1] - rix[1][1] ) >> 1);
03300               rix[0][2-c] = CLIP(val);
03301               val = pix[0][1] + (( pix[-width][c] + pix[width][c]
03302                                  - rix[-TS][1] - rix[TS][1] ) >> 1);
03303             } else
03304               val = rix[0][1] + (( pix[-width-1][c] + pix[-width+1][c]
03305                                  + pix[+width-1][c] + pix[+width+1][c]
03306                                  - rix[-TS-1][1] - rix[-TS+1][1]
03307                                  - rix[+TS-1][1] - rix[+TS+1][1] + 1) >> 2);
03308             rix[0][c] = CLIP(val);
03309             c = FC(row,col);
03310             rix[0][c] = pix[0][c];
03311             cam_to_cielab (rix[0], flab);
03312             FORC3 lab[d][row-top][col-left][c] = 64*flab[c];
03313           }
03314 /*  Build homogeneity maps from the CIELab images:              */
03315       memset (homo, 0, 2*TS*TS);
03316       for (row=top+2; row < top+TS-2 && row < height; row++) {
03317         tr = row-top;
03318         for (col=left+2; col < left+TS-2 && col < width; col++) {
03319           tc = col-left;
03320           for (d=0; d < 2; d++)
03321             for (i=0; i < 4; i++)
03322               ldiff[d][i] = ABS(lab[d][tr][tc][0]-lab[d][tr][tc+dir[i]][0]);
03323           leps = MIN(MAX(ldiff[0][0],ldiff[0][1]),
03324                      MAX(ldiff[1][2],ldiff[1][3]));
03325           for (d=0; d < 2; d++)
03326             for (i=0; i < 4; i++)
03327               if (i >> 1 == d || ldiff[d][i] <= leps)
03328                 abdiff[d][i] = SQR(lab[d][tr][tc][1]-lab[d][tr][tc+dir[i]][1])
03329                              + SQR(lab[d][tr][tc][2]-lab[d][tr][tc+dir[i]][2]);
03330           abeps = MIN(MAX(abdiff[0][0],abdiff[0][1]),
03331                       MAX(abdiff[1][2],abdiff[1][3]));
03332           for (d=0; d < 2; d++)
03333             for (i=0; i < 4; i++)
03334               if (ldiff[d][i] <= leps && abdiff[d][i] <= abeps)
03335                 homo[d][tr][tc]++;
03336         }
03337       }
03338 /*  Combine the most homogenous pixels for the final result:    */
03339       for (row=top+3; row < top+TS-3 && row < height-3; row++) {
03340         tr = row-top;
03341         for (col=left+3; col < left+TS-3 && col < width-3; col++) {
03342           tc = col-left;
03343           for (d=0; d < 2; d++)
03344             for (hm[d]=0, i=tr-1; i <= tr+1; i++)
03345               for (j=tc-1; j <= tc+1; j++)
03346                 hm[d] += homo[d][i][j];
03347           if (hm[0] != hm[1])
03348             FORC3 image[row*width+col][c] = rgb[hm[1] > hm[0]][tr][tc][c];
03349           else
03350             FORC3 image[row*width+col][c] =
03351                 (rgb[0][tr][tc][c] + rgb[1][tr][tc][c]) >> 1;
03352         }
03353       }
03354     }
03355   free (buffer);
03356 }
03357 #undef TS
03358 
03359 /*
03360    Bilateral Filtering was developed by C. Tomasi and R. Manduchi.
03361  */
03362 void CLASS bilateral_filter()
03363 {
03364   float (**window)[7], *kernel, scale_r, elut[1024], sum[5];
03365   int c, i, wr, ws, wlast, row, col, y, x;
03366   unsigned sep;
03367 
03368   if (verbose) fprintf (stderr, "Bilateral filtering...\n");
03369 
03370   wr = ceil(sigma_d*2);         /* window radius */
03371   ws = 2*wr + 1;                /* window size */
03372   window = calloc ((ws+1)*sizeof  *window +
03373                  ws*width*sizeof **window + ws*sizeof *kernel, 1);
03374   merror (window, "bilateral_filter()");
03375   for (i=0; i <= ws; i++)
03376     window[i] = (float(*)[7]) (window+ws+1) + i*width;
03377   kernel = (float *) window[ws] + wr;
03378   for (i=-wr; i <= wr; i++)
03379     kernel[i] = 256 / (2*SQR(sigma_d)) * i*i + 0.25;
03380   scale_r     = 256 / (2*SQR(sigma_r));
03381   for (i=0; i < 1024; i++)
03382     elut[i] = exp (-i/256.0);
03383 
03384   for (wlast=-1, row=0; row < height; row++) {
03385     while (wlast < row+wr) {
03386       wlast++;
03387       for (i=0; i <= ws; i++)   /* rotate window rows */
03388         window[(ws+i) % (ws+1)] = window[i];
03389       if (wlast < height)
03390         for (col=0; col < width; col++) {
03391           FORCC window[ws-1][col][c] = image[wlast*width+col][c];
03392           cam_to_cielab (image[wlast*width+col], window[ws-1][col]+4);
03393         }
03394     }
03395     for (col=0; col < width; col++) {
03396       memset (sum, 0, sizeof sum);
03397       for (y=-wr; y <= wr; y++)
03398         if ((unsigned)(row+y) < height)
03399           for (x=-wr; x <= wr; x++)
03400             if ((unsigned)(col+x) < width) {
03401               sep = ( SQR(window[wr+y][col+x][4] - window[wr][col][4])
03402                     + SQR(window[wr+y][col+x][5] - window[wr][col][5])
03403                     + SQR(window[wr+y][col+x][6] - window[wr][col][6]) )
03404                         * scale_r + kernel[y] + kernel[x];
03405               if (sep < 1024) {
03406                 FORCC sum[c] += elut[sep] * window[wr+y][col+x][c];
03407                 sum[4] += elut[sep];
03408               }
03409             }
03410       FORCC image[row*width+col][c] = sum[c]/sum[4];
03411     }
03412   }
03413   free (window);
03414 }
03415 
03416 void CLASS tiff_get (unsigned base,
03417         unsigned *tag, unsigned *type, unsigned *len, unsigned *save)
03418 {
03419   *tag  = get2();
03420   *type = get2();
03421   *len  = get4();
03422   *save = ftell(ifp) + 4;
03423   if (*len * ("1112481124848"[*type < 13 ? *type:0]-'0') > 4)
03424     fseek (ifp, get4()+base, SEEK_SET);
03425 }
03426 
03427 void CLASS parse_olympus_note (int base)
03428 {
03429   unsigned entries, tag, type, len, save;
03430 
03431   entries = get2();
03432   while (entries--) {
03433     tiff_get (base, &tag, &type, &len, &save);
03434     if (tag == 257) thumb_offset = get4();
03435     if (tag == 258) thumb_length = get4();
03436     fseek (ifp, save, SEEK_SET);
03437   }
03438 }
03439 
03440 void CLASS parse_makernote (int base)
03441 {
03442   static const uchar xlat[2][256] = {
03443   { 0xc1,0xbf,0x6d,0x0d,0x59,0xc5,0x13,0x9d,0x83,0x61,0x6b,0x4f,0xc7,0x7f,0x3d,0x3d,
03444     0x53,0x59,0xe3,0xc7,0xe9,0x2f,0x95,0xa7,0x95,0x1f,0xdf,0x7f,0x2b,0x29,0xc7,0x0d,
03445     0xdf,0x07,0xef,0x71,0x89,0x3d,0x13,0x3d,0x3b,0x13,0xfb,0x0d,0x89,0xc1,0x65,0x1f,
03446     0xb3,0x0d,0x6b,0x29,0xe3,0xfb,0xef,0xa3,0x6b,0x47,0x7f,0x95,0x35,0xa7,0x47,0x4f,
03447     0xc7,0xf1,0x59,0x95,0x35,0x11,0x29,0x61,0xf1,0x3d,0xb3,0x2b,0x0d,0x43,0x89,0xc1,
03448     0x9d,0x9d,0x89,0x65,0xf1,0xe9,0xdf,0xbf,0x3d,0x7f,0x53,0x97,0xe5,0xe9,0x95,0x17,
03449     0x1d,0x3d,0x8b,0xfb,0xc7,0xe3,0x67,0xa7,0x07,0xf1,0x71,0xa7,0x53,0xb5,0x29,0x89,
03450     0xe5,0x2b,0xa7,0x17,0x29,0xe9,0x4f,0xc5,0x65,0x6d,0x6b,0xef,0x0d,0x89,0x49,0x2f,
03451     0xb3,0x43,0x53,0x65,0x1d,0x49,0xa3,0x13,0x89,0x59,0xef,0x6b,0xef,0x65,0x1d,0x0b,
03452     0x59,0x13,0xe3,0x4f,0x9d,0xb3,0x29,0x43,0x2b,0x07,0x1d,0x95,0x59,0x59,0x47,0xfb,
03453     0xe5,0xe9,0x61,0x47,0x2f,0x35,0x7f,0x17,0x7f,0xef,0x7f,0x95,0x95,0x71,0xd3,0xa3,
03454     0x0b,0x71,0xa3,0xad,0x0b,0x3b,0xb5,0xfb,0xa3,0xbf,0x4f,0x83,0x1d,0xad,0xe9,0x2f,
03455     0x71,0x65,0xa3,0xe5,0x07,0x35,0x3d,0x0d,0xb5,0xe9,0xe5,0x47,0x3b,0x9d,0xef,0x35,
03456     0xa3,0xbf,0xb3,0xdf,0x53,0xd3,0x97,0x53,0x49,0x71,0x07,0x35,0x61,0x71,0x2f,0x43,
03457     0x2f,0x11,0xdf,0x17,0x97,0xfb,0x95,0x3b,0x7f,0x6b,0xd3,0x25,0xbf,0xad,0xc7,0xc5,
03458     0xc5,0xb5,0x8b,0xef,0x2f,0xd3,0x07,0x6b,0x25,0x49,0x95,0x25,0x49,0x6d,0x71,0xc7 },
03459   { 0xa7,0xbc,0xc9,0xad,0x91,0xdf,0x85,0xe5,0xd4,0x78,0xd5,0x17,0x46,0x7c,0x29,0x4c,
03460     0x4d,0x03,0xe9,0x25,0x68,0x11,0x86,0xb3,0xbd,0xf7,0x6f,0x61,0x22,0xa2,0x26,0x34,
03461     0x2a,0xbe,0x1e,0x46,0x14,0x68,0x9d,0x44,0x18,0xc2,0x40,0xf4,0x7e,0x5f,0x1b,0xad,
03462     0x0b,0x94,0xb6,0x67,0xb4,0x0b,0xe1,0xea,0x95,0x9c,0x66,0xdc,0xe7,0x5d,0x6c,0x05,
03463     0xda,0xd5,0xdf,0x7a,0xef,0xf6,0xdb,0x1f,0x82,0x4c,0xc0,0x68,0x47,0xa1,0xbd,0xee,
03464     0x39,0x50,0x56,0x4a,0xdd,0xdf,0xa5,0xf8,0xc6,0xda,0xca,0x90,0xca,0x01,0x42,0x9d,
03465     0x8b,0x0c,0x73,0x43,0x75,0x05,0x94,0xde,0x24,0xb3,0x80,0x34,0xe5,0x2c,0xdc,0x9b,
03466     0x3f,0xca,0x33,0x45,0xd0,0xdb,0x5f,0xf5,0x52,0xc3,0x21,0xda,0xe2,0x22,0x72,0x6b,
03467     0x3e,0xd0,0x5b,0xa8,0x87,0x8c,0x06,0x5d,0x0f,0xdd,0x09,0x19,0x93,0xd0,0xb9,0xfc,
03468     0x8b,0x0f,0x84,0x60,0x33,0x1c,0x9b,0x45,0xf1,0xf0,0xa3,0x94,0x3a,0x12,0x77,0x33,
03469     0x4d,0x44,0x78,0x28,0x3c,0x9e,0xfd,0x65,0x57,0x16,0x94,0x6b,0xfb,0x59,0xd0,0xc8,
03470     0x22,0x36,0xdb,0xd2,0x63,0x98,0x43,0xa1,0x04,0x87,0x86,0xf7,0xa6,0x26,0xbb,0xd6,
03471     0x59,0x4d,0xbf,0x6a,0x2e,0xaa,0x2b,0xef,0xe6,0x78,0xb6,0x4e,0xe0,0x2f,0xdc,0x7c,
03472     0xbe,0x57,0x19,0x32,0x7e,0x2a,0xd0,0xb8,0xba,0x29,0x00,0x3c,0x52,0x7d,0xa8,0x49,
03473     0x3b,0x2d,0xeb,0x25,0x49,0xfa,0xa3,0xaa,0x39,0xa7,0xc5,0xa7,0x50,0x11,0x36,0xfb,
03474     0xc6,0x67,0x4a,0xf5,0xa5,0x12,0x65,0x7e,0xb0,0xdf,0xaf,0x4e,0xb3,0x61,0x7f,0x2f } };
03475   unsigned offset=0, entries, tag, type, len, save, c;
03476   unsigned ver97=0, serial=0, i;
03477   uchar buf97[324], ci, cj, ck;
03478   short sorder;
03479   char buf[10];
03480 /*
03481    The MakerNote might have its own TIFF header (possibly with
03482    its own byte-order!), or it might just be a table.
03483  */
03484   sorder = order;
03485   fread (buf, 1, 10, ifp);
03486   if (!strncmp (buf,"KC"  ,2) ||        /* these aren't TIFF format */
03487       !strncmp (buf,"KDK" ,3) ||
03488       !strncmp (buf,"MLY" ,3) ||
03489       !strncmp (buf,"VER" ,3) ||
03490       !strncmp (buf,"IIII",4) ||
03491       !strncmp (buf,"MMMM",4)) return;
03492   if (!strcmp (buf,"Nikon")) {
03493     base = ftell(ifp);
03494     order = get2();
03495     if (get2() != 42) goto quit;
03496     offset = get4();
03497     fseek (ifp, offset-8, SEEK_CUR);
03498   } else if (!strncmp (buf,"FUJIFILM",8) ||
03499              !strncmp (buf,"SONY",4) ||
03500              !strcmp  (buf,"Panasonic")) {
03501     order = 0x4949;
03502     fseek (ifp,  2, SEEK_CUR);
03503   } else if (!strcmp (buf,"OLYMP") ||
03504              !strcmp (buf,"LEICA") ||
03505              !strcmp (buf,"Ricoh") ||
03506              !strcmp (buf,"EPSON"))
03507     fseek (ifp, -2, SEEK_CUR);
03508   else if (!strcmp (buf,"AOC") ||
03509            !strcmp (buf,"QVC"))
03510     fseek (ifp, -4, SEEK_CUR);
03511   else fseek (ifp, -10, SEEK_CUR);
03512 
03513   entries = get2();
03514   if (entries > 1000) return;
03515   while (entries--) {
03516     tiff_get (base, &tag, &type, &len, &save);
03517     if (tag == 2 && strstr(make,"NIKON"))
03518       iso_speed = (get2(),get2());
03519     if (tag == 4 && len == 27) {
03520       iso_speed = 50 * pow (2, (get4(),get2())/32.0 - 4);
03521       aperture = (get2(), pow (2, get2()/64.0));
03522       shutter = pow (2, ((short) get2())/-32.0);
03523     }
03524     if (tag == 8 && type == 4)
03525       shot_order = get4();
03526     if (tag == 0xc && len == 4) {
03527       camera_red  = getrat();
03528       camera_blue = getrat();
03529     }
03530     if (tag == 0x14 && len == 2560 && type == 7) {
03531       fseek (ifp, 1248, SEEK_CUR);
03532       goto get2_256;
03533     }
03534     if (strstr(make,"PENTAX")) {
03535       if (tag == 0x1b) tag = 0x1018;
03536       if (tag == 0x1c) tag = 0x1017;
03537     }
03538     if (tag == 0x1d)
03539       while ((c = fgetc(ifp)))
03540         serial = serial*10 + (isdigit(c) ? c - '0' : c % 10);
03541     if (tag == 0x81 && type == 4) {
03542       data_offset = get4();
03543       fseek (ifp, data_offset + 41, SEEK_SET);
03544       raw_height = get2() * 2;
03545       raw_width  = get2();
03546       filters = 0x61616161;
03547     }
03548     if ((tag == 0x81  && type == 7) ||
03549         (tag == 0x100 && type == 7) ||
03550         (tag == 0x280 && type == 1)) {
03551       thumb_offset = ftell(ifp);
03552       thumb_length = len;
03553     }
03554     if (tag == 0x88 && type == 4 && (thumb_offset = get4()))
03555       thumb_offset += base;
03556     if (tag == 0x89 && type == 4)
03557       thumb_length = get4();
03558     if (tag == 0x8c)
03559       curve_offset = ftell(ifp) + 2112;
03560     if (tag == 0x96)
03561       curve_offset = ftell(ifp) + 2;
03562     if (tag == 0x97) {
03563       for (i=0; i < 4; i++)
03564         ver97 = (ver97 << 4) + fgetc(ifp)-'0';
03565       switch (ver97) {
03566         case 0x100:
03567           fseek (ifp, 68, SEEK_CUR);
03568           FORC4 cam_mul[(c >> 1) | ((c & 1) << 1)] = get2();
03569           break;
03570         case 0x102:
03571           fseek (ifp, 6, SEEK_CUR);
03572           goto get2_rggb;
03573         case 0x103:
03574           fseek (ifp, 16, SEEK_CUR);
03575           FORC4 cam_mul[c] = get2();
03576       }
03577       if (ver97 >> 8 == 2) {
03578         if (ver97 != 0x205) fseek (ifp, 280, SEEK_CUR);
03579         fread (buf97, 324, 1, ifp);
03580       }
03581     }
03582     if (tag == 0xa7 && ver97 >> 8 == 2) {
03583       ci = xlat[0][serial & 0xff];
03584       cj = xlat[1][fgetc(ifp)^fgetc(ifp)^fgetc(ifp)^fgetc(ifp)];
03585       ck = 0x60;
03586       for (i=0; i < 324; i++)
03587         buf97[i] ^= (cj += ci * ck++);
03588       FORC4 cam_mul[c ^ (c >> 1)] =
03589         sget2 (buf97 + (ver97 == 0x205 ? 14:6) + c*2);
03590     }
03591     if (tag == 0x200 && len == 4)
03592       black = (get2()+get2()+get2()+get2())/4;
03593     if (tag == 0x201 && len == 4)
03594       goto get2_rggb;
03595     if (tag == 0x401 && len == 4) {
03596       black = (get4()+get4()+get4()+get4())/4;
03597     }
03598     if (tag == 0xe01) {         /* Nikon Capture Note */
03599       type = order;
03600       order = 0x4949;
03601       fseek (ifp, 22, SEEK_CUR);
03602       for (offset=22; offset+22 < len; offset += 22+i) {
03603         tag = get4();
03604         fseek (ifp, 14, SEEK_CUR);
03605         i = get4()-4;
03606         if (tag == 0x76a43207) flip = get2();
03607         else fseek (ifp, i, SEEK_CUR);
03608       }
03609       order = type;
03610     }
03611     if (tag == 0xe80 && len == 256 && type == 7) {
03612       fseek (ifp, 48, SEEK_CUR);
03613       camera_red  = get2() * 508 * 1.078 / 0x10000;
03614       camera_blue = get2() * 382 * 1.173 / 0x10000;
03615     }
03616     if (tag == 0xf00 && len == 614 && type == 7) {
03617       fseek (ifp, 176, SEEK_CUR);
03618       goto get2_256;
03619     }
03620     if (tag == 0x1011 && len == 9 && use_camera_wb) {
03621       for (i=0; i < 3; i++)
03622         FORC3 rgb_cam[i][c] = ((short) get2()) / 256.0;
03623       raw_color = rgb_cam[0][0] < 1;
03624     }
03625     if (tag == 0x1017)
03626       camera_red  = get2() / 256.0;
03627     if (tag == 0x1018)
03628       camera_blue = get2() / 256.0;
03629     if (tag == 0x2011 && len == 2) {
03630 get2_256:
03631       order = 0x4d4d;
03632       camera_red  = get2() / 256.0;
03633       camera_blue = get2() / 256.0;
03634     }
03635     if (tag == 0x2020)
03636       parse_olympus_note (base);
03637     if (tag == 0x4001) {
03638       i = len == 582 ? 50 : len == 653 ? 68 : len == 796 ? 126 : 0;
03639       fseek (ifp, i ,SEEK_CUR);
03640 get2_rggb:
03641       FORC4 cam_mul[c ^ (c >> 1)] = get2();
03642     }
03643     fseek (ifp, save, SEEK_SET);
03644   }
03645 quit:
03646   order = sorder;
03647 }
03648 
03649 /*
03650    Since the TIFF DateTime string has no timezone information,
03651    assume that the camera's clock was set to Universal Time.
03652  */
03653 void CLASS get_timestamp (int reversed)
03654 {
03655   struct tm t;
03656   char str[20];
03657   int i;
03658 
03659   if (timestamp) return;
03660   str[19] = 0;
03661   if (reversed)
03662     for (i=19; i--; ) str[i] = fgetc(ifp);
03663   else
03664     fread (str, 19, 1, ifp);
03665   if (sscanf (str, "%d:%d:%d %d:%d:%d", &t.tm_year, &t.tm_mon,
03666         &t.tm_mday, &t.tm_hour, &t.tm_min, &t.tm_sec) != 6)
03667     return;
03668   t.tm_year -= 1900;
03669   t.tm_mon -= 1;
03670   if (mktime(&t) > 0)
03671     timestamp = mktime(&t);
03672 }
03673 
03674 void CLASS parse_exif (int base)
03675 {
03676   unsigned kodak, entries, tag, type, len, save;
03677   double expo;
03678 
03679   kodak = !strncmp(make,"EASTMAN",7);
03680   entries = get2();
03681   while (entries--) {
03682     tiff_get (base, &tag, &type, &len, &save);
03683     switch (tag) {
03684       case 33434:  shutter = getrat();                  break;
03685       case 33437:  aperture = getrat();                 break;
03686       case 34855:  iso_speed = get2();                  break;
03687       case 36867:
03688       case 36868:  get_timestamp(0);                    break;
03689       case 37377:  if ((expo = -getrat()) < 128)
03690                      shutter = pow (2, expo);           break;
03691       case 37378:  aperture = pow (2, getrat()/2);      break;
03692       case 37386:  focal_len = getrat();                break;
03693       case 37500:  parse_makernote (base);              break;
03694       case 40962:  if (kodak) raw_width  = get4();      break;
03695       case 40963:  if (kodak) raw_height = get4();      break;
03696     }
03697     fseek (ifp, save, SEEK_SET);
03698   }
03699 }
03700 
03701 void CLASS parse_mos (int offset)
03702 {
03703   char data[40];
03704   int skip, from, i, c, neut[4], planes=0, frot=0;
03705   static const char *mod[] = { "Aptus","Valeo","Volare" };
03706   static const unsigned bayer[] =
03707         { 0x94949494, 0x61616161, 0x16161616, 0x49494949 };
03708 
03709   fseek (ifp, offset, SEEK_SET);
03710   while (1) {
03711     fread (data, 1, 8, ifp);
03712     if (strcmp(data,"PKTS")) break;
03713     if (!make[0]) strcpy(make,"Leaf");
03714     fread (data, 1, 40, ifp);
03715     skip = get4();
03716     from = ftell(ifp);
03717     if (!strcmp(data,"JPEG_preview_data")) {
03718       thumb_offset = from;
03719       thumb_length = skip;
03720     }
03721     if (!strcmp(data,"icc_camera_profile")) {
03722       profile_offset = from;
03723       profile_length = skip;
03724     }
03725     if (!strcmp(data,"CaptProf_serial_number")) {
03726       fread (data, 1, 40, ifp);
03727       for (i=0; i < sizeof mod / sizeof *mod; i++)
03728         if (data[0] == mod[i][0] && data[1] == toupper(mod[i][1]))
03729           sprintf (model, "%s %d", mod[i], atoi(data+2));
03730     }
03731     if (!strcmp(data,"CaptProf_number_of_planes"))
03732       fscanf (ifp, "%d", &planes);
03733     if (!strcmp(data,"CaptProf_raw_data_rotation"))
03734       fscanf (ifp, "%d", &flip);
03735     if (!strcmp(data,"CaptProf_mosaic_pattern"))
03736       FORC4 {
03737         fscanf (ifp, "%d", &i);
03738         if (i == 1) frot = c ^ (c >> 1);
03739       }
03740     if (!strcmp(data,"ImgProf_rotation_angle")) {
03741       fscanf (ifp, "%d", &i);
03742       flip = i - flip;
03743     }
03744     if (!strcmp(data,"NeutObj_neutrals")) {
03745       FORC4 fscanf (ifp, "%d", neut+c);
03746       FORC3 cam_mul[c] = (float) neut[0] / neut[c+1];
03747     }
03748     parse_mos (from);
03749     fseek (ifp, skip+from, SEEK_SET);
03750   }
03751   if (planes)
03752     filters = (planes == 1) * bayer[(flip/90 + frot) & 3];
03753 }
03754 
03755 int CLASS parse_tiff_ifd (int base, int level)
03756 {
03757   unsigned entries, tag, type, len, plen=16, save;
03758   int ifd, use_cm=0, cfa, i, j, c;
03759   char software[64], *cbuf, *cp;
03760   uchar cfa_pat[16], cfa_pc[] = { 0,1,2,3 }, tab[256];
03761   double dblack, cc[4][4], cm[4][3], cam_xyz[4][3];
03762   double ab[]={ 1,1,1,1 }, asn[] = { 0,0,0,0 }, xyz[] = { 1,1,1 };
03763   unsigned *buf, sony_offset=0, sony_length=0, sony_key=0;
03764   struct jhead jh;
03765   FILE *sfp;
03766 
03767   if (tiff_nifds >= sizeof tiff_ifd / sizeof tiff_ifd[0])
03768     return 1;
03769   ifd = tiff_nifds++;
03770   for (j=0; j < 4; j++)
03771     for (i=0; i < 4; i++)
03772       cc[j][i] = i == j;
03773   entries = get2();
03774   if (entries > 512) return 1;
03775   while (entries--) {
03776     tiff_get (base, &tag, &type, &len, &save);
03777     switch (tag) {
03778       case 17: case 18:
03779         if (type == 3 && len == 1)
03780           cam_mul[(tag-17)*2] = get2() / 256.0;
03781         break;
03782       case 36: case 37: case 38:
03783         cam_mul[tag-0x24] = get2();
03784         break;
03785       case 39:
03786         if (len < 50 || cam_mul[0]) break;
03787         fseek (ifp, 12, SEEK_CUR);
03788         FORC3 cam_mul[c] = get2();
03789         break;
03790       case 2: case 256:                 /* ImageWidth */
03791         tiff_ifd[ifd].width = getint(type);
03792         break;
03793       case 3: case 257:                 /* ImageHeight */
03794         tiff_ifd[ifd].height = getint(type);
03795         break;
03796       case 258:                         /* BitsPerSample */
03797         tiff_ifd[ifd].samples = len;
03798         tiff_ifd[ifd].bps = get2();
03799         break;
03800       case 259:                         /* Compression */
03801         tiff_ifd[ifd].comp = get2();
03802         break;
03803       case 262:                         /* PhotometricInterpretation */
03804         tiff_ifd[ifd].phint = get2();
03805         break;
03806       case 271:                         /* Make */
03807         fgets (make, 64, ifp);
03808         break;
03809       case 272:                         /* Model */
03810         fgets (model, 64, ifp);
03811         break;
03812       case 273:                         /* StripOffset */
03813       case 513:
03814         tiff_ifd[ifd].offset = get4()+base;
03815         if (!tiff_ifd[ifd].width) {
03816           fseek (ifp, tiff_ifd[ifd].offset, SEEK_SET);
03817           if (ljpeg_start (&jh, 1)) {
03818             tiff_ifd[ifd].comp    = 6;
03819             tiff_ifd[ifd].width   = jh.wide << (jh.clrs == 2);
03820             tiff_ifd[ifd].height  = jh.high;
03821             tiff_ifd[ifd].bps     = jh.bits;
03822             tiff_ifd[ifd].samples = jh.clrs;
03823           }
03824         }
03825         break;
03826       case 274:                         /* Orientation */
03827         tiff_ifd[ifd].flip = "50132467"[get2() & 7]-'0';
03828         break;
03829       case 277:                         /* SamplesPerPixel */
03830         tiff_ifd[ifd].samples = getint(type);
03831         break;
03832       case 279:                         /* StripByteCounts */
03833       case 514:
03834         tiff_ifd[ifd].bytes = get4();
03835         break;
03836       case 305:                         /* Software */
03837         fgets (software, 64, ifp);
03838         if (!strncmp(software,"Adobe",5) ||
03839             !strncmp(software,"Bibble",6) ||
03840             !strcmp (software,"Digital Photo Professional"))
03841           is_raw = 0;
03842         break;
03843       case 306:                         /* DateTime */
03844         get_timestamp(0);
03845         break;
03846       case 324:                         /* TileOffsets */
03847         tiff_ifd[ifd].offset = level ? ftell(ifp) : get4();
03848         break;
03849       case 330:                         /* SubIFDs */
03850         while (len--) {
03851           i = ftell(ifp);
03852           fseek (ifp, get4()+base, SEEK_SET);
03853           if (parse_tiff_ifd (base, level+1)) break;
03854           fseek (ifp, i+4, SEEK_SET);
03855         }
03856         break;
03857       case 400:
03858         strcpy (make, "Sarnoff");
03859         maximum = 0xfff;
03860         break;
03861       case 29184: sony_offset = get4();  break;
03862       case 29185: sony_length = get4();  break;
03863       case 29217: sony_key    = get4();  break;
03864       case 29443:
03865         FORC4 cam_mul[c ^ (c < 2)] = get2();
03866         break;
03867       case 33405:                       /* Model2 */
03868         fgets (model2, 64, ifp);
03869         break;
03870       case 33422:                       /* CFAPattern */
03871       case 64777:                       /* Kodak P-series */
03872         if ((plen=len) > 16) plen = 16;
03873         fread (cfa_pat, 1, plen, ifp);
03874         for (colors=cfa=i=0; i < plen; i++) {
03875           colors += !(cfa & (1 << cfa_pat[i]));
03876           cfa |= 1 << cfa_pat[i];
03877         }
03878         if (cfa == 070) memcpy (cfa_pc,"\003\004\005",3);       /* CMY */
03879         if (cfa == 072) memcpy (cfa_pc,"\005\003\004\001",4);   /* GMCY */
03880         goto guess_cfa_pc;
03881       case 33434:                       /* ExposureTime */
03882         shutter = getrat();
03883         break;
03884       case 33437:                       /* FNumber */
03885         aperture = getrat();
03886         break;
03887       case 34310:                       /* Leaf metadata */
03888         parse_mos (ftell(ifp));
03889         break;
03890       case 34665:                       /* EXIF tag */
03891         fseek (ifp, get4()+base, SEEK_SET);
03892         parse_exif (base);
03893         break;
03894       case 34675:                       /* InterColorProfile */
03895       case 50831:                       /* AsShotICCProfile */
03896         profile_offset = ftell(ifp);
03897         profile_length = len;
03898         break;
03899       case 37122:                       /* CompressedBitsPerPixel */
03900         kodak_cbpp = get4();
03901         break;
03902       case 37386:                       /* FocalLength */
03903         focal_len = getrat();
03904         break;
03905       case 37393:                       /* ImageNumber */
03906         shot_order = getint(type);
03907         break;
03908       case 37400:                       /* old Kodak KDC tag */
03909         for (raw_color = i=0; i < 3; i++) {
03910           getrat();
03911           FORC3 rgb_cam[i][c] = getrat();
03912         }
03913         break;
03914       case 46275:                       /* Imacon tags */
03915         strcpy (make, "Imacon");
03916         data_offset = ftell(ifp);
03917         break;
03918       case 46279:
03919         fseek (ifp, 78, SEEK_CUR);
03920         raw_width  = get4();
03921         raw_height = get4();
03922         break;
03923       case 50454:                       /* Sinar tag */
03924       case 50455:
03925         if (!(cbuf = malloc(len))) break;
03926         fread (cbuf, 1, len, ifp);
03927         for (cp = cbuf-1; cp && cp < cbuf+len; cp = strchr(cp,'\n'))
03928           if (!strncmp (++cp,"Neutral ",8))
03929             sscanf (cp+8, "%f %f %f", cam_mul, cam_mul+1, cam_mul+2);
03930         free (cbuf);
03931         break;
03932       case 50706:                       /* DNGVersion */
03933         FORC4 dng_version = (dng_version << 8) + fgetc(ifp);
03934         break;
03935       case 50710:                       /* CFAPlaneColor */
03936         if (len > 4) len = 4;
03937         colors = len;
03938         fread (cfa_pc, 1, colors, ifp);
03939 guess_cfa_pc:
03940         FORCC tab[cfa_pc[c]] = c;
03941         cdesc[c] = 0;
03942         for (i=16; i--; )
03943           filters = filters << 2 | tab[cfa_pat[i % plen]];
03944         break;
03945       case 50711:                       /* CFALayout */
03946         if (get2() == 2) {
03947           fuji_width = 1;
03948           filters = 0x49494949;
03949         }
03950         break;
03951       case 291:
03952       case 2317:
03953       case 50712:                       /* LinearizationTable */
03954         if (len > 0x1000)
03955             len = 0x1000;
03956         read_shorts (curve, len);
03957         for (i=len; i < 0x1000; i++)
03958           curve[i] = curve[i-1];
03959         maximum = curve[0xfff];
03960         break;
03961       case 50714:                       /* BlackLevel */
03962       case 50715:                       /* BlackLevelDeltaH */
03963       case 50716:                       /* BlackLevelDeltaV */
03964         for (dblack=i=0; i < len; i++)
03965           dblack += getreal(type);
03966         black += dblack/len + 0.5;
03967         break;
03968       case 50717:                       /* WhiteLevel */
03969         maximum = getint(type);
03970         break;
03971       case 50718:                       /* DefaultScale */
03972         i  = get4();
03973         j  = get4() * get4();
03974         i *= get4();
03975         if (i > j) xmag = i / j;
03976         else       ymag = j / i;
03977         break;
03978       case 50721:                       /* ColorMatrix1 */
03979       case 50722:                       /* ColorMatrix2 */
03980         FORCC for (j=0; j < 3; j++)
03981           cm[c][j] = getrat();
03982         use_cm = 1;
03983         break;
03984       case 50723:                       /* CameraCalibration1 */
03985       case 50724:                       /* CameraCalibration2 */
03986         for (i=0; i < colors; i++)
03987           FORCC cc[i][c] = getrat();
03988       case 50727:                       /* AnalogBalance */
03989         FORCC ab[c] = getrat();
03990         break;
03991       case 50728:                       /* AsShotNeutral */
03992         FORCC asn[c] = getreal(type);
03993         break;
03994       case 50729:                       /* AsShotWhiteXY */
03995         xyz[0] = getrat();
03996         xyz[1] = getrat();
03997         xyz[2] = 1 - xyz[0] - xyz[1];
03998         FORC3 xyz[c] /= d65_white[c];
03999         break;
04000       case 50740:                       /* DNGPrivateData */
04001         if (dng_version) break;
04002         fseek (ifp, get4()+base, SEEK_SET);
04003         parse_tiff_ifd (base, level+1);
04004         break;
04005       case 50752:
04006         read_shorts (cr2_slice, 3);
04007         break;
04008       case 50829:                       /* ActiveArea */
04009         top_margin = getint(type);
04010         left_margin = getint(type);
04011         height = getint(type) - top_margin;
04012         width = getint(type) - left_margin;
04013         break;
04014       case 64772:                       /* Kodak P-series */
04015         fseek (ifp, 16, SEEK_CUR);
04016         data_offset = get4();
04017         fseek (ifp, 28, SEEK_CUR);
04018         data_offset += get4();
04019         load_raw = packed_12_load_raw;
04020     }
04021     fseek (ifp, save, SEEK_SET);
04022   }
04023   if (sony_length && (buf = malloc(sony_length))) {
04024     fseek (ifp, sony_offset, SEEK_SET);
04025     fread (buf, sony_length, 1, ifp);
04026     sony_decrypt (buf, sony_length/4, 1, sony_key);
04027     sfp = ifp;
04028     if ((ifp = tmpfile())) {
04029       fwrite (buf, sony_length, 1, ifp);
04030       fseek (ifp, 0, SEEK_SET);
04031       parse_tiff_ifd (-sony_offset, level);
04032       fclose (ifp);
04033     }
04034     ifp = sfp;
04035     free (buf);
04036   }
04037   for (i=0; i < colors; i++)
04038     FORCC cc[i][c] *= ab[i];
04039   if (use_cm) {
04040     FORCC for (i=0; i < 3; i++)
04041       for (cam_xyz[c][i]=j=0; j < colors; j++)
04042         cam_xyz[c][i] += cc[c][j] * cm[j][i] * xyz[i];
04043     cam_xyz_coeff (cam_xyz);
04044   }
04045   if (asn[0])
04046     FORCC pre_mul[c] = 1 / asn[c];
04047   if (!use_cm)
04048     FORCC pre_mul[c] /= cc[c][c];
04049   return 0;
04050 }
04051 
04052 void CLASS parse_tiff (int base)
04053 {
04054   int doff, max_samp=0, raw=-1, thm=-1, i;
04055   struct jhead jh;
04056 
04057   fseek (ifp, base, SEEK_SET);
04058   order = get2();
04059   if (order != 0x4949 && order != 0x4d4d) return;
04060   get2();
04061   memset (tiff_ifd, 0, sizeof tiff_ifd);
04062   tiff_nifds = 0;
04063   while ((doff = get4())) {
04064     fseek (ifp, doff+base, SEEK_SET);
04065     if (parse_tiff_ifd (base, 0)) break;
04066   }
04067   if (!dng_version && !strncmp(make,"Kodak",5)) {
04068     fseek (ifp, 12+base, SEEK_SET);
04069     parse_tiff_ifd (base, 2);
04070   }
04071   thumb_misc = 16;
04072   if (thumb_offset) {
04073     fseek (ifp, thumb_offset, SEEK_SET);
04074     if (ljpeg_start (&jh, 1)) {
04075       thumb_misc   = jh.bits;
04076       thumb_width  = jh.wide;
04077       thumb_height = jh.high;
04078     }
04079   }
04080   for (i=0; i < tiff_nifds; i++) {
04081     if (max_samp < tiff_ifd[i].samples)
04082         max_samp = tiff_ifd[i].samples;
04083     if ((tiff_ifd[i].comp != 6 || tiff_ifd[i].samples != 3) &&
04084         tiff_ifd[i].width*tiff_ifd[i].height > raw_width*raw_height) {
04085       raw_width     = tiff_ifd[i].width;
04086       raw_height    = tiff_ifd[i].height;
04087       tiff_bps      = tiff_ifd[i].bps;
04088       tiff_compress = tiff_ifd[i].comp;
04089       data_offset   = tiff_ifd[i].offset;
04090       tiff_flip     = tiff_ifd[i].flip;
04091       tiff_samples  = tiff_ifd[i].samples;
04092       fuji_secondary = tiff_samples == 2;
04093       raw = i;
04094     }
04095   }
04096   fuji_width *= (raw_width+1)/2;
04097   if (tiff_ifd[0].flip) tiff_flip = tiff_ifd[0].flip;
04098   if (raw >= 0) {
04099     if (tiff_compress < 2)
04100       load_raw = tiff_bps > 8 ? unpacked_load_raw : eight_bit_load_raw;
04101     if (tiff_compress/2 == 3)
04102       load_raw = lossless_jpeg_load_raw;
04103     if (tiff_compress == 32773)
04104       load_raw = packed_12_load_raw;
04105     if (tiff_compress == 65000)
04106       switch (tiff_ifd[raw].phint) {
04107         case     2: load_raw = kodak_rgb_load_raw;   filters = 0;  break;
04108         case     6: load_raw = kodak_ycbcr_load_raw; filters = 0;  break;
04109         case 32803: load_raw = kodak_65000_load_raw;
04110       }
04111   }
04112   if (tiff_samples == 3 && tiff_bps == 8)
04113     if (!dng_version) is_raw = 0;
04114   for (i=0; i < tiff_nifds; i++)
04115     if (i != raw && tiff_ifd[i].samples == max_samp &&
04116         tiff_ifd[i].width * tiff_ifd[i].height / SQR(tiff_ifd[i].bps+1) >
04117               thumb_width *       thumb_height / SQR(thumb_misc+1)) {
04118       thumb_width  = tiff_ifd[i].width;
04119       thumb_height = tiff_ifd[i].height;
04120       thumb_offset = tiff_ifd[i].offset;
04121       thumb_length = tiff_ifd[i].bytes;
04122       thumb_misc   = tiff_ifd[i].bps;
04123       thm = i;
04124     }
04125   if (thm >= 0) {
04126     thumb_misc |= tiff_ifd[thm].samples << 5;
04127     switch (tiff_ifd[thm].comp) {
04128       case 0:
04129         write_thumb = layer_thumb;
04130         break;
04131       case 1:
04132         if (tiff_ifd[thm].bps > 8)
04133           thumb_load_raw = kodak_thumb_load_raw;
04134         else
04135           write_thumb = ppm_thumb;
04136         break;
04137       case 65000:
04138         thumb_load_raw = tiff_ifd[thm].phint == 6 ?
04139                 kodak_ycbcr_load_raw : kodak_rgb_load_raw;
04140     }
04141   }
04142 }
04143 
04144 void CLASS parse_minolta()
04145 {
04146   int save, tag, len, offset, high=0, wide=0, i, c;
04147 
04148   fseek (ifp, 4, SEEK_SET);
04149   offset = get4() + 8;
04150   while ((save=ftell(ifp)) < offset) {
04151     tag = get4();
04152     len = get4();
04153     switch (tag) {
04154       case 0x505244:                            /* PRD */
04155         fseek (ifp, 8, SEEK_CUR);
04156         high = get2();
04157         wide = get2();
04158         break;
04159       case 0x574247:                            /* WBG */
04160         get4();
04161         i = strstr(model,"A200") ? 3:0;
04162         FORC4 cam_mul[c ^ (c >> 1) ^ i] = get2();
04163         break;
04164       case 0x545457:                            /* TTW */
04165         parse_tiff (ftell(ifp));
04166     }
04167     fseek (ifp, save+len+8, SEEK_SET);
04168   }
04169   raw_height = high;
04170   raw_width  = wide;
04171   data_offset = offset;
04172 }
04173 
04174 /*