PageRenderTime 75ms CodeModel.GetById 26ms RepoModel.GetById 1ms app.codeStats 2ms

/Dependencies/Source/FreeImage/LibRawLite/internal/dcraw_common.cpp

http://gamekit.googlecode.com/
C++ | 7449 lines | 7024 code | 307 blank | 118 comment | 2370 complexity | cda8664a6c75ec055a3253a2d8f7f911 MD5 | raw file
Possible License(s): BSD-2-Clause, LGPL-2.0, AGPL-3.0, BSD-3-Clause, GPL-2.0, LGPL-3.0, MPL-2.0-no-copyleft-exception, LGPL-2.1, MIT

Large files files are truncated, but you can click here to view the full file

  1. /*
  2. GENERATED FILE, DO NOT EDIT
  3. Generated from dcraw/dcraw.c at Mon May 4 22:14:56 2009
  4. Look into original file (probably http://cybercom.net/~dcoffin/dcraw/dcraw.c)
  5. for copyright information.
  6. */
  7. #line 257 "dcraw/dcraw.c"
  8. #define CLASS LibRaw::
  9. #include "libraw/libraw_types.h"
  10. #define LIBRAW_LIBRARY_BUILD
  11. #define LIBRAW_IO_REDEFINED
  12. #include "libraw/libraw.h"
  13. #include "internal/defines.h"
  14. #include "internal/var_defines.h"
  15. #line 267 "dcraw/dcraw.c"
  16. #ifndef __GLIBC__
  17. char *my_memmem (char *haystack, size_t haystacklen,
  18. char *needle, size_t needlelen)
  19. {
  20. char *c;
  21. for (c = haystack; c <= haystack + haystacklen - needlelen; c++)
  22. if (!memcmp (c, needle, needlelen))
  23. return c;
  24. return 0;
  25. }
  26. #define memmem my_memmem
  27. #endif
  28. #line 301 "dcraw/dcraw.c"
  29. ushort CLASS sget2 (uchar *s)
  30. {
  31. if (order == 0x4949) /* "II" means little-endian */
  32. return s[0] | s[1] << 8;
  33. else /* "MM" means big-endian */
  34. return s[0] << 8 | s[1];
  35. }
  36. ushort CLASS get2()
  37. {
  38. uchar str[2] = { 0xff,0xff };
  39. fread (str, 1, 2, ifp);
  40. return sget2(str);
  41. }
  42. unsigned CLASS sget4 (uchar *s)
  43. {
  44. if (order == 0x4949)
  45. return s[0] | s[1] << 8 | s[2] << 16 | s[3] << 24;
  46. else
  47. return s[0] << 24 | s[1] << 16 | s[2] << 8 | s[3];
  48. }
  49. #define sget4(s) sget4((uchar *)s)
  50. unsigned CLASS get4()
  51. {
  52. uchar str[4] = { 0xff,0xff,0xff,0xff };
  53. fread (str, 1, 4, ifp);
  54. return sget4(str);
  55. }
  56. unsigned CLASS getint (int type)
  57. {
  58. return type == 3 ? get2() : get4();
  59. }
  60. float CLASS int_to_float (int i)
  61. {
  62. union { int i; float f; } u;
  63. u.i = i;
  64. return u.f;
  65. }
  66. double CLASS getreal (int type)
  67. {
  68. union { char c[8]; double d; } u;
  69. int i, rev;
  70. switch (type) {
  71. case 3: return (unsigned short) get2();
  72. case 4: return (unsigned int) get4();
  73. case 5: u.d = (unsigned int) get4();
  74. return u.d / (unsigned int) get4();
  75. case 8: return (signed short) get2();
  76. case 9: return (signed int) get4();
  77. case 10: u.d = (signed int) get4();
  78. return u.d / (signed int) get4();
  79. case 11: return int_to_float (get4());
  80. case 12:
  81. rev = 7 * ((order == 0x4949) == (ntohs(0x1234) == 0x1234));
  82. for (i=0; i < 8; i++)
  83. u.c[i ^ rev] = fgetc(ifp);
  84. return u.d;
  85. default: return fgetc(ifp);
  86. }
  87. }
  88. void CLASS read_shorts (ushort *pixel, int count)
  89. {
  90. if (fread (pixel, 2, count, ifp) < count) derror();
  91. if ((order == 0x4949) == (ntohs(0x1234) == 0x1234))
  92. swab ((char*)pixel, (char*)pixel, count*2);
  93. }
  94. #line 378 "dcraw/dcraw.c"
  95. void CLASS canon_black (double dark[2])
  96. {
  97. int c, diff, row, col;
  98. if (raw_width < width+4) return;
  99. FORC(2) dark[c] /= (raw_width-width-2) * height >> 1;
  100. if ((diff = dark[0] - dark[1]))
  101. for (row=0; row < height; row++)
  102. for (col=1; col < width; col+=2)
  103. BAYER(row,col) += diff;
  104. dark[1] += diff;
  105. black = (dark[0] + dark[1] + 1) / 2;
  106. }
  107. void CLASS canon_600_fixed_wb (int temp)
  108. {
  109. static const short mul[4][5] = {
  110. { 667, 358,397,565,452 },
  111. { 731, 390,367,499,517 },
  112. { 1119, 396,348,448,537 },
  113. { 1399, 485,431,508,688 } };
  114. int lo, hi, i;
  115. float frac=0;
  116. for (lo=4; --lo; )
  117. if (*mul[lo] <= temp) break;
  118. for (hi=0; hi < 3; hi++)
  119. if (*mul[hi] >= temp) break;
  120. if (lo != hi)
  121. frac = (float) (temp - *mul[lo]) / (*mul[hi] - *mul[lo]);
  122. for (i=1; i < 5; i++)
  123. pre_mul[i-1] = 1 / (frac * mul[hi][i] + (1-frac) * mul[lo][i]);
  124. }
  125. /* Return values: 0 = white 1 = near white 2 = not white */
  126. int CLASS canon_600_color (int ratio[2], int mar)
  127. {
  128. int clipped=0, target, miss;
  129. if (flash_used) {
  130. if (ratio[1] < -104)
  131. { ratio[1] = -104; clipped = 1; }
  132. if (ratio[1] > 12)
  133. { ratio[1] = 12; clipped = 1; }
  134. } else {
  135. if (ratio[1] < -264 || ratio[1] > 461) return 2;
  136. if (ratio[1] < -50)
  137. { ratio[1] = -50; clipped = 1; }
  138. if (ratio[1] > 307)
  139. { ratio[1] = 307; clipped = 1; }
  140. }
  141. target = flash_used || ratio[1] < 197
  142. ? -38 - (398 * ratio[1] >> 10)
  143. : -123 + (48 * ratio[1] >> 10);
  144. if (target - mar <= ratio[0] &&
  145. target + 20 >= ratio[0] && !clipped) return 0;
  146. miss = target - ratio[0];
  147. if (abs(miss) >= mar*4) return 2;
  148. if (miss < -20) miss = -20;
  149. if (miss > mar) miss = mar;
  150. ratio[0] = target - miss;
  151. return 1;
  152. }
  153. void CLASS canon_600_auto_wb()
  154. {
  155. int mar, row, col, i, j, st, count[] = { 0,0 };
  156. int test[8], total[2][8], ratio[2][2], stat[2];
  157. memset (&total, 0, sizeof total);
  158. i = canon_ev + 0.5;
  159. if (i < 10) mar = 150;
  160. else if (i > 12) mar = 20;
  161. else mar = 280 - 20 * i;
  162. if (flash_used) mar = 80;
  163. for (row=14; row < height-14; row+=4)
  164. for (col=10; col < width; col+=2) {
  165. for (i=0; i < 8; i++)
  166. test[(i & 4) + FC(row+(i >> 1),col+(i & 1))] =
  167. BAYER(row+(i >> 1),col+(i & 1));
  168. for (i=0; i < 8; i++)
  169. if (test[i] < 150 || test[i] > 1500) goto next;
  170. for (i=0; i < 4; i++)
  171. if (abs(test[i] - test[i+4]) > 50) goto next;
  172. for (i=0; i < 2; i++) {
  173. for (j=0; j < 4; j+=2)
  174. ratio[i][j >> 1] = ((test[i*4+j+1]-test[i*4+j]) << 10) / test[i*4+j];
  175. stat[i] = canon_600_color (ratio[i], mar);
  176. }
  177. if ((st = stat[0] | stat[1]) > 1) goto next;
  178. for (i=0; i < 2; i++)
  179. if (stat[i])
  180. for (j=0; j < 2; j++)
  181. test[i*4+j*2+1] = test[i*4+j*2] * (0x400 + ratio[i][j]) >> 10;
  182. for (i=0; i < 8; i++)
  183. total[st][i] += test[i];
  184. count[st]++;
  185. next: ;
  186. }
  187. if (count[0] | count[1]) {
  188. st = count[0]*200 < count[1];
  189. for (i=0; i < 4; i++)
  190. pre_mul[i] = 1.0 / (total[st][i] + total[st][i+4]);
  191. }
  192. }
  193. void CLASS canon_600_coeff()
  194. {
  195. static const short table[6][12] = {
  196. { -190,702,-1878,2390, 1861,-1349,905,-393, -432,944,2617,-2105 },
  197. { -1203,1715,-1136,1648, 1388,-876,267,245, -1641,2153,3921,-3409 },
  198. { -615,1127,-1563,2075, 1437,-925,509,3, -756,1268,2519,-2007 },
  199. { -190,702,-1886,2398, 2153,-1641,763,-251, -452,964,3040,-2528 },
  200. { -190,702,-1878,2390, 1861,-1349,905,-393, -432,944,2617,-2105 },
  201. { -807,1319,-1785,2297, 1388,-876,769,-257, -230,742,2067,-1555 } };
  202. int t=0, i, c;
  203. float mc, yc;
  204. mc = pre_mul[1] / pre_mul[2];
  205. yc = pre_mul[3] / pre_mul[2];
  206. if (mc > 1 && mc <= 1.28 && yc < 0.8789) t=1;
  207. if (mc > 1.28 && mc <= 2) {
  208. if (yc < 0.8789) t=3;
  209. else if (yc <= 2) t=4;
  210. }
  211. if (flash_used) t=5;
  212. for (raw_color = i=0; i < 3; i++)
  213. FORCC rgb_cam[i][c] = table[t][i*4 + c] / 1024.0;
  214. }
  215. void CLASS canon_600_load_raw()
  216. {
  217. uchar data[1120], *dp;
  218. ushort pixel[896], *pix;
  219. int irow, row, col, val;
  220. static const short mul[4][2] =
  221. { { 1141,1145 }, { 1128,1109 }, { 1178,1149 }, { 1128,1109 } };
  222. for (irow=row=0; irow < height; irow++) {
  223. if (fread (data, 1, raw_width*5/4, ifp) < raw_width*5/4) derror();
  224. for (dp=data, pix=pixel; dp < data+1120; dp+=10, pix+=8) {
  225. pix[0] = (dp[0] << 2) + (dp[1] >> 6 );
  226. pix[1] = (dp[2] << 2) + (dp[1] >> 4 & 3);
  227. pix[2] = (dp[3] << 2) + (dp[1] >> 2 & 3);
  228. pix[3] = (dp[4] << 2) + (dp[1] & 3);
  229. pix[4] = (dp[5] << 2) + (dp[9] & 3);
  230. pix[5] = (dp[6] << 2) + (dp[9] >> 2 & 3);
  231. pix[6] = (dp[7] << 2) + (dp[9] >> 4 & 3);
  232. pix[7] = (dp[8] << 2) + (dp[9] >> 6 );
  233. }
  234. for (col=0; col < width; col++)
  235. BAYER(row,col) = pixel[col];
  236. for (col=width; col < raw_width; col++)
  237. {
  238. black += pixel[col];
  239. }
  240. if ((row+=2) > height) row = 1;
  241. }
  242. if (raw_width > width)
  243. black = black / ((raw_width - width) * height) - 4;
  244. for (row=0; row < height; row++)
  245. for (col=0; col < width; col++) {
  246. if ((val = BAYER(row,col) - black) < 0) val = 0;
  247. val = val * mul[row & 3][col & 1] >> 9;
  248. BAYER(row,col) = val;
  249. }
  250. canon_600_fixed_wb(1311);
  251. canon_600_auto_wb();
  252. canon_600_coeff();
  253. maximum = (0x3ff - black) * 1109 >> 9;
  254. black = 0;
  255. }
  256. void CLASS remove_zeroes()
  257. {
  258. unsigned row, col, tot, n, r, c;
  259. #ifdef LIBRAW_LIBRARY_BUILD
  260. RUN_CALLBACK(LIBRAW_PROGRESS_REMOVE_ZEROES,0,2);
  261. #endif
  262. for (row=0; row < height; row++)
  263. for (col=0; col < width; col++)
  264. if (BAYER(row,col) == 0) {
  265. tot = n = 0;
  266. for (r = row-2; r <= row+2; r++)
  267. for (c = col-2; c <= col+2; c++)
  268. if (r < height && c < width &&
  269. FC(r,c) == FC(row,col) && BAYER(r,c))
  270. tot += (n++,BAYER(r,c));
  271. if (n) BAYER(row,col) = tot/n;
  272. }
  273. #ifdef LIBRAW_LIBRARY_BUILD
  274. RUN_CALLBACK(LIBRAW_PROGRESS_REMOVE_ZEROES,1,2);
  275. #endif
  276. }
  277. int CLASS canon_s2is()
  278. {
  279. unsigned row;
  280. for (row=0; row < 100; row++) {
  281. fseek (ifp, row*3340 + 3284, SEEK_SET);
  282. if (getc(ifp) > 15) return 1;
  283. }
  284. return 0;
  285. }
  286. void CLASS canon_a5_load_raw()
  287. {
  288. ushort data[2565], *dp, pixel;
  289. int vbits=0, buf=0, row, col, bc=0;
  290. order = 0x4949;
  291. for (row=-top_margin; row < raw_height-top_margin; row++) {
  292. read_shorts (dp=data, raw_width * 10 / 16);
  293. for (col=-left_margin; col < raw_width-left_margin; col++) {
  294. if ((vbits -= 10) < 0)
  295. buf = (vbits += 16, (buf << 16) + *dp++);
  296. pixel = buf >> vbits & 0x3ff;
  297. if ((unsigned) row < height && (unsigned) col < width)
  298. BAYER(row,col) = pixel;
  299. else if (col > 1-left_margin && col != width)
  300. black += (bc++,pixel);
  301. }
  302. }
  303. if (bc) black /= bc;
  304. maximum = 0x3ff;
  305. if (raw_width > 1600) remove_zeroes();
  306. }
  307. /*
  308. getbits(-1) initializes the buffer
  309. getbits(n) where 0 <= n <= 25 returns an n-bit integer
  310. */
  311. unsigned CLASS getbits (int nbits)
  312. {
  313. #ifdef LIBRAW_NOTHREADS
  314. static unsigned bitbuf=0;
  315. static int vbits=0, reset=0;
  316. #else
  317. #define bitbuf tls->getbits.bitbuf
  318. #define vbits tls->getbits.vbits
  319. #define reset tls->getbits.reset
  320. #endif
  321. unsigned c;
  322. if (nbits == -1)
  323. return bitbuf = vbits = reset = 0;
  324. if (nbits == 0 || reset) return 0;
  325. while (vbits < nbits) {
  326. if ((c = fgetc(ifp)) == EOF) derror();
  327. if ((reset = zero_after_ff && c == 0xff && fgetc(ifp))) return 0;
  328. bitbuf = (bitbuf << 8) + (uchar) c;
  329. vbits += 8;
  330. }
  331. vbits -= nbits;
  332. return bitbuf << (32-nbits-vbits) >> (32-nbits);
  333. #ifndef LIBRAW_NOTHREADS
  334. #undef bitbuf
  335. #undef vbits
  336. #undef reset
  337. #endif
  338. }
  339. void CLASS init_decoder()
  340. {
  341. memset (first_decode, 0, sizeof first_decode);
  342. free_decode = first_decode;
  343. }
  344. /*
  345. Construct a decode tree according to the specification in *source.
  346. The first 16 bytes specify how many codes should be 1-bit, 2-bit
  347. 3-bit, etc. Bytes after that are the leaf values.
  348. For example, if the source is
  349. { 0,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0,
  350. 0x04,0x03,0x05,0x06,0x02,0x07,0x01,0x08,0x09,0x00,0x0a,0x0b,0xff },
  351. then the code is
  352. 00 0x04
  353. 010 0x03
  354. 011 0x05
  355. 100 0x06
  356. 101 0x02
  357. 1100 0x07
  358. 1101 0x01
  359. 11100 0x08
  360. 11101 0x09
  361. 11110 0x00
  362. 111110 0x0a
  363. 1111110 0x0b
  364. 1111111 0xff
  365. */
  366. uchar * CLASS make_decoder (const uchar *source, int level)
  367. {
  368. struct decode *cur;
  369. #ifndef LIBRAW_NOTHREADS
  370. #define t_leaf tls->make_decoder_leaf
  371. #else
  372. static int t_leaf;
  373. #endif
  374. int i, next;
  375. if (level==0) t_leaf=0;
  376. cur = free_decode++;
  377. if (free_decode > first_decode+2048) {
  378. #ifdef LIBRAW_LIBRARY_BUILD
  379. throw LIBRAW_EXCEPTION_DECODE_RAW;
  380. #else
  381. fprintf (stderr,_("%s: decoder table overflow\n"), ifname);
  382. longjmp (failure, 2);
  383. #endif
  384. }
  385. for (i=next=0; i <= t_leaf && next < 16; )
  386. i += source[next++];
  387. if (i > t_leaf) {
  388. if (level < next) {
  389. cur->branch[0] = free_decode;
  390. make_decoder (source, level+1);
  391. cur->branch[1] = free_decode;
  392. make_decoder (source, level+1);
  393. } else
  394. cur->leaf = source[16 + t_leaf++];
  395. }
  396. return (uchar *) source + 16 + t_leaf;
  397. #ifndef LIBRAW_NOTHREADS
  398. #undef t_leaf
  399. #endif
  400. }
  401. void CLASS crw_init_tables (unsigned table)
  402. {
  403. static const uchar first_tree[3][29] = {
  404. { 0,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0,
  405. 0x04,0x03,0x05,0x06,0x02,0x07,0x01,0x08,0x09,0x00,0x0a,0x0b,0xff },
  406. { 0,2,2,3,1,1,1,1,2,0,0,0,0,0,0,0,
  407. 0x03,0x02,0x04,0x01,0x05,0x00,0x06,0x07,0x09,0x08,0x0a,0x0b,0xff },
  408. { 0,0,6,3,1,1,2,0,0,0,0,0,0,0,0,0,
  409. 0x06,0x05,0x07,0x04,0x08,0x03,0x09,0x02,0x00,0x0a,0x01,0x0b,0xff },
  410. };
  411. static const uchar second_tree[3][180] = {
  412. { 0,2,2,2,1,4,2,1,2,5,1,1,0,0,0,139,
  413. 0x03,0x04,0x02,0x05,0x01,0x06,0x07,0x08,
  414. 0x12,0x13,0x11,0x14,0x09,0x15,0x22,0x00,0x21,0x16,0x0a,0xf0,
  415. 0x23,0x17,0x24,0x31,0x32,0x18,0x19,0x33,0x25,0x41,0x34,0x42,
  416. 0x35,0x51,0x36,0x37,0x38,0x29,0x79,0x26,0x1a,0x39,0x56,0x57,
  417. 0x28,0x27,0x52,0x55,0x58,0x43,0x76,0x59,0x77,0x54,0x61,0xf9,
  418. 0x71,0x78,0x75,0x96,0x97,0x49,0xb7,0x53,0xd7,0x74,0xb6,0x98,
  419. 0x47,0x48,0x95,0x69,0x99,0x91,0xfa,0xb8,0x68,0xb5,0xb9,0xd6,
  420. 0xf7,0xd8,0x67,0x46,0x45,0x94,0x89,0xf8,0x81,0xd5,0xf6,0xb4,
  421. 0x88,0xb1,0x2a,0x44,0x72,0xd9,0x87,0x66,0xd4,0xf5,0x3a,0xa7,
  422. 0x73,0xa9,0xa8,0x86,0x62,0xc7,0x65,0xc8,0xc9,0xa1,0xf4,0xd1,
  423. 0xe9,0x5a,0x92,0x85,0xa6,0xe7,0x93,0xe8,0xc1,0xc6,0x7a,0x64,
  424. 0xe1,0x4a,0x6a,0xe6,0xb3,0xf1,0xd3,0xa5,0x8a,0xb2,0x9a,0xba,
  425. 0x84,0xa4,0x63,0xe5,0xc5,0xf3,0xd2,0xc4,0x82,0xaa,0xda,0xe4,
  426. 0xf2,0xca,0x83,0xa3,0xa2,0xc3,0xea,0xc2,0xe2,0xe3,0xff,0xff },
  427. { 0,2,2,1,4,1,4,1,3,3,1,0,0,0,0,140,
  428. 0x02,0x03,0x01,0x04,0x05,0x12,0x11,0x06,
  429. 0x13,0x07,0x08,0x14,0x22,0x09,0x21,0x00,0x23,0x15,0x31,0x32,
  430. 0x0a,0x16,0xf0,0x24,0x33,0x41,0x42,0x19,0x17,0x25,0x18,0x51,
  431. 0x34,0x43,0x52,0x29,0x35,0x61,0x39,0x71,0x62,0x36,0x53,0x26,
  432. 0x38,0x1a,0x37,0x81,0x27,0x91,0x79,0x55,0x45,0x28,0x72,0x59,
  433. 0xa1,0xb1,0x44,0x69,0x54,0x58,0xd1,0xfa,0x57,0xe1,0xf1,0xb9,
  434. 0x49,0x47,0x63,0x6a,0xf9,0x56,0x46,0xa8,0x2a,0x4a,0x78,0x99,
  435. 0x3a,0x75,0x74,0x86,0x65,0xc1,0x76,0xb6,0x96,0xd6,0x89,0x85,
  436. 0xc9,0xf5,0x95,0xb4,0xc7,0xf7,0x8a,0x97,0xb8,0x73,0xb7,0xd8,
  437. 0xd9,0x87,0xa7,0x7a,0x48,0x82,0x84,0xea,0xf4,0xa6,0xc5,0x5a,
  438. 0x94,0xa4,0xc6,0x92,0xc3,0x68,0xb5,0xc8,0xe4,0xe5,0xe6,0xe9,
  439. 0xa2,0xa3,0xe3,0xc2,0x66,0x67,0x93,0xaa,0xd4,0xd5,0xe7,0xf8,
  440. 0x88,0x9a,0xd7,0x77,0xc4,0x64,0xe2,0x98,0xa5,0xca,0xda,0xe8,
  441. 0xf3,0xf6,0xa9,0xb2,0xb3,0xf2,0xd2,0x83,0xba,0xd3,0xff,0xff },
  442. { 0,0,6,2,1,3,3,2,5,1,2,2,8,10,0,117,
  443. 0x04,0x05,0x03,0x06,0x02,0x07,0x01,0x08,
  444. 0x09,0x12,0x13,0x14,0x11,0x15,0x0a,0x16,0x17,0xf0,0x00,0x22,
  445. 0x21,0x18,0x23,0x19,0x24,0x32,0x31,0x25,0x33,0x38,0x37,0x34,
  446. 0x35,0x36,0x39,0x79,0x57,0x58,0x59,0x28,0x56,0x78,0x27,0x41,
  447. 0x29,0x77,0x26,0x42,0x76,0x99,0x1a,0x55,0x98,0x97,0xf9,0x48,
  448. 0x54,0x96,0x89,0x47,0xb7,0x49,0xfa,0x75,0x68,0xb6,0x67,0x69,
  449. 0xb9,0xb8,0xd8,0x52,0xd7,0x88,0xb5,0x74,0x51,0x46,0xd9,0xf8,
  450. 0x3a,0xd6,0x87,0x45,0x7a,0x95,0xd5,0xf6,0x86,0xb4,0xa9,0x94,
  451. 0x53,0x2a,0xa8,0x43,0xf5,0xf7,0xd4,0x66,0xa7,0x5a,0x44,0x8a,
  452. 0xc9,0xe8,0xc8,0xe7,0x9a,0x6a,0x73,0x4a,0x61,0xc7,0xf4,0xc6,
  453. 0x65,0xe9,0x72,0xe6,0x71,0x91,0x93,0xa6,0xda,0x92,0x85,0x62,
  454. 0xf3,0xc5,0xb2,0xa4,0x84,0xba,0x64,0xa5,0xb3,0xd2,0x81,0xe5,
  455. 0xd3,0xaa,0xc4,0xca,0xf2,0xb1,0xe4,0xd1,0x83,0x63,0xea,0xc3,
  456. 0xe2,0x82,0xf1,0xa3,0xc2,0xa1,0xc1,0xe3,0xa2,0xe1,0xff,0xff }
  457. };
  458. if (table > 2) table = 2;
  459. init_decoder();
  460. make_decoder ( first_tree[table], 0);
  461. second_decode = free_decode;
  462. make_decoder (second_tree[table], 0);
  463. }
  464. /*
  465. Return 0 if the image starts with compressed data,
  466. 1 if it starts with uncompressed low-order bits.
  467. In Canon compressed data, 0xff is always followed by 0x00.
  468. */
  469. int CLASS canon_has_lowbits()
  470. {
  471. uchar test[0x4000];
  472. int ret=1, i;
  473. fseek (ifp, 0, SEEK_SET);
  474. fread (test, 1, sizeof test, ifp);
  475. for (i=540; i < sizeof test - 1; i++)
  476. if (test[i] == 0xff) {
  477. if (test[i+1]) return 1;
  478. ret=0;
  479. }
  480. return ret;
  481. }
  482. void CLASS canon_compressed_load_raw()
  483. {
  484. ushort *pixel, *prow;
  485. int nblocks, lowbits, i, row, r, col, save, val;
  486. unsigned irow, icol;
  487. struct decode *decode, *dindex;
  488. int block, diffbuf[64], leaf, len, diff, carry=0, pnum=0, base[2];
  489. double dark[2] = { 0,0 };
  490. uchar c;
  491. crw_init_tables (tiff_compress);
  492. pixel = (ushort *) calloc (raw_width*8, sizeof *pixel);
  493. merror (pixel, "canon_compressed_load_raw()");
  494. lowbits = canon_has_lowbits();
  495. if (!lowbits) maximum = 0x3ff;
  496. fseek (ifp, 540 + lowbits*raw_height*raw_width/4, SEEK_SET);
  497. zero_after_ff = 1;
  498. getbits(-1);
  499. for (row=0; row < raw_height; row+=8) {
  500. nblocks = MIN (8, raw_height-row) * raw_width >> 6;
  501. for (block=0; block < nblocks; block++) {
  502. memset (diffbuf, 0, sizeof diffbuf);
  503. decode = first_decode;
  504. for (i=0; i < 64; i++ ) {
  505. for (dindex=decode; dindex->branch[0]; )
  506. dindex = dindex->branch[getbits(1)];
  507. leaf = dindex->leaf;
  508. decode = second_decode;
  509. if (leaf == 0 && i) break;
  510. if (leaf == 0xff) continue;
  511. i += leaf >> 4;
  512. len = leaf & 15;
  513. if (len == 0) continue;
  514. diff = getbits(len);
  515. if ((diff & (1 << (len-1))) == 0)
  516. diff -= (1 << len) - 1;
  517. if (i < 64) diffbuf[i] = diff;
  518. }
  519. diffbuf[0] += carry;
  520. carry = diffbuf[0];
  521. for (i=0; i < 64; i++ ) {
  522. if (pnum++ % raw_width == 0)
  523. base[0] = base[1] = 512;
  524. if ((pixel[(block << 6) + i] = base[i & 1] += diffbuf[i]) >> 10)
  525. derror();
  526. }
  527. }
  528. if (lowbits) {
  529. save = ftell(ifp);
  530. fseek (ifp, 26 + row*raw_width/4, SEEK_SET);
  531. for (prow=pixel, i=0; i < raw_width*2; i++) {
  532. c = fgetc(ifp);
  533. for (r=0; r < 8; r+=2, prow++) {
  534. val = (*prow << 2) + ((c >> r) & 3);
  535. if (raw_width == 2672 && val < 512) val += 2;
  536. *prow = val;
  537. }
  538. }
  539. fseek (ifp, save, SEEK_SET);
  540. }
  541. for (r=0; r < 8; r++) {
  542. irow = row - top_margin + r;
  543. if (irow >= height) continue;
  544. for (col=0; col < raw_width; col++) {
  545. icol = col - left_margin;
  546. if (icol < width)
  547. BAYER(irow,icol) = pixel[r*raw_width+col];
  548. else if (col > 1)
  549. dark[icol & 1] += pixel[r*raw_width+col];
  550. }
  551. }
  552. }
  553. free (pixel);
  554. canon_black (dark);
  555. }
  556. #line 885 "dcraw/dcraw.c"
  557. int CLASS ljpeg_start (struct jhead *jh, int info_only)
  558. {
  559. int c, tag, len;
  560. uchar data[0x10000], *dp;
  561. if (!info_only) init_decoder();
  562. memset (jh, 0, sizeof *jh);
  563. FORC(6) jh->huff[c] = free_decode;
  564. jh->restart = INT_MAX;
  565. fread (data, 2, 1, ifp);
  566. if (data[1] != 0xd8) return 0;
  567. do {
  568. fread (data, 2, 2, ifp);
  569. tag = data[0] << 8 | data[1];
  570. len = (data[2] << 8 | data[3]) - 2;
  571. if (tag <= 0xff00) return 0;
  572. fread (data, 1, len, ifp);
  573. switch (tag) {
  574. case 0xffc3:
  575. jh->sraw = ((data[7] >> 4) * (data[7] & 15) - 1) & 3;
  576. case 0xffc0:
  577. jh->bits = data[0];
  578. jh->high = data[1] << 8 | data[2];
  579. jh->wide = data[3] << 8 | data[4];
  580. jh->clrs = data[5] + jh->sraw;
  581. if (len == 9 && !dng_version) getc(ifp);
  582. break;
  583. case 0xffc4:
  584. if (info_only) break;
  585. for (dp = data; dp < data+len && *dp < 4; ) {
  586. jh->huff[*dp] = free_decode;
  587. dp = make_decoder (++dp, 0);
  588. }
  589. break;
  590. case 0xffda:
  591. jh->psv = data[1+data[0]*2];
  592. jh->bits -= data[3+data[0]*2] & 15;
  593. break;
  594. case 0xffdd:
  595. jh->restart = data[0] << 8 | data[1];
  596. }
  597. } while (tag != 0xffda);
  598. if (info_only) return 1;
  599. if (jh->sraw) {
  600. FORC(4) jh->huff[2+c] = jh->huff[1];
  601. FORC(jh->sraw) jh->huff[1+c] = jh->huff[0];
  602. }
  603. jh->row = (ushort *) calloc (jh->wide*jh->clrs, 4);
  604. merror (jh->row, "ljpeg_start()");
  605. return zero_after_ff = 1;
  606. }
  607. int CLASS ljpeg_diff (struct decode *dindex)
  608. {
  609. int len, diff;
  610. while (dindex->branch[0])
  611. dindex = dindex->branch[getbits(1)];
  612. len = dindex->leaf;
  613. if (len == 16 && (!dng_version || dng_version >= 0x1010000))
  614. return -32768;
  615. diff = getbits(len);
  616. if ((diff & (1 << (len-1))) == 0)
  617. diff -= (1 << len) - 1;
  618. return diff;
  619. }
  620. ushort * CLASS ljpeg_row (int jrow, struct jhead *jh)
  621. {
  622. int col, c, diff, pred, spred=0;
  623. ushort mark=0, *row[3];
  624. if (jrow * jh->wide % jh->restart == 0) {
  625. FORC(6) jh->vpred[c] = 1 << (jh->bits-1);
  626. if (jrow)
  627. do mark = (mark << 8) + (c = fgetc(ifp));
  628. while (c != EOF && mark >> 4 != 0xffd);
  629. getbits(-1);
  630. }
  631. FORC3 row[c] = jh->row + jh->wide*jh->clrs*((jrow+c) & 1);
  632. for (col=0; col < jh->wide; col++)
  633. FORC(jh->clrs) {
  634. diff = ljpeg_diff (jh->huff[c]);
  635. if (jh->sraw && c <= jh->sraw && (col | c))
  636. pred = spred;
  637. else if (col) pred = row[0][-jh->clrs];
  638. else pred = (jh->vpred[c] += diff) - diff;
  639. if (jrow && col) switch (jh->psv) {
  640. case 1: break;
  641. case 2: pred = row[1][0]; break;
  642. case 3: pred = row[1][-jh->clrs]; break;
  643. case 4: pred = pred + row[1][0] - row[1][-jh->clrs]; break;
  644. case 5: pred = pred + ((row[1][0] - row[1][-jh->clrs]) >> 1); break;
  645. case 6: pred = row[1][0] + ((pred - row[1][-jh->clrs]) >> 1); break;
  646. case 7: pred = (pred + row[1][0]) >> 1; break;
  647. default: pred = 0;
  648. }
  649. if ((**row = pred + diff) >> jh->bits) derror();
  650. if (c <= jh->sraw) spred = **row;
  651. row[0]++; row[1]++;
  652. }
  653. return row[2];
  654. }
  655. void CLASS lossless_jpeg_load_raw()
  656. {
  657. int jwide, jrow, jcol, val, jidx, i, j, row=0, col=0;
  658. double dark[2] = { 0,0 };
  659. struct jhead jh;
  660. int min=INT_MAX;
  661. ushort *rp;
  662. if (!ljpeg_start (&jh, 0)) return;
  663. jwide = jh.wide * jh.clrs;
  664. for (jrow=0; jrow < jh.high; jrow++) {
  665. rp = ljpeg_row (jrow, &jh);
  666. for (jcol=0; jcol < jwide; jcol++) {
  667. val = *rp++;
  668. if (jh.bits <= 12)
  669. val = curve[val & 0xfff];
  670. if (cr2_slice[0]) {
  671. jidx = jrow*jwide + jcol;
  672. i = jidx / (cr2_slice[1]*jh.high);
  673. if ((j = i >= cr2_slice[0]))
  674. i = cr2_slice[0];
  675. jidx -= i * (cr2_slice[1]*jh.high);
  676. row = jidx / cr2_slice[1+j];
  677. col = jidx % cr2_slice[1+j] + i*cr2_slice[1];
  678. }
  679. if (raw_width == 3984 && (col -= 2) < 0)
  680. col += (row--,raw_width);
  681. if ((unsigned) (row-top_margin) < height) {
  682. if ((unsigned) (col-left_margin) < width) {
  683. BAYER(row-top_margin,col-left_margin) = val;
  684. if (min > val) min = val;
  685. } else if (col > 1)
  686. dark[(col-left_margin) & 1] += val;
  687. }
  688. if (++col >= raw_width)
  689. col = (row++,0);
  690. }
  691. }
  692. free (jh.row);
  693. canon_black (dark);
  694. if (!strcasecmp(make,"KODAK"))
  695. black = min;
  696. }
  697. void CLASS canon_sraw_load_raw()
  698. {
  699. struct jhead jh;
  700. short *rp=0, (*ip)[4];
  701. int jwide, slice, scol, ecol, row, col, jrow=0, jcol=0, pix[3], c;
  702. int v[3]={0,0,0}, ver, hue;
  703. char *cp;
  704. if (!ljpeg_start (&jh, 0)) return;
  705. jwide = (jh.wide >>= 1) * jh.clrs;
  706. for (ecol=slice=0; slice <= cr2_slice[0]; slice++) {
  707. scol = ecol;
  708. ecol += cr2_slice[1] * 2 / jh.clrs;
  709. if (!cr2_slice[0] || ecol > raw_width-1) ecol = raw_width & -2;
  710. for (row=0; row < height; row += (jh.clrs >> 1) - 1) {
  711. ip = (short (*)[4]) image + row*width;
  712. for (col=scol; col < ecol; col+=2, jcol+=jh.clrs) {
  713. if ((jcol %= jwide) == 0)
  714. rp = (short *) ljpeg_row (jrow++, &jh);
  715. if (col >= width) continue;
  716. FORC (jh.clrs-2)
  717. ip[col + (c >> 1)*width + (c & 1)][0] = rp[jcol+c];
  718. ip[col][1] = rp[jcol+jh.clrs-2] - 16384;
  719. ip[col][2] = rp[jcol+jh.clrs-1] - 16384;
  720. }
  721. }
  722. }
  723. for (cp=model2; *cp && !isdigit(*cp); cp++);
  724. sscanf (cp, "%d.%d.%d", v, v+1, v+2);
  725. ver = (v[0]*1000 + v[1])*1000 + v[2];
  726. hue = (jh.sraw+1) << 2;
  727. if (unique_id == 0x80000218 && ver > 1000006 && ver < 3000000)
  728. hue = jh.sraw << 1;
  729. ip = (short (*)[4]) image;
  730. rp = ip[0];
  731. for (row=0; row < height; row++, ip+=width) {
  732. if (row & (jh.sraw >> 1))
  733. for (col=0; col < width; col+=2)
  734. for (c=1; c < 3; c++)
  735. if (row == height-1)
  736. ip[col][c] = ip[col-width][c];
  737. else ip[col][c] = (ip[col-width][c] + ip[col+width][c] + 1) >> 1;
  738. for (col=1; col < width; col+=2)
  739. for (c=1; c < 3; c++)
  740. if (col == width-1)
  741. ip[col][c] = ip[col-1][c];
  742. else ip[col][c] = (ip[col-1][c] + ip[col+1][c] + 1) >> 1;
  743. }
  744. for ( ; rp < ip[0]; rp+=4) {
  745. if (unique_id < 0x80000200) {
  746. pix[0] = rp[0] + rp[2] - 512;
  747. pix[2] = rp[0] + rp[1] - 512;
  748. pix[1] = rp[0] + ((-778*rp[1] - (rp[2] << 11)) >> 12) - 512;
  749. } else {
  750. rp[1] = (rp[1] << 2) + hue;
  751. rp[2] = (rp[2] << 2) + hue;
  752. pix[0] = rp[0] + (( 200*rp[1] + 22929*rp[2]) >> 14);
  753. pix[1] = rp[0] + ((-5640*rp[1] - 11751*rp[2]) >> 14);
  754. pix[2] = rp[0] + ((29040*rp[1] - 101*rp[2]) >> 14);
  755. }
  756. FORC3 rp[c] = CLIP(pix[c] * sraw_mul[c] >> 10);
  757. }
  758. free (jh.row);
  759. maximum = 0x3fff;
  760. }
  761. void CLASS adobe_copy_pixel (int row, int col, ushort **rp)
  762. {
  763. unsigned r, c;
  764. r = row -= top_margin;
  765. c = col -= left_margin;
  766. if (is_raw == 2 && shot_select) (*rp)++;
  767. if (filters) {
  768. if (fuji_width) {
  769. r = row + fuji_width - 1 - (col >> 1);
  770. c = row + ((col+1) >> 1);
  771. }
  772. if (r < height && c < width)
  773. BAYER(r,c) = **rp < 0x1000 ? curve[**rp] : **rp;
  774. *rp += is_raw;
  775. } else {
  776. if (r < height && c < width)
  777. FORC(tiff_samples)
  778. image[row*width+col][c] = (*rp)[c] < 0x1000 ? curve[(*rp)[c]]:(*rp)[c];
  779. *rp += tiff_samples;
  780. }
  781. if (is_raw == 2 && shot_select) (*rp)--;
  782. }
  783. void CLASS adobe_dng_load_raw_lj()
  784. {
  785. unsigned save, trow=0, tcol=0, jwide, jrow, jcol, row, col;
  786. struct jhead jh;
  787. ushort *rp;
  788. while (trow < raw_height) {
  789. save = ftell(ifp);
  790. if (tile_length < INT_MAX)
  791. fseek (ifp, get4(), SEEK_SET);
  792. if (!ljpeg_start (&jh, 0)) break;
  793. jwide = jh.wide;
  794. if (filters) jwide *= jh.clrs;
  795. jwide /= is_raw;
  796. for (row=col=jrow=0; jrow < jh.high; jrow++) {
  797. rp = ljpeg_row (jrow, &jh);
  798. for (jcol=0; jcol < jwide; jcol++) {
  799. adobe_copy_pixel (trow+row, tcol+col, &rp);
  800. if (++col >= tile_width || col >= raw_width)
  801. row += 1 + (col = 0);
  802. }
  803. }
  804. fseek (ifp, save+4, SEEK_SET);
  805. if ((tcol += tile_width) >= raw_width)
  806. trow += tile_length + (tcol = 0);
  807. free (jh.row);
  808. }
  809. }
  810. void CLASS adobe_dng_load_raw_nc()
  811. {
  812. ushort *pixel, *rp;
  813. int row, col;
  814. pixel = (ushort *) calloc (raw_width * tiff_samples, sizeof *pixel);
  815. merror (pixel, "adobe_dng_load_raw_nc()");
  816. for (row=0; row < raw_height; row++) {
  817. if (tiff_bps == 16)
  818. read_shorts (pixel, raw_width * tiff_samples);
  819. else {
  820. getbits(-1);
  821. for (col=0; col < raw_width * tiff_samples; col++)
  822. pixel[col] = getbits(tiff_bps);
  823. }
  824. for (rp=pixel, col=0; col < raw_width; col++)
  825. adobe_copy_pixel (row, col, &rp);
  826. }
  827. free (pixel);
  828. }
  829. void CLASS pentax_tree()
  830. {
  831. ushort bit[2][13];
  832. struct decode *cur;
  833. int c, i, j;
  834. init_decoder();
  835. FORC(13) bit[0][c] = get2();
  836. FORC(13) bit[1][c] = fgetc(ifp) & 15;
  837. FORC(13) {
  838. cur = first_decode;
  839. for (i=0; i < bit[1][c]; i++) {
  840. j = bit[0][c] >> (11-i) & 1;
  841. if (!cur->branch[j]) cur->branch[j] = ++free_decode;
  842. cur = cur->branch[j];
  843. }
  844. cur->leaf = c;
  845. }
  846. }
  847. void CLASS pentax_k10_load_raw()
  848. {
  849. int row, col, diff;
  850. ushort vpred[2][2] = {{0,0},{0,0}}, hpred[2];
  851. getbits(-1);
  852. for (row=0; row < raw_height; row++)
  853. {
  854. if(row >= height) break;
  855. for (col=0; col < raw_width; col++) {
  856. diff = ljpeg_diff (first_decode);
  857. if (col < 2) hpred[col] = vpred[row & 1][col] += diff;
  858. else hpred[col & 1] += diff;
  859. if (col < width && row < height)
  860. BAYER(row,col) = hpred[col & 1];
  861. if (hpred[col & 1] >> 12) derror();
  862. }
  863. }
  864. }
  865. void CLASS nikon_compressed_load_raw()
  866. {
  867. static const uchar nikon_tree[][32] = {
  868. { 0,1,5,1,1,1,1,1,1,2,0,0,0,0,0,0, /* 12-bit lossy */
  869. 5,4,3,6,2,7,1,0,8,9,11,10,12 },
  870. { 0,1,5,1,1,1,1,1,1,2,0,0,0,0,0,0, /* 12-bit lossy after split */
  871. 0x39,0x5a,0x38,0x27,0x16,5,4,3,2,1,0,11,12,12 },
  872. { 0,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0, /* 12-bit lossless */
  873. 5,4,6,3,7,2,8,1,9,0,10,11,12 },
  874. { 0,1,4,3,1,1,1,1,1,2,0,0,0,0,0,0, /* 14-bit lossy */
  875. 5,6,4,7,8,3,9,2,1,0,10,11,12,13,14 },
  876. { 0,1,5,1,1,1,1,1,1,1,2,0,0,0,0,0, /* 14-bit lossy after split */
  877. 8,0x5c,0x4b,0x3a,0x29,7,6,5,4,3,2,1,0,13,14 },
  878. { 0,1,4,2,2,3,1,2,0,0,0,0,0,0,0,0, /* 14-bit lossless */
  879. 7,6,8,5,9,4,10,3,11,12,2,0,1,13,14 } };
  880. struct decode *dindex;
  881. ushort ver0, ver1, vpred[2][2], hpred[2], csize;
  882. int i, min, max, step=0, huff=0, split=0, row, col, len, shl, diff;
  883. fseek (ifp, meta_offset, SEEK_SET);
  884. ver0 = fgetc(ifp);
  885. ver1 = fgetc(ifp);
  886. if (ver0 == 0x49 || ver1 == 0x58)
  887. fseek (ifp, 2110, SEEK_CUR);
  888. if (ver0 == 0x46) huff = 2;
  889. if (tiff_bps == 14) huff += 3;
  890. read_shorts (vpred[0], 4);
  891. max = 1 << tiff_bps & 0x7fff;
  892. if ((csize = get2()) > 1)
  893. step = max / (csize-1);
  894. if (ver0 == 0x44 && ver1 == 0x20 && step > 0) {
  895. for (i=0; i < csize; i++)
  896. curve[i*step] = get2();
  897. for (i=0; i < max; i++)
  898. curve[i] = ( curve[i-i%step]*(step-i%step) +
  899. curve[i-i%step+step]*(i%step) ) / step;
  900. fseek (ifp, meta_offset+562, SEEK_SET);
  901. split = get2();
  902. } else if (ver0 != 0x46 && csize <= 0x4001)
  903. {
  904. read_shorts (curve, max=csize);
  905. }
  906. while (curve[max-2] == curve[max-1]) max--;
  907. init_decoder();
  908. make_decoder (nikon_tree[huff], 0);
  909. fseek (ifp, data_offset, SEEK_SET);
  910. getbits(-1);
  911. for (min=row=0; row < height; row++) {
  912. if (split && row == split) {
  913. init_decoder();
  914. make_decoder (nikon_tree[huff+1], 0);
  915. max += (min = 16) << 1;
  916. }
  917. for (col=0; col < raw_width; col++) {
  918. for (dindex=first_decode; dindex->branch[0]; )
  919. dindex = dindex->branch[getbits(1)];
  920. len = dindex->leaf & 15;
  921. shl = dindex->leaf >> 4;
  922. diff = ((getbits(len-shl) << 1) + 1) << shl >> 1;
  923. if ((diff & (1 << (len-1))) == 0)
  924. diff -= (1 << len) - !shl;
  925. if (col < 2) hpred[col] = vpred[row & 1][col] += diff;
  926. else hpred[col & 1] += diff;
  927. if ((ushort)(hpred[col & 1] + min) >= max) derror();
  928. if ((unsigned) (col-left_margin) < width)
  929. BAYER(row,col-left_margin) = curve[LIM((short)hpred[col & 1],0,0x3fff)];
  930. }
  931. }
  932. }
  933. /*
  934. Figure out if a NEF file is compressed. These fancy heuristics
  935. are only needed for the D100, thanks to a bug in some cameras
  936. that tags all images as "compressed".
  937. */
  938. int CLASS nikon_is_compressed()
  939. {
  940. uchar test[256];
  941. int i;
  942. fseek (ifp, data_offset, SEEK_SET);
  943. fread (test, 1, 256, ifp);
  944. for (i=15; i < 256; i+=16)
  945. if (test[i]) return 1;
  946. return 0;
  947. }
  948. /*
  949. Returns 1 for a Coolpix 995, 0 for anything else.
  950. */
  951. int CLASS nikon_e995()
  952. {
  953. int i, histo[256];
  954. const uchar often[] = { 0x00, 0x55, 0xaa, 0xff };
  955. memset (histo, 0, sizeof histo);
  956. fseek (ifp, -2000, SEEK_END);
  957. for (i=0; i < 2000; i++)
  958. histo[fgetc(ifp)]++;
  959. for (i=0; i < 4; i++)
  960. if (histo[often[i]] < 200)
  961. return 0;
  962. return 1;
  963. }
  964. /*
  965. Returns 1 for a Coolpix 2100, 0 for anything else.
  966. */
  967. int CLASS nikon_e2100()
  968. {
  969. uchar t[12];
  970. int i;
  971. fseek (ifp, 0, SEEK_SET);
  972. for (i=0; i < 1024; i++) {
  973. fread (t, 1, 12, ifp);
  974. if (((t[2] & t[4] & t[7] & t[9]) >> 4
  975. & t[1] & t[6] & t[8] & t[11] & 3) != 3)
  976. return 0;
  977. }
  978. return 1;
  979. }
  980. void CLASS nikon_3700()
  981. {
  982. int bits, i;
  983. uchar dp[24];
  984. static const struct {
  985. int bits;
  986. char t_make[12], t_model[15];
  987. } table[] = {
  988. { 0x00, "PENTAX", "Optio 33WR" },
  989. { 0x03, "NIKON", "E3200" },
  990. { 0x32, "NIKON", "E3700" },
  991. { 0x33, "OLYMPUS", "C740UZ" } };
  992. fseek (ifp, 3072, SEEK_SET);
  993. fread (dp, 1, 24, ifp);
  994. bits = (dp[8] & 3) << 4 | (dp[20] & 3);
  995. for (i=0; i < sizeof table / sizeof *table; i++)
  996. if (bits == table[i].bits) {
  997. strcpy (make, table[i].t_make );
  998. strcpy (model, table[i].t_model);
  999. }
  1000. }
  1001. /*
  1002. Separates a Minolta DiMAGE Z2 from a Nikon E4300.
  1003. */
  1004. int CLASS minolta_z2()
  1005. {
  1006. int i, nz;
  1007. char tail[424];
  1008. fseek (ifp, -sizeof tail, SEEK_END);
  1009. fread (tail, 1, sizeof tail, ifp);
  1010. for (nz=i=0; i < sizeof tail; i++)
  1011. if (tail[i]) nz++;
  1012. return nz > 20;
  1013. }
  1014. /* Here raw_width is in bytes, not pixels. */
  1015. void CLASS nikon_e900_load_raw()
  1016. {
  1017. int offset=0, irow, row, col;
  1018. for (irow=0; irow < height; irow++) {
  1019. row = irow * 2 % height;
  1020. if (row == 1)
  1021. offset = - (-offset & -4096);
  1022. fseek (ifp, offset, SEEK_SET);
  1023. offset += raw_width;
  1024. getbits(-1);
  1025. for (col=0; col < width; col++)
  1026. BAYER(row,col) = getbits(10);
  1027. }
  1028. }
  1029. /*
  1030. The Fuji Super CCD is just a Bayer grid rotated 45 degrees.
  1031. */
  1032. void CLASS fuji_load_raw()
  1033. {
  1034. ushort *pixel;
  1035. int wide, row, col, r, c;
  1036. fseek (ifp, (top_margin*raw_width + left_margin) * 2, SEEK_CUR);
  1037. wide = fuji_width << !fuji_layout;
  1038. pixel = (ushort *) calloc (wide, sizeof *pixel);
  1039. merror (pixel, "fuji_load_raw()");
  1040. for (row=0; row < raw_height; row++) {
  1041. read_shorts (pixel, wide);
  1042. fseek (ifp, 2*(raw_width - wide), SEEK_CUR);
  1043. for (col=0; col < wide; col++) {
  1044. if (fuji_layout) {
  1045. r = fuji_width - 1 - col + (row >> 1);
  1046. c = col + ((row+1) >> 1);
  1047. } else {
  1048. r = fuji_width - 1 + row - (col >> 1);
  1049. c = row + ((col+1) >> 1);
  1050. }
  1051. BAYER(r,c) = pixel[col];
  1052. }
  1053. }
  1054. free (pixel);
  1055. }
  1056. #line 1427 "dcraw/dcraw.c"
  1057. void CLASS ppm_thumb (FILE *tfp)
  1058. {
  1059. char *thumb;
  1060. thumb_length = thumb_width*thumb_height*3;
  1061. thumb = (char *) malloc (thumb_length);
  1062. merror (thumb, "ppm_thumb()");
  1063. fprintf (tfp, "P6\n%d %d\n255\n", thumb_width, thumb_height);
  1064. fread (thumb, 1, thumb_length, ifp);
  1065. fwrite (thumb, 1, thumb_length, tfp);
  1066. free (thumb);
  1067. }
  1068. void CLASS layer_thumb (FILE *tfp)
  1069. {
  1070. int i, c;
  1071. char *thumb, map[][4] = { "012","102" };
  1072. colors = thumb_misc >> 5 & 7;
  1073. thumb_length = thumb_width*thumb_height;
  1074. thumb = (char *) calloc (colors, thumb_length);
  1075. merror (thumb, "layer_thumb()");
  1076. fprintf (tfp, "P%d\n%d %d\n255\n",
  1077. 5 + (colors >> 1), thumb_width, thumb_height);
  1078. fread (thumb, thumb_length, colors, ifp);
  1079. for (i=0; i < thumb_length; i++)
  1080. FORCC putc (thumb[i+thumb_length*(map[thumb_misc >> 8][c]-'0')], tfp);
  1081. free (thumb);
  1082. }
  1083. void CLASS rollei_thumb (FILE *tfp)
  1084. {
  1085. unsigned i;
  1086. ushort *thumb;
  1087. thumb_length = thumb_width * thumb_height;
  1088. thumb = (ushort *) calloc (thumb_length, 2);
  1089. merror (thumb, "rollei_thumb()");
  1090. fprintf (tfp, "P6\n%d %d\n255\n", thumb_width, thumb_height);
  1091. read_shorts (thumb, thumb_length);
  1092. for (i=0; i < thumb_length; i++) {
  1093. putc (thumb[i] << 3, tfp);
  1094. putc (thumb[i] >> 5 << 2, tfp);
  1095. putc (thumb[i] >> 11 << 3, tfp);
  1096. }
  1097. free (thumb);
  1098. }
  1099. void CLASS rollei_load_raw()
  1100. {
  1101. uchar pixel[10];
  1102. unsigned iten=0, isix, i, buffer=0, row, col, todo[16];
  1103. isix = raw_width * raw_height * 5 / 8;
  1104. while (fread (pixel, 1, 10, ifp) == 10) {
  1105. for (i=0; i < 10; i+=2) {
  1106. todo[i] = iten++;
  1107. todo[i+1] = pixel[i] << 8 | pixel[i+1];
  1108. buffer = pixel[i] >> 2 | buffer << 6;
  1109. }
  1110. for ( ; i < 16; i+=2) {
  1111. todo[i] = isix++;
  1112. todo[i+1] = buffer >> (14-i)*5;
  1113. }
  1114. for (i=0; i < 16; i+=2) {
  1115. row = todo[i] / raw_width - top_margin;
  1116. col = todo[i] % raw_width - left_margin;
  1117. if (row < height && col < width)
  1118. BAYER(row,col) = (todo[i+1] & 0x3ff);
  1119. }
  1120. }
  1121. maximum = 0x3ff;
  1122. }
  1123. int CLASS bayer (unsigned row, unsigned col)
  1124. {
  1125. return (row < height && col < width) ? BAYER(row,col) : 0;
  1126. }
  1127. void CLASS phase_one_flat_field (int is_float, int nc)
  1128. {
  1129. ushort head[8];
  1130. unsigned wide, y, x, c, rend, cend, row, col;
  1131. float *mrow, num, mult[4];
  1132. read_shorts (head, 8);
  1133. wide = head[2] / head[4];
  1134. mrow = (float *) calloc (nc*wide, sizeof *mrow);
  1135. merror (mrow, "phase_one_flat_field()");
  1136. for (y=0; y < head[3] / head[5]; y++) {
  1137. for (x=0; x < wide; x++)
  1138. for (c=0; c < nc; c+=2) {
  1139. num = is_float ? getreal(11) : get2()/32768.0;
  1140. if (y==0) mrow[c*wide+x] = num;
  1141. else mrow[(c+1)*wide+x] = (num - mrow[c*wide+x]) / head[5];
  1142. }
  1143. if (y==0) continue;
  1144. rend = head[1]-top_margin + y*head[5];
  1145. for (row = rend-head[5]; row < height && row < rend; row++) {
  1146. for (x=1; x < wide; x++) {
  1147. for (c=0; c < nc; c+=2) {
  1148. mult[c] = mrow[c*wide+x-1];
  1149. mult[c+1] = (mrow[c*wide+x] - mult[c]) / head[4];
  1150. }
  1151. cend = head[0]-left_margin + x*head[4];
  1152. for (col = cend-head[4]; col < width && col < cend; col++) {
  1153. c = nc > 2 ? FC(row,col) : 0;
  1154. if (!(c & 1)) {
  1155. c = BAYER(row,col) * mult[c];
  1156. BAYER(row,col) = LIM(c,0,65535);
  1157. }
  1158. for (c=0; c < nc; c+=2)
  1159. mult[c] += mult[c+1];
  1160. }
  1161. }
  1162. for (x=0; x < wide; x++)
  1163. for (c=0; c < nc; c+=2)
  1164. mrow[c*wide+x] += mrow[(c+1)*wide+x];
  1165. }
  1166. }
  1167. free (mrow);
  1168. }
  1169. void CLASS phase_one_correct()
  1170. {
  1171. unsigned entries, tag, data, save, col, row, type;
  1172. int len, i, j, k, cip, val[4], dev[4], sum, max;
  1173. int head[9], diff, mindiff=INT_MAX, off_412=0;
  1174. static const signed char dir[12][2] =
  1175. { {-1,-1}, {-1,1}, {1,-1}, {1,1}, {-2,0}, {0,-2}, {0,2}, {2,0},
  1176. {-2,-2}, {-2,2}, {2,-2}, {2,2} };
  1177. float poly[8], num, cfrac, frac, mult[2], *yval[2];
  1178. ushort t_curve[0x10000], *xval[2];
  1179. if (half_size || !meta_length) return;
  1180. #ifdef DCRAW_VERBOSE
  1181. if (verbose) fprintf (stderr,_("Phase One correction...\n"));
  1182. #endif
  1183. fseek (ifp, meta_offset, SEEK_SET);
  1184. order = get2();
  1185. fseek (ifp, 6, SEEK_CUR);
  1186. fseek (ifp, meta_offset+get4(), SEEK_SET);
  1187. entries = get4(); get4();
  1188. while (entries--) {
  1189. tag = get4();
  1190. len = get4();
  1191. data = get4();
  1192. save = ftell(ifp);
  1193. fseek (ifp, meta_offset+data, SEEK_SET);
  1194. if (tag == 0x419) { /* Polynomial curve */
  1195. for (get4(), i=0; i < 8; i++)
  1196. poly[i] = getreal(11);
  1197. poly[3] += (ph1.tag_210 - poly[7]) * poly[6] + 1;
  1198. for (i=0; i < 0x10000; i++) {
  1199. num = (poly[5]*i + poly[3])*i + poly[1];
  1200. t_curve[i] = LIM(num,0,65535);
  1201. } goto apply; /* apply to right half */
  1202. } else if (tag == 0x41a) { /* Polynomial curve */
  1203. for (i=0; i < 4; i++)
  1204. poly[i] = getreal(11);
  1205. for (i=0; i < 0x10000; i++) {
  1206. for (num=0, j=4; j--; )
  1207. num = num * i + poly[j];
  1208. t_curve[i] = LIM(num+i,0,65535);
  1209. } apply: /* apply to whole image */
  1210. for (row=0; row < height; row++)
  1211. for (col = (tag & 1)*ph1.split_col; col < width; col++)
  1212. BAYER(row,col) = t_curve[BAYER(row,col)];
  1213. } else if (tag == 0x400) { /* Sensor defects */
  1214. while ((len -= 8) >= 0) {
  1215. col = get2() - left_margin;
  1216. row = get2() - top_margin;
  1217. type = get2(); get2();
  1218. if (col >= width) continue;
  1219. if (type == 131) /* Bad column */
  1220. for (row=0; row < height; row++)
  1221. if (FC(row,col) == 1) {
  1222. for (sum=i=0; i < 4; i++)
  1223. sum += val[i] = bayer (row+dir[i][0], col+dir[i][1]);
  1224. for (max=i=0; i < 4; i++) {
  1225. dev[i] = abs((val[i] << 2) - sum);
  1226. if (dev[max] < dev[i]) max = i;
  1227. }
  1228. BAYER(row,col) = (sum - val[max])/3.0 + 0.5;
  1229. } else {
  1230. for (sum=0, i=8; i < 12; i++)
  1231. sum += bayer (row+dir[i][0], col+dir[i][1]);
  1232. BAYER(row,col) = 0.5 + sum * 0.0732233 +
  1233. (bayer(row,col-2) + bayer(row,col+2)) * 0.3535534;
  1234. }
  1235. else if (type == 129) { /* Bad pixel */
  1236. if (row >= height) continue;
  1237. j = (FC(row,col) != 1) * 4;
  1238. for (sum=0, i=j; i < j+8; i++)
  1239. sum += bayer (row+dir[i][0], col+dir[i][1]);
  1240. BAYER(row,col) = (sum + 4) >> 3;
  1241. }
  1242. }
  1243. } else if (tag == 0x401) { /* All-color flat fields */
  1244. phase_one_flat_field (1, 2);
  1245. } else if (tag == 0x416 || tag == 0x410) {
  1246. phase_one_flat_field (0, 2);
  1247. } else if (tag == 0x40b) { /* Red+blue flat field */
  1248. phase_one_flat_field (0, 4);
  1249. } else if (tag == 0x412) {
  1250. fseek (ifp, 36, SEEK_CUR);
  1251. diff = abs (get2() - ph1.tag_21a);
  1252. if (mindiff > diff) {
  1253. mindiff = diff;
  1254. off_412 = ftell(ifp) - 38;
  1255. }
  1256. }
  1257. fseek (ifp, save, SEEK_SET);
  1258. }
  1259. if (off_412) {
  1260. fseek (ifp, off_412, SEEK_SET);
  1261. for (i=0; i < 9; i++) head[i] = get4() & 0x7fff;
  1262. yval[0] = (float *) calloc (head[1]*head[3] + head[2]*head[4], 6);
  1263. merror (yval[0], "phase_one_correct()");
  1264. yval[1] = (float *) (yval[0] + head[1]*head[3]);
  1265. xval[0] = (ushort *) (yval[1] + head[2]*head[4]);
  1266. xval[1] = (ushort *) (xval[0] + head[1]*head[3]);
  1267. get2();
  1268. for (i=0; i < 2; i++)
  1269. for (j=0; j < head[i+1]*head[i+3]; j++)
  1270. yval[i][j] = getreal(11);
  1271. for (i=0; i < 2; i++)
  1272. for (j=0; j < head[i+1]*head[i+3]; j++)
  1273. xval[i][j] = get2();
  1274. for (row=0; row < height; row++)
  1275. for (col=0; col < width; col++) {
  1276. cfrac = (float) col * head[3] / raw_width;
  1277. cfrac -= cip = cfrac;
  1278. num = BAYER(row,col) * 0.5;
  1279. for (i=cip; i < cip+2; i++) {
  1280. for (k=j=0; j < head[1]; j++)
  1281. if (num < xval[0][k = head[1]*i+j]) break;
  1282. frac = (j == 0 || j == head[1]) ? 0 :
  1283. (xval[0][k] - num) / (xval[0][k] - xval[0][k-1]);
  1284. mult[i-cip] = yval[0][k-1] * frac + yval[0][k] * (1-frac);
  1285. }
  1286. i = ((mult[0] * (1-cfrac) + mult[1] * cfrac)
  1287. * (row + top_margin) + num) * 2;
  1288. BAYER(row,col) = LIM(i,0,65535);
  1289. }
  1290. free (yval[0]);
  1291. }
  1292. }
  1293. void CLASS phase_one_load_raw()
  1294. {
  1295. int row, col, a, b;
  1296. ushort *pixel, akey, bkey, mask;
  1297. fseek (ifp, ph1.key_off, SEEK_SET);
  1298. akey = get2();
  1299. bkey = get2();
  1300. mask = ph1.format == 1 ? 0x5555:0x1354;
  1301. fseek (ifp, data_offset + top_margin*raw_width*2, SEEK_SET);
  1302. pixel = (ushort *) calloc (raw_width, sizeof *pixel);
  1303. merror (pixel, "phase_one_load_raw()");
  1304. for (row=0; row < height; row++) {
  1305. read_shorts (pixel, raw_width);
  1306. for (col=0; col < raw_width; col+=2) {
  1307. a = pixel[col+0] ^ akey;
  1308. b = pixel[col+1] ^ bkey;
  1309. pixel[col+0] = (a & mask) | (b & ~mask);
  1310. pixel[col+1] = (b & mask) | (a & ~mask);
  1311. }
  1312. for (col=0; col < width; col++)
  1313. BAYER(row,col) = pixel[col+left_margin];
  1314. }
  1315. free (pixel);
  1316. phase_one_correct();
  1317. }
  1318. unsigned CLASS ph1_bits (int nbits)
  1319. {
  1320. #ifndef LIBRAW_NOTHREADS
  1321. #define bitbuf tls->ph1_bits.bitbuf
  1322. #define vbits tls->ph1_bits.vbits
  1323. #else
  1324. static UINT64 bitbuf=0;
  1325. static int vbits=0;
  1326. #endif
  1327. if (nbits == -1)
  1328. return bitbuf = vbits = 0;
  1329. if (nbits == 0) return 0;
  1330. if ((vbits -= nbits) < 0) {
  1331. bitbuf = bitbuf << 32 | get4();
  1332. vbits += 32;
  1333. }
  1334. return bitbuf << (64-nbits-vbits) >> (64-nbits);
  1335. #ifndef LIBRAW_NOTHREADS
  1336. #undef bitbuf
  1337. #undef vbits
  1338. #endif
  1339. }
  1340. void CLASS phase_one_load_raw_c()
  1341. {
  1342. static const int length[] = { 8,7,6,9,11,10,5,12,14,13 };
  1343. int *offset, len[2], pred[2], row, col, i, j;
  1344. ushort *pixel;
  1345. short (*t_black)[2];
  1346. pixel = (ushort *) calloc (raw_width + raw_height*4, 2);
  1347. merror (pixel, "phase_one_load_raw_c()");
  1348. offset = (int *) (pixel + raw_width);
  1349. fseek (ifp, strip_offset, SEEK_SET);
  1350. for (row=0; row < raw_height; row++)
  1351. offset[row] = get4();
  1352. t_black = (short (*)[2]) offset + raw_height;
  1353. fseek (ifp, ph1.black_off, SEEK_SET);
  1354. if (ph1.black_off)
  1355. read_shorts ((ushort *) t_black[0], raw_height*2);
  1356. for (i=0; i < 256; i++)
  1357. curve[i] = i*i / 3.969 + 0.5;
  1358. for (row=0; row < raw_height; row++) {
  1359. fseek (ifp, data_offset + offset[row], SEEK_SET);
  1360. ph1_bits(-1);
  1361. pred[0] = pred[1] = 0;
  1362. for (col=0; col < raw_width; col++) {
  1363. if (col >= (raw_width & -8))
  1364. len[0] = len[1] = 14;
  1365. else if ((col & 7) == 0)
  1366. for (i=0; i < 2; i++) {
  1367. for (j=0; j < 5 && !ph1_bits(1); j++);
  1368. if (j--) len[i] = length[j*2 + ph1_bits(1)];
  1369. }
  1370. if ((i = len[col & 1]) == 14)
  1371. pixel[col] = pred[col & 1] = ph1_bits(16);
  1372. else
  1373. pixel[col] = pred[col & 1] += ph1_bits(i) + 1 - (1 << (i - 1));
  1374. if (pred[col & 1] >> 16) derror();
  1375. if (ph1.format == 5 && pixel[col] < 256)
  1376. pixel[col] = curve[pixel[col]];
  1377. }
  1378. if ((unsigned) (row-top_margin) < height)
  1379. for (col=0; col < width; col++) {
  1380. i = (pixel[col+left_margin] << 2)
  1381. - ph1.t_black + t_black[row][col >= ph1.split_col];
  1382. if (i > 0) BAYER(row-top_margin,col) = i;
  1383. }
  1384. }
  1385. free (pixel);
  1386. phase_one_correct();
  1387. maximum = 0xfffc - ph1.t_black;
  1388. }
  1389. void CLASS hasselblad_load_raw()
  1390. {
  1391. struct jhead jh;
  1392. struct decode *dindex;
  1393. int row, col, pred[2], len[2], diff, i;
  1394. if (!ljpeg_start (&jh, 0)) return;
  1395. free (jh.row);
  1396. order = 0x4949;
  1397. ph1_bits(-1);
  1398. for (row=-top_margin; row < raw_height-top_margin; row++) {
  1399. pred[0] = pred[1] = 0x8000;
  1400. for (col=-left_margin; col < raw_width-left_margin; col+=2) {
  1401. for (i=0; i < 2; i++) {
  1402. for (dindex=jh.huff[0]; dindex->branch[0]; )
  1403. dindex = dindex->branch[ph1_bits(1)];
  1404. len[i] = dindex->leaf;
  1405. }
  1406. for (i=0; i < 2; i++) {
  1407. diff = ph1_bits(len[i]);
  1408. if ((diff & (1 << (len[i]-1))) == 0)
  1409. diff -= (1 << len[i]) - 1;
  1410. if (diff == 65535) diff = -32768;
  1411. pred[i] += diff;
  1412. if (row >= 0 && row < height && (unsigned)(col+i) < width)
  1413. BAYER(row,col+i) = pred[i];
  1414. }
  1415. }
  1416. }
  1417. maximum = 0xffff;
  1418. }
  1419. void CLASS leaf_hdr_load_raw()
  1420. {
  1421. ushort *pixel;
  1422. unsigned tile=0, r, c, row, col;
  1423. pixel = (ushort *) calloc (raw_width, sizeof *pixel);
  1424. merror (pixel, "leaf_hdr_load_raw()");
  1425. FORC(tiff_samples)
  1426. for (r=0; r < raw_height; r++) {
  1427. if (r % tile_length == 0) {
  1428. fseek (ifp, data_offset + 4*tile++, SEEK_SET);
  1429. fseek (ifp, get4() + 2*left_margin, SEEK_SET);
  1430. }
  1431. if (filters && c != shot_select) continue;
  1432. read_shorts (pixel, raw_width);
  1433. if ((row = r - top_margin) >= height) continue;
  1434. for (col=0; col < width; col++)
  1435. if (filters) BAYER(row,col) = pixel[col];
  1436. else image[row*width+col][c] = pixel[col];
  1437. }
  1438. free (pixel);
  1439. if (!filters) {
  1440. maximum = 0xffff;
  1441. raw_color = 1;
  1442. }
  1443. }
  1444. #line 1839 "dcraw/dcraw.c"
  1445. void CLASS sinar_4shot_load_raw()
  1446. {
  1447. ushort *pixel;
  1448. unsigned shot, row, col, r, c;
  1449. if ((shot = shot_select) || half_size) {
  1450. if (shot) shot--;
  1451. if (shot > 3) shot = 3;
  1452. fseek (ifp, data_offset + shot*4, SEEK_SET);
  1453. fseek (ifp, get4(), SEEK_SET);
  1454. unpacked_load_raw();
  1455. return;
  1456. }
  1457. free (image);
  1458. image = (ushort (*)[4])
  1459. calloc ((iheight=height)*(iwidth=width), sizeof *image);
  1460. merror (image, "sinar_4shot_load_raw()");
  1461. pixel = (ushort *) calloc (raw_width, sizeof *pixel);
  1462. merror (pixel, "sinar_4shot_load_raw()");
  1463. for (shot=0; shot < 4; shot++) {
  1464. fseek (ifp, data_offset + shot*4, SEEK_SET);
  1465. fseek (ifp, get4(), SEEK_SET);
  1466. for (row=0; row < raw_height; row++) {
  1467. read_shorts (pixel, raw_width);
  1468. if ((r = row-top_margin - (shot >> 1 & 1)) >= height) continue;
  1469. for (col=0; col < raw_width; col++) {
  1470. if ((c = col-left_margin - (shot & 1)) >= width) continue;
  1471. image[r*width+c][FC(row,col)] = pixel[col];
  1472. }
  1473. }
  1474. }
  1475. free (pixel);
  1476. shrink = filters = 0;
  1477. }
  1478. void CLASS imacon_full_load_raw()
  1479. {
  1480. int row, col;
  1481. for (row=0; row < height; row++)
  1482. for (col=0; col < width; col++)
  1483. read_shorts (image[row*width+col], 3);
  1484. }
  1485. void CLASS packed_12_load_raw()
  1486. {
  1487. int vbits=0, rbits=0, irow, row, col;
  1488. UINT64 bitbuf=0;
  1489. if (raw_width * 2 >= width * 3) { /* If raw_width is in bytes, */
  1490. rbits = raw_width * 8;
  1491. raw_width = raw_width * 2 / 3; /* convert it to pixels and */
  1492. rbits -= raw_width * 12; /* save the remainder. */
  1493. }
  1494. order = load_flags & 1 ? 0x4949 : 0x4d4d;
  1495. for (irow=0; irow < height; irow++) {
  1496. row = irow;
  1497. if (load_flags & 2 &&
  1498. (row = irow * 2 % height + irow / (height/2)) == 1 &&
  1499. load_flags & 4) {
  1500. if (vbits=0, tiff_compress)
  1501. fseek (ifp, data_offset - (-width*height*3/4 & -2048), SEEK_SET);
  1502. else {
  1503. fseek (ifp, 0, SEEK_END);
  1504. fseek (ifp, ftell(ifp)/2, SEEK_SET);
  1505. }
  1506. }
  1507. for (col=0; col < raw_width; col++) {
  1508. if ((vbits -= 12) < 0) {
  1509. bitbuf = bitbuf << 32 | get4();
  1510. vbits += 32;
  1511. }
  1512. if ((unsigned) (col-left_margin) < width)
  1513. BAYER(row,col-left_margin) = bitbuf << (52-vbits) >> 52;
  1514. if (load_flags & 8 && (col % 10) == 9)
  1515. if (vbits=0, bitbuf & 255) derror();
  1516. }
  1517. vbits -= rbits;
  1518. }
  1519. if (!strcmp(make,"OLYMPUS")) black >>= 4;
  1520. }
  1521. void CLASS unpacked_load_raw()
  1522. {
  1523. ushort *pixel;
  1524. int row, col, bits=0;
  1525. while (1 << ++bits < maximum);
  1526. fseek (ifp, (top_margin*raw_width + left_margin) * 2, SEEK_CUR);
  1527. pixel = (ushort *) calloc (width, sizeof *pixel);
  1528. merror (pixel, "unpacked_load_raw()");
  1529. for (row=0; row < height; row++) {
  1530. read_shorts (pixel, width);
  1531. fseek (ifp, 2*(raw_width - width), SEEK_CUR);
  1532. for (col=0; col < width; col++)
  1533. if ((BAYER2(row,col) = pixel[col]) >> bits) derror();
  1534. }
  1535. free (pixel);
  1536. }
  1537. void CLASS nokia_load_raw()
  1538. {
  1539. uchar *data, *dp;
  1540. ushort *pixel, *pix;
  1541. int dwide, row, c;
  1542. dwide = raw_width * 5 / 4;
  1543. data = (uchar *) malloc (dwide + raw_width*2);
  1544. merror (data, "nokia_load_raw()");
  1545. pixel = (ushort *) (data + dwide);
  1546. for (row=0; row < raw_height; row++) {
  1547. if (fread (data, 1, dwide, ifp) < dwide) derror();
  1548. for (dp=data, pix=pixel; pix < pixel+raw_width; dp+=5, pix+=4)
  1549. FORC4 pix[c] = (dp[c] << 2) | (dp[4] >> (c << 1) & 3);
  1550. if (row < top_margin)
  1551. FORC(width) black += pixel[c];
  1552. else
  1553. FORC(width) BAYER(row-top_margin,c) = pixel[c];
  1554. }
  1555. free (data);
  1556. if (top_margin) black /= top_margin * width;
  1557. maximum = 0x3ff;
  1558. }
  1559. unsigned CLASS pana_bits (int nbits)
  1560. {
  1561. #ifndef LIBRAW_NOTHREADS
  1562. #define buf tls->pana_bits.buf
  1563. #define vbits tls->pana_bits.vbits
  1564. #else
  1565. static uchar buf[0x4000];
  1566. static int vbits;
  1567. #endif
  1568. int byte;
  1569. if (!nbits) return vbits=0;
  1570. if (!vbits) {
  1571. fread (buf+load_flags, 1, 0x4000-load_flags,

Large files files are truncated, but you can click here to view the full file