summaryrefslogtreecommitdiff
path: root/src/generators.c
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@users.sourceforge.net>2012-04-15 21:44:31 +0200
committerTomas Bzatek <tbzatek@users.sourceforge.net>2012-04-15 21:44:31 +0200
commit713c2d86d9335a9c681357254d4bc4f817626259 (patch)
treec4cabe1b7dcf1d2f192fdcfc68d35e242305c949 /src/generators.c
parentc5f23c17a14bbe07042f46be90fe2b2e465436c7 (diff)
downloadcataract-713c2d86d9335a9c681357254d4bc4f817626259.tar.xz
Change EXIF metadata handling into a registered function
This allows much greater flexibility from templates regarding EXIF metadata handling, no more hardcoded symbols. It's possible to display essentially any attribute known to Exiv2. Please see http://exiv2.org/metadata.html This brings two new functions that can be called from templates: * get_exif_value (exiv2_attribute) * get_exif_value_fixed (exiv2_attribute) Both functions take a string argument of metadata attribute name from Exiv2 namespace. The difference is that get_exif_value_fixed() does some extra formatting for several basic attributes (e.g. datetime format).
Diffstat (limited to 'src/generators.c')
-rw-r--r--src/generators.c71
1 files changed, 43 insertions, 28 deletions
diff --git a/src/generators.c b/src/generators.c
index 48a377a..1d05eea 100644
--- a/src/generators.c
+++ b/src/generators.c
@@ -555,6 +555,27 @@ write_html_album (TGallerySetup *setup,
return res;
}
+static char *
+get_exif_value_cb (gchar **args, gpointer user_data)
+{
+ ExifData *exif = user_data;
+
+ g_return_val_if_fail (exif != NULL, NULL);
+ g_return_val_if_fail (g_strv_length (args) != 2, NULL); /* incl. trailing NULL */
+
+ return get_exif_data (exif, *args);
+}
+
+static char *
+get_exif_value_fixed_cb (gchar **args, gpointer user_data)
+{
+ ExifData *exif = user_data;
+
+ g_return_val_if_fail (exif != NULL, NULL);
+ g_return_val_if_fail (g_strv_length (args) != 2, NULL); /* incl. trailing NULL */
+
+ return get_exif_data_fixed (exif, *args);
+}
/*
* write_html_image: process single image template file
@@ -581,7 +602,7 @@ write_html_image (TGallerySetup *setup,
gchar *img_orig_src;
gchar *img_orig_dst;
gchar *img_orig_dst_page;
- TExifData *exif;
+ ExifData *exif;
unsigned long img_w, img_h;
unsigned long img_orig_w, img_orig_h;
unsigned int item_index, next_item_index, real_item_index, real_total_items;
@@ -676,13 +697,13 @@ write_html_image (TGallerySetup *setup,
/* Get EXIF data from the original image */
exif = NULL;
if (img_orig_src) {
- exif = get_exif (img_orig_src);
+ exif = read_exif (img_orig_src);
if (exif == NULL)
log_error ("write_html_image: error getting exif data from file \"%s\"\n", img_orig_src);
}
/* Try destination image instead, though it might have the metadata stripped */
if (exif == NULL) {
- exif = get_exif (img_dst);
+ exif = read_exif (img_dst);
if (exif == NULL)
log_error ("write_html_image: error getting exif data from file \"%s\"\n", img_dst);
}
@@ -699,25 +720,30 @@ write_html_image (TGallerySetup *setup,
title = g_strdup (item->title);
title_desc = g_strdup (item->title_description);
if (setup->use_iptc_exif && title == NULL && title_desc == NULL && exif != NULL) {
- if (exif->iptc_caption)
- title = g_strdup (exif->iptc_caption);
- if (exif->jpeg_comment) {
+ title = get_exif_data_fixed (exif, IPTC_CAPTION);
+ s1 = get_exif_data_fixed (exif, JPEG_COMMENT);
+ if (s1) {
if (! title)
- title = g_strdup (exif->jpeg_comment);
+ title = g_strdup (s1);
else
- title_desc = g_strdup (exif->jpeg_comment);
+ title_desc = g_strdup (s1);
+ g_free (s1);
}
- if (exif->exif_imgdesc) {
+ s1 = get_exif_data_fixed (exif, EXIF_IMAGE_DESCRIPTION);
+ if (s1) {
if (! title)
- title = g_strdup (exif->exif_imgdesc);
+ title = g_strdup (s1);
/* if (! title_desc) -- disabled
- title_desc = g_strdup (exif->exif_imgdesc); */
+ title_desc = g_strdup (s1); */
+ g_free (s1);
}
- if (exif->exif_usercomment) {
+ s1 = get_exif_data_fixed (exif, EXIF_COMMENT);
+ if (s1) {
if (! title)
- title = g_strdup (exif->exif_usercomment);
+ title = g_strdup (s1);
if (! title_desc)
- title_desc = g_strdup (exif->exif_usercomment);
+ title_desc = g_strdup (s1);
+ g_free (s1);
}
/* Convert line breaks to be visible in the HTML code */
if (title) {
@@ -794,19 +820,8 @@ write_html_image (TGallerySetup *setup,
replace_table_add_key (replace_table, "TEMPLATES_PATH", setup->supplemental_files_use_common_root ? s1 : "");
g_free (s1);
- /* EXIF values */
- if (exif) {
- replace_table_add_key (replace_table, "EXIF_ISO", exif->iso ? exif->iso : "??");
- replace_table_add_key (replace_table, "EXIF_TIME", exif->exposure ? exif->exposure : "??");
- replace_table_add_key (replace_table, "EXIF_APERTURE", exif->aperture ? exif->aperture : "??");
- replace_table_add_key (replace_table, "EXIF_FOCAL_LENGTH", exif->focal_length ? exif->focal_length : "??");
- replace_table_add_key (replace_table, "EXIF_FLASH", exif->flash ? exif->flash : "??");
- replace_table_add_key (replace_table, "EXIF_DATE", exif->datetime ? exif->datetime : "??");
- replace_table_add_key (replace_table, "EXIF_CAMERA_MODEL", exif->camera_model ? exif->camera_model : "??");
- s1 = g_strdup_printf ("(%s)", exif->focal_length_35mm);
- replace_table_add_key (replace_table, "EXIF_FOCAL_35", exif->focal_length_35mm ? s1 : "");
- g_free (s1);
- }
+ replace_table_register_function (replace_table, "get_exif_value", get_exif_value_cb, exif);
+ replace_table_register_function (replace_table, "get_exif_value_fixed", get_exif_value_fixed_cb, exif);
/* Border style */
s1 = item->border_style;
@@ -912,7 +927,7 @@ write_html_image (TGallerySetup *setup,
g_free (imgname);
g_free (preload_imgname);
g_hash_table_destroy (defines);
- free_exif_data (exif);
+ exif_data_free (exif);
replace_table_free (replace_table);
block_parser_free (block_parser);
return res;