GtkListStore *store;
GtkTreeIter iter;
GList *work;
+ ExifItem *item;
store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(eb->listview)));
gtk_list_store_clear(store);
- work = exif->items;
- while (work)
+ item = exif_get_first_item(exif);
+ while (item)
{
- ExifItem *item;
gchar *tag;
const gchar *tag_name;
gchar *text;
gchar *elements;
const gchar *description;
- item = work->data;
- work = work->next;
-
- tag = g_strdup_printf("0x%04x", item->tag);
+ tag = g_strdup_printf("0x%04x", exif_item_get_tag_id(item));
tag_name = exif_item_get_tag_name(item);
format = exif_item_get_format_name(item, TRUE);
text = exif_item_get_data_as_text(item);
text = bar_exif_validate_text(text);
- elements = g_strdup_printf("%d", item->elements);
+ elements = g_strdup_printf("%d", exif_item_get_elements(item));
description = exif_item_get_description(item);
if (!description) description = "";
gtk_list_store_append(store, &iter);
g_free(tag);
g_free(text);
g_free(elements);
+ item = exif_get_next_item(exif);
}
}
--- /dev/null
+/*
+ * GQView
+ * (C) 2006 John Ellis
+ *
+ * Authors:
+ * Support for Exif file format, originally written by Eric Swalens.
+ * Modified by Quy Tonthat
+ * Reimplemented with generic data storage by John Ellis
+ *
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+*/
+
+#ifndef __EXIF_INT_H
+#define __EXIF_INT_H
+
+#include "exif.h"
+
+/*
+ *-----------------------------------------------------------------------------
+ * Tag formats
+ *-----------------------------------------------------------------------------
+ */
+
+typedef enum {
+ EXIF_BYTE_ORDER_INTEL,
+ EXIF_BYTE_ORDER_MOTOROLA
+} ExifByteOrder;
+
+typedef struct _ExifFormatAttrib ExifFormatAttrib;
+struct _ExifFormatAttrib
+{
+ ExifFormatType type;
+ guint size;
+ const gchar *short_name;
+ const gchar *description;
+};
+
+/* the list of known tag data formats */
+extern ExifFormatAttrib ExifFormatList[];
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * Data storage
+ *-----------------------------------------------------------------------------
+ */
+
+typedef struct _ExifMarker ExifMarker;
+typedef struct _ExifTextList ExifTextList;
+
+struct _ExifData
+{
+ GList *items; /* list of (ExifItem *) */
+ GList *current; /* for exif_get_next_item */
+};
+
+
+struct _ExifItem
+{
+ ExifFormatType format;
+ guint tag;
+ const ExifMarker *marker;
+ guint elements;
+ gpointer data;
+ guint data_len;
+};
+
+struct _ExifMarker
+{
+ guint tag;
+ ExifFormatType format;
+ gint components;
+ gchar *key;
+ gchar *description;
+ ExifTextList *list;
+};
+
+#define EXIF_MARKER_LIST_END { 0x0000, EXIF_FORMAT_UNKNOWN, 0, NULL, NULL, NULL }
+
+struct _ExifTextList
+{
+ gint value;
+ const gchar* description;
+};
+
+#define EXIF_TEXT_LIST_END { -1, NULL }
+
+
+typedef struct _ExifFormattedText ExifFormattedText;
+struct _ExifFormattedText
+{
+ const gchar *key;
+ const gchar *description;
+};
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * Data
+ *-----------------------------------------------------------------------------
+ */
+
+
+
+/* the known exif tags list */
+extern ExifMarker ExifKnownMarkersList[];
+
+/* the unknown tags utilize this generic list */
+extern ExifMarker ExifUnknownMarkersList[];
+
+/* the list of specially formatted keys, for human readable output */
+extern ExifFormattedText ExifFormattedList[];
+
+
+/*
+ *-----------------------------------------------------------------------------
+ * functions
+ *-----------------------------------------------------------------------------
+ */
+
+
+/* usually for debugging to stdout */
+void exif_write_data_list(ExifData *exif, FILE *f, gint human_readable_list);
+
+
+
+/* These funcs for use by makernote/tiff parsers only */
+
+#define EXIF_TIFF_MAX_LEVELS 4
+
+#define EXIF_TIFD_OFFSET_TAG 0
+#define EXIF_TIFD_OFFSET_FORMAT 2
+#define EXIF_TIFD_OFFSET_COUNT 4
+#define EXIF_TIFD_OFFSET_DATA 8
+#define EXIF_TIFD_SIZE 12
+
+
+guint16 exif_byte_get_int16(unsigned char *f, ExifByteOrder bo);
+guint32 exif_byte_get_int32(unsigned char *f, ExifByteOrder bo);
+void exif_byte_put_int16(unsigned char *f, guint16 n, ExifByteOrder bo);
+void exif_byte_put_int32(unsigned char *f, guint32 n, ExifByteOrder bo);
+
+ExifItem *exif_item_new(ExifFormatType format, guint tag,
+ guint elements, const ExifMarker *marker);
+void exif_item_copy_data(ExifItem *item, void *src, guint len,
+ ExifFormatType src_format, ExifByteOrder bo);
+
+gint exif_parse_IFD_table(ExifData *exif,
+ unsigned char *tiff, guint offset,
+ guint size, ExifByteOrder bo,
+ gint level,
+ const ExifMarker *list);
+
+gint exif_tiff_directory_offset(unsigned char *data, const guint len,
+ guint *offset, ExifByteOrder *bo);
+gint exif_tiff_parse(ExifData *exif, unsigned char *tiff, guint size, ExifMarker *list);
+
+gchar *exif_text_list_find_value(ExifTextList *list, guint value);
+
+
+#endif
+
#include "intl.h"
#include "gqview.h"
-#include "exif.h"
+#include "exif-int.h"
#include "format_raw.h"
#include "ui_fileops.h"
return item->marker->key;
}
+guint exif_item_get_tag_id(ExifItem *item)
+{
+ return item->tag;
+}
+
+guint exif_item_get_elements(ExifItem *item)
+{
+ return item->elements;
+}
+
+char *exif_item_get_data(ExifItem *item, guint *data_len)
+{
+ if (data_len)
+ *data_len = item->data_len;
+ return item->data;
+}
+
+guint exif_item_get_format_id(ExifItem *item)
+{
+ return item->format;
+}
+
+
const char *exif_item_get_description(ExifItem *item)
{
if (!item || !item->marker) return NULL;
return result;
}
+
/*
*-------------------------------------------------------------------
* byte order utils
*-------------------------------------------------------------------
*/
+
+ExifItem *exif_get_first_item(ExifData *exif)
+{
+ if (exif->items)
+ {
+ ExifItem *ret = (ExifItem *)exif->items->data;
+ exif->current = exif->items->next;
+ return ret;
+ }
+ exif->current = NULL;
+ return NULL;
+}
+
+ExifItem *exif_get_next_item(ExifData *exif)
+{
+ if (exif->current)
+ {
+ ExifItem *ret = (ExifItem *)exif->current->data;
+ exif->current = exif->current->next;
+ return ret;
+ }
+ return NULL;
+}
+
+
+
static gint map_file(const gchar *path, void **mapping, int *size)
{
int fd;
exif = g_new0(ExifData, 1);
exif->items = NULL;
+ exif->current = NULL;
if ((res = exif_jpeg_parse(exif, (unsigned char *)f, size,
ExifKnownMarkersList,
EXIF_FORMAT_DOUBLE = 12
} ExifFormatType;
-typedef enum {
- EXIF_BYTE_ORDER_INTEL,
- EXIF_BYTE_ORDER_MOTOROLA
-} ExifByteOrder;
-
-typedef struct _ExifFormatAttrib ExifFormatAttrib;
-struct _ExifFormatAttrib
-{
- ExifFormatType type;
- guint size;
- const gchar *short_name;
- const gchar *description;
-};
-
-/* the list of known tag data formats */
-extern ExifFormatAttrib ExifFormatList[];
-
-
/*
*-----------------------------------------------------------------------------
* Data storage
*-----------------------------------------------------------------------------
*/
+typedef struct _ExifItem ExifItem;
+
typedef struct _ExifData ExifData;
-struct _ExifData
-{
- GList *items; /* list of (ExifItem *) */
-};
typedef struct _ExifRational ExifRational;
struct _ExifRational
};
-typedef struct _ExifItem ExifItem;
-typedef struct _ExifMarker ExifMarker;
-typedef struct _ExifTextList ExifTextList;
-
-struct _ExifItem
-{
- ExifFormatType format;
- guint tag;
- const ExifMarker *marker;
- guint elements;
- gpointer data;
- guint data_len;
-};
-
-struct _ExifMarker
-{
- guint tag;
- ExifFormatType format;
- gint components;
- gchar *key;
- gchar *description;
- ExifTextList *list;
-};
-
-#define EXIF_MARKER_LIST_END { 0x0000, EXIF_FORMAT_UNKNOWN, 0, NULL, NULL, NULL }
-
-struct _ExifTextList
-{
- gint value;
- const gchar* description;
-};
-
-#define EXIF_TEXT_LIST_END { -1, NULL }
-
-
-typedef struct _ExifFormattedText ExifFormattedText;
-struct _ExifFormattedText
-{
- const gchar *key;
- const gchar *description;
-};
-
-
-/*
- *-----------------------------------------------------------------------------
- * Data
- *-----------------------------------------------------------------------------
- */
-
/* enums useful for image manipulation */
typedef enum {
} ExifUnitType;
-/* the known exif tags list */
-extern ExifMarker ExifKnownMarkersList[];
-
-/* the unknown tags utilize this generic list */
-extern ExifMarker ExifUnknownMarkersList[];
-
-/* the list of specially formatted keys, for human readable output */
-extern ExifFormattedText ExifFormattedList[];
-
-
/*
*-----------------------------------------------------------------------------
* functions
double exif_rational_to_double(ExifRational *r, gint sign);
ExifItem *exif_get_item(ExifData *exif, const gchar *key);
+ExifItem *exif_get_first_item(ExifData *exif);
+ExifItem *exif_get_next_item(ExifData *exif);
const char *exif_item_get_tag_name(ExifItem *item);
+guint exif_item_get_tag_id(ExifItem *item);
+guint exif_item_get_elements(ExifItem *item);
+char *exif_item_get_data(ExifItem *item, guint *data_len);
const char *exif_item_get_description(ExifItem *item);
+guint exif_item_get_format_id(ExifItem *item);
const char *exif_item_get_format_name(ExifItem *item, gint brief);
gchar *exif_item_get_data_as_text(ExifItem *item);
gint exif_item_get_integer(ExifItem *item, gint *value);
const gchar *exif_get_description_by_key(const gchar *key);
-/* usually for debugging to stdout */
-void exif_write_data_list(ExifData *exif, FILE *f, gint human_readable_list);
-
-
-
-/* These funcs for use by makernote/tiff parsers only */
-
-#define EXIF_TIFF_MAX_LEVELS 4
-
-#define EXIF_TIFD_OFFSET_TAG 0
-#define EXIF_TIFD_OFFSET_FORMAT 2
-#define EXIF_TIFD_OFFSET_COUNT 4
-#define EXIF_TIFD_OFFSET_DATA 8
-#define EXIF_TIFD_SIZE 12
-
-
-guint16 exif_byte_get_int16(unsigned char *f, ExifByteOrder bo);
-guint32 exif_byte_get_int32(unsigned char *f, ExifByteOrder bo);
-void exif_byte_put_int16(unsigned char *f, guint16 n, ExifByteOrder bo);
-void exif_byte_put_int32(unsigned char *f, guint32 n, ExifByteOrder bo);
-
-ExifItem *exif_item_new(ExifFormatType format, guint tag,
- guint elements, const ExifMarker *marker);
-void exif_item_copy_data(ExifItem *item, void *src, guint len,
- ExifFormatType src_format, ExifByteOrder bo);
-
-gint exif_parse_IFD_table(ExifData *exif,
- unsigned char *tiff, guint offset,
- guint size, ExifByteOrder bo,
- gint level,
- const ExifMarker *list);
-
-gint exif_tiff_directory_offset(unsigned char *data, const guint len,
- guint *offset, ExifByteOrder *bo);
-gint exif_tiff_parse(ExifData *exif, unsigned char *tiff, guint size, ExifMarker *list);
-
-gchar *exif_text_list_find_value(ExifTextList *list, guint value);
+gint format_raw_img_exif_offsets_fd(int fd, const gchar *path,
+ unsigned char *header_data, const guint header_len,
+ guint *image_offset, guint *exif_offset);
#endif
#define __FORMAT_CANON_H
-#include "exif.h"
+#include "exif-int.h"
gint format_canon_raw_crw(unsigned char *data, const guint len,
#define __FORMAT_FUJI_H
-#include "exif.h"
+#include "exif-int.h"
gint format_fuji_raw(unsigned char *data, const guint len,
#define __FORMAT_NIKON_H
-#include "exif.h"
+#include "exif-int.h"
gint format_nikon_raw(unsigned char *data, const guint len,
guint *image_offset, guint *exif_offset);
#define __FORMAT_OLYMPUS_H
-#include "exif.h"
+#include "exif-int.h"
gint format_olympus_raw(unsigned char *data, const guint len,
#ifndef __FORMAT_RAW_H
#define __FORMAT_RAW_H
-#include "exif.h"
+#include "exif-int.h"
typedef enum {
#include "image-load.h"
#include "filelist.h"
-#include "format_raw.h"
+#include "exif.h"
#include "ui_fileops.h"
#include <fcntl.h>
}
}
}
- if (item && item->format == EXIF_FORMAT_UNDEFINED)
+
+ if (item && exif_item_get_format_id(item) == EXIF_FORMAT_UNDEFINED)
{
+ char *data;
+ guint data_len;
if (debug) printf("Found embedded color profile\n");
+
+ data = exif_item_get_data(item, &data_len);
cm = color_man_new_embedded(imd, NULL,
- item->data, item->data_len,
+ data, data_len,
screen_type, screen_file,
image_post_process_color_cb, imd);
}
- else
+ else
{
cm = color_man_new(imd, NULL,
input_type, input_file,