diff options
| author | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2015-01-25 18:23:03 +0100 |
|---|---|---|
| committer | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2015-01-25 18:23:03 +0100 |
| commit | 6fffe1a21d5acaa544f7796241e13ff37e75349f (patch) | |
| tree | 83e0cf3237f11742a89fbc925ac327595b930068 /src/generators.c | |
| parent | 7779510229bb478f591cc67c0cb0e2fbb84fdb98 (diff) | |
| download | cataract-6fffe1a21d5acaa544f7796241e13ff37e75349f.tar.xz | |
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 <item> tag arguments. Alternatively, this automatic name matching
can be overriden by <size tagname="..."> 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).
Diffstat (limited to 'src/generators.c')
| -rw-r--r-- | src/generators.c | 97 |
1 files changed, 44 insertions, 53 deletions
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); |
