From: Niels K. B. J. <nk...@us...> - 2015-04-11 04:00:23
|
Update of /cvsroot/ufraw/ufraw In directory sfp-cvs-1.v30.ch3.sourceforge.com:/tmp/cvs-serv21910 Modified Files: dcraw.cc Log Message: dcraw modified 9.25 (1.475). Changelog: Updated color matrices, support the Canon EOS 5DS. Use typecasts instead of [0] to flatten multi-dimensional arrays. Index: dcraw.cc =================================================================== RCS file: /cvsroot/ufraw/ufraw/dcraw.cc,v retrieving revision 1.331 retrieving revision 1.332 diff -u -d -r1.331 -r1.332 --- dcraw.cc 26 Feb 2015 03:30:12 -0000 1.331 +++ dcraw.cc 11 Apr 2015 04:00:20 -0000 1.332 @@ -22,7 +22,7 @@ #include "uf_progress.h" } -#define DCRAW_VERSION "9.24" +#define DCRAW_VERSION "9.25" #ifndef _GNU_SOURCE #define _GNU_SOURCE @@ -1064,10 +1064,10 @@ val = curve[*rp++]; if (cr2_slice[0]) { jidx = jrow*jwide + jcol; - i = jidx / (cr2_slice[1]*jh.high); + i = jidx / (cr2_slice[1]*raw_height); if ((j = i >= cr2_slice[0])) i = cr2_slice[0]; - jidx -= i * (cr2_slice[1]*jh.high); + jidx -= i * (cr2_slice[1]*raw_height); row = jidx / cr2_slice[1+j]; col = jidx % cr2_slice[1+j] + i*cr2_slice[1]; } @@ -1643,7 +1643,7 @@ for (qr = 0; qr < 2; qr++) for (qc = 0; qc < 2; qc++) for (i = 0; i < 16; i++) - lc[qr][qc][i] = (ushort)get4(); + lc[qr][qc][i] = get4(); for (i = 0; i < 16; i++) { int v = 0; for (qr = 0; qr < 2; qr++) @@ -1653,15 +1653,15 @@ } for (qr = 0; qr < 2; qr++) { for (qc = 0; qc < 2; qc++) { - int cx[18], cf[18]; + int cx[19], cf[19]; for (i = 0; i < 16; i++) { cx[1+i] = lc[qr][qc][i]; cf[1+i] = ref[i]; } cx[0] = cf[0] = 0; - cx[17] = cf[17] = ((unsigned int)ref[15] * 65535) / lc[qr][qc][15]; - cubic_spline(cx, cf, 18); - + cx[17] = cf[17] = ((unsigned) ref[15] * 65535) / lc[qr][qc][15]; + cx[18] = cf[18] = 65535; + cubic_spline(cx, cf, 19); for (row = (qr ? ph1.split_row : 0); (int) row < (qr ? raw_height : ph1.split_row); row++) for (col = (qc ? ph1.split_col : 0); @@ -1690,17 +1690,17 @@ ushort lc[2][2][7], ref[7]; int qr, qc; for (i = 0; i < 7; i++) - ref[i] = (ushort)get4(); + ref[i] = get4(); for (qr = 0; qr < 2; qr++) for (qc = 0; qc < 2; qc++) for (i = 0; i < 7; i++) - lc[qr][qc][i] = (ushort)get4(); + lc[qr][qc][i] = get4(); for (qr = 0; qr < 2; qr++) { for (qc = 0; qc < 2; qc++) { int cx[9], cf[9]; for (i = 0; i < 7; i++) { cx[1+i] = ref[i]; - cf[1+i] = ((unsigned int)ref[i] * lc[qr][qc][i]) / 10000; + cf[1+i] = ((unsigned) ref[i] * lc[qr][qc][i]) / 10000; } cx[0] = cf[0] = 0; cx[8] = cf[8] = 65535; @@ -2280,7 +2280,7 @@ 2,-26, 2,-13, 2,1, 3,-39, 4,16, 5,-55, 6,-76, 6,37 }; ushort huff[19][256]; - int row, col, tree, nreps, rep, step, i, j, k, c, s, r, x, y, val; + int row, col, tree, nreps, rep, step, i, c, s, r, x, y, val; short last[3] = { 16,16,16 }, mul[3], buf[3][3][386]; static const ushort pt[] = { 0,0, 1280,1344, 2320,3616, 3328,8000, 4095,16383, 65535,16383 }; @@ -2291,14 +2291,12 @@ (c-pt[i-2]) / (pt[i]-pt[i-2]) * (pt[i+1]-pt[i-1]) + pt[i-1] + 0.5; for (s=i=0; i < (int) sizeof src; i+=2) FORC(256 >> src[i]) - huff[0][s++] = src[i] << 8 | (uchar) src[i+1]; + ((ushort *)huff)[s++] = src[i] << 8 | (uchar) src[i+1]; s = kodak_cbpp == 243 ? 2 : 3; FORC(256) huff[18][c] = (8-s) << 8 | c >> s << s | 1 << (s-1); getbits(-1); - for (i=0; i < 3; i++) - for (j=0; j < 3; j++) - for (k=0; k < 386; k++) - buf[i][j][k] = 2048; + for (i=0; i < (int) sizeof(buf)/(int) sizeof(short); i++) + ((short *)buf)[i] = 2048; for (row=0; row < height; row+=4) { FORC3 mul[c] = getbits(6); FORC3 { @@ -2306,9 +2304,8 @@ s = val > 65564 ? 10:12; x = ~(-1 << (s-1)); val <<= 12-s; - for (i=0; i < 3; i++) - for (j=0; j < 386; j++) - buf[c][i][j] = (buf[c][i][j] * val + x) >> s; + for (i=0; i < (int) sizeof(buf[0])/(int) sizeof(short); i++) + ((short *)buf[c])[i] = (((short *)buf[c])[i] * val + x) >> s; last[c] = mul[c]; for (r=0; r <= !c; r++) { buf[c][1][width/2] = buf[c][2][width/2] = mul[c] << 7; @@ -2759,14 +2756,14 @@ key = get4(); fseek (ifp, 164600, SEEK_SET); fread (head, 1, 40, ifp); - sony_decrypt ((unsigned int *) head, 10, 1, key); + sony_decrypt ((unsigned *) head, 10, 1, key); for (i=26; i-- > 22; ) key = key << 8 | head[i]; fseek (ifp, data_offset, SEEK_SET); for (row=0; row < raw_height; row++) { pixel = raw_image + row*raw_width; if (fread (pixel, 2, raw_width, ifp) < raw_width) derror(); - sony_decrypt ((unsigned int *) pixel, raw_width/2, !row, key); + sony_decrypt ((unsigned *) pixel, raw_width/2, !row, key); for (col=0; col < raw_width; col++) if ((pixel[col] = ntohs(pixel[col])) >> 14) derror(); } @@ -2891,8 +2888,7 @@ fseek (ifp, (data_offset-ftell(ifp)) & 15, SEEK_CUR); ph1_bits(-1); mag = 0; pmode = 7; - for (i=0; i<3; i++) - FORC(2) lent[i][c] = row < 2 ? 7:4; + FORC(6) ((ushort *)lent)[c] = row < 2 ? 7:4; prow[ row & 1] = &RAW(row-1,1-((row & 1) << 1)); // green prow[~row & 1] = &RAW(row-2,0); // red and blue for (tab=0; tab+15 < raw_width; tab+=16) { @@ -3057,10 +3053,10 @@ fseek (ifp, 67, SEEK_SET); offset = get4(); - nseg = fgetc(ifp); + nseg = (uchar) fgetc(ifp); fseek (ifp, offset, SEEK_SET); for (i=0; i < nseg*2; i++) - seg[0][i] = get4() + data_offset*(i & 1); + ((unsigned *)seg)[i] = get4() + data_offset*(i & 1); fseek (ifp, 78, SEEK_SET); holes = fgetc(ifp); fseek (ifp, 88, SEEK_SET); @@ -3571,8 +3567,8 @@ black = (float (*)[3]) calloc (height, sizeof *black); for (row=0; row < height; row++) { for (i=0; i < 6; i++) - ddft[0][0][i] = ddft[1][0][i] + - row / (height-1.0) * (ddft[2][0][i] - ddft[1][0][i]); + ((float *)ddft[0])[i] = ((float *)ddft[1])[i] + + row / (height-1.0) * (((float *)ddft[2])[i] - ((float *)ddft[1])[i]); FORC3 black[row][c] = ( foveon_avg (image[row*width]+c, dscr[0], cfilt) + foveon_avg (image[row*width]+c, dscr[1], cfilt) * 3 @@ -3617,8 +3613,8 @@ for (row=0; row < height; row++) { for (i=0; i < 6; i++) - ddft[0][0][i] = ddft[1][0][i] + - row / (height-1.0) * (ddft[2][0][i] - ddft[1][0][i]); + ((float *)ddft[0])[i] = ((float *)ddft[1])[i] + + row / (height-1.0) * (((float *)ddft[2])[i] - ((float *)ddft[1])[i]); pix = image[row*width]; memcpy (prev, pix, sizeof prev); frow = row / (height-1.0) * (dim[2]-1); @@ -3659,7 +3655,7 @@ #endif if (foveon_camf_param ("IncludeBlocks", "BadPixels")) { - badpix = (unsigned int *) foveon_camf_matrix (dim, "BadPixels"); + badpix = (unsigned *) foveon_camf_matrix (dim, "BadPixels"); for (i=0; i < (int) dim[0]; i++) { col = (badpix[i] >> 8 & 0xfff) - keep[0]; row = (badpix[i] >> 20 ) - keep[1]; @@ -3980,8 +3976,8 @@ for (row=0; row < height; row++) { for (i=0; i < 3; i++) for (j=0; j < 2; j++) - ddft[0][i][j] = ddft[1][i][j] + - row / (height-1.0) * (ddft[2][i][j] - ddft[1][i][j]); + ((float *)ddft[0])[i] = ((float *)ddft[1])[i] + + row / (height-1.0) * (((float *)ddft[2])[i] - ((float *)ddft[1])[i]); FORC3 black[row][c] = ( foveon_avg (image[row*width]+c, dscr[0], cfilt) + foveon_avg (image[row*width]+c, dscr[1], cfilt) * 3 @@ -4027,8 +4023,8 @@ for (row=0; row < height; row++) { for (i=0; i < 3; i++) for (j=0; j < 2; j++) - ddft[0][i][j] = ddft[1][i][j] + - row / (height-1.0) * (ddft[2][i][j] - ddft[1][i][j]); + ((float *)ddft[0])[i] = ((float *)ddft[1])[i] + + row / (height-1.0) * (((float *)ddft[2])[i] - ((float *)ddft[1])[i]); pix = image[row*width]; memcpy (prev, pix, sizeof prev); frow = row / (height-1.0) * (dim[2]-1); @@ -4067,7 +4063,7 @@ free (sgrow); free (sgain); - if ((badpix = (unsigned int *) foveon_camf_matrix (dim, "BadPixels"))) { + if ((badpix = (unsigned *) foveon_camf_matrix (dim, "BadPixels"))) { for (i=0; i < (int) dim[0]; i++) { col = (badpix[i] >> 8 & 0xfff) - keep[0]; row = (badpix[i] >> 20 ) - keep[1]; @@ -4807,13 +4803,13 @@ } size = iheight*iwidth; for (i=0; i < size*4; i++) { - if (!(val = image[0][i])) continue; + if (!(val = ((ushort *)image)[i])) continue; if (cblack[4] && cblack[5]) val -= cblack[6 + i/4 / iwidth % cblack[4] * cblack[5] + i/4 % iwidth % cblack[5]]; val -= cblack[i & 3]; val *= scale_mul[i & 3]; - image[0][i] = CLIP(val); + ((ushort *)image)[i] = CLIP(val); } if ((aber[0] != 1 || aber[2] != 1) && colors == 3) { dcraw_message (DCRAW_VERBOSE,_("Correcting chromatic aberration...\n")); @@ -6118,7 +6114,7 @@ { "","DCB2","Volare","Cantare","CMost","Valeo 6","Valeo 11","Valeo 22", "Valeo 11p","Valeo 17","","Aptus 17","Aptus 22","Aptus 75","Aptus 65", "Aptus 54S","Aptus 65S","Aptus 75S","AFi 5","AFi 6","AFi 7", - "Aptus-II 7","","","Aptus-II 6","","","Aptus-II 10","Aptus-II 5", + "AFi-II 7","Aptus-II 7","","Aptus-II 6","","","Aptus-II 10","Aptus-II 5", "","","","","Aptus-II 10R","Aptus-II 8","","Aptus-II 12","","AFi-II 12" }; float romm_cam[3][3]; @@ -6144,12 +6140,12 @@ } if (!strcmp(data,"icc_camera_to_tone_matrix")) { for (i=0; i < 9; i++) - romm_cam[0][i] = int_to_float(get4()); + ((float *)romm_cam)[i] = int_to_float(get4()); romm_coeff (romm_cam); } if (!strcmp(data,"CaptProf_color_matrix")) { for (i=0; i < 9; i++) - fscanf (ifp, "%f", &romm_cam[0][i]); + fscanf (ifp, "%f", (float *)romm_cam + i); romm_coeff (romm_cam); } if (!strcmp(data,"CaptProf_number_of_planes")) @@ -6337,6 +6333,10 @@ tiff_ifd[ifd].samples = jh.clrs; if (!(jh.sraw || (jh.clrs & 1))) tiff_ifd[ifd].width *= jh.clrs; + if ((tiff_ifd[ifd].width > 4*tiff_ifd[ifd].height) & ~jh.clrs) { + tiff_ifd[ifd].width /= 2; + tiff_ifd[ifd].height *= 2; + } i = order; parse_tiff (tiff_ifd[ifd].offset + 12); order = i; @@ -6436,8 +6436,7 @@ break; case 33422: /* CFAPattern */ if (filters == 9) { - for (i=0; i < 6; i++) - FORC(6) xtrans[i][c] = fgetc(ifp) & 3; + FORC(36) ((char *)xtrans)[c] = fgetc(ifp) & 3; break; } case 64777: /* Kodak P-series */ @@ -6676,7 +6675,7 @@ break; case 50830: /* MaskedAreas */ for (i=0; i < len && i < 32; i++) - mask[0][i] = getint(type); + ((int *)mask)[i] = getint(type); black = 0; break; case 51009: /* OpcodeList2 */ @@ -7185,7 +7184,7 @@ void CLASS parse_phase_one (int base) { - unsigned entries, tag, len, data, save, i, j, c; + unsigned entries, tag, len, data, save, i, c; float romm_cam[3][3]; char *cp; @@ -7206,9 +7205,8 @@ switch (tag) { case 0x100: flip = "0653"[data & 3]-'0'; break; case 0x106: - for (i=0; i < 3; i++) - for (j=0; j < 3; j++) - romm_cam[i][j] = getreal(11); + for (i=0; i < 9; i++) + ((float *)romm_cam)[i] = getreal(11); romm_coeff (romm_cam); break; case 0x107: @@ -7564,7 +7562,7 @@ off += pent*8 + 24; if ((unsigned) pent > 256) pent=256; for (i=0; i < pent*2; i++) - poff[0][i] = off + get4()*2; + ((int *)poff)[i] = off + get4()*2; for (i=0; i < pent; i++) { foveon_gets (poff[i][0], name, 64); foveon_gets (poff[i][1], value, 64); @@ -7616,6 +7614,8 @@ { 9805,-2689,-1312,-5803,13064,3068,-2438,3075,8775 } }, { "Canon EOS D60", 0, 0xfa0, { 6188,-1341,-890,-7168,14489,2937,-2640,3228,8483 } }, + { "Canon EOS 5DS", 0, 0x3c96, /* DJC */ + { 6885,-753,-856,-4416,11752,2665,-1266,2393,5468 } }, { "Canon EOS 5D Mark III", 0, 0x3c80, { 6722,-635,-963,-4287,12460,2028,-908,2162,5668 } }, { "Canon EOS 5D Mark II", 0, 0x3cf0, @@ -7880,6 +7880,8 @@ { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, { "Fujifilm X-A1", 0, 0, { 11086,-4555,-839,-3512,11310,2517,-815,1341,5940 } }, + { "Fujifilm X-A2", 0, 0, + { 10763,-4560,-917,-3346,11311,2322,-475,1135,5843 } }, { "Fujifilm X-E1", 0, 0, { 10413,-3996,-993,-3721,11640,2361,-733,1540,6011 } }, { "Fujifilm X-E2", 0, 0, @@ -7892,7 +7894,7 @@ { 8458,-2451,-855,-4597,12447,2407,-1475,2482,6526 } }, { "Fujifilm XF1", 0, 0, { 13509,-6199,-1254,-4430,12733,1865,-331,1441,5022 } }, - { "Fujifilm XQ1", 0, 0, + { "Fujifilm XQ", 0, 0, // XQ1 and XQ2 { 9252,-2704,-1064,-5893,14265,1717,-1101,2341,4349 } }, { "Imacon Ixpress", 0, 0, /* DJC */ { 7025,-1415,-704,-5188,13765,1424,-1248,2742,6038 } }, @@ -8032,8 +8034,8 @@ { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } }, { "Nikon D5300", 0, 0, { 6988,-1384,-714,-5631,13410,2447,-1485,2204,7318 } }, - { "Nikon D5500", 0, 0, /* DJC */ - { 5765,-2176,184,-3736,9072,4664,-1028,2213,9259 } }, + { "Nikon D5500", 0, 0, + { 8821,-2938,-785,-4178,12142,2287,-824,1651,6860 } }, { "Nikon D50", 0, 0, { 7732,-2422,-789,-8238,15884,2498,-859,783,7330 } }, { "Nikon D600", 0, 0x3e07, @@ -8046,6 +8048,8 @@ { 8198,-2239,-724,-4871,12389,2798,-1043,2050,7181 } }, { "Nikon D7100", 0, 0, { 8322,-3112,-1047,-6367,14342,2179,-988,1638,6394 } }, + { "Nikon D7200", 0, 0, /* DJC */ + { 6111,-2759,-358,-5108,10766,4343,-769,1691,8030 } }, { "Nikon D750", 0, 0, { 9020,-2890,-715,-4535,12436,2348,-934,1919,7086 } }, { "Nikon D700", 0, 0, @@ -8110,6 +8114,8 @@ { 5958,-1559,-571,-4021,11453,2939,-634,1548,5087 } }, { "Nikon 1 J4", 0, 0, { 5958,-1559,-571,-4021,11453,2939,-634,1548,5087 } }, + { "Nikon 1 J5", 0, 0, /* DJC */ + { 2621,-856,500,-4471,8761,5711,-1321,2644,11945 } }, { "Nikon 1 S2", 200, 0, { 6612,-1342,-618,-3338,11055,2623,-174,1792,5075 } }, { "Nikon 1 V2", 0, 0, @@ -8194,8 +8200,8 @@ { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, { "Olympus E-M1", 0, 0, { 7687,-1984,-606,-4327,11928,2721,-1381,2339,6452 } }, - { "Olympus E-M5MarkII", 0, 0, /* DJC */ - { 6617,-2589,139,-2917,8499,4419,-884,1913,6829 } }, + { "Olympus E-M5MarkII", 0, 0, + { 9422,-3258,-711,-2655,10898,2015,-512,1354,5512 } }, { "Olympus E-M5", 0, 0xfe1, { 8380,-2630,-639,-2887,10725,2496,-627,1427,5438 } }, { "Olympus SP350", 0, 0, @@ -8358,8 +8364,8 @@ { 8228,-2945,-660,-3938,11792,2430,-1094,2278,5793 } }, { "Panasonic DMC-GF6", 15, 0, { 8130,-2801,-946,-3520,11289,2552,-1314,2511,5791 } }, - { "Panasonic DMC-GF7", 15, 0, /* DJC */ - { 6086,-2691,-18,-4207,9767,4441,-1486,2640,7441 } }, + { "Panasonic DMC-GF7", 15, 0, + { 7610,-2780,-576,-4614,12195,2733,-1375,2393,6490 } }, { "Panasonic DMC-GH1", 15, 0xf92, { 6299,-1466,-532,-6535,13852,2969,-2331,3112,5984 } }, { "Panasonic DMC-GH2", 15, 0xf95, @@ -8380,6 +8386,10 @@ { 8607,-2822,-808,-3755,11930,2049,-820,2060,5224 } }, { "Panasonic DMC-ZS4", 15, 0, { 8607,-2822,-808,-3755,11930,2049,-820,2060,5224 } }, + { "Panasonic DMC-TZ7", 15, 0, + { 8802,-3135,-789,-3151,11468,1904,-550,1745,4810 } }, + { "Panasonic DMC-ZS5", 15, 0, + { 8802,-3135,-789,-3151,11468,1904,-550,1745,4810 } }, { "Phase One H 20", 0, 0, /* DJC */ { 1313,1855,-109,-6715,15908,808,-327,1840,6020 } }, { "Phase One H 25", 0, 0, @@ -8420,9 +8430,11 @@ { 10332,-3234,-1168,-6111,14639,1520,-1352,2647,8331 } }, { "Samsung NX10", 0, 0, /* also NX100 */ { 10332,-3234,-1168,-6111,14639,1520,-1352,2647,8331 } }, + { "Samsung NX500", 0, 0, /* DJC */ + { 10196,-4532,-272,-3888,11489,2400,-1203,2424,9173 } }, { "Samsung NX5", 0, 0, { 10332,-3234,-1168,-6111,14639,1520,-1352,2647,8331 } }, - { "Samsung NX1", 128, 0, + { "Samsung NX1", 0, 0, { 10686,-4042,-1052,-3595,13238,276,-464,1259,5931 } }, { "Samsung WB2000", 0, 0xfff, { 12093,-3557,-1155,-1000,9534,1733,-22,1787,4576 } }, @@ -8533,7 +8545,7 @@ }; double cam_xyz[4][3]; char name[130]; - unsigned i, j, k; + unsigned i, j; sprintf (name, "%s %s", make, model); for (i=0; i < sizeof table / sizeof *table; i++) @@ -8541,9 +8553,8 @@ if (table[i].black) black = (ushort) table[i].black; if (table[i].maximum) maximum = (ushort) table[i].maximum; if (table[i].trans[0]) { - for (j=0; j < 4; j++) - for (k=0; k < 3; k++) - cam_xyz[j][k] = table[i].trans[3*j+k] / 10000.0; + for (raw_color = j=0; j < 12; j++) + ((double *)cam_xyz)[j] = table[i].trans[j] / 10000.0; cam_xyz_coeff (rgb_cam, cam_xyz); } break; @@ -8686,6 +8697,7 @@ { 5712, 3774, 62, 20, 10, 2 }, { 5792, 3804, 158, 51, 0, 0 }, { 5920, 3950, 122, 80, 2, 0 }, + { 8896, 5920, 160, 64, 0, 0 }, }; static const struct { ushort id; @@ -9175,7 +9187,10 @@ case 3344: width -= 66; case 3872: width -= 6; } - if (height > width) SWAP(height,width); + if (height > width) { + SWAP(height,width); + SWAP(raw_height,raw_width); + } filters = 0; tiff_samples = colors = 3; load_raw = &CLASS canon_sraw_load_raw; @@ -9362,9 +9377,8 @@ } if (fuji_layout) raw_width *= is_raw; if (filters == 9) - for (i=0; i < 6; i++) - FORC(6) xtrans[i][c] = - xtrans_abs[(i+top_margin) % 6][(c+left_margin) % 6]; + FORC(36) ((char *)xtrans)[c] = + xtrans_abs[(c/6+top_margin) % 6][(c+left_margin) % 6]; } else if (!strcmp(model,"KD-400Z")) { height = 1712; width = 2312; @@ -9435,6 +9449,7 @@ filters = 0x49494949; } else if (!strcmp(make,"Samsung") && raw_width == 6496) { filters = 0x61616161; + black = 1 << (tiff_bps - 7); } else if (!strcmp(model,"EX1")) { order = 0x4949; height -= 20; |