summaryrefslogtreecommitdiff
path: root/dcraw
diff options
context:
space:
mode:
authorhub <hub>2005-06-28 02:01:34 +0000
committerhub <hub>2005-06-28 02:01:34 +0000
commit219f5a070a920aca313c786471535fff4cd1280c (patch)
treebbe95d6694150869d2f26532fdfdd24cd4b69de6 /dcraw
parenta8ad974cf918bc82330dc2c16efa7de8292b16d2 (diff)
new version of parse.c
Diffstat (limited to 'dcraw')
-rw-r--r--dcraw/parse.c77
1 files changed, 44 insertions, 33 deletions
diff --git a/dcraw/parse.c b/dcraw/parse.c
index 8152533..ce7eb0f 100644
--- a/dcraw/parse.c
+++ b/dcraw/parse.c
@@ -6,8 +6,8 @@
from any raw digital camera formats that have them, and
shows table contents.
- $Revision: 1.40 $
- $Date: 2005/06/06 05:32:07 $
+ $Revision: 1.42 $
+ $Date: 2005/06/27 20:22:12 $
*/
#include <stdio.h>
@@ -511,6 +511,28 @@ void parse_ciff (int offset, int length, int level)
}
}
+int parse_jpeg (int offset)
+{
+ int len, save, hlen;
+
+ fseek (ifp, offset, SEEK_SET);
+ if (fgetc(ifp) != 0xff || fgetc(ifp) != 0xd8) return 0;
+
+ while (fgetc(ifp) == 0xff && fgetc(ifp) >> 4 != 0xd) {
+ order = 0x4d4d;
+ len = get2() - 2;
+ save = ftell(ifp);
+ order = get2();
+ hlen = get4();
+ if (get4() == 0x48454150) /* "HEAP" */
+ parse_ciff (save+hlen, len-hlen, 0);
+ parse_tiff (save+6);
+ fseek (ifp, save+len, SEEK_SET);
+ }
+ thumb_length = 0;
+ return 1;
+}
+
void parse_mos(int level)
{
uchar data[256];
@@ -643,15 +665,20 @@ void parse_foveon()
switch (tag) {
case 0x32414d49: /* IMA2 */
case 0x47414d49: /* IMAG */
- if (++img == 2) { /* second image */
- thumb_offset = off;
- thumb_length = 1;
- }
printf ("type %d, " , get4());
printf ("format %2d, " , get4());
printf ("columns %4d, " , get4());
printf ("rows %4d, " , get4());
printf ("rowsize %d\n" , get4());
+ if (parse_jpeg (off+28)) {
+ thumb_offset = off+28;
+ thumb_length = len-28;
+ }
+ order = 0x4949;
+ if (++img == 2 && !thumb_length) {
+ thumb_offset = off;
+ thumb_length = 1;
+ }
break;
case 0x464d4143: /* CAMF */
printf ("type %d, ", get4());
@@ -695,9 +722,12 @@ void parse_foveon()
printf (" ");
for (k=0; k < dim[0]; k++)
switch (type) {
+ case 5:
+ printf ("%7d", *(uchar *)dp++);
+ break;
case 0:
case 6:
- printf ("%7d", sget2(dp));
+ printf ("%7d", (short) sget2(dp));
dp += 2;
break;
case 1:
@@ -918,8 +948,10 @@ void parse_phase_one (int base)
unsigned entries, tag, type, len, data, save;
char str[256];
- fseek (ifp, base + 8, SEEK_SET);
- fseek (ifp, base + get4(), SEEK_SET);
+ fseek (ifp, base, SEEK_SET);
+ order = get4() & 0xffff;
+ if (get4() >> 8 != 0x526177) return;
+ fseek (ifp, base+get4(), SEEK_SET);
entries = get4();
get4();
while (entries--) {
@@ -936,7 +968,7 @@ void parse_phase_one (int base)
fread (str, 256, 1, ifp);
puts (str);
}
- if (type == 4 && len > 4) {
+ if (tag != 0x21c && type == 4 && len > 4) {
for ( ; len > 0; len -= 4)
printf ("%f ", get_float());
puts ("");
@@ -951,27 +983,6 @@ void parse_phase_one (int base)
strcpy (model, "unknown");
}
-void parse_jpeg (int offset)
-{
- int len, save, hlen;
-
- fseek (ifp, offset, SEEK_SET);
- if (fgetc(ifp) != 0xff || fgetc(ifp) != 0xd8) return;
-
- while (fgetc(ifp) == 0xff && fgetc(ifp) >> 4 != 0xd) {
- order = 0x4d4d;
- len = get2() - 2;
- save = ftell(ifp);
- order = get2();
- hlen = get4();
- if (get4() == 0x48454150) /* "HEAP" */
- parse_ciff (save+hlen, len-hlen, 0);
- parse_tiff (save+6);
- fseek (ifp, save+len, SEEK_SET);
- }
- thumb_length = 0;
-}
-
char *memmem (char *haystack, size_t haystacklen,
char *needle, size_t needlelen)
{
@@ -1000,8 +1011,8 @@ int identify()
fread (head, 1, 32, ifp);
fseek (ifp, 0, SEEK_END);
fsize = ftell(ifp);
- if ((cp = memmem (head, 32, "MMMMRawT", 8)) ||
- (cp = memmem (head, 32, "IIIITwaR", 8))) {
+ if ((cp = memmem (head, 32, "MMMM", 4)) ||
+ (cp = memmem (head, 32, "IIII", 4))) {
parse_phase_one (cp-head);
if (cp-head) parse_tiff (0);
} else if (order == 0x4949 || order == 0x4d4d) {