From bf19313cd64fb6ac21004a06586f90fd3765293b Mon Sep 17 00:00:00 2001 From: Tomas Bzatek Date: Wed, 23 Sep 2009 10:10:12 +0200 Subject: Generate source image and thumbnail paths on demand Another step to get rid of writes to unlocked objects during threading. --- src/generators.c | 90 ++++++++++++++++++++++++++++++++++++++++++-------------- src/items.h | 2 -- 2 files changed, 68 insertions(+), 24 deletions(-) (limited to 'src') diff --git a/src/generators.c b/src/generators.c index 0db1b76..f53b826 100644 --- a/src/generators.c +++ b/src/generators.c @@ -36,6 +36,7 @@ +/* Returns newly allocated string */ static gchar * make_thumbnail_string (TGallerySetup *setup, unsigned int item_index, const gchar *imgname) { @@ -51,6 +52,53 @@ make_thumbnail_string (TGallerySetup *setup, unsigned int item_index, const gcha return s; } +/* Get full image source path */ +/* Returns newly allocated string */ +static gchar * +item_get_img_src (TGallerySetup *setup, TAlbum *items, TIndexItem *item) +{ + if (items->type == GALLERY_TYPE_INDEX) { + if (item->thumbnail == NULL || strlen (item->thumbnail) == 0) + return NULL; + return g_path_get_basename (item->thumbnail); + } + else + if (items->type == GALLERY_TYPE_ALBUM) { + return g_path_get_basename ((item->path == NULL && item->preview) ? item->preview : item->path); + } + g_assert_not_reached (); + return NULL; +} + +/* Get full thumbnail source path */ +/* Returns newly allocated string */ +static gchar * +item_get_thumbnail_src (TGallerySetup *setup, TAlbum *items, TIndexItem *item, unsigned int item_index) +{ + gchar *s1, *ret; + const gchar *gen_img_src; + + if (items->type == GALLERY_TYPE_INDEX) { + if (item->thumbnail == NULL || strlen (item->thumbnail) == 0) + return NULL; + s1 = g_path_get_basename (item->thumbnail); + ret = make_thumbnail_string (setup, item_index, s1); + g_free (s1); + return ret; + } + else + if (items->type == GALLERY_TYPE_ALBUM) { + gen_img_src = (item->path == NULL && item->preview) ? item->preview : item->path; + s1 = g_path_get_basename ((item->thumbnail) ? item->thumbnail : gen_img_src); + ret = make_thumbnail_string (setup, item_index, s1); + g_free (s1); + return ret; + } + g_assert_not_reached (); + return NULL; +} + + /* * generate_image: generate needed image sizes @@ -76,8 +124,6 @@ generate_image (TGallerySetup *setup, gboolean res; - item->gen_img_src = NULL; - item->gen_thumb = NULL; thumb_src_full = NULL; img_src_full = NULL; orig_dst = NULL; @@ -87,32 +133,28 @@ generate_image (TGallerySetup *setup, return FALSE; img_src_full = g_strconcat (items->base_dir, "/", item->thumbnail, NULL); thumb_src_full = g_strconcat (items->base_dir, "/", item->thumbnail, NULL); - item->gen_img_src = g_path_get_basename (item->thumbnail); - s1 = g_path_get_basename (item->thumbnail); - item->gen_thumb = make_thumbnail_string (setup, item_index, s1); - g_free (s1); } else if (items->type == GALLERY_TYPE_ALBUM) { - item->gen_img_src = (item->path == NULL && item->preview) ? item->preview : item->path; - item->gen_thumb = (item->thumbnail) ? item->thumbnail : item->gen_img_src; - img_src_full = g_strconcat (items->base_dir, "/", item->gen_img_src, NULL); - thumb_src_full = g_strconcat (items->base_dir, "/", item->gen_thumb, NULL); - item->gen_img_src = g_path_get_basename (item->gen_img_src); - s1 = g_path_get_basename (item->gen_thumb); - item->gen_thumb = make_thumbnail_string (setup, item_index, s1); - g_free (s1); + s1 = (item->path == NULL && item->preview) ? item->preview : item->path; + thumb_src_full = (item->thumbnail) ? item->thumbnail : s1; + img_src_full = g_strconcat (items->base_dir, "/", s1, NULL); + thumb_src_full = g_strconcat (items->base_dir, "/", thumb_src_full, NULL); } /* Make paths */ - thumb_dst = g_strconcat (dst_dir, "/", setup->thumbnail_dir, "/", item->gen_thumb, NULL); - big_dst = g_strconcat (dst_dir, "/", setup->img_big_dir, "/", item->gen_img_src, NULL); + s1 = item_get_thumbnail_src (setup, items, item, item_index); + thumb_dst = g_strconcat (dst_dir, "/", setup->thumbnail_dir, "/", s1, NULL); + g_free (s1); + s1 = item_get_img_src (setup, items, item); + big_dst = g_strconcat (dst_dir, "/", setup->img_big_dir, "/", s1, NULL); if (item->force_fullsize || (items->fullsize && ! item->force_nofullsize) || (! item->force_nofullsize && ! items->nofullsize && ! setup->nofullsize)) - orig_dst = g_strconcat (dst_dir, "/", setup->img_orig_dir, "/", item->gen_img_src, NULL); + orig_dst = g_strconcat (dst_dir, "/", setup->img_orig_dir, "/", s1, NULL); res = (! update_when_necessary) || needs_update (thumb_src_full, thumb_dst) || (items->type == GALLERY_TYPE_ALBUM && (needs_update (img_src_full, big_dst) || (orig_dst && needs_update (img_src_full, orig_dst)))); - + g_free (s1); + /* Do something when necessary */ if (res) { get_image_sizes (img_src_full, &new_w, &new_h); @@ -405,13 +447,17 @@ write_html_album (TGallerySetup *setup, if (! item->hidden) { s1 = block_parser_get_data (block_parser, item->gen_portrait ? "IMG_LIST_PORTRAIT" : "IMG_LIST_LANDSCAPE"); replace_table_add_key_printf (local_replace_table, "ALBUM_SUBPATH", "%s/%s", item->path, setup->index_file_name); - replace_table_add_key_printf (local_replace_table, "IMG_SUBPAGE", "%s%s", item->gen_img_src, GET_EXT (setup->index_file_name)); + s3 = item_get_img_src (setup, items, item); + replace_table_add_key_printf (local_replace_table, "IMG_SUBPAGE", "%s%s", s3, GET_EXT (setup->index_file_name)); + replace_table_add_key (local_replace_table, "IMG_FILENAME", s3); + g_free (s3); + s3 = item_get_thumbnail_src (setup, items, item, i); + if (s3 != NULL) + replace_table_add_key_printf (local_replace_table, "IMG_THUMBNAIL", "%s/%s", setup->thumbnail_dir, s3); + g_free (s3); replace_table_add_key (local_replace_table, "IMG_TITLE", item->title); replace_table_add_key (local_replace_table, "IMG_DESCRIPTION", item->title_description); replace_table_add_key_printf (local_replace_table, "IMG_LIST_ID", "i%d", i + 1); - if (item->gen_thumb != NULL) - replace_table_add_key_printf (local_replace_table, "IMG_THUMBNAIL", "%s/%s", setup->thumbnail_dir, item->gen_thumb); - replace_table_add_key (local_replace_table, "IMG_FILENAME", item->gen_img_src); if (items->type == GALLERY_TYPE_INDEX) { s3 = g_strconcat (items->base_dir, "/", item->path, "/index.xml", NULL); replace_table_add_key_int (local_replace_table, "ALBUM_NUM_ITEMS", get_album_objects_count (s3)); diff --git a/src/items.h b/src/items.h index c61863b..de71a71 100644 --- a/src/items.h +++ b/src/items.h @@ -73,8 +73,6 @@ typedef struct { gboolean hidden; /* generated item info */ - gchar *gen_img_src; - gchar *gen_thumb; gboolean gen_portrait; } TIndexItem; -- cgit v1.2.3