/*
* Geeqie
* (C) 2006 John Ellis
- * Copyright (C) 2008 - 2009 The Geeqie Team
+ * Copyright (C) 2008 - 2012 The Geeqie Team
*
* Authors:
* Support for Exif file format, originally written by Eric Swalens.
#include <math.h>
#include <glib.h>
+#include <glib/gprintf.h>
#include "intl.h"
#include "main.h"
#include "exif-int.h"
+#include "jpeg_parser.h"
#include "format_raw.h"
#include "ui_fileops.h"
item->tag = tag;
item->marker = marker;
item->elements = elements;
- item->data = NULL;
- item->data_len = 0;
switch (format)
{
return g_strdup(_(item->marker->description));
}
-const gchar *exif_item_get_format_name(ExifItem *item, gint brief)
+const gchar *exif_item_get_format_name(ExifItem *item, gboolean brief)
{
if (!item || !item->marker) return NULL;
return (brief) ? ExifFormatList[item->format].short_name : ExifFormatList[item->format].description;
if (data_length > 4)
{
data_offset = data_val;
- if (size < data_offset + data_length)
+ if (size < data_offset || size < data_offset + data_length)
{
log_printf("warning: exif tag %s data will overrun end of file, ignored.\n", marker->key);
return -1;
return -2;
}
- if (exif_jpeg_segment_find(data, size, JPEG_MARKER_APP1,
+ if (jpeg_segment_find(data, size, JPEG_MARKER_APP1,
"Exif\x00\x00", 6,
&seg_offset, &seg_length))
{
g_free(pathl);
exif = g_new0(ExifData, 1);
- exif->items = NULL;
- exif->current = NULL;
exif->path = g_strdup(path);
res = exif_jpeg_parse(exif, (guchar *)f, size, ExifKnownMarkersList);
if (exif) exif->items = g_list_reverse(exif->items);
-#if 0
- exif_write_data_list(exif, stdout, TRUE);
- exif_write_data_list(exif, stdout, FALSE);
-#endif
-
return exif;
}
gint exif_item_get_integer(ExifItem *item, gint *value)
{
if (!item) return FALSE;
+ if (!item->elements) return FALSE;
switch (item->format)
{
i = 0;
while (ExifKnownGPSInfoMarkersList[i].tag > 0)
{
- if (strcmp(key, ExifKnownGPSInfoMarkersList[i].key) == 0) return _(ExifKnownGPSInfoMarkersList[i].description);
+ if (strcmp(key, ExifKnownGPSInfoMarkersList[i].key) == 0) return g_strdup(_(ExifKnownGPSInfoMarkersList[i].description));
i++;
}
if (text)
{
gchar *tag = exif_item_get_tag_name(item);
- fprintf(f, "%4x %9s %30s %s\n", item->tag, ExifFormatList[item->format].short_name,
+ g_fprintf(f, "%4x %9s %30s %s\n", item->tag, ExifFormatList[item->format].short_name,
tag, text);
g_free(tag);
}
{
if (!f || !exif) return;
- fprintf(f, " tag format key value\n");
- fprintf(f, "----------------------------------------------------\n");
+ g_fprintf(f, " tag format key value\n");
+ g_fprintf(f, "----------------------------------------------------\n");
if (human_readable_list)
{
text = exif_get_formatted_by_key(exif, ExifFormattedList[i].key, NULL);
if (text)
{
- fprintf(f, " %9s %30s %s\n", "string", ExifFormattedList[i].key, text);
+ g_fprintf(f, " %9s %30s %s\n", "string", ExifFormattedList[i].key, text);
}
i++;
}
exif_write_item(f, item);
}
}
- fprintf(f, "----------------------------------------------------\n");
+ g_fprintf(f, "----------------------------------------------------\n");
}
gboolean exif_write(ExifData *exif)
{
- log_printf("Not compiled with EXIF write support");
+ log_printf("Not compiled with EXIF write support\n");
return FALSE;
}
gboolean exif_write_sidecar(ExifData *exif, gchar *path)
{
- log_printf("Not compiled with EXIF write support");
+ log_printf("Not compiled with EXIF write support\n");
return FALSE;
}
if (!key) return NULL;
+ /* convert xmp key to exif key */
+ if (strcmp(key, "Xmp.tiff.Orientation") == 0) key = "Exif.Image.Orientation";
+
if (format == METADATA_FORMATTED)
{
gchar *text;