This commit is contained in:
ffsup2
2010-12-31 18:50:29 +01:00
parent 79bfe602e5
commit b687a18d2e
38 changed files with 1207 additions and 872 deletions

View File

@@ -1,6 +1,6 @@
--- dcraw.c 2010-11-11 08:44:21.000000000 -0700
+++ dcraw.cc 2010-12-29 12:57:16.000000000 -0700
@@ -1,3 +1,12 @@
--- dcraw.c Sun Dec 12 19:32:29 2010
+++ dcraw.cc Fri Dec 31 12:10:25 2010
@@ -1,5 +1,14 @@
+/*RT*/#include <glib.h>
+/*RT*/#include <glib/gstdio.h>
+/*RT*/#undef MAX
@@ -13,7 +13,11 @@
/*
dcraw.c -- Dave Coffin's raw photo decoder
Copyright 1997-2010 by Dave Coffin, dcoffin a cybercom o net
@@ -96,11 +105,12 @@
This is a command-line ANSI C program to convert raw photos from
@@ -94,15 +103,16 @@
#define ushort UshORt
typedef unsigned char uchar;
typedef unsigned short ushort;
@@ -27,7 +31,11 @@
FILE *ifp, *ofp;
short order;
const char *ifname;
@@ -128,13 +138,13 @@
char *meta_data;
char cdesc[5], desc[512], make[64], model[64], model2[64], artist[64];
@@ -126,17 +136,17 @@
int half_size=0, four_color_rgb=0, document_mode=0, highlight=0;
int verbose=0, use_auto_wb=0, use_camera_wb=0, use_camera_matrix=-1;
int output_color=1, output_bps=8, output_tiff=0, med_passes=0;
int no_auto_bright=0;
unsigned greybox[4] = { 0, 0, UINT_MAX, UINT_MAX };
@@ -44,7 +52,11 @@
void (*write_thumb)(), (*write_fun)();
void (*load_raw)(), (*thumb_load_raw)();
jmp_buf failure;
@@ -152,8 +162,8 @@
struct decode {
@@ -150,12 +160,12 @@
struct ph1 {
int format, key_off, black, black_off, split_col, tag_21a;
float tag_210;
} ph1;
@@ -55,7 +67,11 @@
#define FORC(cnt) for (c=0; c < cnt; c++)
#define FORC3 FORC(3)
@@ -271,6 +281,7 @@
#define FORC4 FORC(4)
#define FORCC FORC(colors)
@@ -269,10 +279,11 @@
fprintf (stderr,_("Unexpected end of file\n"));
else
fprintf (stderr,_("Corrupt data near 0x%llx\n"), (INT64) ftello(ifp));
}
data_error++;
@@ -63,7 +79,11 @@
}
ushort CLASS sget2 (uchar *s)
@@ -344,7 +355,7 @@
{
if (order == 0x4949) /* "II" means little-endian */
@@ -342,11 +353,11 @@
void CLASS read_shorts (ushort *pixel, int count)
{
if (fread (pixel, 2, count, ifp) < count) derror();
if ((order == 0x4949) == (ntohs(0x1234) == 0x1234))
@@ -72,7 +92,11 @@
}
void CLASS canon_600_fixed_wb (int temp)
@@ -536,10 +547,10 @@
{
static const short mul[4][5] = {
@@ -534,14 +545,14 @@
/*
getbits(-1) initializes the buffer
getbits(n) where 0 <= n <= 25 returns an n-bit integer
*/
@@ -86,7 +110,11 @@
unsigned c;
if (nbits == -1)
@@ -1286,7 +1297,7 @@
return bitbuf = vbits = reset = 0;
if (nbits == 0 || vbits < 0) return 0;
@@ -1284,11 +1295,11 @@
}
}
free (pixel);
}
@@ -95,7 +123,11 @@
void CLASS ppm_thumb()
{
@@ -1561,10 +1572,10 @@
char *thumb;
thumb_length = thumb_width*thumb_height*3;
@@ -1559,14 +1570,14 @@
}
free (pixel);
phase_one_correct();
}
@@ -109,7 +141,11 @@
unsigned c;
if (nbits == -1)
@@ -1690,7 +1701,7 @@
return bitbuf = vbits = 0;
if (nbits == 0) return 0;
@@ -1688,11 +1699,11 @@
maximum = 0xffff;
raw_color = 1;
}
}
@@ -118,7 +154,11 @@
void CLASS sinar_4shot_load_raw()
{
@@ -1826,10 +1837,10 @@
ushort *pixel;
unsigned shot, row, col, r, c;
@@ -1824,14 +1835,14 @@
free (data);
if (top_margin) black /= top_margin * width;
maximum = 0x3ff;
}
@@ -132,7 +172,11 @@
int byte;
if (!nbits) return vbits=0;
@@ -2118,11 +2129,11 @@
if (!vbits) {
fread (buf+load_flags, 1, 0x4000-load_flags, ifp);
@@ -2116,15 +2127,15 @@
#else
METHODDEF(boolean)
fill_input_buffer (j_decompress_ptr cinfo)
{
@@ -146,7 +190,11 @@
cinfo->src->next_input_byte = jpeg_buffer;
cinfo->src->bytes_in_buffer = nbytes;
return TRUE;
@@ -2394,9 +2405,9 @@
}
@@ -2392,13 +2403,13 @@
for (col=0; col < width; col++)
read_shorts (image[row*width+col], colors);
maximum = (1 << (thumb_misc & 31)) - 1;
}
@@ -158,7 +206,11 @@
if (start) {
for (p=0; p < 4; p++)
@@ -2643,7 +2654,7 @@
pad[p] = key = key * 48828125 + 1;
pad[3] = pad[3] << 1 | (pad[0]^pad[2]) >> 31;
@@ -2641,11 +2652,11 @@
/* RESTRICTED code starts here */
void CLASS foveon_decoder (unsigned size, unsigned code)
{
@@ -167,7 +219,11 @@
struct decode *cur;
int i, len;
@@ -4327,7 +4338,7 @@
if (!code) {
for (i=0; i < size; i++)
@@ -4325,11 +4336,11 @@
if (tag == tlen) thumb_length = get4();
fseek (ifp, save, SEEK_SET);
}
}
@@ -176,7 +232,11 @@
void CLASS parse_makernote (int base, int uptag)
{
@@ -4452,7 +4463,7 @@
static const uchar xlat[2][256] = {
{ 0xc1,0xbf,0x6d,0x0d,0x59,0xc5,0x13,0x9d,0x83,0x61,0x6b,0x4f,0xc7,0x7f,0x3d,0x3d,
@@ -4450,11 +4461,11 @@
cam_mul[0] = getreal(type);
cam_mul[2] = getreal(type);
}
if (tag == 0xd && type == 7 && get2() == 0xaaaa) {
fread (buf97, 1, sizeof buf97, ifp);
@@ -185,7 +245,11 @@
if (i < 70 && buf97[i] < 3)
flip = "065"[buf97[i]]-'0';
}
@@ -4821,8 +4832,8 @@
if (tag == 0x10 && type == 4)
unique_id = get4();
@@ -4819,12 +4830,12 @@
if (tag == 64020) height = (getint(type)+1) & -2;
fseek (ifp, save, SEEK_SET);
}
}
@@ -196,7 +260,11 @@
int CLASS parse_tiff_ifd (int base)
{
@@ -4836,7 +4847,7 @@
unsigned entries, tag, type, len, plen=16, save;
int ifd, use_cm=0, cfa, i, j, c, ima_len=0;
@@ -4834,11 +4845,11 @@
double cc[4][4], cm[4][3], cam_xyz[4][3], num;
double ab[]={ 1,1,1,1 }, asn[] = { 0,0,0,0 }, xyz[] = { 1,1,1 };
unsigned sony_curve[] = { 0,0,0,0,0,4095 };
unsigned *buf, sony_offset=0, sony_length=0, sony_key=0;
struct jhead jh;
@@ -205,7 +273,11 @@
if (tiff_nifds >= sizeof tiff_ifd / sizeof tiff_ifd[0])
return 1;
@@ -5254,12 +5265,13 @@
ifd = tiff_nifds++;
for (j=0; j < 4; j++)
@@ -5252,16 +5263,17 @@
if (sony_length && (buf = (unsigned *) malloc(sony_length))) {
fseek (ifp, sony_offset, SEEK_SET);
fread (buf, sony_length, 1, ifp);
sony_decrypt (buf, sony_length/4, 1, sony_key);
sfp = ifp;
@@ -224,7 +296,11 @@
ifp = sfp;
free (buf);
}
@@ -5284,6 +5296,8 @@
for (i=0; i < colors; i++)
FORCC cc[i][c] *= ab[i];
@@ -5282,10 +5294,12 @@
int CLASS parse_tiff (int base)
{
int doff;
@@ -233,7 +309,11 @@
fseek (ifp, base, SEEK_SET);
order = get2();
if (order != 0x4949 && order != 0x4d4d) return 0;
@@ -5458,7 +5472,7 @@
get2();
while ((doff = get4())) {
@@ -5456,11 +5470,11 @@
*/
void CLASS parse_external_jpeg()
{
const char *file, *ext;
char *jname, *jfile, *jext;
@@ -242,7 +322,11 @@
ext = strrchr (ifname, '.');
file = strrchr (ifname, '/');
@@ -5486,7 +5500,8 @@
if (!file) file = strrchr (ifname, '\\');
if (!file) file = ifname-1;
@@ -5484,11 +5498,12 @@
break;
}
*jext = '0';
}
if (strcmp (jname, ifname)) {
@@ -252,7 +336,11 @@
if (verbose)
fprintf (stderr,_("Reading metadata from %s ...\n"), jname);
parse_tiff (12);
@@ -5824,7 +5839,11 @@
thumb_offset = 0;
is_raw = 1;
@@ -5822,11 +5837,15 @@
raw_width = get2();
}
order = get2();
hlen = get4();
if (get4() == 0x48454150) /* "HEAP" */
@@ -265,7 +353,11 @@
if (parse_tiff (save+6)) apply_tiff();
fseek (ifp, save+len, SEEK_SET);
}
@@ -6845,6 +6864,12 @@
return 1;
}
@@ -6843,17 +6862,25 @@
hlen = get4();
fseek (ifp, 0, SEEK_SET);
fread (head, 1, 32, ifp);
fseek (ifp, 0, SEEK_END);
flen = fsize = ftell(ifp);
@@ -278,7 +370,7 @@
if ((cp = (char *) memmem (head, 32, "MMMM", 4)) ||
(cp = (char *) memmem (head, 32, "IIII", 4))) {
parse_phase_one (cp-head);
@@ -6852,6 +6877,8 @@
if (cp-head && parse_tiff(0)) apply_tiff();
} else if (order == 0x4949 || order == 0x4d4d) {
if (!memcmp (head+6,"HEAPCCDR",8)) {
data_offset = hlen;
@@ -287,7 +379,11 @@
parse_ciff (hlen, flen - hlen);
} else if (parse_tiff(0)) apply_tiff();
} else if (!memcmp (head,"\xff\xd8\xff\xe1",4) &&
@@ -6893,6 +6920,7 @@
!memcmp (head+6,"Exif",4)) {
fseek (ifp, 4, SEEK_SET);
@@ -6891,10 +6918,11 @@
parse_fuji (i);
}
fseek (ifp, 100, SEEK_SET);
parse_tiff (data_offset = get4());
parse_tiff (thumb_offset+12);
@@ -295,7 +391,11 @@
apply_tiff();
} else if (!memcmp (head,"RIFF",4)) {
fseek (ifp, 0, SEEK_SET);
@@ -7331,6 +7359,9 @@
parse_riff();
} else if (!memcmp (head,"\0\001\0\001\0@",6)) {
@@ -7329,10 +7357,13 @@
cam_mul[0] *= 256/527.0;
cam_mul[2] *= 256/317.0;
} else if (!strcmp(model,"D1X")) {
width -= 4;
pixel_aspect = 0.5;
@@ -305,7 +405,11 @@
} else if (!strcmp(model,"D40X") ||
!strcmp(model,"D60") ||
!strcmp(model,"D80") ||
@@ -7548,7 +7579,7 @@
!strcmp(model,"D3000")) {
height -= 3;
@@ -7546,11 +7577,11 @@
} else if (!strcmp(model,"*ist D")) {
data_error = -1;
} else if (!strcmp(model,"*ist DS")) {
height -= 2;
} else if (!strcmp(model,"K-x")) {
@@ -314,7 +418,11 @@
filters = 0x16161616;
} else if (!strcmp(model,"Optio S")) {
if (fsize == 3178560) {
@@ -8560,13 +8591,13 @@
height = 1540;
width = 2064;
@@ -8558,17 +8589,17 @@
for (col=0; col < width; col++, soff += cstep)
if (output_bps == 8)
FORCC ppm [col*colors+c] = curve[image[soff][c]] >> 8;
else FORCC ppm2[col*colors+c] = curve[image[soff][c]];
if (output_bps == 16 && !output_tiff && htons(0x55aa) != 0x55aa)
@@ -330,7 +438,11 @@
{
int arg, status=0;
int timestamp_only=0, thumbnail_only=0, identify_only=0;
@@ -8679,7 +8710,7 @@
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;
@@ -8677,11 +8708,11 @@
case 'z': timestamp_only = 1; break;
case 'e': thumbnail_only = 1; break;
case 'i': identify_only = 1; break;
case 'c': write_to_stdout = 1; break;
case 'v': verbose = 1; break;
@@ -339,7 +451,11 @@
case 'f': four_color_rgb = 1; break;
case 'A': FORC4 greybox[c] = atoi(argv[arg++]);
case 'a': use_auto_wb = 1; break;
@@ -8943,3 +8974,4 @@
case 'w': use_camera_wb = 1; break;
case 'M': use_camera_matrix = (opm == '+'); break;
@@ -8941,5 +8972,6 @@
else shot_select = 0;
}
}
return status;
}