summaryrefslogtreecommitdiff
path: root/src/generators.c
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@users.sourceforge.net>2015-01-25 18:23:03 +0100
committerTomas Bzatek <tbzatek@users.sourceforge.net>2015-01-25 18:23:03 +0100
commit6fffe1a21d5acaa544f7796241e13ff37e75349f (patch)
tree83e0cf3237f11742a89fbc925ac327595b930068 /src/generators.c
parent7779510229bb478f591cc67c0cb0e2fbb84fdb98 (diff)
downloadcataract-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.c97
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);