From 8d5ff019af0a5a87e74632f53a8cc8cf34060db9 Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Fri, 23 Sep 2016 22:30:59 +0200 Subject: generators: Expose all image sizes A new block LIST_PICTURE_ALL_SIZES has been introduced to expose all available image sizes when iterating through the album items. Image size availability can be tested by the HAVE_IMG_SIZE_xxx define where "xxx" is an upper-case image size name as defined in the theme XML file. Similarly the image standard tags IMG_SIZE_W__xxx, IMG_SIZE_H__xxx and IMG_SRC__xxx have been introduced as well. --- src/generators.c | 67 ++++++++++++++++++++++++++++++++++++++++++++++---------- 1 file changed, 55 insertions(+), 12 deletions(-) diff --git a/src/generators.c b/src/generators.c index 4648f49..5a76827 100644 --- a/src/generators.c +++ b/src/generators.c @@ -854,7 +854,8 @@ process_img_item (TGallerySetup *setup, GHashTable *defines, TImageSize *image_size, TImageSize *thumb_image_size, - gboolean list_mode) + gboolean list_mode, + gboolean all_image_sizes) { unsigned long img_w, img_h; unsigned long img_orig_w, img_orig_h; @@ -868,6 +869,7 @@ process_img_item (TGallerySetup *setup, TImageSize *tmp_image_size; ExifData *exif = NULL; struct HaveImageSizeData *img_size_data; + GList *l; if (list_mode) { /* Index stuff */ @@ -927,27 +929,59 @@ process_img_item (TGallerySetup *setup, } /* Image stuff */ - if (image_size != NULL) { + for (l = g_list_first (setup->design->image_sizes); l; l = g_list_next (l)) { + tmp_image_size = l->data; + if (! all_image_sizes && tmp_image_size != image_size) + continue; + if (tmp_image_size->is_thumbnail) + continue; /* First calculate image paths */ - img_dst = get_image_dest_path_with_fallback (setup, items, item, path_info, image_size, FALSE); - img_dst_page = get_image_dest_path_with_fallback (setup, items, item, path_info, image_size, TRUE); + if (all_image_sizes) { + img_dst = get_image_dest_path (setup, items, item, path_info, tmp_image_size, FALSE); + if (g_access (img_dst, R_OK) != 0) { + g_free (img_dst); + continue; + } + img_dst_page = get_image_dest_path (setup, items, item, path_info, tmp_image_size, TRUE); + } else { + img_dst = get_image_dest_path_with_fallback (setup, items, item, path_info, tmp_image_size, FALSE); + img_dst_page = get_image_dest_path_with_fallback (setup, items, item, path_info, tmp_image_size, TRUE); + } /* Retrieve image sizes */ get_image_sizes (img_dst, &img_w, &img_h, NULL, setup->autorotate); - exif = get_img_exif_data (setup, path_info, items, item, image_size); - replace_table_add_key_int (replace_table, "IMG_SIZE_W", img_w); - replace_table_add_key_int (replace_table, "IMG_SIZE_H", img_h); - replace_table_add_key (replace_table, "IMG_SRC", img_dst_page); + exif = get_img_exif_data (setup, path_info, items, item, tmp_image_size); + if (all_image_sizes) { + s1 = g_ascii_strup (tmp_image_size->name, -1); + s2 = g_strdup_printf ("IMG_SIZE_W__%s", s1); + replace_table_add_key_int (replace_table, s2, img_w); + g_free (s2); + s2 = g_strdup_printf ("IMG_SIZE_H__%s", s1); + replace_table_add_key_int (replace_table, s2, img_h); + g_free (s2); + s2 = g_strdup_printf ("IMG_SRC__%s", s1); + replace_table_add_key (replace_table, s2, img_dst_page); + g_free (s2); + g_hash_table_replace (defines, g_strdup_printf ("HAVE_IMG_SIZE_%s", s1), g_strdup ("")); + g_free (s1); + } + if (tmp_image_size == image_size) { + replace_table_add_key_int (replace_table, "IMG_SIZE_W", img_w); + replace_table_add_key_int (replace_table, "IMG_SIZE_H", img_h); + replace_table_add_key (replace_table, "IMG_SRC", img_dst_page); + } g_free (img_dst); g_free (img_dst_page); + } + if (! all_image_sizes && image_size != NULL) { /* Legacy stuff, subject to removal */ tmp_image_size = NULL; /* Take the last image size from the sorted list */ if (g_list_length (setup->design->image_sizes) > 0) tmp_image_size = (TImageSize *) (g_list_last (setup->design->image_sizes))->data; - if (tmp_image_size != NULL && tmp_image_size != image_size) { + if (tmp_image_size != NULL && tmp_image_size != image_size && ! tmp_image_size->is_thumbnail) { img_dst = get_image_dest_path_with_fallback (setup, items, item, path_info, tmp_image_size, FALSE); img_dst_page = get_image_dest_path_with_fallback (setup, items, item, path_info, tmp_image_size, TRUE); get_image_sizes (img_dst, &img_orig_w, &img_orig_h, NULL, setup->autorotate); @@ -960,6 +994,7 @@ process_img_item (TGallerySetup *setup, } } + /* Get title and description from IPTC/EXIF/JPEG if not defined */ get_item_titles (setup, item, exif, &title, &title_desc); replace_table_add_key (replace_table, "IMG_TITLE", title); @@ -1045,6 +1080,7 @@ write_html_page (TGallerySetup *setup, GHashTable *local_defines; TImageSize *image_size, *thumb_image_size; struct HaveImageSizeData *img_size_data; + gboolean all_sizes; res = TRUE; @@ -1127,12 +1163,13 @@ write_html_page (TGallerySetup *setup, /* Picture page tags */ if (item != NULL) { add_next_prev_links (setup, path_info, theme, items, item, global_replace_table, image_size); - process_img_item (setup, path_info, theme, items, item, block_parser, global_replace_table, defines, image_size, thumb_image_size, FALSE); + process_img_item (setup, path_info, theme, items, item, block_parser, global_replace_table, defines, image_size, thumb_image_size, FALSE, FALSE); } /* Setup block parser */ block_parser_register_key (block_parser, "IMG_LIST", "IMG_LIST"); block_parser_register_key (block_parser, "LIST_PICTURE", NULL); + block_parser_register_key (block_parser, "LIST_PICTURE_ALL_SIZES", NULL); block_parser_register_key (block_parser, "LIST_SEPARATOR", NULL); block_parser_register_key (block_parser, "LIST_INTERSPACE", NULL); block_parser_register_key (block_parser, "NAV_BAR", "NAV_BAR"); @@ -1166,8 +1203,13 @@ write_html_page (TGallerySetup *setup, switch (iter_item->type) { case INDEX_ITEM_TYPE_PICTURE: if (! iter_item->hidden) { - s1 = block_parser_get_data (block_parser, "LIST_PICTURE"); - process_img_item (setup, path_info, theme, items, iter_item, local_block_parser, local_replace_table, local_defines, image_size, thumb_image_size, TRUE); + all_sizes = FALSE; + s1 = block_parser_get_data (block_parser, "LIST_PICTURE_ALL_SIZES"); + if (s1) + all_sizes = TRUE; + else + s1 = block_parser_get_data (block_parser, "LIST_PICTURE"); + process_img_item (setup, path_info, theme, items, iter_item, local_block_parser, local_replace_table, local_defines, image_size, thumb_image_size, TRUE, all_sizes); } break; @@ -1202,6 +1244,7 @@ write_html_page (TGallerySetup *setup, /* Clear processed nested keys for further use */ block_parser_clear_key_data (block_parser, "IMG_LIST"); block_parser_clear_key_data (block_parser, "LIST_PICTURE"); + block_parser_clear_key_data (block_parser, "LIST_PICTURE_ALL_SIZES"); block_parser_clear_key_data (block_parser, "LIST_SEPARATOR"); block_parser_clear_key_data (block_parser, "LIST_INTERSPACE"); } -- cgit v1.2.3