summaryrefslogtreecommitdiff
path: root/src/generators.c
diff options
context:
space:
mode:
authorTomas Bzatek <tbzatek@users.sourceforge.net>2014-09-15 23:45:14 +0200
committerTomas Bzatek <tbzatek@users.sourceforge.net>2014-09-15 23:45:14 +0200
commitd8708c220afc84549e5e4feaa09f32aa46aba4b5 (patch)
tree5c5f3a2aca7de56737a739e667c5f428321d3c34 /src/generators.c
parent2ab38412b14f38202b364558031ddb7db357f1ec (diff)
downloadcataract-d8708c220afc84549e5e4feaa09f32aa46aba4b5.tar.xz
theming: Allow themes to use different thumbnail image sizes
This change makes thumbnail image sizes more flexible by explicitly stating the particular image size is a thumbnail. And each thumbnail image size can have different squared settings. On the theme side it's now mandatory to specify which thumbnail size to use (if applicable). This allows us to have different thumbnail styles for index and album pages. This commit also removes the <squared_thumbnails> tag from setup.xml file but retains fallback for ver. 1 setup.xml files.
Diffstat (limited to 'src/generators.c')
-rw-r--r--src/generators.c104
1 files changed, 44 insertions, 60 deletions
diff --git a/src/generators.c b/src/generators.c
index a2f7a65..3d04ad6 100644
--- a/src/generators.c
+++ b/src/generators.c
@@ -44,21 +44,6 @@
#define BUFFER_SIZE 65536 /* line cannot be longer than this */
-static TImageSize *
-find_image_size_for_name (TGallerySetup *setup, const gchar *name)
-{
- GList *l;
- TImageSize *image_size;
-
- for (l = g_list_first (setup->design->image_sizes); l; l = g_list_next (l)) {
- image_size = l->data;
- g_assert (image_size != NULL);
- if (g_ascii_strcasecmp (name, image_size->name) == 0)
- return image_size;
- }
- return NULL;
-}
-
static void
get_image_paths (TGallerySetup *setup,
@@ -72,7 +57,6 @@ get_image_paths (TGallerySetup *setup,
gchar **page_img_dst)
{
gboolean nofullsize;
- gboolean is_thumbnail;
gboolean is_preview;
gboolean is_original;
gchar *s1, *s2, *s3;
@@ -87,23 +71,23 @@ get_image_paths (TGallerySetup *setup,
*page_img_dst = NULL;
preview_image_size = NULL;
- /* ignore combinations that are not valid */
nofullsize = IS_NOFULLSIZE (item, items, setup);
- is_thumbnail = g_ascii_strcasecmp ("thumbnail", image_size->name) == 0;
is_preview = g_ascii_strcasecmp ("preview", image_size->name) == 0;
is_original = g_ascii_strcasecmp ("original", image_size->name) == 0;
- if ((items->type == GALLERY_TYPE_INDEX && ! is_thumbnail) ||
- (is_thumbnail && item->hidden) ||
- (is_thumbnail && items->type == GALLERY_TYPE_INDEX && (item->thumbnail == NULL || strlen (item->thumbnail) == 0)))
+
+ /* ignore combinations that are not valid */
+ if ((items->type == GALLERY_TYPE_INDEX && ! image_size->is_thumbnail) ||
+ (image_size->is_thumbnail && item->hidden) ||
+ (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 = find_image_size_for_name (setup, "preview");
+ 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);
/* Thumbnail special case */
- if (is_thumbnail) {
+ if (image_size->is_thumbnail) {
s1 = NULL;
if (items->type == GALLERY_TYPE_INDEX) {
s1 = item->thumbnail;
@@ -152,7 +136,8 @@ metadata_apply_overrides (ExifData *exif_data,
TGallerySetup *setup,
TPathInfo *path_info,
TAlbum *items,
- TIndexItem *item)
+ TIndexItem *item,
+ TImageSize *image_size)
{
g_return_if_fail (exif_data != NULL);
@@ -170,8 +155,7 @@ metadata_apply_overrides (ExifData *exif_data,
if (setup->write_supplied_exif && item->metadata_external_exif)
exif_data->external_exif_data = g_path_is_absolute (item->metadata_external_exif) ? g_strdup (item->metadata_external_exif) : g_build_filename (path_info->src_dir, item->metadata_external_exif, NULL);
- exif_data->squared_thumbnail_type = setup->squared_thumbnail_type;
-
+ exif_data->squared_thumbnail = image_size->is_thumbnail && image_size->squared_thumb;
exif_data->thumbnail_crop_hint = get_prop_int (items, item, PROP_THUMB_CROP_HINT, CROP_HINT_UNDEFINED);
}
@@ -188,7 +172,6 @@ generate_image (TGallerySetup *setup,
gboolean query_update)
{
gboolean res;
- gboolean is_thumbnail;
gboolean is_preview;
gboolean is_original;
gchar *img_src;
@@ -206,7 +189,6 @@ generate_image (TGallerySetup *setup,
image_size = l->data;
/* TODO: this is too specific */
- is_thumbnail = g_ascii_strcasecmp ("thumbnail", image_size->name) == 0;
is_preview = g_ascii_strcasecmp ("preview", image_size->name) == 0;
is_original = g_ascii_strcasecmp ("original", image_size->name) == 0;
@@ -224,13 +206,13 @@ generate_image (TGallerySetup *setup,
}
exif_data = exif_data_new_empty ();
- metadata_apply_overrides (exif_data, setup, path_info, items, item);
+ metadata_apply_overrides (exif_data, setup, path_info, items, item, image_size);
/* Do something when required */
res = res || needs_update (img_src, img_dst);
if (! query_update) {
/* Copy the source file */
- if (image_size->no_resize && ((is_preview && item->preview) || is_original)) {
+ if (! image_size->is_thumbnail && image_size->no_resize && ((is_preview && item->preview) || is_original)) {
if (! copy_file (img_src, img_dst))
log_error (" Error copying image %s to %s\n", img_src, img_dst);
}
@@ -240,32 +222,33 @@ generate_image (TGallerySetup *setup,
if (img_w > 0 && img_h > 0) {
stats_images_inc ();
- /* Only the "preview" size is affected by deprecated 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);
- calculate_sizes (tmpw, tmph, &img_w, &img_h);
- }
- if (is_thumbnail && setup->squared_thumbnail_type != THUMBNAIL_SQUARE_TYPE_NONE)
- tmpw = tmph = image_size->square_size;
- else
- /* Calculate sizes */
- if (img_w > img_h) {
- tmpw = image_size->landscape_width;
- tmph = image_size->landscape_height;
+ if (image_size->is_thumbnail && image_size->squared_thumb)
+ img_w = img_h = image_size->square_size;
+ else {
+ /* Only the "preview" size is affected by deprecated item and album overrides */
if (is_preview) {
- tmpw = get_prop_int (items, item, PROP_LANDSCAPE_W, tmpw);
- tmph = get_prop_int (items, item, PROP_LANDSCAPE_H, tmph);
+ tmpw = get_prop_int (items, item, PROP_WIDTH, img_w);
+ tmph = get_prop_int (items, item, PROP_HEIGHT, img_h);
+ calculate_sizes (tmpw, tmph, &img_w, &img_h);
}
- } else {
- tmpw = image_size->portrait_width;
- tmph = image_size->portrait_height;
- if (is_preview) {
- tmpw = get_prop_int (items, item, PROP_PORTRAIT_W, tmpw);
- tmph = get_prop_int (items, item, PROP_PORTRAIT_H, tmph);
+ /* Calculate sizes */
+ if (img_w > img_h) {
+ tmpw = image_size->landscape_width;
+ tmph = image_size->landscape_height;
+ if (is_preview) {
+ tmpw = get_prop_int (items, item, PROP_LANDSCAPE_W, tmpw);
+ tmph = get_prop_int (items, item, PROP_LANDSCAPE_H, tmph);
+ }
+ } else {
+ tmpw = image_size->portrait_width;
+ tmph = image_size->portrait_height;
+ if (is_preview) {
+ tmpw = get_prop_int (items, item, PROP_PORTRAIT_W, tmpw);
+ tmph = get_prop_int (items, item, PROP_PORTRAIT_H, tmph);
+ }
}
+ calculate_sizes (tmpw, tmph, &img_w, &img_h);
}
- calculate_sizes (tmpw, tmph, &img_w, &img_h);
/* Calculate quality */
if (is_preview)
quality = get_prop_int (items, item, PROP_QUALITY, image_size->quality);
@@ -273,14 +256,14 @@ generate_image (TGallerySetup *setup,
quality = image_size->quality;
/* Perform resize and strip */
- if (! resize_image (img_src, img_dst, img_w, img_h, quality, is_thumbnail, setup->autorotate, exif_data))
+ if (! resize_image (img_src, img_dst, img_w, img_h, quality, image_size->is_thumbnail, setup->autorotate, exif_data))
log_error (" Error resizing image %s\n", img_src);
} else {
log_error ("generate_image: image %s sizes are %lux%lu\n", img_src, img_w, img_h);
}
}
}
- if (! is_thumbnail) {
+ if (! image_size->is_thumbnail) {
modify_exif (img_dst, exif_data, setup->erase_exif_thumbnail, setup->strip_xmp);
}
@@ -491,8 +474,9 @@ write_html_album (TGallerySetup *setup,
/* Theming */
/* TODO: "image_size" will be used for album themes showing pictures inpage */
- image_size = find_image_size_for_name (setup, theme->album_image_size);
- thumb_image_size = find_image_size_for_name (setup, "thumbnail");
+ image_size = lookup_image_size_for_name (setup, theme->album_image_size);
+ thumb_image_size = lookup_image_size_for_name (setup, items->type == GALLERY_TYPE_ALBUM ? theme->album_thumb_size : theme->index_thumb_size);
+ g_assert (thumb_image_size != NULL);
/* Setup block parser */
block_parser_register_key (block_parser, "IMG_LIST", "IMG_LIST");
@@ -554,7 +538,7 @@ write_html_album (TGallerySetup *setup,
if (s2 != NULL)
get_image_sizes (s2, &img_thumb_w, &img_thumb_h, setup->autorotate);
- if (setup->squared_thumbnail_type != THUMBNAIL_SQUARE_TYPE_NONE || img_thumb_w == img_thumb_h)
+ if (thumb_image_size->squared_thumb || img_thumb_w == img_thumb_h)
s1 = "IMG_LIST_SQUARED";
else
s1 = (img_thumb_h > img_thumb_w) ? "IMG_LIST_PORTRAIT" : "IMG_LIST_LANDSCAPE";
@@ -783,9 +767,9 @@ write_html_image (TGallerySetup *setup,
/* If currently processed picture size is original, disable fullsize tags */
theme_size_is_original = g_ascii_strcasecmp (theme->picture_image_size, "original") == 0;
/* Original size is needed for several things, like EXIF and IPTC metadata */
- image_size = find_image_size_for_name (setup, "original");
+ image_size = lookup_image_size_for_name (setup, "original");
get_image_paths (setup, parent_items, item, item_index, path_info, image_size, &img_orig_src, &img_orig_dst, &img_orig_dst_page);
- image_size = find_image_size_for_name (setup, theme->picture_image_size);
+ image_size = lookup_image_size_for_name (setup, theme->picture_image_size);
get_image_paths (setup, parent_items, item, item_index, path_info, image_size, NULL, &img_dst, &img_dst_page);
imgname = g_path_get_basename (img_dst);
if (next_item && setup->preload)
@@ -819,7 +803,7 @@ write_html_image (TGallerySetup *setup,
*/
}
if (exif != NULL)
- metadata_apply_overrides (exif, setup, path_info, parent_items, item);
+ metadata_apply_overrides (exif, setup, path_info, parent_items, item, image_size);
/* Test for basic EXIF keys presence */
if (exif != NULL && exif_has_key (exif, EXIF_APERTURE) &&
exif_has_key (exif, EXIF_FOCAL_LENGTH) &&