From c35d1bd2543192ae1ec7468d86219dd6e66acd64 Mon Sep 17 00:00:00 2001 From: ffsup2 Date: Tue, 12 Apr 2011 23:51:07 +0200 Subject: [PATCH] Update to dcraw 9.07 --- rtengine/dcraw.c | 66 ++++++++++++++++++++++++++++++++++---------- rtengine/dcraw.cc | 66 ++++++++++++++++++++++++++++++++++---------- rtengine/dcraw.patch | 24 ++++++++-------- 3 files changed, 114 insertions(+), 42 deletions(-) diff --git a/rtengine/dcraw.c b/rtengine/dcraw.c index 4e4b1464f..e3df29698 100644 --- a/rtengine/dcraw.c +++ b/rtengine/dcraw.c @@ -19,11 +19,11 @@ *If you have not modified dcraw.c in any way, a link to my homepage qualifies as "full source code". - $Revision: 1.440 $ - $Date: 2011/01/29 07:43:38 $ + $Revision: 1.442 $ + $Date: 2011/04/01 23:30:09 $ */ -#define VERSION "9.06" +#define VERSION "9.07" #ifndef _GNU_SOURCE #define _GNU_SOURCE @@ -1646,7 +1646,7 @@ void CLASS hasselblad_load_raw() order = 0x4949; ph1_bits(-1); for (row=-top_margin; row < height; row++) { - pred[0] = pred[1] = 0x8000; + pred[0] = pred[1] = 0x8000 + load_flags; for (col=-left_margin; col < raw_width-left_margin; col+=2) { FORC(2) len[c] = ph1_huff(jh.huff[0]); FORC(2) { @@ -4933,7 +4933,7 @@ int CLASS parse_tiff_ifd (int base) case 513: /* JpegIFOffset */ case 61447: tiff_ifd[ifd].offset = get4()+base; - if (!tiff_ifd[ifd].bps) { + if (!tiff_ifd[ifd].bps && tiff_ifd[ifd].offset > 0) { fseek (ifp, tiff_ifd[ifd].offset, SEEK_SET); if (ljpeg_start (&jh, 1)) { tiff_ifd[ifd].comp = 6; @@ -5811,9 +5811,18 @@ void CLASS parse_fuji (int offset) fuji_layout = fgetc(ifp) >> 7; load_raw = fgetc(ifp) & 8 ? &CLASS unpacked_load_raw : &CLASS fuji_load_raw; - } - if (tag == 0x2ff0) + } else if (tag == 0x2ff0) { FORC4 cam_mul[c ^ 1] = get2(); + } else if (tag == 0xc000) { + raw_height = order; + order = 0x4949; + width = get4(); + height = get4(); + order = raw_height; + raw_height = 1; + load_raw = &CLASS packed_load_raw; + load_flags = 16; + } fseek (ifp, save+len, SEEK_SET); } if (!raw_height) { @@ -6108,8 +6117,12 @@ void CLASS adobe_coeff (const char *make, const char *model) { 4763,712,-646,-6821,14399,2640,-1921,3276,6561 } }, { "Canon EOS 550D", 0, 0x3dd7, { 6941,-1164,-857,-3825,11597,2534,-416,1540,6039 } }, + { "Canon EOS 600D", 0, 0x3510, /* DJC */ + { 5589,-1476,-292,-3401,9372,4030,-706,2038,6350 } }, { "Canon EOS 1000D", 0, 0xe43, { 6771,-1139,-977,-7818,15123,2928,-1244,1437,7533 } }, + { "Canon EOS 1100D", 0, 0x3510, /* DJC */ + { 5193,-1423,-226,-3414,9273,4142,-679,2103,6808 } }, { "Canon EOS-1Ds Mark III", 0, 0x3bb0, { 5859,-211,-930,-8255,16017,2353,-1732,1887,7448 } }, { "Canon EOS-1Ds Mark II", 0, 0xe80, @@ -6554,7 +6567,7 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8048,-2810,-623,-6450,13519,3272,-1700,2146,7049 } }, { "Panasonic DMC-LX3", 15, 0, { 8128,-2668,-655,-6134,13307,3161,-1782,2568,6083 } }, - { "LEICA D-LUX4", 15, 0, + { "LEICA D-LUX 4", 15, 0, { 8128,-2668,-655,-6134,13307,3161,-1782,2568,6083 } }, { "Panasonic DMC-LX5", 143, 0, { 10909,-4295,-948,-1333,9306,2399,22,1738,4582 } }, @@ -6616,6 +6629,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 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-A390", 0, 0, + { 6038,-1484,-579,-9145,16746,2512,-875,746,7218 } }, { "SONY DSLR-A450", 128, 0xfeb, { 4950,-580,-103,-5228,12542,3029,-709,1435,7371 } }, { "SONY DSLR-A580", 128, 0xfeb, @@ -7314,6 +7329,12 @@ canon_a5: if (unique_id == 0x80000176) adobe_coeff ("Canon","EOS 450D"); goto canon_cr2; + } else if (is_canon && raw_width == 4352) { + top_margin = 18; + left_margin = 62; + if (unique_id == 0x80000288) + adobe_coeff ("Canon","EOS 1100D"); + goto canon_cr2; } else if (is_canon && raw_width == 4476) { top_margin = 34; left_margin = 90; @@ -7339,6 +7360,8 @@ canon_a5: left_margin = 142; if (unique_id == 0x80000270) adobe_coeff ("Canon","EOS 550D"); + if (unique_id == 0x80000286) + adobe_coeff ("Canon","EOS 600D"); goto canon_cr2; } else if (is_canon && raw_width == 5360) { top_margin = 51; @@ -7518,8 +7541,8 @@ cp_e2500: maximum = 0x3e00; if (is_raw == 2 && shot_select) maximum = 0x2f00; - top_margin = (raw_height - height)/2; - left_margin = (raw_width - width )/2; + top_margin = (raw_height - height) >> 2 << 1; + left_margin = (raw_width - width ) >> 2 << 1; if (is_raw == 2) data_offset += (shot_select > 0) * ( fuji_layout ? (raw_width *= 2) : raw_height*raw_width*2 ); @@ -7625,18 +7648,22 @@ konica_400z: load_flags = 32; } else if (!strcmp(model,"EX1")) { order = 0x4949; - height = 2760; + height -= 20; top_margin = 2; if ((width -= 6) > 3682) { - height = 2750; - width = 3668; + height -= 10; + width -= 46; top_margin = 8; } } else if (!strcmp(model,"WB2000")) { order = 0x4949; height -= 3; - width -= 10; top_margin = 2; + if ((width -= 10) > 3718) { + height -= 28; + width -= 56; + top_margin = 8; + } } else if (fsize == 20487168) { height = 2808; width = 3648; @@ -7740,6 +7767,13 @@ wb550: top_margin = 4; left_margin = 41; filters = 0x61616161; + } else if (raw_width == 9044) { + height = 6716; + width = 8964; + top_margin = 8; + left_margin = 40; + black += load_flags = 256; + maximum = 0x8101; } else if (raw_width == 4090) { strcpy (model, "V96C"); height -= (top_margin = 6); @@ -7762,8 +7796,10 @@ wb550: if (ljpeg_start (&jh, 1) && jh.bits == 15) maximum = 0x1fff; if (tiff_samples > 1) filters = 0; - if (tiff_samples > 1 || tile_length < raw_height) + if (tiff_samples > 1 || tile_length < raw_height) { load_raw = &CLASS leaf_hdr_load_raw; + raw_width = tile_width; + } if ((width | height) == 2048) { if (tiff_samples == 1) { filters = 1; diff --git a/rtengine/dcraw.cc b/rtengine/dcraw.cc index 9ff320a16..b4a953eaa 100644 --- a/rtengine/dcraw.cc +++ b/rtengine/dcraw.cc @@ -28,11 +28,11 @@ *If you have not modified dcraw.c in any way, a link to my homepage qualifies as "full source code". - $Revision: 1.440 $ - $Date: 2011/01/29 07:43:38 $ + $Revision: 1.442 $ + $Date: 2011/04/01 23:30:09 $ */ -#define VERSION "9.06" +#define VERSION "9.07" #ifndef _GNU_SOURCE #define _GNU_SOURCE @@ -1657,7 +1657,7 @@ void CLASS hasselblad_load_raw() order = 0x4949; ph1_bits(-1); for (row=-top_margin; row < height; row++) { - pred[0] = pred[1] = 0x8000; + pred[0] = pred[1] = 0x8000 + load_flags; for (col=-left_margin; col < raw_width-left_margin; col+=2) { FORC(2) len[c] = ph1_huff(jh.huff[0]); FORC(2) { @@ -4947,7 +4947,7 @@ int CLASS parse_tiff_ifd (int base) case 513: /* JpegIFOffset */ case 61447: tiff_ifd[ifd].offset = get4()+base; -/*RT*/if (!tiff_ifd[ifd].bps && tiff_ifd[ifd].offset>=0) { + if (!tiff_ifd[ifd].bps && tiff_ifd[ifd].offset > 0) { fseek (ifp, tiff_ifd[ifd].offset, SEEK_SET); if (ljpeg_start (&jh, 1)) { tiff_ifd[ifd].comp = 6; @@ -5829,9 +5829,18 @@ void CLASS parse_fuji (int offset) fuji_layout = fgetc(ifp) >> 7; load_raw = fgetc(ifp) & 8 ? &CLASS unpacked_load_raw : &CLASS fuji_load_raw; - } - if (tag == 0x2ff0) + } else if (tag == 0x2ff0) { FORC4 cam_mul[c ^ 1] = get2(); + } else if (tag == 0xc000) { + raw_height = order; + order = 0x4949; + width = get4(); + height = get4(); + order = raw_height; + raw_height = 1; + load_raw = &CLASS packed_load_raw; + load_flags = 16; + } fseek (ifp, save+len, SEEK_SET); } if (!raw_height) { @@ -6130,8 +6139,12 @@ void CLASS adobe_coeff (const char *make, const char *model) { 4763,712,-646,-6821,14399,2640,-1921,3276,6561 } }, { "Canon EOS 550D", 0, 0x3dd7, { 6941,-1164,-857,-3825,11597,2534,-416,1540,6039 } }, + { "Canon EOS 600D", 0, 0x3510, /* DJC */ + { 5589,-1476,-292,-3401,9372,4030,-706,2038,6350 } }, { "Canon EOS 1000D", 0, 0xe43, { 6771,-1139,-977,-7818,15123,2928,-1244,1437,7533 } }, + { "Canon EOS 1100D", 0, 0x3510, /* DJC */ + { 5193,-1423,-226,-3414,9273,4142,-679,2103,6808 } }, { "Canon EOS-1Ds Mark III", 0, 0x3bb0, { 5859,-211,-930,-8255,16017,2353,-1732,1887,7448 } }, { "Canon EOS-1Ds Mark II", 0, 0xe80, @@ -6576,7 +6589,7 @@ void CLASS adobe_coeff (const char *make, const char *model) { 8048,-2810,-623,-6450,13519,3272,-1700,2146,7049 } }, { "Panasonic DMC-LX3", 15, 0, { 8128,-2668,-655,-6134,13307,3161,-1782,2568,6083 } }, - { "LEICA D-LUX4", 15, 0, + { "LEICA D-LUX 4", 15, 0, { 8128,-2668,-655,-6134,13307,3161,-1782,2568,6083 } }, { "Panasonic DMC-LX5", 143, 0, { 10909,-4295,-948,-1333,9306,2399,22,1738,4582 } }, @@ -6638,6 +6651,8 @@ void CLASS adobe_coeff (const char *make, const char *model) { 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-A390", 0, 0, + { 6038,-1484,-579,-9145,16746,2512,-875,746,7218 } }, { "SONY DSLR-A450", 128, 0xfeb, { 4950,-580,-103,-5228,12542,3029,-709,1435,7371 } }, { "SONY DSLR-A580", 128, 0xfeb, @@ -7345,6 +7360,12 @@ canon_a5: if (unique_id == 0x80000176) adobe_coeff ("Canon","EOS 450D"); goto canon_cr2; + } else if (is_canon && raw_width == 4352) { + top_margin = 18; + left_margin = 62; + if (unique_id == 0x80000288) + adobe_coeff ("Canon","EOS 1100D"); + goto canon_cr2; } else if (is_canon && raw_width == 4476) { top_margin = 34; left_margin = 90; @@ -7370,6 +7391,8 @@ canon_a5: left_margin = 142; if (unique_id == 0x80000270) adobe_coeff ("Canon","EOS 550D"); + if (unique_id == 0x80000286) + adobe_coeff ("Canon","EOS 600D"); goto canon_cr2; } else if (is_canon && raw_width == 5360) { top_margin = 51; @@ -7549,8 +7572,8 @@ cp_e2500: maximum = 0x3e00; if (is_raw == 2 && shot_select) maximum = 0x2f00; - top_margin = (raw_height - height)/2; - left_margin = (raw_width - width )/2; + top_margin = (raw_height - height) >> 2 << 1; + left_margin = (raw_width - width ) >> 2 << 1; if (is_raw == 2) data_offset += (shot_select > 0) * ( fuji_layout ? (raw_width *= 2) : raw_height*raw_width*2 ); @@ -7656,18 +7679,22 @@ konica_400z: load_flags = 32; } else if (!strcmp(model,"EX1")) { order = 0x4949; - height = 2760; + height -= 20; top_margin = 2; if ((width -= 6) > 3682) { - height = 2750; - width = 3668; + height -= 10; + width -= 46; top_margin = 8; } } else if (!strcmp(model,"WB2000")) { order = 0x4949; height -= 3; - width -= 10; top_margin = 2; + if ((width -= 10) > 3718) { + height -= 28; + width -= 56; + top_margin = 8; + } } else if (fsize == 20487168) { height = 2808; width = 3648; @@ -7771,6 +7798,13 @@ wb550: top_margin = 4; left_margin = 41; filters = 0x61616161; + } else if (raw_width == 9044) { + height = 6716; + width = 8964; + top_margin = 8; + left_margin = 40; + black += load_flags = 256; + maximum = 0x8101; } else if (raw_width == 4090) { strcpy (model, "V96C"); height -= (top_margin = 6); @@ -7793,8 +7827,10 @@ wb550: if (ljpeg_start (&jh, 1) && jh.bits == 15) maximum = 0x1fff; if (tiff_samples > 1) filters = 0; - if (tiff_samples > 1 || tile_length < raw_height) + if (tiff_samples > 1 || tile_length < raw_height) { load_raw = &CLASS leaf_hdr_load_raw; + raw_width = tile_width; + } if ((width | height) == 2048) { if (tiff_samples == 1) { filters = 1; diff --git a/rtengine/dcraw.patch b/rtengine/dcraw.patch index ad83234e9..dcd55a455 100644 --- a/rtengine/dcraw.patch +++ b/rtengine/dcraw.patch @@ -1,5 +1,5 @@ ---- H:/rawtherapee_3.0/rtengine/dcraw.c Wed Feb 02 23:18:25 2011 -+++ H:/rawtherapee_3.0/rtengine/dcraw.cc Thu Mar 17 17:39:52 2011 +--- rtengine/dcraw.c Tue Apr 05 21:33:35 2011 ++++ rtengine/dcraw.cc Tue Apr 12 23:18:14 2011 @@ -1,5 +1,14 @@ +/*RT*/#include +/*RT*/#include @@ -305,8 +305,8 @@ case 513: /* JpegIFOffset */ case 61447: tiff_ifd[ifd].offset = get4()+base; -- if (!tiff_ifd[ifd].bps) { -+/*RT*/if (!tiff_ifd[ifd].bps && tiff_ifd[ifd].offset>=0) { +- if (!tiff_ifd[ifd].bps && tiff_ifd[ifd].offset > 0) { ++ if (!tiff_ifd[ifd].bps && tiff_ifd[ifd].offset > 0) { fseek (ifp, tiff_ifd[ifd].offset, SEEK_SET); if (ljpeg_start (&jh, 1)) { tiff_ifd[ifd].comp = 6; @@ -375,7 +375,7 @@ parse_tiff (12); thumb_offset = 0; is_raw = 1; -@@ -5842,11 +5860,15 @@ +@@ -5851,11 +5869,15 @@ raw_width = get2(); } order = get2(); @@ -392,7 +392,7 @@ } return 1; } -@@ -6626,14 +6648,14 @@ +@@ -6641,14 +6663,14 @@ { 5775,-805,-359,-8574,16295,2391,-1943,2341,7249 } }, { "SONY DSLR-A850", 128, 0, { 5413,-1162,-365,-5665,13098,2866,-608,1179,8440 } }, @@ -411,7 +411,7 @@ { "SONY SLT-A33", 128, 0, { 6069,-1221,-366,-5221,12779,2734,-1024,2066,6834 } }, { "SONY SLT-A55", 128, 0, -@@ -6877,17 +6899,25 @@ +@@ -6892,17 +6914,25 @@ hlen = get4(); fseek (ifp, 0, SEEK_SET); fread (head, 1, 32, ifp); @@ -437,7 +437,7 @@ } else if (!memcmp (head,"\xff\xd8\xff\xe1",4) && !memcmp (head+6,"Exif",4)) { fseek (ifp, 4, SEEK_SET); -@@ -6925,10 +6955,11 @@ +@@ -6940,10 +6970,11 @@ parse_fuji (i); } fseek (ifp, 100, SEEK_SET); @@ -449,7 +449,7 @@ fseek (ifp, 0, SEEK_SET); parse_riff(); } else if (!memcmp (head,"\0\001\0\001\0@",6)) { -@@ -7007,11 +7038,11 @@ +@@ -7022,11 +7053,11 @@ if (height == 2624 && width == 3936) /* Pentax K10D and Samsung GX10 */ { height = 2616; width = 3896; } if (height == 3136 && width == 4864) /* Pentax K20D and Samsung GX20 */ @@ -462,7 +462,7 @@ if (!strcmp(model,"K-7")) { height = 3122; width = 4684; filters = 0x16161616; top_margin = 2; } if (!strcmp(model,"645D")) -@@ -8589,17 +8620,17 @@ +@@ -8625,17 +8656,17 @@ for (col=0; col < width; col++, soff += cstep) if (output_bps == 8) FORCC ppm [col*colors+c] = curve[image[soff][c]] >> 8; @@ -482,7 +482,7 @@ int timestamp_only=0, thumbnail_only=0, identify_only=0; int user_qual=-1, user_black=-1, user_sat=-1, user_flip=-1; int use_fuji_rotate=1, write_to_stdout=0, quality, i, c; -@@ -8708,11 +8739,11 @@ +@@ -8744,11 +8775,11 @@ case 'z': timestamp_only = 1; break; case 'e': thumbnail_only = 1; break; case 'i': identify_only = 1; break; @@ -495,7 +495,7 @@ case 'a': use_auto_wb = 1; break; case 'w': use_camera_wb = 1; break; case 'M': use_camera_matrix = (opm == '+'); break; -@@ -8971,5 +9002,6 @@ +@@ -9007,5 +9038,6 @@ else shot_select = 0; } }