[Jdlraw-discussion] jdlRaw/Sources jdlAdobeTable.h, 1.4, 1.5 jdlDcRaw.cpp, 1.19, 1.20 jdlDcRaw.h, 1
Status: Beta
Brought to you by:
jdla
|
From: Jos De L. <jd...@us...> - 2010-06-01 20:39:05
|
Update of /cvsroot/jdlraw/jdlRaw/Sources In directory sfp-cvsdas-3.v30.ch3.sourceforge.com:/tmp/cvs-serv6145/Sources Modified Files: jdlAdobeTable.h jdlDcRaw.cpp jdlDcRaw.h jdlDefines.h jdlExposure.cpp Log Message: *) Synced with latest dcraw (V9.01) Index: jdlDefines.h =================================================================== RCS file: /cvsroot/jdlraw/jdlRaw/Sources/jdlDefines.h,v retrieving revision 1.10 retrieving revision 1.11 diff -C2 -d -r1.10 -r1.11 *** jdlDefines.h 27 Feb 2010 19:02:41 -0000 1.10 --- jdlDefines.h 1 Jun 2010 20:38:57 -0000 1.11 *************** *** 50,54 **** #define ULIM(x,y,z) ((y) < (z) ? LIM(x,y,z) : LIM(x,z,y)) #define CLIP(x) LIM(x,0,0xffff) ! #define SWAP(a,b) { a ^= b; a ^= (b ^= a); } // Input power factor on some inputs. For those who like. See Levels f.i. --- 50,54 ---- #define ULIM(x,y,z) ((y) < (z) ? LIM(x,y,z) : LIM(x,z,y)) #define CLIP(x) LIM(x,0,0xffff) ! #define SWAP(a,b) { a=a+b; b=a-b; a=a-b; } // Input power factor on some inputs. For those who like. See Levels f.i. Index: jdlDcRaw.h =================================================================== RCS file: /cvsroot/jdlraw/jdlRaw/Sources/jdlDcRaw.h,v retrieving revision 1.12 retrieving revision 1.13 diff -C2 -d -r1.12 -r1.13 *** jdlDcRaw.h 2 May 2010 10:14:02 -0000 1.12 --- jdlDcRaw.h 1 Jun 2010 20:38:57 -0000 1.13 *************** *** 38,42 **** // Adaptation of dcraw.c stuff. ! #define VERSION "8.99" // Update along with dcraw syncing ... #ifndef _GNU_SOURCE --- 38,42 ---- // Adaptation of dcraw.c stuff. ! #define VERSION "9.01" // Update along with dcraw syncing ... #ifndef _GNU_SOURCE *************** *** 439,443 **** --- 439,445 ---- unsigned m_Tiff_Compress; unsigned m_BlackLevel; + unsigned m_CBlackLevel[8]; unsigned m_BlackLevel_AfterPhase1; + unsigned m_CBlackLevel_AfterPhase1[4]; // Yes 4 ! The upper 4 not needed. unsigned m_WhiteLevel; unsigned m_WhiteLevel_AfterPhase1; *************** *** 669,673 **** int canon_600_color(int ratio[2],int mar); void canon_600_fixed_wb(int temp); - void canon_black (double dark[2],int nblack); void read_shorts(uint16_t *pixel,int count); double getreal(int type); --- 671,674 ---- Index: jdlAdobeTable.h =================================================================== RCS file: /cvsroot/jdlraw/jdlRaw/Sources/jdlAdobeTable.h,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -d -r1.4 -r1.5 *** jdlAdobeTable.h 27 Feb 2010 19:02:41 -0000 1.4 --- jdlAdobeTable.h 1 Jun 2010 20:38:57 -0000 1.5 *************** *** 43,538 **** static const jdlAdobeTableItem AdobeTable[] = { ! { "AGFAPHOTO DC-833m", 0, 0, /* DJC */ ! { 11438,-3762,-1115,-2409,9914,2497,-1227,2295,5300 } }, ! { "Apple QuickTake", 0, 0, /* DJC */ ! { 21392,-5653,-3353,2406,8010,-415,7166,1427,2078 } }, ! { "Canon EOS D2000", 0, 0, ! { 24542,-10860,-3401,-1490,11370,-297,2858,-605,3225 } }, ! { "Canon EOS D6000", 0, 0, ! { 20482,-7172,-3125,-1033,10410,-285,2542,226,3136 } }, [...979 lines suppressed...] ! { "SONY DSLR-A330", 0, 0, ! { 9847,-3091,-929,-8485,16346,2225,-714,595,7103 } }, ! { "SONY DSLR-A350", 0, 0xffc, ! { 6038,-1484,-578,-9146,16746,2513,-875,746,7217 } }, ! { "SONY DSLR-A380", 0, 0, ! { 6038,-1484,-579,-9145,16746,2512,-875,746,7218 } }, ! { "SONY DSLR-A5", 126, 0, ! { 4950,-580,-103,-5228,12542,3029,-709,1435,7371 } }, ! { "SONY DSLR-A700", 126, 0, ! { 5775,-805,-359,-8574,16295,2391,-1943,2341,7249 } }, ! { "SONY DSLR-A850", 128, 0, ! { 5413,-1162,-365,-5665,13098,2866,-608,1179,8440 } }, ! { "SONY DSLR-A900", 128, 0, ! { 5209,-1072,-397,-8845,16120,2919,-1618,1803,8654 } }, ! { "SONY NEX-3", 138, 0, /* DJC */ ! { 6907,-1256,-645,-4940,12621,2320,-1710,2581,6230 } }, ! { "SONY NEX-5", 116, 0, /* DJC */ ! { 6807,-1350,-342,-4216,11649,2567,-1089,2001,6420 } } }; Index: jdlDcRaw.cpp =================================================================== RCS file: /cvsroot/jdlraw/jdlRaw/Sources/jdlDcRaw.cpp,v retrieving revision 1.19 retrieving revision 1.20 diff -C2 -d -r1.19 -r1.20 *** jdlDcRaw.cpp 26 May 2010 19:08:46 -0000 1.19 --- jdlDcRaw.cpp 1 Jun 2010 20:38:57 -0000 1.20 *************** *** 184,187 **** --- 184,188 ---- m_ColorDescriptor[0] = m_Description[0] = m_Artist[0] = m_CameraMake[0] = m_CameraModel[0] = m_CameraModelBis[0] = 0; m_IsoSpeed = m_Shutter = m_Aperture = m_FocalLength = unique_id = 0; + memset(m_CBlackLevel,0,sizeof m_CBlackLevel); memset (white, 0, sizeof white); m_ThumbOffset = m_ThumbLength = m_ThumbWidth = m_ThumbHeight = 0; *************** *** 418,435 **** } - void CLASS canon_black (double dark[2], int nblack) - { - int c, diff, row, col; - - if (!nblack) return; - for (c=0; c<2; c++) dark[c] /= nblack >> 1; - if ((diff = (int)(dark[0] - dark[1]))) - for (row=0; row < m_Height; row++) - for (col=1; col < m_Width; col+=2) - BAYER(row,col) += diff; - dark[1] += diff; - m_BlackLevel = (unsigned)((dark[0] + dark[1] + 1) / 2); - } - void CLASS canon_600_fixed_wb (int temp) { --- 419,422 ---- *************** *** 787,794 **** { uint16_t *pixel, *prow, *huff[2]; ! int nblocks, lowbits, i, c, row, r, col, save, val, nblack=0; unsigned irow, icol; int block, diffbuf[64], leaf, len, diff, carry=0, pnum=0, base[2]; - double dark[2] = {0,0}; crw_init_tables (m_Tiff_Compress,huff); --- 774,780 ---- { uint16_t *pixel, *prow, *huff[2]; ! int nblocks, lowbits, i, c, row, r, col, save, val; unsigned irow, icol; int block, diffbuf[64], leaf, len, diff, carry=0, pnum=0, base[2]; crw_init_tables (m_Tiff_Compress,huff); *************** *** 843,851 **** for (col=0; col < m_RawWidth; col++) { icol = col - m_LeftMargin; if (icol < m_Width) BAYER(irow,icol) = pixel[r*m_RawWidth+col]; else if (col > 1 && (unsigned)(col-m_LeftMargin+2) > (unsigned) m_Width+3) ! dark[icol & 1] += (nblack++,pixel[r*m_RawWidth+col]); } } --- 829,838 ---- for (col=0; col < m_RawWidth; col++) { icol = col - m_LeftMargin; + c = FC(irow,icol); if (icol < m_Width) BAYER(irow,icol) = pixel[r*m_RawWidth+col]; else if (col > 1 && (unsigned)(col-m_LeftMargin+2) > (unsigned) m_Width+3) ! m_CBlackLevel[c] += (m_CBlackLevel[4+c]++,pixel[r*m_RawWidth+col]); } } *************** *** 854,858 **** FREE(huff[0]); FREE(huff[1]); ! canon_black(dark,nblack); } --- 841,847 ---- FREE(huff[0]); FREE(huff[1]); ! for (c=0;c<4;c++) { ! if (m_CBlackLevel[4+c]) m_CBlackLevel[c] /= m_CBlackLevel[4+c]; ! } } *************** *** 978,983 **** void CLASS lossless_jpeg_load_raw() { ! int jwide, jrow, jcol, val, jidx, i, j, row=0, col=0, nblack=0; ! double dark[2] = { 0,0 }; struct jhead jh; int min=INT_MAX; --- 967,971 ---- void CLASS lossless_jpeg_load_raw() { ! int jwide, jrow, jcol, val, jidx, c, i, j, row=0, col=0; struct jhead jh; int min=INT_MAX; *************** *** 1007,1010 **** --- 995,999 ---- col += (row--,m_RawWidth); if ((unsigned) (row-m_TopMargin) < m_Height) { + c = FC(row-m_TopMargin,col-m_LeftMargin); if ((unsigned) (col-m_LeftMargin) < m_Width) { BAYER(row-m_TopMargin,col-m_LeftMargin) = val; *************** *** 1012,1017 **** } else if (col > 1 && (unsigned) (col-m_LeftMargin+2) > (unsigned) m_Width+3) ! dark[(col-m_LeftMargin) & 1] += (nblack++,val); ! } if (++col >= m_RawWidth) --- 1001,1005 ---- } else if (col > 1 && (unsigned) (col-m_LeftMargin+2) > (unsigned) m_Width+3) ! m_CBlackLevel[c] += (m_CBlackLevel[4+c]++,val); } if (++col >= m_RawWidth) *************** *** 1020,1024 **** } ljpeg_end(&jh); ! canon_black(dark,nblack); if (!strcasecmp(m_CameraMake,"KODAK")) { m_BlackLevel = min; --- 1008,1014 ---- } ljpeg_end(&jh); ! for (c=0;c<4;c++) { ! if (m_CBlackLevel[4+c]) m_CBlackLevel[c] /= m_CBlackLevel[4+c]; ! } if (!strcasecmp(m_CameraMake,"KODAK")) { m_BlackLevel = min; *************** *** 1867,1871 **** i = (col ^ (bite == 24)) - m_LeftMargin; if ((unsigned) i < m_Width) ! BAYER(row,i) = val << (m_Load_Flags >> 6); else if (m_Load_Flags & 32) m_BlackLevel += val; --- 1857,1861 ---- i = (col ^ (bite == 24)) - m_LeftMargin; if ((unsigned) i < m_Width) ! BAYER(row,i) = val; else if (m_Load_Flags & 32) m_BlackLevel += val; *************** *** 1894,1898 **** fseek (m_InputFile, 2*(m_RawWidth - m_Width), SEEK_CUR); for (col=0; col < m_Width; col++) ! if ((BAYER2(row,col) = pixel[col]) >> bits) derror(); } FREE (pixel); --- 1884,1888 ---- fseek (m_InputFile, 2*(m_RawWidth - m_Width), SEEK_CUR); for (col=0; col < m_Width; col++) ! if ((BAYER2(row,col) = pixel[col] >> m_Load_Flags) >> bits) derror(); } FREE (pixel); *************** *** 2612,2616 **** } for (i=0; i < 16; i++, col+=2) ! BAYER(row,col) = m_Curve[pix[i] << 1] >> 1; col -= col & 1 ? 1:31; } --- 2602,2606 ---- } for (i=0; i < 16; i++, col+=2) ! BAYER(row,col) = m_Curve[pix[i] << 1] >> 2; col -= col & 1 ? 1:31; } *************** *** 3498,3501 **** --- 3488,3493 ---- } FREE (pixel); + FCLOSE(fp); + memset(m_CBlackLevel,0,sizeof m_CBlackLevel); m_BlackLevel = 0; } *************** *** 3611,3615 **** // jdlScaleColors // Be aware : jdlWaveletDenoising has as side effect that ! // m_Blacklevel and m_Whitelevel change. // //////////////////////////////////////////////////////////////////////////////// --- 3603,3607 ---- // jdlScaleColors // Be aware : jdlWaveletDenoising has as side effect that ! // m_Blacklevel , m_CBlackLevel[c] and m_Whitelevel change. // //////////////////////////////////////////////////////////////////////////////// *************** *** 3620,3623 **** --- 3612,3622 ---- double dsum[8], dmin, dmax; + // JDLA This is again dcraw obfuscation. + // Earlier we splitted in the common term (in m_BlackLevel) and + // the diffs (in m_CBlackChannel[c]) + // Now the common term is again added putting everyting + // in m_CBlackChannel[c] + for (c=0; c<4; c++) m_CBlackLevel[c] += m_BlackLevel; + // Use the UserSetting_Multipliers if they are defined. // Remark that they will be overwritten if we have a AutoWb on CameraWb on ! *************** *** 3664,3668 **** val = m_Image[y*m_Width+x][c]; if ((unsigned) val > m_WhiteLevel-25) goto skip_block; ! if ((val -= m_BlackLevel) < 0) val = 0; sum[c] += val; sum[c+4]++; --- 3663,3667 ---- val = m_Image[y*m_Width+x][c]; if ((unsigned) val > m_WhiteLevel-25) goto skip_block; ! if ((val -= m_CBlackLevel[c]) < 0) val = 0; sum[c] += val; sum[c+4]++; *************** *** 3693,3697 **** for (col=0; col < 8; col++) { c = FC(row,col); ! if ((val = white[row][col] - m_BlackLevel) > 0) sum[c] += val; sum[c+4]++; --- 3692,3696 ---- for (col=0; col < 8; col++) { c = FC(row,col); ! if ((val = white[row][col] - m_CBlackLevel[c]) > 0) sum[c] += val; sum[c+4]++; *************** *** 3748,3752 **** ASSIGN(m_PreMultipliers[c],VALUE(m_PreMultipliers[c]) / dmax); ASSIGN(m_Multipliers[c], ! VALUE(m_PreMultipliers[c])*0xffff/(m_WhiteLevel-m_BlackLevel)); } m_MinPreMulti = dmin/dmax; // And the maximum is per construction 1.0 --- 3747,3751 ---- ASSIGN(m_PreMultipliers[c],VALUE(m_PreMultipliers[c]) / dmax); ASSIGN(m_Multipliers[c], ! VALUE(m_PreMultipliers[c])*0xffff/(m_WhiteLevel-m_CBlackLevel[c])); } m_MinPreMulti = dmin/dmax; // And the maximum is per construction 1.0 *************** *** 3812,3817 **** for (short Color=0; Color<4; Color++) { uint32_t Value = m_Image[Pos][Color]; ! if (Value > m_BlackLevel) { ! Value -= m_BlackLevel; Value = (uint32_t)(Value*VALUE(m_Multipliers[Color])); } else { --- 3811,3816 ---- for (short Color=0; Color<4; Color++) { uint32_t Value = m_Image[Pos][Color]; ! if (Value > m_CBlackLevel[Color]) { ! Value -= m_CBlackLevel[Color]; Value = (uint32_t)(Value*VALUE(m_Multipliers[Color])); } else { *************** *** 3897,3901 **** if (m_Image[Pos][Color] >= (uint16_t) ! ((m_WhiteLevel-m_BlackLevel)*VALUE(m_Multipliers[Color]))) { Clipped = 1; } --- 3896,3900 ---- if (m_Image[Pos][Color] >= (uint16_t) ! ((m_WhiteLevel-m_CBlackLevel[Color])*VALUE(m_Multipliers[Color]))) { Clipped = 1; } *************** *** 5121,5125 **** m_ShotOrder = (get4(),get4()); if (tag == 0x200 && len == 4) ! m_BlackLevel = (get2()+get2()+get2()+get2())/4; if (tag == 0x201 && len == 4) goto get2_rggb; --- 5120,5124 ---- m_ShotOrder = (get4(),get4()); if (tag == 0x200 && len == 4) ! for (c=0; c<4; c++) m_CBlackLevel[c ^ c >> 1] = get2(); if (tag == 0x201 && len == 4) goto get2_rggb; *************** *** 5127,5131 **** meta_offset = ftell(m_InputFile) + 14; if (tag == 0x401 && type ==4 && len == 4) { ! m_BlackLevel = (get4()+get4()+get4()+get4())/4; } if (tag == 0xe01) { /* Nikon Capture Note */ --- 5126,5130 ---- meta_offset = ftell(m_InputFile) + 14; if (tag == 0x401 && type ==4 && len == 4) { ! for (c=0; c<4; c++) m_CBlackLevel[c ^ c >> 1] = get4(); } if (tag == 0xe01) { /* Nikon Capture Note */ *************** *** 5159,5164 **** for (c=0; c<3; c++) m_cmatrix[i][c] = ((short) get2()) / 256.0; if ((tag == 0x1012 || tag == 0x20400600) && len == 4) ! for (m_BlackLevel = i=0; i < 4; i++) ! m_BlackLevel += get2() << 2; if (tag == 0x1017 || tag == 0x20400100) ASSIGN(m_CameraMultipliers[0], get2() / 256.0); --- 5158,5162 ---- for (c=0; c<3; c++) m_cmatrix[i][c] = ((short) get2()) / 256.0; if ((tag == 0x1012 || tag == 0x20400600) && len == 4) ! for (c=0;c<4;c++) m_CBlackLevel[c ^ c >> 1] = get2(); if (tag == 0x1017 || tag == 0x20400100) ASSIGN(m_CameraMultipliers[0], get2() / 256.0); *************** *** 5180,5184 **** parse_makernote (base, 0x2040); if (tag == 0xb028) { ! fseek (m_InputFile, get4(), SEEK_SET); parse_thumb_note (base, 136, 137); } --- 5178,5182 ---- parse_makernote (base, 0x2040); if (tag == 0xb028) { ! fseek (m_InputFile, get4()+base, SEEK_SET); parse_thumb_note (base, 136, 137); } *************** *** 5396,5399 **** --- 5394,5398 ---- int i, j, c; int l_ImageLength=0; + int blrr=1, blrc=1, dblack[] = { 0,0,0,0 }; char l_Software[64]; char *l_cbuf; *************** *** 5402,5406 **** uint8_t l_cfa_pc[] = { 0,1,2,3 }; uint8_t l_tab[256]; - double l_dblack; double l_cc[4][4]; double l_cm[4][3]; --- 5401,5404 ---- *************** *** 5450,5462 **** m_ThumbLength = l_Length; break; ! case 2: case 256: /* ImageWidth */ m_Tiff_IFD[l_ifd].width = getint(l_Type); break; ! case 3: case 257: /* ImageHeight */ m_Tiff_IFD[l_ifd].height = getint(l_Type); break; case 258: /* BitsPerSample */ m_Tiff_IFD[l_ifd].samples = l_Length & 7; ! m_Tiff_IFD[l_ifd].bps = get2(); break; case 259: /* Compression */ --- 5448,5464 ---- m_ThumbLength = l_Length; break; ! case 61440: /* Fuji HS10 table */ ! parse_tiff_ifd (l_Base); ! break; ! case 2: case 256: case 61441: /* ImageWidth */ m_Tiff_IFD[l_ifd].width = getint(l_Type); break; ! case 3: case 257: case 61442: /* ImageHeight */ m_Tiff_IFD[l_ifd].height = getint(l_Type); break; case 258: /* BitsPerSample */ + case 61443: m_Tiff_IFD[l_ifd].samples = l_Length & 7; ! m_Tiff_IFD[l_ifd].bps = getint(l_Type); break; case 259: /* Compression */ *************** *** 5482,5485 **** --- 5484,5488 ---- case 273: /* StripOffset */ case 513: + case 61447: m_Tiff_IFD[l_ifd].offset = get4()+l_Base; if (!m_Tiff_IFD[l_ifd].bps) { *************** *** 5502,5507 **** --- 5505,5514 ---- case 279: /* StripByteCounts */ case 514: + case 61448: m_Tiff_IFD[l_ifd].bytes = get4(); break; + case 61454: + for (c=0; c<3; c++) ASSIGN(m_CameraMultipliers[(4-c)%3], getint(l_Type)); + break; case 305: case 11: /* Software */ jdlfgets (l_Software, 64, m_InputFile); *************** *** 5567,5571 **** break; case 29459: ! for (c=0; c < 4; c++) ASSIGN(m_CameraMultipliers[c ^ (c >> 1)], get2()); break; case 33405: /* Model2 */ --- 5574,5580 ---- break; case 29459: ! for (c=0; c < 4; c++) ASSIGN(m_CameraMultipliers[c], get2()); ! i = (m_CameraMultipliers[1] == 1024 && m_CameraMultipliers[2] == 1024) << 1; ! SWAP (m_CameraMultipliers[i],m_CameraMultipliers[i+1]) break; case 33405: /* Model2 */ *************** *** 5724,5733 **** linear_table (l_Length); break; case 50714: /* BlackLevel */ ! case 50715: /* BlackLevelDeltaH */ ! case 50716: /* BlackLevelDeltaV */ ! for (l_dblack=i=0; (unsigned) i < l_Length; i++) ! l_dblack += getreal(l_Type); ! m_BlackLevel = (unsigned) (m_BlackLevel+l_dblack/l_Length + 0.5); break; case 50717: /* WhiteLevel */ --- 5733,5752 ---- linear_table (l_Length); break; + case 50713: /* BlackLevelRepeatDim */ + blrr = get2(); + blrc = get2(); + break; case 50714: /* BlackLevel */ ! m_BlackLevel = getreal(l_Type); ! if (!m_Filters || !~m_Filters) break; ! dblack[0] = m_BlackLevel; ! dblack[1] = (blrc == 2) ? getreal(l_Type):dblack[0]; ! dblack[2] = (blrr == 2) ? getreal(l_Type):dblack[0]; ! dblack[3] = (blrc == 2 && blrr == 2) ? getreal(l_Type):dblack[1]; ! if (m_Colors == 3) ! m_Filters |= ((m_Filters >> 2 & 0x22222222) | ! (m_Filters << 2 & 0x88888888)) & m_Filters << 1; ! for (c=0;c<4;c++) m_CBlackLevel[m_Filters >> (c << 1) & 3] = dblack[c]; ! m_BlackLevel = 0; break; case 50717: /* WhiteLevel */ *************** *** 5902,5908 **** if (m_Tiff_IFD[l_Raw].bytes * 5 == m_RawWidth * m_RawHeight * 8) { m_Tiff_bps = 12; - m_WhiteLevel = 0xffff; m_LoadRawFunction = &CLASS packed_load_raw; ! m_Load_Flags = 273; } break; --- 5921,5926 ---- if (m_Tiff_IFD[l_Raw].bytes * 5 == m_RawWidth * m_RawHeight * 8) { m_Tiff_bps = 12; m_LoadRawFunction = &CLASS packed_load_raw; ! m_Load_Flags = 17; } break; *************** *** 5926,5933 **** break; } ! m_Load_Flags = 79; case 32769: m_Load_Flags++; break; case 32773: m_LoadRawFunction = &CLASS packed_load_raw; --- 5944,5952 ---- break; } ! m_Load_Flags = 15; case 32769: m_Load_Flags++; break; + case 32770: case 32773: m_LoadRawFunction = &CLASS packed_load_raw; *************** *** 6372,6375 **** --- 6391,6399 ---- fseek (m_InputFile, save+len, SEEK_SET); } + if (!m_RawHeight) { + m_Filters = 0x16161616; + m_LoadRawFunction = &CLASS packed_load_raw; + m_Load_Flags = 24; + } m_Height <<= fuji_layout; m_Width >>= fuji_layout; *************** *** 6715,6718 **** --- 6739,6744 ---- char* l_CharPointer; unsigned l_HLen; + int l_FLen; + int l_ZeroFileSize=1; unsigned l_FileSize; unsigned l_IsCanon; *************** *** 6742,6746 **** --- 6768,6774 ---- { 1920000, "AVT", "F-201C" ,0 }, { 5067304, "AVT", "F-510C" ,0 }, + { 5067316, "AVT", "F-510C" ,0 }, { 10134608, "AVT", "F-510C" ,0 }, + { 10134620, "AVT", "F-510C" ,0 }, { 16157136, "AVT", "F-810C" ,0 }, { 1409024, "Sony", "XCD-SX910CR" ,0 }, *************** *** 6786,6789 **** --- 6814,6818 ---- { 10834368, "CASIO", "EX-Z750" ,1 }, { 12310144, "CASIO", "EX-Z850" ,1 }, + { 15499264, "CASIO", "EX-Z1050" ,1 }, { 7426656, "CASIO", "EX-P505" ,1 }, { 9313536, "CASIO", "EX-P600" ,1 }, *************** *** 6796,6803 **** { 16098048, "SAMSUNG", "S85" ,1 }, { 16215552, "SAMSUNG", "S85" ,1 }, { 12582980, "Sinar", "" ,0 }, { 33292868, "Sinar", "" ,0 }, { 44390468, "Sinar", "" ,0 } }; - static const char *l_Corporation[] = { "Canon", "NIKON", "EPSON", "KODAK", "Kodak", "OLYMPUS", "PENTAX", --- 6825,6833 ---- { 16098048, "SAMSUNG", "S85" ,1 }, { 16215552, "SAMSUNG", "S85" ,1 }, + { 20487168, "SAMSUNG", "WB550" ,1 }, + { 24000000, "SAMSUNG", "WB550" ,1 }, { 12582980, "Sinar", "" ,0 }, { 33292868, "Sinar", "" ,0 }, { 44390468, "Sinar", "" ,0 } }; static const char *l_Corporation[] = { "Canon", "NIKON", "EPSON", "KODAK", "Kodak", "OLYMPUS", "PENTAX", *************** *** 6815,6819 **** jdlfread (l_Head, 1, 32, m_InputFile); fseek (m_InputFile, 0, SEEK_END); ! l_FileSize = ftell(m_InputFile); if ((l_CharPointer = (char *) memmem (l_Head, 32, "MMMM", 4)) || --- 6845,6849 ---- jdlfread (l_Head, 1, 32, m_InputFile); fseek (m_InputFile, 0, SEEK_END); ! l_FLen = l_FileSize = ftell(m_InputFile); if ((l_CharPointer = (char *) memmem (l_Head, 32, "MMMM", 4)) || *************** *** 6824,6828 **** if (!memcmp (l_Head+6,"HEAPCCDR",8)) { m_Data_Offset = l_HLen; ! parse_ciff (l_HLen, l_FileSize - l_HLen); } else { parse_tiff(0); --- 6854,6858 ---- if (!memcmp (l_Head+6,"HEAPCCDR",8)) { m_Data_Offset = l_HLen; ! parse_ciff (l_HLen, l_FLen - l_HLen); } else { parse_tiff(0); *************** *** 6865,6869 **** } fseek (m_InputFile, 100, SEEK_SET); ! m_Data_Offset = get4(); parse_tiff (m_ThumbOffset+12); } else if (!memcmp (l_Head,"RIFF",4)) { --- 6895,6899 ---- } fseek (m_InputFile, 100, SEEK_SET); ! parse_tiff(m_Data_Offset = get4()); parse_tiff (m_ThumbOffset+12); } else if (!memcmp (l_Head,"RIFF",4)) { *************** *** 6892,6896 **** parse_cine(); else { ! for (i=0; i < sizeof l_Table / sizeof *l_Table; i++) if (l_FileSize == (unsigned) l_Table[i].fsize) { strcpy (m_CameraMake, l_Table[i].make ); --- 6922,6926 ---- parse_cine(); else { ! for (l_ZeroFileSize=i=0; i < sizeof l_Table / sizeof *l_Table; i++) if (l_FileSize == (unsigned) l_Table[i].fsize) { strcpy (m_CameraMake, l_Table[i].make ); *************** *** 6901,6905 **** } ! if (m_CameraMake[0] == 0) parse_smal (0, l_FileSize); if (m_CameraMake[0] == 0) parse_jpeg (m_IsRaw = 0); --- 6931,6937 ---- } ! if (l_ZeroFileSize) l_FileSize = 0; ! ! if (m_CameraMake[0] == 0) parse_smal (0, l_FLen); if (m_CameraMake[0] == 0) parse_jpeg (m_IsRaw = 0); *************** *** 7235,7238 **** --- 7267,7277 ---- m_RawWidth *= 4; m_Width = 4916; + } else if (l_IsCanon && m_RawWidth == 1336) { + m_TopMargin = 51; + m_LeftMargin = 142; + m_RawWidth = m_Width *= 4; + if (unique_id == 0x80000270) + adobe_coeff ("Canon","EOS 550D"); + goto canon_cr2; } else if (l_IsCanon && m_RawWidth == 1340) { m_TopMargin = 51; *************** *** 7366,7371 **** } if (m_CameraMake[0] == 'O') { ! int li = find_green (12, 32, 0, l_FileSize/2); ! int lc = find_green (12, 32, 0, 3096); if (abs(li) < abs(lc)) { SWAP(li,lc); --- 7405,7410 ---- } if (m_CameraMake[0] == 'O') { ! int li = find_green (12, 32, 1188864, 3576832); ! int lc = find_green (12, 32, 2383920, 2387016); if (abs(li) < abs(lc)) { SWAP(li,lc); *************** *** 7406,7410 **** m_Width = 2880; m_Flip = 6; ! } else m_WhiteLevel = 0x3e00; if (m_IsRaw == 2 && m_UserSetting_ShotSelect) --- 7445,7449 ---- m_Width = 2880; m_Flip = 6; ! } else if (m_LoadRawFunction != &CLASS packed_load_raw) m_WhiteLevel = 0x3e00; if (m_IsRaw == 2 && m_UserSetting_ShotSelect) *************** *** 7517,7520 **** --- 7556,7575 ---- m_LoadRawFunction = &CLASS unpacked_load_raw; m_WhiteLevel = 0xffff; + } else if (!strcmp(m_CameraModel,"NX10")) { + m_Height -= m_TopMargin = 4; + m_Width -= 2 * (m_LeftMargin = 8); + } else if (l_FileSize == 20487168) { + m_Height = 2808; + m_Width = 3648; + goto wb550; + } else if (l_FileSize == 24000000) { + m_Height = 3000; + m_Width = 4000; + wb550: + strcpy (m_CameraModel, "WB550"); + m_ByteOrder = 0x4d4d; + m_LoadRawFunction = &CLASS unpacked_load_raw; + m_Load_Flags = 6; + m_WhiteLevel = 0x3df; } else if (!strcmp(m_CameraModel,"STV680 VGA")) { m_Height = 484; *************** *** 7548,7551 **** --- 7603,7607 ---- m_LoadRawFunction = l_FileSize < 7500000 ? &CLASS eight_bit_load_raw : &CLASS unpacked_load_raw; + m_Data_Offset = l_FileSize - m_Width*m_Height*(l_FileSize >> 22); m_WhiteLevel = 0xfff0; } else if (!strcmp(m_CameraModel,"F-810C")) { *************** *** 7657,7664 **** } } else if (!strcmp(m_CameraMake,"LEICA") || !strcmp(m_CameraMake,"Panasonic")) { ! m_WhiteLevel = 0xfff0; ! if ((l_FileSize-m_Data_Offset) / (m_Width*8/7) == m_Height) m_LoadRawFunction = &CLASS panasonic_load_raw; ! if (!m_LoadRawFunction) m_LoadRawFunction = &CLASS unpacked_load_raw; switch (m_Width) { case 2568: --- 7713,7722 ---- } } else if (!strcmp(m_CameraMake,"LEICA") || !strcmp(m_CameraMake,"Panasonic")) { ! if ((l_FLen - m_Data_Offset) / (m_Width*8/7) == m_Height) m_LoadRawFunction = &CLASS panasonic_load_raw; ! if (!m_LoadRawFunction) { ! m_LoadRawFunction = &CLASS unpacked_load_raw; ! m_Load_Flags = 4; ! } switch (m_Width) { case 2568: *************** *** 7680,7683 **** --- 7738,7742 ---- case 3177: m_Width -= 10; + m_Load_Flags = 2; m_Filters = 0x49494949; m_ZeroIsBad = 1; *************** *** 7690,7694 **** m_Width += 43; m_LeftMargin = -6; ! m_WhiteLevel = 0xf7f0; case 3370: m_Width -= 82; --- 7749,7753 ---- m_Width += 43; m_LeftMargin = -6; ! m_WhiteLevel = 0xf7f; case 3370: m_Width -= 82; *************** *** 7726,7729 **** --- 7785,7789 ---- m_Width -= 22; m_LeftMargin = 6; + m_Load_Flags = 2; m_ZeroIsBad = 1; adobe_coeff ("Panasonic","DMC-LX1"); break; *************** *** 7772,7794 **** m_Filters = exif_cfa; if (m_Width == 4100) m_Width -= 4; ! if (m_LoadRawFunction == &CLASS olympus_load_raw) { ! m_Tiff_bps = 12; ! m_BlackLevel >>= 4; ! } else if (!strcmp(m_CameraModel,"E-10") || ! !strncmp(m_CameraModel,"E-20",4)) { ! m_BlackLevel <<= 2; ! } else if (!strcmp(m_CameraModel,"E-300") || ! !strcmp(m_CameraModel,"E-500")) { m_Width -= 20; if (m_LoadRawFunction == &CLASS unpacked_load_raw) { ! m_WhiteLevel = 0xfc30; ! m_BlackLevel = 0; } } else if (!strcmp(m_CameraModel,"E-330")) { m_Width -= 30; if (m_LoadRawFunction == &CLASS unpacked_load_raw) ! m_WhiteLevel = 0xf790; } else if (!strcmp(m_CameraModel,"SP550UZ")) { ! m_ThumbLength = l_FileSize - (m_ThumbOffset = 0xa39800); m_ThumbHeight = 480; m_ThumbWidth = 640; --- 7832,7851 ---- m_Filters = exif_cfa; if (m_Width == 4100) m_Width -= 4; ! if (m_LoadRawFunction == &CLASS unpacked_load_raw) ! m_Load_Flags = 4; ! m_Tiff_bps = 12; ! if (!strcmp(m_CameraModel,"E-300") || ! !strcmp(m_CameraModel,"E-500")) { m_Width -= 20; if (m_LoadRawFunction == &CLASS unpacked_load_raw) { ! m_WhiteLevel = 0xfc3; ! memset (m_CBlackLevel, 0, sizeof m_CBlackLevel); } } else if (!strcmp(m_CameraModel,"E-330")) { m_Width -= 30; if (m_LoadRawFunction == &CLASS unpacked_load_raw) ! m_WhiteLevel = 0xf79; } else if (!strcmp(m_CameraModel,"SP550UZ")) { ! m_ThumbLength = l_FLen - (m_ThumbOffset = 0xa39800); m_ThumbHeight = 480; m_ThumbWidth = 640; *************** *** 7818,7823 **** m_ByteOrder = 0x4d4d; } else if (!strcmp(m_CameraModel,"DSLR-A100")) { ! m_Height--; ! m_Width = ++m_RawWidth; m_Filters = 0x61616161; } else if (!strcmp(m_CameraModel,"DSLR-A350")) { --- 7875,7885 ---- m_ByteOrder = 0x4d4d; } else if (!strcmp(m_CameraModel,"DSLR-A100")) { ! if (m_Width == 3880) { ! m_Height--; ! m_Width = ++m_RawWidth; ! } else { ! m_ByteOrder = 0x4d4d; ! m_Load_Flags = 2; ! } m_Filters = 0x61616161; } else if (!strcmp(m_CameraModel,"DSLR-A350")) { *************** *** 7910,7914 **** if (!strncmp(m_CameraModel,"DC2",3)) { m_Height = 242; ! if (l_FileSize < 100000) { m_RawWidth = 256; m_Width = 249; m_PixelAspect = (4.0*m_Height) / (3.0*m_Width); --- 7972,7976 ---- if (!strncmp(m_CameraModel,"DC2",3)) { m_Height = 242; ! if (l_FLen < 100000) { m_RawWidth = 256; m_Width = 249; m_PixelAspect = (4.0*m_Height) / (3.0*m_Width); *************** *** 8070,8073 **** --- 8132,8140 ---- m_RawWidth = 4928; m_WhiteLevel = 0xfff; + } else if (!strcmp(m_CameraModel,"EX-Z1050")) { + m_Height = 2752; + m_Width = 3672; + m_RawWidth = 5632; + m_WhiteLevel = 0xffc; } else if (!strcmp(m_CameraModel,"EX-P505")) { m_Height = 1928; *************** *** 8112,8121 **** if (!m_RawWidth ) m_RawWidth = m_Width; if (m_Filters && m_Colors == 3) ! for (i=0; i < 32; i+=4) { ! if ((m_Filters >> i & 15) == 9) ! m_Filters |= 2 << i; ! if ((m_Filters >> i & 15) == 6) ! m_Filters |= 8 << i; ! } notraw: if (m_Flip == -1) m_Flip = m_Tiff_Flip; --- 8179,8185 ---- if (!m_RawWidth ) m_RawWidth = m_Width; if (m_Filters && m_Colors == 3) ! m_Filters |= ((m_Filters >> 2 & 0x22222222) | ! (m_Filters << 2 & 0x88888888)) & m_Filters << 1; ! notraw: if (m_Flip == -1) m_Flip = m_Tiff_Flip; *************** *** 8527,8530 **** --- 8591,8595 ---- TRACEKEYVALS("LeftMargin","%d",m_LeftMargin); TRACEKEYVALS("BlackLevel","%d",m_BlackLevel); + for (short c=0; c<4; c++) TRACEKEYVALS("CBlackLevel","%d",m_CBlackLevel[c]); // OK for second entry. *************** *** 8648,8651 **** --- 8713,8717 ---- m_Filters_AfterPhase1 = m_Filters; m_BlackLevel_AfterPhase1 = m_BlackLevel; + for (short c=0;c<4;c++) m_CBlackLevel_AfterPhase1[c] = m_CBlackLevel[c]; m_WhiteLevel_AfterPhase1 = m_WhiteLevel; m_Width_AfterPhase1 = m_Width; *************** *** 8685,8695 **** --- 8751,8779 ---- m_Filters = m_Filters_AfterPhase1; m_BlackLevel = m_BlackLevel_AfterPhase1; + for (short c=0;c<4;c++) m_CBlackLevel[c] = m_CBlackLevel_AfterPhase1[c]; m_WhiteLevel = m_WhiteLevel_AfterPhase1; } + // Split such that the common term of m_CBlackLevel (the minimum) + // is added to m_BlackLevel. m_CBlackLevel then contains the delta + // per channel, with one channel on zero (i.e. the minimum one) + // (not sure why, cause jdlScaleColors adds it again ...) + // (but at least m_BLackLevel has now always some meaning) + unsigned MinCBlackLevel = m_CBlackLevel[3]; + for (short c=0;c<3;c++) { + if (MinCBlackLevel > m_CBlackLevel[c]) { + MinCBlackLevel = m_CBlackLevel[c]; + } + } + for (short c=0;c<4;c++) { + m_CBlackLevel[c] -= MinCBlackLevel; + } + m_BlackLevel += MinCBlackLevel; + if (m_UserSetting_BlackPoint >= 0) m_BlackLevel = m_UserSetting_BlackPoint; if (m_UserSetting_Saturation > 0) m_WhiteLevel = m_UserSetting_Saturation; TRACEKEYVALS("BlackLevel","%d",m_BlackLevel); + for (short c=0; c<4; c++) TRACEKEYVALS("CBlackLevel","%d",m_CBlackLevel[c]); TRACEKEYVALS("WhiteLevel","%d",m_WhiteLevel); TRACEKEYVALS("Colors","%d",m_Colors); *************** *** 8850,8853 **** --- 8934,8938 ---- TRACEKEYVALS("BlackLevel","%d",m_BlackLevel); + for (short c=0; c<4; c++) TRACEKEYVALS("CBlackLevel","%d",m_CBlackLevel[c]); TRACEKEYVALS("WhiteLevel","%d",m_WhiteLevel); TRACEKEYVALS("Colors","%d",m_Colors); *************** *** 9036,9040 **** int Scale=1; ! int lev, hpass, lpass, wlast; TRACEKEYVALS("BlackLevel","%d",m_BlackLevel); --- 9121,9125 ---- int Scale=1; ! int lev, hpass, lpass, wlast, blk[2]; TRACEKEYVALS("BlackLevel","%d",m_BlackLevel); *************** *** 9044,9050 **** --- 9129,9137 ---- m_WhiteLevel <<= --Scale; m_BlackLevel <<= Scale; + for (short c=0; c<4; c++) m_CBlackLevel[c] <<= Scale; TRACEKEYVALS("Scale(denoise)","%d",Scale); TRACEKEYVALS("BlackLevel","%d",m_BlackLevel); + for (short c=0; c<4; c++) TRACEKEYVALS("CBlackLevel","%d",m_CBlackLevel[c]); TRACEKEYVALS("WhiteLevel","%d",m_WhiteLevel); *************** *** 9108,9111 **** --- 9195,9199 ---- VALUE(m_PreMultipliers[FC(Row+1,0) | 1]) / VALUE(m_PreMultipliers[FC(Row,0) | 1]); + blk[Row] = m_CBlackLevel[FC(Row,0) | 1]; } uint16_t* Window[4]; *************** *** 9135,9141 **** for (uint16_t Col = (FC(Row,0) & 1)+1; Col < m_Width-1; Col+=2) { Average = ( Window[0][Col-1] + Window[0][Col+1] + ! Window[2][Col-1] + Window[2][Col+1] - m_BlackLevel*4 ) * Multiplier[Row & 1] ! + (Window[1][Col] - m_BlackLevel) * 0.5 + m_BlackLevel; Average = Average < 0 ? 0 : sqrt(Average); Difference = sqrt(BAYER(Row,Col)) - Average; --- 9223,9229 ---- for (uint16_t Col = (FC(Row,0) & 1)+1; Col < m_Width-1; Col+=2) { Average = ( Window[0][Col-1] + Window[0][Col+1] + ! Window[2][Col-1] + Window[2][Col+1] - blk[~Row & 1]*4 ) * Multiplier[Row & 1] ! + (Window[1][Col] +blk[Row & 1]) * 0.5 ; Average = Average < 0 ? 0 : sqrt(Average); Difference = sqrt(BAYER(Row,Col)) - Average; Index: jdlExposure.cpp =================================================================== RCS file: /cvsroot/jdlraw/jdlRaw/Sources/jdlExposure.cpp,v retrieving revision 1.3 retrieving revision 1.4 diff -C2 -d -r1.3 -r1.4 *** jdlExposure.cpp 26 May 2010 19:08:46 -0000 1.3 --- jdlExposure.cpp 1 Jun 2010 20:38:57 -0000 1.4 *************** *** 48,55 **** // // // FindAlpha (helper for ExposureFunction) // ! ////////////////////////////////////////////////////////////////////////////// double FindAlpha(double Exposure,double L) { --- 48,56 ---- // + //////////////////////////////////////////////////////////////////////////////// // // FindAlpha (helper for ExposureFunction) // ! //////////////////////////////////////////////////////////////////////////////// double FindAlpha(double Exposure,double L) { *************** *** 97,99 **** } ! /////////////////////////////////////////////////////////////////////////////// --- 98,100 ---- } ! //////////////////////////////////////////////////////////////////////////////// |