From 6fffe1a21d5acaa544f7796241e13ff37e75349f Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sun, 25 Jan 2015 18:23:03 +0100 Subject: theming: Make custom image size handling fully flexible This commit brings full flexibility of custom image size definition and usage. When a custom image size is defined, it automatically maps to the album tag arguments. Alternatively, this automatic name matching can be overriden by theme setup tags. This allows us to supply image of different sizes that can be also used in templates. Legacy behaviour of "fullsize" and "preview" image size fallback is retained (though not recommended in new theming setups). --- src/generators.c | 97 +++++++++++++++++++++++++------------------------------- 1 file changed, 44 insertions(+), 53 deletions(-) (limited to 'src/generators.c') diff --git a/src/generators.c b/src/generators.c index a7f94cb..e1bedf9 100644 --- a/src/generators.c +++ b/src/generators.c @@ -190,7 +190,6 @@ get_item_titles (TGallerySetup *setup, *title_desc = g_strstrip (*title_desc); } -/* FIXME: this badly needs port to the new theming system */ static void get_image_paths (TGallerySetup *setup, TAlbum *items, @@ -202,7 +201,6 @@ get_image_paths (TGallerySetup *setup, gchar **page_img_dst) { gboolean nofullsize; - gboolean is_preview; gboolean is_original; gchar *s1, *s2, *s3; gchar *target_image_dir; @@ -214,10 +212,8 @@ get_image_paths (TGallerySetup *setup, *full_img_dst = NULL; if (page_img_dst) *page_img_dst = NULL; - preview_image_size = NULL; nofullsize = IS_NOFULLSIZE (item, items, setup); - is_preview = g_ascii_strcasecmp ("preview", image_size->name) == 0; is_original = g_ascii_strcasecmp ("original", image_size->name) == 0; /* ignore combinations that are not valid */ @@ -226,52 +222,48 @@ get_image_paths (TGallerySetup *setup, (image_size->is_thumbnail && items->type == GALLERY_TYPE_INDEX && (item->thumbnail == NULL || strlen (item->thumbnail) == 0))) return; - /* nofullsize specified, fall back to preview if available */ - if (is_original && nofullsize) - preview_image_size = lookup_image_size_for_name (setup, "preview"); - target_image_dir = g_strdup_printf ("%s%s", TARGET_IMAGE_DIR_PREFIX, preview_image_size ? preview_image_size->name : image_size->name); + s1 = NULL; + if (image_size->is_thumbnail && items->type == GALLERY_TYPE_INDEX) + s1 = item->thumbnail; + if (s1 == NULL && ! is_original && item->image_sizes != NULL) { + s1 = g_hash_table_lookup (item->image_sizes, image_size->name); + } + if (s1 == NULL) + s1 = item->path; + + /* legacy behaviour fallback */ + if (s1 == NULL && item->image_sizes != NULL) + s1 = g_hash_table_lookup (item->image_sizes, "preview"); + if (s1 == NULL) { + log_error ("Unable to find image source for item #%d (\"%s\") for image size \"%s\"\n", get_item_index (items, item), item->title, image_size->name); + return; + } - /* Thumbnail special case */ - if (image_size->is_thumbnail) { - s1 = NULL; - if (items->type == GALLERY_TYPE_INDEX) { - s1 = item->thumbnail; - } else - if (items->type == GALLERY_TYPE_ALBUM) { - s1 = (item->path == NULL && item->preview) ? item->preview : item->path; - s1 = (item->thumbnail) ? item->thumbnail : s1; + if (full_img_src) + *full_img_src = g_build_filename (path_info->src_dir, s1, NULL); + + /* Use preview image for targets but leave original source if nofullsize is defined (legacy behaviour) */ + preview_image_size = NULL; + if (is_original && nofullsize && item->image_sizes != NULL) { + s2 = g_hash_table_lookup (item->image_sizes, "preview"); + if (s2 != NULL) { + s1 = s2; + preview_image_size = lookup_image_size_for_name (setup, "preview"); } - s2 = g_path_get_basename (s1); - if (full_img_src) - *full_img_src = g_build_filename (path_info->src_dir, s1, NULL); - s3 = g_strdup_printf (THUMBNAIL_NAME_FORMAT, get_item_index (items, item), s2); - g_free (s2); - if (full_img_dst) - *full_img_dst = g_build_filename (path_info->dest_dir, target_image_dir, s3, NULL); - if (page_img_dst) - *page_img_dst = g_build_filename (target_image_dir, s3, NULL); - g_free (s3); } + target_image_dir = g_strdup_printf ("%s%s", TARGET_IMAGE_DIR_PREFIX, preview_image_size ? preview_image_size->name : image_size->name); - /* Other image sizes */ - else { - if (is_preview) - s1 = (item->preview) ? item->preview : item->path; - else - s1 = (item->path == NULL && item->preview) ? item->preview : item->path; - if (full_img_src) - *full_img_src = g_build_filename (path_info->src_dir, s1, NULL); - /* Use preview image for targets but leave original source if nofullsize is defined */ - if (is_original && nofullsize) - s1 = (item->preview) ? item->preview : item->path; - s2 = g_path_get_basename (s1); - if (full_img_dst) - *full_img_dst = g_build_filename (path_info->dest_dir, target_image_dir, s2, NULL); - if (page_img_dst) - *page_img_dst = g_build_filename (target_image_dir, s2, NULL); + s2 = g_path_get_basename (s1); + if (image_size->is_thumbnail) { + s3 = g_strdup_printf (THUMBNAIL_NAME_FORMAT, get_item_index (items, item), s2); g_free (s2); + s2 = s3; } - + if (full_img_dst) + *full_img_dst = g_build_filename (path_info->dest_dir, target_image_dir, s2, NULL); + if (page_img_dst) + *page_img_dst = g_build_filename (target_image_dir, s2, NULL); + g_free (s2); g_free (target_image_dir); } @@ -369,9 +361,8 @@ generate_image (TGallerySetup *setup, for (l = g_list_first (setup->design->image_sizes); l; l = g_list_next (l)) { image_size = l->data; - /* TODO: this is too specific */ - is_preview = g_ascii_strcasecmp ("preview", image_size->name) == 0; is_original = g_ascii_strcasecmp ("original", image_size->name) == 0; + is_preview = g_ascii_strcasecmp ("preview", image_size->name) == 0; if (is_original && IS_NOFULLSIZE (item, items, setup)) continue; @@ -392,8 +383,8 @@ generate_image (TGallerySetup *setup, /* Do something when required */ res = res || needs_update (img_src, img_dst); if (! query_update) { - /* Copy the source file */ - if (! image_size->is_thumbnail && image_size->no_resize && ((is_preview && item->preview) || is_original)) { + /* Determine whether to perform file copy or resize */ + if (! image_size->is_thumbnail && image_size->no_resize && (is_original || (item->image_sizes && g_hash_table_lookup (item->image_sizes, image_size->name)))) { if (! copy_file (img_src, img_dst)) log_error (" Error copying image %s to %s\n", img_src, img_dst); } @@ -417,7 +408,7 @@ generate_image (TGallerySetup *setup, } } else { - /* Only the "preview" size is affected by deprecated item and album overrides */ + /* Only the "preview" size is affected by legacy item and album overrides */ if (is_preview) { tmpw = get_prop_int (items, item, PROP_WIDTH, img_w); tmph = get_prop_int (items, item, PROP_HEIGHT, img_h); @@ -669,7 +660,7 @@ add_next_prev_links (TGallerySetup *setup, } if (next_item) { - s = GET_ITEM_TARGET_FILENAME (next_item); + s = get_item_target_filename (next_item); replace_table_add_key_printf (replace_table, "LINK_NEXT", theme->picture_filename, s); g_free (s); } @@ -677,7 +668,7 @@ add_next_prev_links (TGallerySetup *setup, replace_table_add_key (replace_table, "LINK_NEXT", get_index_filename (items, theme, NULL, NULL)); if (previous_item) { - s = GET_ITEM_TARGET_FILENAME (previous_item); + s = get_item_target_filename (previous_item); replace_table_add_key_printf (replace_table, "LINK_PREV", theme->picture_filename, s); g_free (s); } @@ -822,7 +813,7 @@ process_img_item (TGallerySetup *setup, g_free (s3); } - s1 = GET_ITEM_TARGET_FILENAME (item); + s1 = get_item_target_filename (item); replace_table_add_key_printf (replace_table, "IMG_SUBPAGE", theme->picture_filename, s1); replace_table_add_key (replace_table, "IMG_FILENAME", s1); g_free (s1); @@ -1096,7 +1087,7 @@ write_html_page (TGallerySetup *setup, } if (block_parser_has_unused_data (block_parser, "NAV_BAR")) { - s2 = item != NULL ? GET_ITEM_TARGET_FILENAME (item) : NULL; + s2 = item != NULL ? get_item_target_filename (item) : NULL; s1 = make_navbar_string (setup, theme, block_parser, defines, items, item ? get_item_index (items, item) : -1, s2 ? s2 : items->ID); g_free (s2); replace_table_process (&s1, global_replace_table); -- cgit v1.2.3