# HG changeset patch # User gqview # Date 1116208191 0 # Node ID ee03f36e9e4ba0ba3cc9cb2fb77fdf41b591f534 # Parent 606fcf461a689b7e6e5d7e56cdfc4cb041b3ad1d Sun May 15 21:40:26 2005 John Ellis * format_raw.[ch]: New files to parse image data and exif offsets for the raw camera formats. * exif.c, image-load.c: Add support calls to format_raw.c functions above. * filelist.c: Add Fujifilm raw file extension to known formats. * thumb_standard.c (thumb_loader_std_start): Check for existing thumbnail file before checking for a failure mark. * src/Makefile.am: Add format_raw.[ch]. ##### Note: GQview CVS on sourceforge is not always up to date, please use ##### ##### an offical release when making enhancements and translation updates. ##### diff -r 606fcf461a68 -r ee03f36e9e4b ChangeLog --- a/ChangeLog Sat May 14 20:58:18 2005 +0000 +++ b/ChangeLog Mon May 16 01:49:51 2005 +0000 @@ -1,3 +1,14 @@ +Sun May 15 21:40:26 2005 John Ellis + + * format_raw.[ch]: New files to parse image data and exif offsets for + the raw camera formats. + * exif.c, image-load.c: Add support calls to format_raw.c functions + above. + * filelist.c: Add Fujifilm raw file extension to known formats. + * thumb_standard.c (thumb_loader_std_start): Check for existing + thumbnail file before checking for a failure mark. + * src/Makefile.am: Add format_raw.[ch]. + Sat May 14 13:04:23 2005 John Ellis * po/cs.po: Update Czech translation, diff -r 606fcf461a68 -r ee03f36e9e4b src/Makefile.am --- a/src/Makefile.am Sat May 14 20:58:18 2005 +0000 +++ b/src/Makefile.am Mon May 16 01:49:51 2005 +0000 @@ -84,6 +84,8 @@ exif.h \ filelist.c \ filelist.h \ + format_raw.c \ + format_raw.h \ fullscreen.c \ fullscreen.h \ globals.c \ diff -r 606fcf461a68 -r ee03f36e9e4b src/exif.c --- a/src/exif.c Sat May 14 20:58:18 2005 +0000 +++ b/src/exif.c Mon May 16 01:49:51 2005 +0000 @@ -70,6 +70,7 @@ #include "exif.h" +#include "format_raw.h" #include "ui_fileops.h" @@ -437,18 +438,22 @@ #define BYTE_ORDER_INTEL 1 #define BYTE_ORDER_MOTOROLA 2 - + + #define MARKER_UNKNOWN 0x00 #define MARKER_SOI 0xD8 #define MARKER_APP1 0xE1 -typedef struct { +/* These data structs are packed to make sure the + * byte alignment matches the on-disk data format. + */ +typedef struct __attribute__((packed)) { char byte_order[2]; uint16_t magic; uint32_t IFD_offset; } TIFFHeader; -typedef struct { +typedef struct __attribute__((packed)) { uint16_t tag; uint16_t format; uint32_t nb; @@ -1081,6 +1086,16 @@ if (res != 0) { + guint32 offset = 0; + + if (format_raw_img_exif_offsets(-1, f, size, NULL, &offset)) + { + res = parse_TIFF(exif, (unsigned char*)f + offset, size - offset); + } + } + + if (res != 0) + { exif_free(exif); exif = NULL; } diff -r 606fcf461a68 -r ee03f36e9e4b src/filelist.c --- a/src/filelist.c Sat May 14 20:58:18 2005 +0000 +++ b/src/filelist.c Mon May 16 01:49:51 2005 +0000 @@ -207,6 +207,11 @@ filter_add_if_missing("ico", "Icon file", ".ico;.cur", FALSE); filter_add_if_missing("ras", "Raster", ".ras", FALSE); filter_add_if_missing("svg", "Scalable Vector Graphics", ".svg", FALSE); + + /* These are the raw camera formats with embedded jpeg/exif. + * (see format_raw.c) + */ + filter_add_if_missing("raf", "Fujifilm raw camera format", ".raf", TRUE); } static GList *filter_to_list(const gchar *extensions) diff -r 606fcf461a68 -r ee03f36e9e4b src/format_raw.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/format_raw.c Mon May 16 01:49:51 2005 +0000 @@ -0,0 +1,86 @@ +/* + * GQView + * (C) 2005 John Ellis + * + * Authors: + * Original version 2005 Lars Ellenberg, base on dcraw by David coffin. + * + * This software is released under the GNU General Public License (GNU GPL). + * Please read the included file COPYING for more information. + * This software comes with no warranty of any kind, use at your own risk! + */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include +#include + +#include + +#include "intl.h" + +#include "format_raw.h" + +static gint format_raw_test_canon(int fd, const void *data, const guint len, + guint *image_offset, guint *exif_offset) +{ + return FALSE; +} + +static gint format_raw_test_fuji(int fd, const void *data, const guint len, + guint *image_offset, guint *exif_offset) +{ + if (len < 128 || + memcmp(data, "FUJIFILM", 8) != 0) + { + return FALSE; + } + + *image_offset = GUINT32_FROM_BE(*(guint32*)(data + 84)); + *exif_offset = *image_offset + 12; +printf("found a raw fuji file!\n"); + return TRUE; +} + +static gint format_raw_test_nikon(int fd, const void *data, const guint len, + guint *image_offset, guint *exif_offset) +{ + return FALSE; +} + + +gint format_raw_img_exif_offsets(int fd, const void *data, const guint len, + guint *image_offset, guint *exif_offset) +{ + guint32 io = 0; + guint32 eo = 0; + gint found; + + if (fd < 0 && !data) return FALSE; +#if 0 + if (len < 512) return FALSE; +#endif + + found = format_raw_test_canon(fd, data, len, &io, &eo) || + format_raw_test_fuji (fd, data, len, &io, &eo) || + format_raw_test_nikon(fd, data, len, &io, &eo); + + if (!found || + io >= len - 4 || + eo >= len || + memcmp(data + io, "\xff\xd8\xff\xe1", 4) != 0) /* jpeg marker */ + { + return FALSE; + } + + if (image_offset) *image_offset = io; + if (exif_offset) *exif_offset = eo; + + return TRUE; +} + + + diff -r 606fcf461a68 -r ee03f36e9e4b src/format_raw.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/format_raw.h Mon May 16 01:49:51 2005 +0000 @@ -0,0 +1,20 @@ +/* + * GQView + * (C) 2005 John Ellis + * + * Authors: + * Original version 2005 Lars Ellenberg, base on dcraw by David coffin. + * + * This software is released under the GNU General Public License (GNU GPL). + * Please read the included file COPYING for more information. + * This software comes with no warranty of any kind, use at your own risk! + */ + +#ifndef __FORMAT_RAW_H +#define __FORMAT_RAW_H + +gint format_raw_img_exif_offsets(int fd, const void *data, const guint len, + guint *image_offset, guint *exif_offset); + +#endif + diff -r 606fcf461a68 -r ee03f36e9e4b src/image-load.c --- a/src/image-load.c Sat May 14 20:58:18 2005 +0000 +++ b/src/image-load.c Mon May 16 01:49:51 2005 +0000 @@ -13,6 +13,7 @@ #include "gqview.h" #include "image-load.h" +#include "format_raw.h" #include "ui_fileops.h" #include @@ -210,6 +211,7 @@ { guchar buf[IMAGE_LOADER_BUFFER_SIZE]; int b; + unsigned int offset = 0; if (!il->loader || il->pixbuf) return FALSE; @@ -221,7 +223,9 @@ return FALSE; } - if (gdk_pixbuf_loader_write(il->loader, buf, b, NULL)) + format_raw_img_exif_offsets(il->load_fd, buf, b, &offset, NULL); + + if (gdk_pixbuf_loader_write(il->loader, buf + offset, b - offset, NULL)) { il->bytes_read += b; diff -r 606fcf461a68 -r ee03f36e9e4b src/thumb_standard.c --- a/src/thumb_standard.c Sat May 14 20:58:18 2005 +0000 +++ b/src/thumb_standard.c Mon May 16 01:49:51 2005 +0000 @@ -715,14 +715,14 @@ { gint found; - if (thumb_loader_std_fail_check(tl)) return FALSE; - tl->thumb_path = thumb_loader_std_cache_path(tl, FALSE, NULL, FALSE); tl->thumb_path_local = FALSE; found = isfile(tl->thumb_path); if (found && thumb_loader_std_setup(tl, tl->thumb_path)) return TRUE; + if (thumb_loader_std_fail_check(tl)) return FALSE; + return thumb_loader_std_next_source(tl, found); }