diff options
| author | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2012-04-15 21:44:31 +0200 |
|---|---|---|
| committer | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2012-04-15 21:44:31 +0200 |
| commit | 713c2d86d9335a9c681357254d4bc4f817626259 (patch) | |
| tree | c4cabe1b7dcf1d2f192fdcfc68d35e242305c949 /src/generators.c | |
| parent | c5f23c17a14bbe07042f46be90fe2b2e465436c7 (diff) | |
| download | cataract-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.c | 71 |
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; |
