[Rawstudio-commit] r2022 - trunk/src
Anders Brander
anders at brander.dk
Mon Sep 22 08:02:04 CEST 2008
Author: abrander
Date: 2008-09-22 08:02:04 +0200 (Mon, 22 Sep 2008)
New Revision: 2022
Modified:
trunk/src/dcraw.cc
trunk/src/dcraw.h
trunk/src/dcraw_api.cc
trunk/src/dcraw_api.h
Log:
Updated dcraw to v8.88 from v8.87.
Modified: trunk/src/dcraw.cc
===================================================================
--- trunk/src/dcraw.cc 2008-09-22 05:58:06 UTC (rev 2021)
+++ trunk/src/dcraw.cc 2008-09-22 06:02:04 UTC (rev 2022)
@@ -11,8 +11,8 @@
This is a adaptation of Dave Coffin's original dcraw.c to C++.
It can work as either a command-line tool or called by other programs.
- $Revision: 1.404 $
- $Date: 2008/08/12 19:39:17 $
+ $Revision: 1.405 $
+ $Date: 2008/09/15 22:29:19 $
*/
/*
@@ -22,8 +22,8 @@
pserver:anonymous at ufraw.cvs.sourceforge.net:/cvsroot/ufraw
Current revisions:
-dcraw.cc [1.141]
-dcraw.h [1.43]
+dcraw.cc [1.143]
+dcraw.h [1.44]
dcraw_api.cc [1.48]
dcraw_api.h [1.31]
@@ -35,7 +35,7 @@
#include "config.h"
#endif
-#define DCRAW_VERSION "8.87"
+#define DCRAW_VERSION "8.88"
//#define _GNU_SOURCE
#define _USE_MATH_DEFINES
@@ -573,9 +573,9 @@
for (row=-top_margin; row < raw_height-top_margin; row++) {
read_shorts (dp=data, raw_width * 10 / 16);
for (col=-left_margin; col < raw_width-left_margin; col++) {
- if (vbits < 10)
+ if ((vbits -= 10) < 0)
buf = (vbits += 16, (buf << 16) + *dp++);
- pixel = buf >> (vbits -= 10) & 0x3ff;
+ pixel = buf >> vbits & 0x3ff;
if ((unsigned) row < height && (unsigned) col < width)
BAYER(row,col) = pixel;
else if (col > 1-left_margin && col != width)
@@ -1208,31 +1208,6 @@
}
}
-void CLASS nikon_load_raw()
-{
- int irow, row, col, i;
-
- getbits(-1);
- for (irow=0; irow < height; irow++) {
- row = irow;
- if (make[0] == 'O' || model[0] == 'E') {
- row = irow * 2 % height + irow / (height/2);
- if (row == 1 && data_offset == 0) {
- fseek (ifp, 0, SEEK_END);
- fseek (ifp, ftell(ifp)/2, SEEK_SET);
- getbits(-1);
- }
- }
- for (col=0; col < raw_width; col++) {
- i = getbits(12);
- if ((unsigned) (col-left_margin) < width)
- BAYER(row,col-left_margin) = i;
- if (tiff_compress > 32768 && (col % 10) == 9)
- if (getbits(8)) derror();
- }
- }
-}
-
/*
Figure out if a NEF file is compressed. These fancy heuristics
are only needed for the D100, thanks to a bug in some cameras
@@ -1341,34 +1316,6 @@
}
}
-void CLASS nikon_e2100_load_raw()
-{
- uchar data[4608], *dp;
- ushort pixel[3072], *pix;
- int row, col;
-
- for (row=0; row <= height; row+=2) {
- if (row == height) {
- fseek (ifp, 0, SEEK_END);
- fseek (ifp, ftell(ifp)/2, SEEK_SET);
- row = 1;
- }
- fread (data, 1, width*3/2, ifp);
- for (dp=data, pix=pixel; pix < pixel+width; dp+=12, pix+=8) {
- pix[0] = (dp[2] >> 4) + (dp[ 3] << 4);
- pix[1] = (dp[2] << 8) + dp[ 1];
- pix[2] = (dp[7] >> 4) + (dp[ 0] << 4);
- pix[3] = (dp[7] << 8) + dp[ 6];
- pix[4] = (dp[4] >> 4) + (dp[ 5] << 4);
- pix[5] = (dp[4] << 8) + dp[11];
- pix[6] = (dp[9] >> 4) + (dp[10] << 4);
- pix[7] = (dp[9] << 8) + dp[ 8];
- }
- for (col=0; col < width; col++)
- BAYER(row,col) = (pixel[col] & 0xfff);
- }
-}
-
/*
The Fuji Super CCD is just a Bayer grid rotated 45 degrees.
*/
@@ -1684,11 +1631,10 @@
if (nbits == -1)
return bitbuf = vbits = 0;
if (nbits == 0) return 0;
- if (vbits < nbits) {
+ if ((vbits -= nbits) < 0) {
bitbuf = bitbuf << 32 | get4();
vbits += 32;
}
- vbits -= nbits;
return bitbuf << (64-nbits-vbits) >> (64-nbits);
}
@@ -1848,19 +1794,40 @@
void CLASS packed_12_load_raw()
{
- int row, col;
+ int vbits=0, rbits=0, irow, row, col;
+ UINT64 bitbuf=0;
- if (raw_width * 2 < width * 3)
- raw_width = raw_width * 3 / 2; /* Convert raw_width to bytes */
- getbits(-1);
- for (row=0; row < height; row++) {
- for (col=0; col < left_margin; col++)
- getbits(12);
- for (col=0; col < width; col++)
- BAYER(row,col) = getbits(12);
- for (col = (width+left_margin)*3/2; col < raw_width; col++)
- if (getbits(8) && raw_width-col < 35 && width != 3896) derror();
+ if (raw_width * 2 >= width * 3) { /* If raw_width is in bytes, */
+ rbits = raw_width * 8;
+ raw_width = raw_width * 2 / 3; /* convert it to pixels and */
+ rbits -= raw_width * 12; /* save the remainder. */
}
+ order = load_flags & 1 ? 0x4949 : 0x4d4d;
+ for (irow=0; irow < height; irow++) {
+ row = irow;
+ if (load_flags & 2 &&
+ (row = irow * 2 % height + irow / (height/2)) == 1 &&
+ load_flags & 4) {
+ if (vbits=0, tiff_compress)
+ fseek (ifp, data_offset - (-width*height*3/4 & -2048), SEEK_SET);
+ else {
+ fseek (ifp, 0, SEEK_END);
+ fseek (ifp, ftell(ifp)/2, SEEK_SET);
+ }
+ }
+ for (col=0; col < raw_width; col++) {
+ if ((vbits -= 12) < 0) {
+ bitbuf = bitbuf << 32 | get4();
+ vbits += 32;
+ }
+ if ((unsigned) (col-left_margin) < width)
+ BAYER(row,col-left_margin) = bitbuf << (52-vbits) >> 52;
+ if (load_flags & 8 && (col % 10) == 9)
+ if (vbits=0, bitbuf & 255) derror();
+ }
+ vbits -= rbits;
+ }
+ if (!strcmp(make,"OLYMPUS")) black >>= 4;
}
void CLASS unpacked_load_raw()
@@ -1913,8 +1880,8 @@
if (!nbits) return vbits=0;
if (!vbits) {
- fread (buf+pana_shift, 1, 0x4000-pana_shift, ifp);
- fread (buf, 1, pana_shift, ifp);
+ fread (buf+load_flags, 1, 0x4000-load_flags, ifp);
+ fread (buf, 1, load_flags, ifp);
}
vbits = (vbits - nbits) & 0x1ffff;
byte = vbits >> 3 ^ 0x3ff0;
@@ -1930,15 +1897,15 @@
for (col=0; col < raw_width; col++) {
if ((i = col % 14) == 0)
pred[0] = pred[1] = nonz[0] = nonz[1] = 0;
- if (i % 3 == 2) sh = 4 >> (3 - pana_bits(2));
+ if (i % 3 == 2) sh = 4 >> (3 - pana_bits(2));
if (nonz[i & 1]) {
if ((j = pana_bits(8))) {
if ((pred[i & 1] -= 0x80 << sh) < 0 || sh == 4)
pred[i & 1] &= ~(-1 << sh);
pred[i & 1] += j << sh;
- }
- } else if ((nonz[i & 1] = pana_bits(8)) || i > 11)
- pred[i & 1] = nonz[i & 1] << 4 | pana_bits(4);
+ }
+ } else if ((nonz[i & 1] = pana_bits(8)) || i > 11)
+ pred[i & 1] = nonz[i & 1] << 4 | pana_bits(4);
if (col < width)
if ((BAYER(row,col) = pred[col & 1]) > 4098) derror();
}
@@ -2012,22 +1979,6 @@
}
}
-void CLASS olympus_cseries_load_raw()
-{
- int irow, row, col;
-
- for (irow=0; irow < height; irow++) {
- row = irow * 2 % height + irow / (height/2);
- if (row < 2) {
- fseek (ifp, data_offset - row*(-width*height*3/4 & -2048), SEEK_SET);
- getbits(-1);
- }
- for (col=0; col < width; col++)
- BAYER(row,col) = getbits(12);
- }
- black >>= 4;
-}
-
void CLASS minolta_rd175_load_raw()
{
uchar pixel[768];
@@ -3886,9 +3837,9 @@
if (uc > (unsigned)(iwidth-2)) continue;
fc -= uc;
pix = img + ur*iwidth + uc;
- image[row*iwidth+col][c] = (ushort)
- ((pix[ 0]*(1-fc) + pix[ 1]*fc) * (1-fr) +
- (pix[iwidth]*(1-fc) + pix[iwidth+1]*fc) * fr);
+ image[row*iwidth+col][c] = (ushort)(
+ (pix[ 0]*(1-fc) + pix[ 1]*fc) * (1-fr) +
+ (pix[iwidth]*(1-fc) + pix[iwidth+1]*fc) * fr);
}
}
free(img);
@@ -5025,6 +4976,10 @@
case 272: /* Model */
fgets (model, 64, ifp);
break;
+ case 280: /* Panasonic RW2 offset */
+ if (~tiff_ifd[ifd].offset) break;
+ load_raw = &CLASS panasonic_load_raw;
+ load_flags = 0x2008;
case 273: /* StripOffset */
case 513:
tiff_ifd[ifd].offset = get4()+base;
@@ -5049,12 +5004,6 @@
case 514:
tiff_ifd[ifd].bytes = get4();
break;
- case 280: /* Panasonic RW2 offset */
- if (tiff_ifd[ifd].offset != -1) break;
- tiff_ifd[ifd].offset = get4()+base;
- pana_shift = 0x2008;
- load_raw = &CLASS panasonic_load_raw;
- break;
case 305: /* Software */
fgets (software, 64, ifp);
if (!strncmp(software,"Adobe",5) ||
@@ -5406,16 +5355,14 @@
switch (tiff_bps) {
case 8: load_raw = &CLASS eight_bit_load_raw; break;
case 12: load_raw = &CLASS packed_12_load_raw;
- if (!strncmp(make,"NIKON",5))
- load_raw = &CLASS nikon_load_raw;
+ if (tiff_ifd[raw].phint == 2)
+ load_flags = 6;
if (strncmp(make,"PENTAX",6)) break;
case 14:
case 16: load_raw = &CLASS unpacked_load_raw; break;
}
if (tiff_ifd[raw].bytes*5 == raw_width*raw_height*8)
load_raw = &CLASS olympus_e300_load_raw;
- if (tiff_bps == 12 && tiff_ifd[raw].phint == 2)
- load_raw = &CLASS olympus_cseries_load_raw;
break;
case 6: case 7: case 99:
load_raw = &CLASS lossless_jpeg_load_raw; break;
@@ -5428,7 +5375,7 @@
raw_height += 8;
load_raw = &CLASS sony_arw_load_raw; break;
case 32769:
- load_raw = &CLASS nikon_load_raw; break;
+ load_flags = 8;
case 32773:
load_raw = &CLASS packed_12_load_raw; break;
case 34713:
@@ -5908,7 +5855,7 @@
memset (&t, 0, sizeof t);
if (sscanf (date, "%*s %s %d %d:%d:%d %d", month, &t.tm_mday,
&t.tm_hour, &t.tm_min, &t.tm_sec, &t.tm_year) == 6) {
- for (i=0; i < 12 && strcmp(mon[i],month); i++);
+ for (i=0; i < 12 && strcasecmp(mon[i],month); i++);
t.tm_mon = i;
t.tm_year -= 1900;
if (mktime(&t) > 0)
@@ -6177,6 +6124,8 @@
{ 15591,-6402,-1592,-5365,13198,2168,-1300,1824,5075 } },
{ "Canon PowerShot A620", 0, 0, /* DJC */
{ 15265,-6193,-1558,-4125,12116,2010,-888,1639,5220 } },
+ { "Canon PowerShot A630", 0, 0, /* DJC */
+ { 14201,-5308,-1757,-6087,14472,1617,-2191,3105,5348 } },
{ "Canon PowerShot A640", 0, 0, /* DJC */
{ 13124,-5329,-1390,-3602,11658,1944,-1612,2863,4885 } },
{ "Canon PowerShot A650", 0, 0, /* DJC */
@@ -6344,7 +6293,7 @@
{ "NIKON D80", 0, 0,
{ 8629,-2410,-883,-9055,16940,2171,-1490,1363,8520 } },
{ "NIKON D90", 0, 0xf00, /* DJC */
- { 9692,-2519,-831,-5396,13053,2344,-1818,2682,7084 } },
+ { 9692,-2519,-831,-5396,13053,2344,-1818,2682,7084 } },
{ "NIKON D200", 0, 0xfbc,
{ 8367,-2248,-763,-8758,16447,2422,-1527,1550,8053 } },
{ "NIKON D300", 0, 0,
@@ -6486,7 +6435,9 @@
{ "SONY DSLR-A350", 0, 0xffc,
{ 6038,-1484,-578,-9146,16746,2513,-875,746,7217 } },
{ "SONY DSLR-A700", 254, 0x1ffe,
- { 5775,-805,-359,-8574,16295,2391,-1943,2341,7249 } }
+ { 5775,-805,-359,-8574,16295,2391,-1943,2341,7249 } },
+ { "SONY DSLR-A900", 254, 0x1ffe, /* DJC */
+ { 6971,-1730,-794,-5763,13529,2236,-1500,2251,6715 } }
};
double cam_xyz[4][3];
char name[130];
@@ -6638,7 +6589,7 @@
load_raw = thumb_load_raw = 0;
write_thumb = &CLASS jpeg_thumb;
data_offset = meta_length = tiff_bps = tiff_compress = 0;
- kodak_cbpp = zero_after_ff = dng_version = pana_shift = 0;
+ kodak_cbpp = zero_after_ff = dng_version = load_flags = 0;
timestamp = shot_order = tiff_samples = black = is_foveon = 0;
mix_green = profile_length = data_error = zero_is_bad = 0;
pixel_aspect = is_raw = raw_color = use_gamma = 1;
@@ -6788,8 +6739,12 @@
if ((is_canon = !strcmp(make,"Canon")))
load_raw = memcmp (head+6,"HEAPCCDR",8) ?
&CLASS lossless_jpeg_load_raw : &CLASS canon_compressed_load_raw;
- if (!strcmp(make,"NIKON") && !load_raw)
- load_raw = &CLASS nikon_load_raw;
+ if (!strcmp(make,"NIKON")) {
+ if (!load_raw)
+ load_raw = &CLASS packed_12_load_raw;
+ if (model[0] == 'E')
+ load_flags |= !data_offset << 2 | 2;
+ }
if (!strcmp(make,"CASIO")) {
load_raw = &CLASS packed_12_load_raw;
maximum = 0xf7f;
@@ -6803,7 +6758,7 @@
filters = 0;
load_raw = &CLASS foveon_load_raw;
simple_coeff(0);
- } else if (is_canon && tiff_samples == 4) {
+ } else if (is_canon && tiff_bps == 15) {
filters = 0;
load_raw = &CLASS canon_sraw_load_raw;
} else if (!strcmp(model,"PowerShot 600")) {
@@ -7011,6 +6966,12 @@
top_margin = 34;
left_margin = 90;
goto canon_cr2;
+ } else if (is_canon && raw_width == 1208) {
+ top_margin = 51;
+ left_margin = 62;
+ raw_width = width *= 4;
+ maximum = 0x3d93;
+ goto canon_cr2;
} else if (is_canon && raw_width == 5108) {
top_margin = 13;
left_margin = 98;
@@ -7045,7 +7006,8 @@
width -= 42;
} else if (!strcmp(model,"D100")) {
if (tiff_compress == 34713 && !nikon_is_compressed()) {
- load_raw = &CLASS nikon_load_raw;
+ load_raw = &CLASS packed_12_load_raw;
+ load_flags |= 8;
raw_width = (width += 3) + 3;
}
} else if (!strcmp(model,"D200")) {
@@ -7060,6 +7022,9 @@
else width -= 8;
} else if (!strcmp(model,"D300")) {
width -= 32;
+ } else if (!strcmp(model,"COOLPIX P6000")) {
+ load_flags = 1;
+ filters = 0x94949494;
} else if (fsize == 1581060) {
height = 963;
width = 1287;
@@ -7085,7 +7050,8 @@
width = 2064;
colors = 4;
filters = 0xe1e1e1e1;
- load_raw = &CLASS nikon_load_raw;
+ load_raw = &CLASS packed_12_load_raw;
+ load_flags = 6;
if (!timestamp && nikon_e995())
strcpy (model, "E995");
if (strcmp(model,"E995")) {
@@ -7099,7 +7065,7 @@
if (!timestamp && !nikon_e2100()) goto cp_e2500;
height = 1206;
width = 1616;
- load_raw = &CLASS nikon_e2100_load_raw;
+ load_flags = 7;
} else if (!strcmp(model,"E2500")) {
cp_e2500:
strcpy (model, "E2500");
@@ -7110,7 +7076,8 @@
} else if (fsize == 4775936) {
height = 1542;
width = 2064;
- load_raw = &CLASS nikon_e2100_load_raw;
+ load_raw = &CLASS packed_12_load_raw;
+ load_flags = 7;
pre_mul[0] = 1.818;
pre_mul[2] = 1.618;
if (!timestamp) nikon_3700();
@@ -7130,8 +7097,8 @@
strcpy (make, "Minolta");
strcpy (model,"DiMAGE Z2");
}
- if (make[0] == 'M')
- load_raw = &CLASS nikon_e2100_load_raw;
+ load_raw = &CLASS packed_12_load_raw;
+ load_flags = 6 + (make[0] == 'M');
} else if (!strcmp(model,"E4500")) {
height = 1708;
width = 2288;
@@ -7146,7 +7113,8 @@
height = 2118;
width = 2832;
maximum = 0xf83;
- load_raw = &CLASS nikon_e2100_load_raw;
+ load_raw = &CLASS packed_12_load_raw;
+ load_flags = 7;
} else if (!strcmp(model,"FinePix S5100") ||
!strcmp(model,"FinePix S5500")) {
height -= top_margin = 6;
@@ -7251,7 +7219,8 @@
} else if (!strcmp(model,"Optio 750Z")) {
height = 2302;
width = 3072;
- load_raw = &CLASS nikon_e2100_load_raw;
+ load_raw = &CLASS packed_12_load_raw;
+ load_flags = 7;
} else if (!strcmp(model,"STV680 VGA")) {
height = 484;
width = 644;
@@ -7485,7 +7454,8 @@
height = 1718;
width = 2304;
filters = 0x16161616;
- load_raw = &CLASS nikon_e2100_load_raw;
+ load_raw = &CLASS packed_12_load_raw;
+ load_flags = 7;
} else if (!strcmp(make,"OLYMPUS")) {
height += height & 1;
filters = exif_cfa;
Modified: trunk/src/dcraw.h
===================================================================
--- trunk/src/dcraw.h 2008-09-22 05:58:06 UTC (rev 2021)
+++ trunk/src/dcraw.h 2008-09-22 06:02:04 UTC (rev 2022)
@@ -50,7 +50,7 @@
unsigned tiff_nifds, tiff_samples, tiff_bps, tiff_compress;
unsigned black, maximum, mix_green, raw_color, use_gamma, zero_is_bad;
unsigned zero_after_ff, is_raw, dng_version, is_foveon, data_error;
-unsigned tile_width, tile_length, gpsdata[32], pana_shift;
+unsigned tile_width, tile_length, gpsdata[32], load_flags;
ushort raw_height, raw_width, height, width, top_margin, left_margin;
ushort shrink, iheight, iwidth, fuji_width, thumb_width, thumb_height;
int flip, tiff_flip, colors;
@@ -133,14 +133,12 @@
void adobe_dng_load_raw_nc();
void pentax_k10_load_raw();
void nikon_compressed_load_raw();
-void nikon_load_raw();
int nikon_is_compressed();
int nikon_e995();
int nikon_e2100();
void nikon_3700();
int minolta_z2();
void nikon_e900_load_raw();
-void nikon_e2100_load_raw();
void fuji_load_raw();
void jpeg_thumb (FILE *tfp);
void ppm_thumb (FILE *tfp);
Modified: trunk/src/dcraw_api.cc
===================================================================
--- trunk/src/dcraw_api.cc 2008-09-22 05:58:06 UTC (rev 2021)
+++ trunk/src/dcraw_api.cc 2008-09-22 06:02:04 UTC (rev 2022)
@@ -16,6 +16,7 @@
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
+
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
Modified: trunk/src/dcraw_api.h
===================================================================
--- trunk/src/dcraw_api.h 2008-09-22 05:58:06 UTC (rev 2021)
+++ trunk/src/dcraw_api.h 2008-09-22 06:02:04 UTC (rev 2022)
@@ -16,6 +16,10 @@
#ifndef _DCRAW_API_H
#define _DCRAW_API_H
+#ifdef HAVE_LENSFUN
+#include <lensfun.h>
+#endif /* HAVE_LENSFUN */
+
#ifdef __cplusplus
extern "C" {
#endif
More information about the Rawstudio-commit
mailing list