summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@users.sourceforge.net>2015-01-25 20:55:53 +0100
committerTomas Bzatek <tbzatek@users.sourceforge.net>2015-01-25 20:55:53 +0100
commitdd374c7ad3117b6e862b5491d7e580b1ae6a57dd (patch)
tree9d823b6caa5d157794097784444bc4732d1eae78 /src
parent7387a70b2f460d8a5e43de71cbe6a315430dc469 (diff)
downloadcataract-dd374c7ad3117b6e862b5491d7e580b1ae6a57dd.tar.xz
theming: Implement have_image_size() block function
This can be used to query image size availability for the current item. While images are normally generated for theme-defined image sizes and thus guaranteed to be available, this function queries if the image of defined size has really been supplied in album XML files. Takes in account the legacy "nofullsize" tags. Takes one mandatory argument of image size name.
Diffstat (limited to 'src')
-rw-r--r--src/generators.c45
1 files changed, 45 insertions, 0 deletions
diff --git a/src/generators.c b/src/generators.c
index ae3219d..845e5c1 100644
--- a/src/generators.c
+++ b/src/generators.c
@@ -332,6 +332,43 @@ have_exif_key_cb (gchar **args, gpointer user_data)
return exif_has_key (exif, *args);
}
+struct HaveImageSizeData {
+ TGallerySetup *setup;
+ TAlbum *items;
+ TIndexItem *item;
+};
+
+static gboolean
+have_image_size_cb (gchar **args, gpointer user_data)
+{
+ struct HaveImageSizeData *data = user_data;
+ gboolean is_original;
+
+ g_return_val_if_fail (g_strv_length (args) != 2, FALSE); /* incl. trailing NULL */
+
+ /* no image size of that name available */
+ if (! lookup_image_size_for_name (data->setup, *args))
+ return FALSE;
+
+ is_original = g_ascii_strcasecmp ("original", *args) == 0;
+
+ /* no custom image sizes defined for the particular item */
+ if (! is_original && ! data->item->image_sizes)
+ return FALSE;
+
+ if (! is_original && data->item->image_sizes && g_hash_table_lookup (data->item->image_sizes, *args))
+ return TRUE;
+
+ if (is_original && data->item->path && ! IS_NOFULLSIZE (data->item, data->items, data->setup))
+ return TRUE;
+
+ if (is_original && (! data->item->path || IS_NOFULLSIZE (data->item, data->items, data->setup)) &&
+ data->item->image_sizes && g_hash_table_lookup (data->item->image_sizes, "preview"))
+ return TRUE;
+
+ return FALSE;
+}
+
/*
@@ -764,6 +801,7 @@ process_img_item (TGallerySetup *setup,
gchar *title, *title_desc;
TImageSize *orig_image_size;
ExifData *exif = NULL;
+ struct HaveImageSizeData *img_size_data;
if (list_mode) {
/* Index stuff */
@@ -891,6 +929,13 @@ process_img_item (TGallerySetup *setup,
/* Common tags */
replace_table_add_key_printf (replace_table, "IMG_POS_MARKER", POSITION_MARKER_FMT, get_item_index (items, item));
replace_table_add_key_int (replace_table, "ITEM_INDEX", get_display_item_index (items, item));
+
+ /* Single image size callback */
+ img_size_data = g_new0 (struct HaveImageSizeData, 1);
+ img_size_data->setup = setup;
+ img_size_data->item = item;
+ img_size_data->items = items;
+ block_parser_register_function (block_parser, "have_image_size", have_image_size_cb, img_size_data, g_free);
}