view src/format_raw.c @ 43:ee03f36e9e4b

Sun May 15 21:40:26 2005 John Ellis <johne@verizon.net> * 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. #####
author gqview
date Mon, 16 May 2005 01:49:51 +0000
parents
children 7cfa60beda76
line wrap: on
line source

/*
 *  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 <stdio.h>
#include <string.h>
#include <unistd.h>

#include <glib.h>

#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;
}