[Rawstudio-commit] r2010 - trunk/src

Anders Brander anders at brander.dk
Wed Sep 17 10:17:56 CEST 2008


Author: abrander
Date: 2008-09-17 10:17:56 +0200 (Wed, 17 Sep 2008)
New Revision: 2010

Modified:
   trunk/src/ciff-meta.c
   trunk/src/ciff-meta.h
   trunk/src/mrw-meta.c
   trunk/src/mrw-meta.h
   trunk/src/rawstudio.c
   trunk/src/rawstudio.h
   trunk/src/rs-metadata.c
   trunk/src/tiff-meta.c
   trunk/src/tiff-meta.h
   trunk/src/x3f-meta.c
   trunk/src/x3f-meta.h
Log:
Merged metadata and thumbnail loading.

Modified: trunk/src/ciff-meta.c
===================================================================
--- trunk/src/ciff-meta.c	2008-09-16 17:32:25 UTC (rev 2009)
+++ trunk/src/ciff-meta.c	2008-09-17 08:17:56 UTC (rev 2010)
@@ -181,7 +181,11 @@
 rs_ciff_load_meta(const gchar *filename, RSMetadata *meta)
 {
 	guint root=0;
+	GdkPixbuf *pixbuf = NULL, *pixbuf2 = NULL;
+	gdouble ratio;
+	guint start=0, length=0;//, root=0;
 	RAWFILE *rawfile;
+
 	rawfile = raw_open_file(filename);
 	if (!rawfile)
 		return;
@@ -190,43 +194,19 @@
 		return;
 	raw_get_uint(rawfile, 2, &root);
 	raw_crw_walker(rawfile, root, raw_get_filesize(rawfile)-root, meta);
-	raw_close_file(rawfile);
 
 	adobe_coeff_set(&meta->adobe_coeff, meta->model_ascii, meta->model_ascii);
-	return;
-}
 
-GdkPixbuf *
-rs_ciff_load_thumb(const gchar *src)
-{
-	GdkPixbuf *pixbuf = NULL, *pixbuf2 = NULL;
-	gdouble ratio;
-	guint start=0, length=0, root=0;
-	RSMetadata *m;
-	RAWFILE *rawfile;
-
-	raw_init();
-
-	rawfile = raw_open_file(src);
-	if (!rawfile) return(NULL);
-
-	raw_init_file_tiff(rawfile, 0);
-	if (!raw_strcmp(rawfile, 6, "HEAPCCDR", 8))
-		return(NULL);
-	raw_get_uint(rawfile, 2, &root);
-	m = rs_metadata_new();
-	raw_crw_walker(rawfile, root, raw_get_filesize(rawfile)-root, m);
-
-	if ((m->thumbnail_start>0) && (m->thumbnail_length>0))
+	if ((meta->thumbnail_start>0) && (meta->thumbnail_length>0))
 	{
-		start = m->thumbnail_start;
-		length = m->thumbnail_length;
+		start = meta->thumbnail_start;
+		length = meta->thumbnail_length;
 	}
 
-	else if ((m->preview_start>0) && (m->preview_length>0))
+	else if ((meta->preview_start>0) && (meta->preview_length>0))
 	{
-		start = m->preview_start;
-		length = m->preview_length;
+		start = meta->preview_start;
+		length = meta->preview_length;
 	}
 
 	if ((start>0) && (length>0))
@@ -240,7 +220,7 @@
 			pixbuf2 = gdk_pixbuf_scale_simple(pixbuf, (gint) (128.0*ratio), 128, GDK_INTERP_BILINEAR);
 		g_object_unref(pixbuf);
 		pixbuf = pixbuf2;
-		switch (m->orientation)
+		switch (meta->orientation)
 		{
 			/* this is very COUNTER-intuitive - gdk_pixbuf_rotate_simple() is wierd */
 			case 90:
@@ -254,8 +234,8 @@
 				pixbuf = pixbuf2;
 				break;
 		}
+		meta->thumbnail = pixbuf;
 	}
 	raw_close_file(rawfile);
-	g_object_unref(m);
-	return(pixbuf);
+	return;
 }

Modified: trunk/src/ciff-meta.h
===================================================================
--- trunk/src/ciff-meta.h	2008-09-16 17:32:25 UTC (rev 2009)
+++ trunk/src/ciff-meta.h	2008-09-17 08:17:56 UTC (rev 2010)
@@ -18,4 +18,3 @@
  */
 
 void rs_ciff_load_meta(const gchar *filename, RSMetadata *meta);
-GdkPixbuf *rs_ciff_load_thumb(const gchar *src);

Modified: trunk/src/mrw-meta.c
===================================================================
--- trunk/src/mrw-meta.c	2008-09-16 17:32:25 UTC (rev 2009)
+++ trunk/src/mrw-meta.c	2008-09-17 08:17:56 UTC (rev 2010)
@@ -72,46 +72,24 @@
 rs_mrw_load_meta(const gchar *filename, RSMetadata *meta)
 {
 	RAWFILE *rawfile;
+	GdkPixbuf *pixbuf=NULL, *pixbuf2=NULL;
+	guint start=0, length=0;
+
 	raw_init();
 	if (!(rawfile = raw_open_file(filename)))
 		return;
 
 	raw_mrw_walker(rawfile, 0, meta);
 
-	raw_close_file(rawfile);
-	return;
-}
-
-GdkPixbuf *
-rs_mrw_load_thumb(const gchar *src)
-{
-	RAWFILE *rawfile;
-	GdkPixbuf *pixbuf=NULL, *pixbuf2=NULL;
-	RSMetadata meta;
-	guint start=0, length=0;
-
-	raw_init();
-
-	meta.thumbnail_start = 0;
-	meta.thumbnail_length = 0;
-	meta.preview_start = 0;
-	meta.preview_length = 0;
-	meta.make = MAKE_MINOLTA;
-
-	if (!(rawfile = raw_open_file(src)))
-		return(NULL);
-	raw_mrw_walker(rawfile, 0, &meta);
-
-	if ((meta.thumbnail_start>0) && (meta.thumbnail_length>0))
+	if ((meta->thumbnail_start>0) && (meta->thumbnail_length>0))
 	{
-		start = meta.thumbnail_start;
-		length = meta.thumbnail_length;
+		start = meta->thumbnail_start;
+		length = meta->thumbnail_length;
 	}
-
-	else if ((meta.preview_start>0) && (meta.preview_length>0))
+	else if ((meta->preview_start>0) && (meta->preview_length>0))
 	{
-		start = meta.preview_start;
-		length = meta.preview_length;
+		start = meta->preview_start;
+		length = meta->preview_length;
 	}
 
 	if ((start>0) && (length>0))
@@ -132,7 +110,7 @@
 		gdk_pixbuf_loader_close(pl, NULL);
 		g_free(thumbbuffer);
 		
-		if (pixbuf==NULL) return(NULL);
+		if (pixbuf==NULL) return;
 		ratio = ((gdouble) gdk_pixbuf_get_width(pixbuf))/((gdouble) gdk_pixbuf_get_height(pixbuf));
 		if (ratio>1.0)
 			pixbuf2 = gdk_pixbuf_scale_simple(pixbuf, 128, (gint) (128.0/ratio), GDK_INTERP_BILINEAR);
@@ -140,7 +118,7 @@
 			pixbuf2 = gdk_pixbuf_scale_simple(pixbuf, (gint) (128.0*ratio), 128, GDK_INTERP_BILINEAR);
 		g_object_unref(pixbuf);
 		pixbuf = pixbuf2;
-		switch (meta.orientation)
+		switch (meta->orientation)
 		{
 			/* this is very COUNTER-intuitive - gdk_pixbuf_rotate_simple() is wierd */
 			case 90:
@@ -154,9 +132,10 @@
 				pixbuf = pixbuf2;
 				break;
 		}
+		meta->thumbnail = pixbuf;
 	}
 
 	raw_close_file(rawfile);
 
-	return(pixbuf);
+	return;
 }

Modified: trunk/src/mrw-meta.h
===================================================================
--- trunk/src/mrw-meta.h	2008-09-16 17:32:25 UTC (rev 2009)
+++ trunk/src/mrw-meta.h	2008-09-17 08:17:56 UTC (rev 2010)
@@ -21,6 +21,5 @@
 #define MRW_META_H
 
 extern void rs_mrw_load_meta(const gchar *filename, RSMetadata *meta);
-extern GdkPixbuf *rs_mrw_load_thumb(const gchar *src);
 
 #endif

Modified: trunk/src/rawstudio.c
===================================================================
--- trunk/src/rawstudio.c	2008-09-16 17:32:25 UTC (rev 2009)
+++ trunk/src/rawstudio.c	2008-09-17 08:17:56 UTC (rev 2010)
@@ -55,14 +55,13 @@
 static void photo_settings_changed(RS_PHOTO *photo, gint mask, RS_BLOB *rs);
 static void photo_spatial_changed(RS_PHOTO *photo, RS_BLOB *rs);
 static RS_SETTINGS *rs_settings_new();
-static GdkPixbuf *rs_thumb_gdk(const gchar *src);
+static void rs_gdk_load_meta(const gchar *src, RSMetadata *metadata);
 
 RS_FILETYPE *filetypes;
 
 static void
 rs_add_filetype(gchar *id, gint filetype, const gchar *ext, gchar *description,
 	RS_IMAGE16 *(*load)(const gchar *, gboolean),
-	GdkPixbuf *(*thumb)(const gchar *),
 	void (*load_meta)(const gchar *, RSMetadata *),
 	gboolean (*save)(RS_PHOTO *photo, const gchar *filename, gint filetype, gint width, gint height, gboolean keep_aspect, gdouble scale, gint snapshot, RS_CMS *cms))
 {
@@ -80,7 +79,6 @@
 	cur->ext = ext;
 	cur->description = description;
 	cur->load = load;
-	cur->thumb = thumb;
 	cur->load_meta = load_meta;
 	cur->save = save;
 	cur->next = NULL;
@@ -92,47 +90,47 @@
 {
 	filetypes = NULL;
 	rs_add_filetype("cr2", FILETYPE_RAW, ".cr2", _("Canon CR2"),
-		rs_image16_open_dcraw, rs_tiff_load_thumb, rs_tiff_load_meta, NULL);
+		rs_image16_open_dcraw,  rs_tiff_load_meta, NULL);
 	rs_add_filetype("crw", FILETYPE_RAW, ".crw", _("Canon CIFF"),
-		rs_image16_open_dcraw, rs_ciff_load_thumb, rs_ciff_load_meta, NULL);
+		rs_image16_open_dcraw,  rs_ciff_load_meta, NULL);
 	rs_add_filetype("nef", FILETYPE_RAW, ".nef", _("Nikon NEF"),
-		rs_image16_open_dcraw, rs_tiff_load_thumb, rs_tiff_load_meta, NULL);
+		rs_image16_open_dcraw,  rs_tiff_load_meta, NULL);
 	rs_add_filetype("mrw", FILETYPE_RAW, ".mrw", _("Minolta raw"),
-		rs_image16_open_dcraw, rs_mrw_load_thumb, rs_mrw_load_meta, NULL);
+		rs_image16_open_dcraw, rs_mrw_load_meta, NULL);
 	rs_add_filetype("cr-tiff", FILETYPE_RAW, ".tif", _("Canon TIFF"),
-		rs_image16_open_dcraw, rs_tiff_load_thumb, rs_tiff_load_meta, NULL);
+		rs_image16_open_dcraw,  rs_tiff_load_meta, NULL);
 	rs_add_filetype("arw", FILETYPE_RAW, ".arw", _("Sony"),
-		rs_image16_open_dcraw, rs_tiff_load_thumb, rs_tiff_load_meta, NULL);
+		rs_image16_open_dcraw,  rs_tiff_load_meta, NULL);
 	rs_add_filetype("sr2", FILETYPE_RAW, ".sr2", _("Sony"),
-		rs_image16_open_dcraw, rs_tiff_load_thumb, rs_tiff_load_meta, NULL);
+		rs_image16_open_dcraw,  rs_tiff_load_meta, NULL);
 	rs_add_filetype("sr2", FILETYPE_RAW, ".srf", _("Sony"),
-		rs_image16_open_dcraw, rs_tiff_load_thumb, rs_tiff_load_meta, NULL);
+		rs_image16_open_dcraw,  rs_tiff_load_meta, NULL);
 	rs_add_filetype("kdc", FILETYPE_RAW, ".kdc", _("Kodak"),
-		rs_image16_open_dcraw, rs_tiff_load_thumb, rs_tiff_load_meta, NULL);
+		rs_image16_open_dcraw,  rs_tiff_load_meta, NULL);
 	rs_add_filetype("kdc", FILETYPE_RAW, ".dcr", _("Kodak"),
-		rs_image16_open_dcraw, rs_tiff_load_thumb, rs_tiff_load_meta, NULL);
+		rs_image16_open_dcraw,  rs_tiff_load_meta, NULL);
 	rs_add_filetype("x3f", FILETYPE_RAW, ".x3f", _("Sigma"),
-		rs_image16_open_dcraw, rs_x3f_load_thumb, rs_x3f_load_meta, NULL);
+		rs_image16_open_dcraw, rs_x3f_load_meta, NULL);
 	rs_add_filetype("orf", FILETYPE_RAW, ".orf", "",
-		rs_image16_open_dcraw, rs_tiff_load_thumb, rs_tiff_load_meta, NULL);
+		rs_image16_open_dcraw,  rs_tiff_load_meta, NULL);
 	rs_add_filetype("raw", FILETYPE_RAW, ".raw", _("Panasonic raw"),
-		rs_image16_open_dcraw, rs_tiff_load_thumb, rs_tiff_load_meta, NULL);
+		rs_image16_open_dcraw,  rs_tiff_load_meta, NULL);
 	rs_add_filetype("pef", FILETYPE_RAW, ".pef", _("Pentax raw"),
-		rs_image16_open_dcraw, rs_tiff_load_thumb, rs_tiff_load_meta, NULL);
+		rs_image16_open_dcraw,  rs_tiff_load_meta, NULL);
 	rs_add_filetype("dng", FILETYPE_RAW, "dng", _("Adobe Digital negative"),
-		rs_image16_open_dcraw, rs_tiff_load_thumb, rs_tiff_load_meta, NULL);
+		rs_image16_open_dcraw,  rs_tiff_load_meta, NULL);
 	rs_add_filetype("mef", FILETYPE_RAW, "mef", _("Mamiya"),
-		rs_image16_open_dcraw, rs_tiff_load_thumb, rs_tiff_load_meta, NULL);
+		rs_image16_open_dcraw,  rs_tiff_load_meta, NULL);
 	rs_add_filetype("3fr", FILETYPE_RAW, "3fr", _("Hasselblad"),
-		rs_image16_open_dcraw, rs_tiff_load_thumb, rs_tiff_load_meta, NULL);
+		rs_image16_open_dcraw,  rs_tiff_load_meta, NULL);
 	rs_add_filetype("jpeg", FILETYPE_JPEG, ".jpg", _("JPEG (Joint Photographic Experts Group)"),
-		rs_image16_open_gdk, rs_thumb_gdk, NULL, rs_photo_save);
+		rs_image16_open_gdk, rs_gdk_load_meta, rs_photo_save);
 	rs_add_filetype("png", FILETYPE_PNG, ".png", _("PNG (Portable Network Graphics)"),
-		rs_image16_open_gdk, rs_thumb_gdk, NULL, rs_photo_save);
+		rs_image16_open_gdk, rs_gdk_load_meta, rs_photo_save);
 	rs_add_filetype("tiff8", FILETYPE_TIFF8, ".tif", _("8-bit TIFF (Tagged Image File Format)"),
-		rs_image16_open_gdk, rs_thumb_gdk, NULL, rs_photo_save);
+		rs_image16_open_gdk, rs_gdk_load_meta, rs_photo_save);
 	rs_add_filetype("tiff16", FILETYPE_TIFF16, ".tif", _("16-bit TIFF (Tagged Image File Format)"),
-		rs_image16_open_gdk, rs_thumb_gdk, NULL, rs_photo_save);
+		rs_image16_open_gdk, rs_gdk_load_meta, rs_photo_save);
 	return;
 }
 
@@ -657,14 +655,10 @@
 	return(ret);
 }
 
-static GdkPixbuf *
-rs_thumb_gdk(const gchar *src)
+void
+rs_gdk_load_meta(const gchar *src, RSMetadata *metadata)
 {
-	GdkPixbuf *pixbuf=NULL;
-
-	pixbuf = gdk_pixbuf_new_from_file_at_size(src, 128, 128, NULL);
-
-	return(pixbuf);
+	metadata->thumbnail = gdk_pixbuf_new_from_file_at_size(src, 128, 128, NULL);
 }
 
 GdkPixbuf *
@@ -677,19 +671,31 @@
 	{
 		pixbuf = gdk_pixbuf_new_from_file(thumbname, NULL);
 
-		if (!pixbuf && filetype->thumb)
+		if (!pixbuf)
 		{
-			pixbuf = filetype->thumb(src);
+			RSMetadata *metadata = rs_metadata_new_from_file(src);
+			pixbuf = metadata->thumbnail;
 
 			if (pixbuf)
+			{
+				g_object_ref(pixbuf);
 				gdk_pixbuf_save(pixbuf, thumbname, "png", NULL, NULL);
+			}
+			g_object_unref(metadata);
 		}
 
 		g_free(thumbname);
 	}
-	else if (filetype->thumb)
-		pixbuf = filetype->thumb(src);
+	else
+	{
+		RSMetadata *metadata = rs_metadata_new_from_file(src);
+		pixbuf = metadata->thumbnail;
 
+		if (pixbuf)
+			g_object_ref(pixbuf);
+		g_object_unref(metadata);
+	}
+
 	return pixbuf;
 }
 

Modified: trunk/src/rawstudio.h
===================================================================
--- trunk/src/rawstudio.h	2008-09-16 17:32:25 UTC (rev 2009)
+++ trunk/src/rawstudio.h	2008-09-17 08:17:56 UTC (rev 2010)
@@ -206,6 +206,7 @@
 	gdouble color_tone;
 	gshort focallength;
 	RS_MATRIX4 adobe_coeff;
+	GdkPixbuf *thumbnail;
 } RSMetadata;
 
 typedef struct _photo {
@@ -256,7 +257,6 @@
 	const gchar *ext;
 	gchar *description;
 	RS_IMAGE16 *(*load)(const gchar *, gboolean);
-	GdkPixbuf *(*thumb)(const gchar *);
 	void (*load_meta)(const gchar *, RSMetadata *);
 	gboolean (*save)(RS_PHOTO *photo, const gchar *filename, gint filetype, gint width, gint height, gboolean keep_aspect, gdouble scale, gint snapshot, RS_CMS *cms);
 	struct _rs_filetype *next;

Modified: trunk/src/rs-metadata.c
===================================================================
--- trunk/src/rs-metadata.c	2008-09-16 17:32:25 UTC (rev 2009)
+++ trunk/src/rs-metadata.c	2008-09-17 08:17:56 UTC (rev 2010)
@@ -40,6 +40,8 @@
 			g_free(metadata->model_ascii);
 		if (metadata->time_ascii)
 			g_free(metadata->time_ascii);
+		if (metadata->thumbnail)
+			g_object_unref(metadata->thumbnail);
 	}
 
 	/* Chain up */
@@ -93,6 +95,7 @@
 	for(i=0;i<4;i++)
 		metadata->cam_mul[i] = 1.0f;
 	matrix4_identity(&metadata->adobe_coeff);
+	metadata->thumbnail = NULL;
 }
 
 RSMetadata*

Modified: trunk/src/tiff-meta.c
===================================================================
--- trunk/src/tiff-meta.c	2008-09-16 17:32:25 UTC (rev 2009)
+++ trunk/src/tiff-meta.c	2008-09-17 08:17:56 UTC (rev 2010)
@@ -1101,6 +1101,8 @@
 void
 rs_tiff_load_meta(const gchar *filename, RSMetadata *meta)
 {
+	GdkPixbuf *pixbuf=NULL, *pixbuf2=NULL;
+	guint start=0, length=0;
 	RAWFILE *rawfile;
 
 	raw_init();
@@ -1110,22 +1112,6 @@
 
 	rs_tiff_load_meta_from_rawfile(rawfile, 0, meta);
 
-	raw_close_file(rawfile);
-}
-
-GdkPixbuf *
-rs_tiff_load_thumb(const gchar *src)
-{
-	RAWFILE *rawfile;
-	GdkPixbuf *pixbuf=NULL, *pixbuf2=NULL;
-	guint start=0, length=0;
-	RSMetadata *meta = rs_metadata_new();
-
-	if (!(rawfile = raw_open_file(src)))
-		return(NULL);
-
-	rs_tiff_load_meta_from_rawfile(rawfile, 0, meta);
-
 	if ((meta->thumbnail_start>0) && (meta->thumbnail_length>0))
 	{
 		start = meta->thumbnail_start;
@@ -1180,7 +1166,7 @@
 	else if (meta->make == MAKE_PANASONIC)
 	{
 		RS_PHOTO *photo;
-		if ((photo = rs_photo_load_from_file(src, TRUE)))
+		if ((photo = rs_photo_load_from_file(filename, TRUE)))
 		{
 			gint c;
 			gfloat pre_mul[4];
@@ -1242,10 +1228,8 @@
 				pixbuf = pixbuf2;
 				break;
 		}
+		meta->thumbnail = pixbuf;
 	}
 
-	g_object_unref(meta);
 	raw_close_file(rawfile);
-
-	return(pixbuf);
 }

Modified: trunk/src/tiff-meta.h
===================================================================
--- trunk/src/tiff-meta.h	2008-09-16 17:32:25 UTC (rev 2009)
+++ trunk/src/tiff-meta.h	2008-09-17 08:17:56 UTC (rev 2010)
@@ -22,4 +22,3 @@
 extern gboolean exif_reader(RAWFILE *rawfile, guint offset, RSMetadata *meta);
 extern void rs_tiff_load_meta_from_rawfile(RAWFILE *rawfile, guint offset, RSMetadata *meta);
 extern void rs_tiff_load_meta(const gchar *filename, RSMetadata *meta);
-extern GdkPixbuf *rs_tiff_load_thumb(const gchar *src);

Modified: trunk/src/x3f-meta.c
===================================================================
--- trunk/src/x3f-meta.c	2008-09-16 17:32:25 UTC (rev 2009)
+++ trunk/src/x3f-meta.c	2008-09-17 08:17:56 UTC (rev 2010)
@@ -90,6 +90,7 @@
 	guint columns;
 	guint rows;
 	guint rowstride; /* row size in bytes, a value of zero means variable */
+	void *image_data;
 	/* Followed by image-data */
 } __attribute__ ((packed)) X3F_IMAGE_DATA;
 
@@ -118,6 +119,9 @@
 	X3F_DIRECTORY_SECTION directory;
 	X3F_DIRECTORY_ENTRY directory_entry;
 	X3F_IMAGE_DATA image_data;
+	guint start=0, width=0, height=0, rowstride=0;
+	GdkPixbuf *pixbuf = NULL, *pixbuf2 = NULL;
+	gdouble ratio=1.0;
 
 	rawfile = raw_open_file(filename);
 
@@ -184,14 +188,16 @@
 				raw_get_uint(rawfile, offset+G_STRUCT_OFFSET(X3F_DIRECTORY_ENTRY, offset), &directory_entry.offset);
 				raw_get_uint(rawfile, offset+G_STRUCT_OFFSET(X3F_DIRECTORY_ENTRY, length), &directory_entry.length);
 
-				if (raw_strcmp(rawfile, offset+G_STRUCT_OFFSET(X3F_DIRECTORY_ENTRY, type), "IMAG", 4))
+				if (raw_strcmp(rawfile, offset+G_STRUCT_OFFSET(X3F_DIRECTORY_ENTRY, type), "IMA", 3))
 				{
 					/* Image Data */
-					raw_get_uint(rawfile, directory_entry.offset+G_STRUCT_OFFSET(X3F_IMAGE_DATA, type_of_image_data), &image_data.type_of_image_data);
-
-					if (image_data.type_of_image_data == X3F_DATA_FORMAT_UNCOMPRESSED)
+					raw_get_uint(rawfile, directory_entry.offset+G_STRUCT_OFFSET(X3F_IMAGE_DATA, data_format), &image_data.data_format);
+					if (image_data.data_format == X3F_DATA_FORMAT_UNCOMPRESSED)
 					{
-						/* FIXME: thumbnail */
+						start = directory_entry.offset+G_STRUCT_OFFSET(X3F_IMAGE_DATA, image_data);
+						raw_get_uint(rawfile, directory_entry.offset+G_STRUCT_OFFSET(X3F_IMAGE_DATA, columns), &width);
+						raw_get_uint(rawfile, directory_entry.offset+G_STRUCT_OFFSET(X3F_IMAGE_DATA, rows), &height);
+						raw_get_uint(rawfile, directory_entry.offset+G_STRUCT_OFFSET(X3F_IMAGE_DATA, rowstride), &rowstride);
 					}
 				}
 				else if (raw_strcmp(rawfile, offset+G_STRUCT_OFFSET(X3F_DIRECTORY_ENTRY, type), "PROP", 4))
@@ -265,51 +271,7 @@
 			}
 		}
 	}
-}
 
-GdkPixbuf *
-rs_x3f_load_thumb(const gchar *src)
-{
-	GdkPixbuf *pixbuf = NULL, *pixbuf2 = NULL;
-	gdouble ratio=1.0;
-	guint directory=0, directory_entries=0, n=0;
-	guint data_offset=0, data_length=0, data_format=0;
-	guint start=0, width=0, height=0, rowstride=0;
-	RAWFILE *rawfile;
-
-	raw_init();
-
-	rawfile = raw_open_file(src);
-	if (!rawfile) return(NULL);
-	if (!raw_strcmp(rawfile, 0, "FOVb", 4))
-	{
-		raw_close_file(rawfile);
-		return(NULL);
-	}
-
-	raw_set_byteorder(rawfile, 0x4949); /* x3f is always little endian */
-	raw_get_uint(rawfile, raw_get_filesize(rawfile)-4, &directory);
-	raw_get_uint(rawfile, directory+8, &directory_entries);
-	for(n=0;n<(directory_entries*12);n+=12)
-	{
-		raw_get_uint(rawfile, directory+12+n, &data_offset);
-		raw_get_uint(rawfile, directory+12+n+4, &data_length);
-		if (raw_strcmp(rawfile, directory+12+n+8, "IMA", 3)) /* Catch both IMAG and IMA2 */
-		{
-			if (raw_strcmp(rawfile, data_offset, "SECi", 4))
-			{
-				raw_get_uint(rawfile, data_offset+12, &data_format);
-				if (data_format == 3)
-				{
-					raw_get_uint(rawfile, data_offset+16, &width);
-					raw_get_uint(rawfile, data_offset+20, &height);
-					raw_get_uint(rawfile, data_offset+24, &rowstride);
-					start = data_offset+28;
-				}
-			}
-		}
-	}
-
 	if (width > 0)
 		pixbuf = gdk_pixbuf_new_from_data(raw_get_map(rawfile)+start, GDK_COLORSPACE_RGB, FALSE, 8,
 			width, height, rowstride, NULL, NULL);
@@ -322,9 +284,9 @@
 		else
 			pixbuf2 = gdk_pixbuf_scale_simple(pixbuf, (gint) (128.0*ratio), 128, GDK_INTERP_BILINEAR);
 		g_object_unref(pixbuf);
-		pixbuf = pixbuf2;
+		meta->thumbnail = pixbuf2;
 	}
 
 	raw_close_file(rawfile);
-	return(pixbuf);
+	return;
 }

Modified: trunk/src/x3f-meta.h
===================================================================
--- trunk/src/x3f-meta.h	2008-09-16 17:32:25 UTC (rev 2009)
+++ trunk/src/x3f-meta.h	2008-09-17 08:17:56 UTC (rev 2010)
@@ -18,4 +18,3 @@
  */
 
 extern void rs_x3f_load_meta(const gchar *filename, RSMetadata *meta);
-GdkPixbuf *rs_x3f_load_thumb(const gchar *src);




More information about the Rawstudio-commit mailing list