SOURCES: dcraw.1, dcraw.c - updated. 0edfe10acf69c93724e271646ae79...
pluto
pluto at pld-linux.org
Tue Sep 6 09:13:45 CEST 2005
Author: pluto Date: Tue Sep 6 07:13:45 2005 GMT
Module: SOURCES Tag: HEAD
---- Log message:
- updated.
0edfe10acf69c93724e271646ae79df5 dcraw.1
2fc0584127c3746debba941273f8b417 dcraw.c
---- Files affected:
SOURCES:
dcraw.1 (1.2 -> 1.3) , dcraw.c (1.3 -> 1.4)
---- Diffs:
================================================================
Index: SOURCES/dcraw.1
diff -u SOURCES/dcraw.1:1.2 SOURCES/dcraw.1:1.3
--- SOURCES/dcraw.1:1.2 Thu Apr 28 20:38:44 2005
+++ SOURCES/dcraw.1 Tue Sep 6 09:13:40 2005
@@ -9,7 +9,7 @@
.\" dcoffin a cybercom o net
.\" http://www.cybercom.net/~dcoffin
.\"
-.TH dcraw 1 "April 28, 2005"
+.TH dcraw 1 "August 30, 2005"
.LO 1
.SH NAME
dcraw - convert raw digital photos to PPM format
@@ -23,21 +23,31 @@
format.
.SH OPTIONS
.TP
+.B -v
+Print verbose messages. The default is to print only warnings
+and errors.
+.TP
+.B -z
+Change the access and modification times of a JPEG or raw file to
+when the photo was taken, assuming that the camera clock was set
+to Universal Time.
+.TP
.B -i
Identify files but don't decode them.
Exit status is 0 if
.B dcraw
can decode the last file, 1 if it can't.
.TP
+.B ""
+.B dcraw
+cannot decode JPEG files!!
+.TP
.B -c
Write binary image data to standard output.
By default,
.B dcraw
creates files with a ".ppm" extension.
.TP
-.B -v
-Print verbose messages. Default is to print only warnings and errors.
-.TP
.B -d
Show the raw data as a grayscale image with no interpolation.
Good for photographing black-and-white documents.
@@ -52,10 +62,8 @@
.BR -q .
.TP
.B -f
-Interpolate RGB as four colors. This causes a slight loss
-of detail, so use
-.B -f
-only if you see false 2x2 mesh patterns in blue sky.
+Interpolate RGB as four colors. This blurs the image a little,
+but it eliminates false 2x2 mesh patterns.
.TP
.B -a
Automatic color balance. The default is to use a fixed
@@ -74,6 +82,9 @@
.B -b brightness
Change the output brightness. Default is 1.0.
.TP
+.B -k black
+Change the black point. Default depends on the camera.
+.TP
.B -n
By default,
.B dcraw
@@ -87,12 +98,21 @@
.B dcraw
converts to sRGB colorspace.
.TP
+.B -j
+For Fuji\ Super\ CCD cameras, show the image tilted 45 degrees
+so that each output pixel corresponds to one raw pixel.
+.TP
.B -s
-For cameras based on the Fuji Super CCD SR, use the secondary
-sensors, in effect underexposing the image by four stops to
-reveal detail in the highlights. For all other cameras,
+For Fuji\ Super\ CCD\ SR cameras, use the secondary sensors, in
+effect underexposing the image by four stops to reveal detail
+in the highlights.
+.TP
+.B ""
+For all other cameras,
+.B -j
+and
.B -s
-is silently ignored.
+are silently ignored.
.TP
.B -t [0-7]
Flip the output image. The most common flips are 5
@@ -117,7 +137,12 @@
.BR -4 ,
written in Adobe PhotoShop format. File extension is ".psd".
.SH "SEE ALSO"
-ppm(5), ppm2tiff(1), pnmtotiff(1), pnmtopng(1), gphoto2(1).
+.BR ppm (5),
+.BR ppm2tiff (1),
+.BR pnmtotiff (1),
+.BR pnmtopng (1),
+.BR gphoto2 (1),
+.BR djpeg (1)
.SH BUGS
The
.B -w
@@ -125,7 +150,7 @@
.P
No attempt is made to save camera settings or thumbnail images.
.P
-Author stubbornly refuses to add more output formats.
+The author stubbornly refuses to add more output formats.
.P
Don't expect
.B dcraw
================================================================
Index: SOURCES/dcraw.c
diff -u SOURCES/dcraw.c:1.3 SOURCES/dcraw.c:1.4
--- SOURCES/dcraw.c:1.3 Thu Apr 28 20:38:44 2005
+++ SOURCES/dcraw.c Tue Sep 6 09:13:40 2005
@@ -48,14 +48,18 @@
#include <io.h>
#endif
#ifdef WIN32
+#include <sys/utime.h>
#include <winsock2.h>
#pragma comment(lib, "ws2_32.lib")
#define strcasecmp stricmp
typedef __int64 INT64;
+typedef unsigned __int64 UINT64;
#else
#include <unistd.h>
+#include <utime.h>
#include <netinet/in.h>
typedef long long INT64;
+typedef unsigned long long UINT64;
#endif
#ifdef LJPEG_DECODE
@@ -79,6 +83,7 @@
FILE *ifp;
short order;
char *ifname, make[64], model[70], model2[64], *meta_data;
+float flash_used, canon_5814;
time_t timestamp;
int data_offset, meta_offset, meta_length, nikon_curve_offset;
int tiff_data_compression, kodak_data_compression;
@@ -86,7 +91,7 @@
int height, width, fuji_width, colors, tiff_samples;
int black, maximum, clip_max, clip_color=1;
int iheight, iwidth, shrink;
-int is_dng, is_canon, is_foveon, use_coeff, use_gamma;
+int dng_version, is_canon, is_foveon, raw_color, use_gamma;
int trim, flip, xmag, ymag;
int zero_after_ff;
unsigned filters;
@@ -96,7 +101,11 @@
int four_color_rgb=0, document_mode=0, quick_interpolate=0;
int verbose=0, use_auto_wb=0, use_camera_wb=0, use_camera_rgb=0;
int fuji_secondary, use_secondary=0;
-float cam_mul[4], pre_mul[4], coeff[3][4];
+float cam_mul[4], pre_mul[4], rgb_cam[3][4]; /* RGB from camera color */
+const double xyz_rgb[3][3] = { /* XYZ from RGB */
+ { 0.412453, 0.357580, 0.180423 },
+ { 0.212671, 0.715160, 0.072169 },
+ { 0.019334, 0.119193, 0.950227 } };
#define camera_red cam_mul[0]
#define camera_blue cam_mul[2]
int histogram[3][0x2000];
@@ -120,6 +129,12 @@
#define FORC4 for (c=0; c < 4; c++)
#define FORCC for (c=0; c < colors; c++)
+#define SQR(x) ((x)*(x))
+#define ABS(x) (((int)(x) ^ ((int)(x) >> 31)) - ((int)(x) >> 31))
+#define MIN(a,b) (((a) < (b)) ? (a) : (b))
+#define MAX(a,b) (((a) > (b)) ? (a) : (b))
+#define CLIP(x) (MAX(0,MIN((x),clip_max)))
+
/*
In order to inline this calculation, I make the risky
assumption that all filter patterns can be described
@@ -182,41 +197,49 @@
longjmp (failure, 1);
}
-/*
- Get a 2-byte integer, making no assumptions about CPU byte order.
- Nor should we assume that the compiler evaluates left-to-right.
- */
-ushort CLASS get2()
+ushort CLASS sget2 (uchar *s)
{
- uchar a, b;
-
- a = fgetc(ifp); b = fgetc(ifp);
-
if (order == 0x4949) /* "II" means little-endian */
- return a | b << 8;
+ return s[0] | s[1] << 8;
else /* "MM" means big-endian */
- return a << 8 | b;
+ return s[0] << 8 | s[1];
}
-/*
- Same for a 4-byte integer.
- */
-int CLASS get4()
+ushort CLASS get2()
{
- uchar a, b, c, d;
-
- a = fgetc(ifp); b = fgetc(ifp);
- c = fgetc(ifp); d = fgetc(ifp);
+ uchar str[2] = { 0xff,0xff };
+ fread (str, 1, 2, ifp);
+ return sget2(str);
+}
+int CLASS sget4 (uchar *s)
+{
if (order == 0x4949)
- return a | b << 8 | c << 16 | d << 24;
+ return s[0] | s[1] << 8 | s[2] << 16 | s[3] << 24;
else
- return a << 24 | b << 16 | c << 8 | d;
+ return s[0] << 24 | s[1] << 16 | s[2] << 8 | s[3];
+}
+
+int CLASS get4()
+{
+ uchar str[4] = { 0xff,0xff,0xff,0xff };
+ fread (str, 1, 4, ifp);
+ return sget4(str);
+}
+
+double CLASS getrat()
+{
+ double num = get4();
+ return num / get4();
+}
+
+float CLASS int_to_float (int i)
+{
+ union { int i; float f; } u;
+ u.i = i;
+ return u.f;
}
-/*
- Faster than calling get2() multiple times.
- */
void CLASS read_shorts (ushort *pixel, int count)
{
fread (pixel, 2, count, ifp);
@@ -224,13 +247,131 @@
swab (pixel, pixel, count*2);
}
+void CLASS canon_600_fixed_wb (int temp)
+{
+ static const short mul[4][5] = {
+ { 667, 358,397,565,452 },
+ { 731, 390,367,499,517 },
+ { 1119, 396,348,448,537 },
+ { 1399, 485,431,508,688 } };
+ int lo, hi, i;
+ float frac=0;
+
+ for (lo=4; --lo; )
+ if (*mul[lo] <= temp) break;
+ for (hi=0; hi < 3; hi++)
+ if (*mul[hi] >= temp) break;
+ if (lo != hi)
+ frac = (float) (temp - *mul[lo]) / (*mul[hi] - *mul[lo]);
+ for (i=1; i < 5; i++)
+ pre_mul[i-1] = 1 / (frac * mul[hi][i] + (1-frac) * mul[lo][i]);
+}
+
+/* Return values: 0 = white 1 = near white 2 = not white */
+int CLASS canon_600_color (int ratio[2], int mar)
+{
+ int clipped=0, target, miss;
+
+ if (flash_used) {
+ if (ratio[1] < -104)
+ { ratio[1] = -104; clipped = 1; }
+ if (ratio[1] > 12)
+ { ratio[1] = 12; clipped = 1; }
+ } else {
+ if (ratio[1] < -264 || ratio[1] > 461) return 2;
+ if (ratio[1] < -50)
+ { ratio[1] = -50; clipped = 1; }
+ if (ratio[1] > 307)
+ { ratio[1] = 307; clipped = 1; }
+ }
+ target = flash_used || ratio[1] < 197
+ ? -38 - (398 * ratio[1] >> 10)
+ : -123 + (48 * ratio[1] >> 10);
+ if (target - mar <= ratio[0] &&
+ target + 20 >= ratio[0] && !clipped) return 0;
+ miss = target - ratio[0];
+ if (abs(miss) >= mar*4) return 2;
+ if (miss < -20) miss = -20;
+ if (miss > mar) miss = mar;
+ ratio[0] = target - miss;
+ return 1;
+}
+
+void CLASS canon_600_auto_wb ()
+{
+ int mar, row, col, i, j, st, count[] = { 0,0 };
+ int test[8], total[2][8], ratio[2][2], stat[2];
+
+ memset (&total, 0, sizeof total);
+ i = canon_5814 + 0.5;
+ if (i < 10) mar = 150;
+ else if (i > 12) mar = 20;
+ else mar = 280 - 20 * i;
+ if (flash_used) mar = 80;
+ for (row=14; row < height-14; row+=4)
+ for (col=10; col < width; col+=2) {
+ for (i=0; i < 8; i++)
+ test[(i & 4) + FC(row+(i >> 1),col+(i & 1))] =
+ BAYER(row+(i >> 1),col+(i & 1));
+ for (i=0; i < 8; i++)
+ if (test[i] < 150 || test[i] > 1500) goto next;
+ for (i=0; i < 4; i++)
+ if (abs(test[i] - test[i+4]) > 50) goto next;
+ for (i=0; i < 2; i++) {
+ for (j=0; j < 4; j+=2)
+ ratio[i][j >> 1] = ((test[i*4+j+1]-test[i*4+j]) << 10) / test[i*4+j];
+ stat[i] = canon_600_color (ratio[i], mar);
+ }
+ if ((st = stat[0] | stat[1]) > 1) goto next;
+ for (i=0; i < 2; i++)
+ if (stat[i])
+ for (j=0; j < 2; j++)
+ test[i*4+j*2+1] = test[i*4+j*2] * (0x400 + ratio[i][j]) >> 10;
+ for (i=0; i < 8; i++)
+ total[st][i] += test[i];
+ count[st]++;
+next: continue;
+ }
+ if (count[0] | count[1]) {
+ st = count[0]*200 < count[1];
+ for (i=0; i < 4; i++)
+ pre_mul[i] = 1.0 / (total[st][i] + total[st][i+4]);
+ }
+}
+
+void CLASS canon_600_coeff ()
+{
+ static const short table[6][12] = {
+ { -190,702,-1878,2390, 1861,-1349,905,-393, -432,944,2617,-2105 },
+ { -1203,1715,-1136,1648, 1388,-876,267,245, -1641,2153,3921,-3409 },
+ { -615,1127,-1563,2075, 1437,-925,509,3, -756,1268,2519,-2007 },
+ { -190,702,-1886,2398, 2153,-1641,763,-251, -452,964,3040,-2528 },
+ { -190,702,-1878,2390, 1861,-1349,905,-393, -432,944,2617,-2105 },
+ { -807,1319,-1785,2297, 1388,-876,769,-257, -230,742,2067,-1555 } };
+ int t=0, i, c;
+ float mc, yc;
+
+ mc = pre_mul[1] / pre_mul[2];
+ yc = pre_mul[3] / pre_mul[2];
+ if (mc > 1 && mc <= 1.28 && yc < 0.8789) t=1;
+ if (mc > 1.28 && mc <= 2) {
+ if (yc < 0.8789) t=3;
+ else if (yc <= 2) t=4;
+ }
+ if (flash_used) t=5;
+ for (raw_color = i=0; i < 3; i++)
+ FORCC rgb_cam[i][c] = table[t][i*4 + c] / 1024.0;
+}
+
void CLASS canon_600_load_raw()
{
uchar data[1120], *dp;
ushort pixel[896], *pix;
- int irow, orow, col;
+ int irow, row, col, val;
+ static const short mul[4][2] =
+ { { 1141,1145 }, { 1128,1109 }, { 1178,1149 }, { 1128,1109 } };
- for (irow=orow=0; irow < height; irow++)
+ for (irow=row=0; irow < height; irow++)
{
fread (data, 1120, 1, ifp);
for (dp=data, pix=pixel; dp < data+1120; dp+=10, pix+=8)
@@ -245,14 +386,23 @@
pix[7] = (dp[8] << 2) + (dp[9] >> 6 );
}
for (col=0; col < width; col++)
- BAYER(orow,col) = pixel[col];
+ BAYER(row,col) = pixel[col];
for (col=width; col < 896; col++)
black += pixel[col];
- if ((orow+=2) > height)
- orow = 1;
+ if ((row+=2) > height) row = 1;
}
- black /= (896 - width) * height;
- maximum = 0x3ff;
+ black = black / ((896 - width) * height) - 4;
+ for (row=0; row < height; row++)
+ for (col=0; col < width; col++) {
+ val = (BAYER(row,col) - black) * mul[row & 3][col & 1] >> 9;
+ if (val < 0) val = 0;
+ BAYER(row,col) = val;
+ }
+ canon_600_fixed_wb(1311);
+ canon_600_auto_wb();
+ canon_600_coeff();
+ maximum = (0x3ff - black) * 1109 >> 9;
+ black = 0;
}
void CLASS canon_a5_load_raw()
@@ -291,21 +441,22 @@
unsigned CLASS getbits (int nbits)
{
static unsigned long bitbuf=0;
- static int vbits=0;
+ static int vbits=0, reset=0;
unsigned c, ret;
- if (nbits == 0) return 0;
+ if (nbits == 0 || nbits > vbits) return 0;
+ if (nbits == -2)
+ return ftell(ifp) + (-vbits >> 3);
if (nbits == -1)
- ret = bitbuf = vbits = 0;
+ ret = bitbuf = vbits = reset = 0;
else {
ret = bitbuf << (LONG_BIT - vbits) >> (LONG_BIT - nbits);
vbits -= nbits;
}
- while (vbits < LONG_BIT - 7) {
+ while (!reset && vbits < LONG_BIT - 7) {
c = fgetc(ifp);
+ if ((reset = zero_after_ff && c == 0xff && fgetc(ifp))) break;
bitbuf = (bitbuf << 8) + c;
- if (c == 0xff && zero_after_ff)
- fgetc(ifp);
vbits += 8;
}
return ret;
@@ -538,7 +689,7 @@
enough to decode Canon, Kodak and Adobe DNG images.
*/
struct jhead {
- int bits, high, wide, clrs, vpred[4];
+ int bits, high, wide, clrs, restart, vpred[4];
struct decode *huff[4];
ushort *row;
};
@@ -551,6 +702,7 @@
init_decoder();
for (i=0; i < 4; i++)
jh->huff[i] = free_decode;
+ jh->restart = INT_MAX;
fread (data, 2, 1, ifp);
if (data[0] != 0xff || data[1] != 0xd8) return 0;
do {
@@ -571,14 +723,14 @@
jh->huff[*dp] = free_decode;
dp = make_decoder (++dp, 0);
}
+ break;
+ case 0xffdd:
+ jh->restart = data[0] << 8 | data[1];
}
} while (tag != 0xffda);
jh->row = calloc (jh->wide*jh->clrs, 2);
merror (jh->row, " jpeg_start()");
- for (i=0; i < 4; i++)
- jh->vpred[i] = 1 << (jh->bits-1);
zero_after_ff = 1;
- getbits(-1);
return 1;
}
@@ -588,17 +740,24 @@
while (dindex->branch[0])
dindex = dindex->branch[getbits(1)];
- diff = getbits (len = dindex->leaf);
+ len = dindex->leaf;
+ if (len == 16 && (!dng_version || dng_version >= 0x1010000))
+ return -32768;
+ diff = getbits(len);
if ((diff & (1 << (len-1))) == 0)
diff -= (1 << len) - 1;
return diff;
}
-void CLASS ljpeg_row (struct jhead *jh)
+void CLASS ljpeg_row (int jrow, struct jhead *jh)
{
int col, c, diff;
ushort *outp=jh->row;
+ if (jrow * jh->wide % jh->restart == 0) {
+ FORC4 jh->vpred[c] = 1 << (jh->bits-1);
+ getbits(-1);
+ }
for (col=0; col < jh->wide; col++)
for (c=0; c < jh->clrs; c++) {
diff = ljpeg_diff (jh->huff[c]);
@@ -617,9 +776,11 @@
jwide = jh.wide * jh.clrs;
for (jrow=0; jrow < jh.high; jrow++) {
- ljpeg_row (&jh);
+ ljpeg_row (jrow, &jh);
for (jcol=0; jcol < jwide; jcol++) {
- val = curve[jh.row[jcol]];
+ val = jh.row[jcol];
+ if (jh.bits <= 12)
+ val = curve[val];
jidx = jrow*jwide + jcol;
if (raw_width == 5108) {
i = jidx / (1680*jh.high);
@@ -659,8 +820,10 @@
void CLASS adobe_copy_pixel (int row, int col, ushort **rp)
{
- unsigned r=row, c=col;
+ unsigned r, c;
+ r = row -= top_margin;
+ c = col -= left_margin;
if (fuji_secondary && use_secondary) (*rp)++;
if (filters) {
if (fuji_width) {
@@ -670,11 +833,12 @@
if (r < height && c < width)
BAYER(r,c) = **rp < 0x1000 ? curve[**rp] : **rp;
*rp += 1 + fuji_secondary;
- } else
- for (c=0; c < tiff_samples; c++) {
- image[row*width+col][c] = **rp < 0x1000 ? curve[**rp] : **rp;
- (*rp)++;
- }
+ } else {
+ if (r < height && c < width)
+ for (c=0; c < tiff_samples; c++)
+ image[row*width+col][c] = (*rp)[c] < 0x1000 ? curve[(*rp)[c]]:(*rp)[c];
+ *rp += tiff_samples;
+ }
if (fuji_secondary && use_secondary) (*rp)--;
}
@@ -699,7 +863,7 @@
twide = raw_width-tcol;
for (jrow=0; jrow < jh.high; jrow++) {
- ljpeg_row (&jh);
+ ljpeg_row (jrow, &jh);
for (rp=jh.row, jcol=0; jcol < twide; jcol++)
adobe_copy_pixel (trow+jrow, tcol+jcol, &rp);
}
@@ -764,7 +928,6 @@
if (diff >= csize) diff = csize-1;
BAYER(row,col-left_margin) = curve[diff];
}
- maximum = curve[csize-1];
free (curve);
}
@@ -851,9 +1014,11 @@
}
/*
- Separates a Pentax Optio 33WR from a Nikon E3700.
+ Returns 0 for a Pentax Optio 33WR,
+ 1 for a Nikon E3700,
+ 2 for an Olympus C740UZ.
*/
-int CLASS pentax_optio33()
+int CLASS nikon_3700()
{
int i, sum[] = { 0, 0 };
uchar tail[952];
@@ -862,7 +1027,8 @@
fread (tail, 1, sizeof tail, ifp);
for (i=0; i < sizeof tail; i++)
sum[(i>>2) & 1] += tail[i];
- return sum[0] < sum[1]*4;
+ if (sum[1] > 4*sum[0]) return 2;
<<Diff was trimmed, longer than 597 lines>>
---- CVS-web:
http://cvs.pld-linux.org/SOURCES/dcraw.1?r1=1.2&r2=1.3&f=u
http://cvs.pld-linux.org/SOURCES/dcraw.c?r1=1.3&r2=1.4&f=u
More information about the pld-cvs-commit
mailing list