diff options
| author | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2015-01-25 20:55:53 +0100 |
|---|---|---|
| committer | Tomas Bzatek <tbzatek@users.sourceforge.net> | 2015-01-25 20:55:53 +0100 |
| commit | dd374c7ad3117b6e862b5491d7e580b1ae6a57dd (patch) | |
| tree | 9d823b6caa5d157794097784444bc4732d1eae78 | |
| parent | 7387a70b2f460d8a5e43de71cbe6a315430dc469 (diff) | |
| download | cataract-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.
| -rw-r--r-- | src/generators.c | 45 |
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); } |
