[Rawstudio-commit] r1975 - trunk/src

Anders Brander anders at brander.dk
Tue Sep 2 07:02:33 CEST 2008


Author: abrander
Date: 2008-09-02 07:02:32 +0200 (Tue, 02 Sep 2008)
New Revision: 1975

Modified:
   trunk/src/rawstudio.h
   trunk/src/tiff-meta.c
Log:
Added metadata support for Leica.

Modified: trunk/src/rawstudio.h
===================================================================
--- trunk/src/rawstudio.h	2008-09-02 05:00:21 UTC (rev 1974)
+++ trunk/src/rawstudio.h	2008-09-02 05:02:32 UTC (rev 1975)
@@ -74,6 +74,7 @@
 	MAKE_CANON,
 	MAKE_FUJIFILM,
 	MAKE_KODAK,
+	MAKE_LEICA,
 	MAKE_MINOLTA,
 	MAKE_NIKON,
 	MAKE_OLYMPUS,

Modified: trunk/src/tiff-meta.c
===================================================================
--- trunk/src/tiff-meta.c	2008-09-02 05:00:21 UTC (rev 1974)
+++ trunk/src/tiff-meta.c	2008-09-02 05:02:32 UTC (rev 1975)
@@ -49,6 +49,7 @@
 static gfloat get_rational(RAWFILE *rawfile, guint offset);
 inline static void read_ifd(RAWFILE *rawfile, guint offset, struct IFD *ifd);
 static gboolean makernote_canon(RAWFILE *rawfile, guint offset, RS_METADATA *meta);
+static gboolean makernote_leica(RAWFILE *rawfile, guint offset, RS_METADATA *meta);
 static gboolean makernote_minolta(RAWFILE *rawfile, guint offset, RS_METADATA *meta);
 static gboolean makernote_nikon(RAWFILE *rawfile, guint offset, RS_METADATA *meta);
 static gboolean makernote_olympus(RAWFILE *rawfile, guint base, guint offset, RS_METADATA *meta);
@@ -231,6 +232,77 @@
 }
 
 static gboolean
+makernote_leica(RAWFILE *rawfile, guint offset, RS_METADATA *meta)
+{
+	gushort number_of_entries = 0;
+	guint version = 0;
+
+	struct IFD ifd;
+
+	/* get number of entries */
+	if(!raw_get_ushort(rawfile, offset, &number_of_entries))
+		return FALSE;
+	offset += 2;
+
+	while(number_of_entries--)
+	{
+		read_ifd(rawfile, offset, &ifd);
+		offset += 12;
+
+		switch (version)
+		{
+			case 100:
+				switch(ifd.tag)
+				{
+					case 0x0011: /* Red balance */
+						meta->cam_mul[1] = 1.0;
+						meta->cam_mul[3] = 1.0;
+						meta->cam_mul[0] = ifd.value / 256.0;
+						break;
+					case 0x0012: /* Blue balance */
+						meta->cam_mul[2] = ifd.value / 256.0;
+						break;
+					case 0x8769: /* ExifIFDPointer */
+						exif_reader(rawfile, ifd.value_offset, meta);
+						break;
+				}
+				break;
+			case 200:
+				switch(ifd.tag)
+				{
+					case 0x0024: /* WB Red Level */
+						meta->cam_mul[0] = ifd.value;
+						break;
+					case 0x0025: /* WB Green Level */
+						meta->cam_mul[1] = ifd.value;
+						meta->cam_mul[3] = ifd.value;
+						break;
+					case 0x0026: /* WB Blue Level */
+						meta->cam_mul[2] = ifd.value;
+						break;
+					case 0x8769: /* ExifIFDPointer */
+						exif_reader(rawfile, ifd.value_offset, meta);
+						break;
+				}
+				break;
+			default:
+				switch(ifd.tag)
+				{
+					case 0x0001: /* Raw version */
+						if (ifd.value_offset == 0x30303130)
+							version = 100;
+						else if (ifd.value_offset == 0x30303230)
+							version = 200;
+				}
+				break;
+		}
+	}
+	rs_metadata_normalize_wb(meta);
+
+	return TRUE;
+}
+
+static gboolean
 makernote_minolta(RAWFILE *rawfile, guint offset, RS_METADATA *meta)
 {
 	gushort number_of_entries = 0;
@@ -960,15 +1032,28 @@
 {
 	guint next = 0;
 	gushort ifd_num = 0;
+	guchar version;
 
-	raw_init_file_tiff(rawfile, offset);
+	version = raw_init_file_tiff(rawfile, offset);
 
+	if (version == 0x55)
+		meta->make = MAKE_LEICA;
+
 	offset = get_first_ifd_offset(rawfile);
 	do {
 		if (!raw_get_ushort(rawfile, offset, &ifd_num)) break; /* used for calculating next IFD */
 		if (!raw_get_uint(rawfile, offset+2+ifd_num*12, &next)) break; /* 2: offset+short(ifd_num), 12: length of ifd-entry */
-		ifd_reader(rawfile, offset, meta);
 
+		switch (meta->make)
+		{
+			case MAKE_LEICA:
+				makernote_leica(rawfile, offset, meta);
+				break;
+			default:
+				ifd_reader(rawfile, offset, meta);
+				break;
+		}
+
 		/* Hack to support a few cameras that embeds EXIF-info or Makernotes in IFD 0 */
 		if (meta->make == MAKE_CANON && g_str_equal(meta->model_ascii, "EOS D2000C"))
 			exif_reader(rawfile, offset, meta);




More information about the Rawstudio-commit mailing list