From dd374c7ad3117b6e862b5491d7e580b1ae6a57dd Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Sun, 25 Jan 2015 20:55:53 +0100 Subject: 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. --- src/generators.c | 45 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 45 insertions(+) (limited to 'src') 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); } -- cgit v1.2.3