Fix #324: TIFF multipage viewing
authorColin Clark <colin.clark@cclark.uk>
Tue, 6 Aug 2019 11:39:28 +0000 (12:39 +0100)
committerColin Clark <colin.clark@cclark.uk>
Tue, 6 Aug 2019 11:39:28 +0000 (12:39 +0100)
https://github.com/BestImageViewer/geeqie/issues/324

src/image-load.c
src/image_load_tiff.c
src/layout.c

index 578e0ae..8cee6e7 100644 (file)
@@ -698,6 +698,15 @@ static void image_loader_setup_loader(ImageLoader *il)
 
        il->loader = il->backend.loader_new(image_loader_area_updated_cb, image_loader_size_cb, image_loader_area_prepared_cb, il);
 
+#ifdef HAVE_TIFF
+       format = il->backend.get_format_name(il->loader);
+       if (g_strcmp0(format, "tiff") == 0)
+               {
+               il->backend.set_page_num(il->loader, il->fd->page_num);
+               }
+       g_free(format);
+#endif
+
 #ifdef HAVE_PDF
        format = il->backend.get_format_name(il->loader);
        if (g_strcmp0(format, "pdf") == 0)
@@ -818,6 +827,15 @@ static gboolean image_loader_begin(ImageLoader *il)
                }
        g_free(format);
 #endif
+#ifdef HAVE_TIFF
+       format = il->backend.get_format_name(il->loader);
+       if (g_strcmp0(format, "tiff") == 0)
+               {
+               gint i = il->backend.get_page_total(il->loader);
+               file_data_set_page_total(il->fd, i);
+               }
+       g_free(format);
+#endif
 
        il->bytes_read += b;
 
index a3c8ce6..03315c0 100644 (file)
@@ -51,6 +51,8 @@ struct _ImageLoaderTiff {
        const guchar *buffer;
        toff_t used;
        toff_t pos;
+       gint page_num;
+       gint page_total;
 };
 
 static void free_buffer (guchar *pixels, gpointer data)
@@ -144,6 +146,7 @@ static gboolean image_loader_tiff_load (gpointer loader, const guchar *buf, gsiz
        gint width, height, rowstride;
        size_t bytes;
        uint32 rowsperstrip;
+       gint dircount = 0;
 
        lt->buffer = buf;
        lt->used = count;
@@ -161,7 +164,21 @@ static gboolean image_loader_tiff_load (gpointer loader, const guchar *buf, gsiz
                DEBUG_1("Failed to open TIFF image");
                return FALSE;
                }
+       else
+               {
+               do
+                       {
+                       dircount++;
+                       } while (TIFFReadDirectory(tiff));
+               lt->page_total = dircount;
+               }
 
+    if (!TIFFSetDirectory(tiff, lt->page_num))
+               {
+               DEBUG_1("Failed to open TIFF image");
+               TIFFClose(tiff);
+               return FALSE;
+               }
 
        if (!TIFFGetField (tiff, TIFFTAG_IMAGEWIDTH, &width))
                {
@@ -364,6 +381,20 @@ static void image_loader_tiff_free(gpointer loader)
        g_free(lt);
 }
 
+static void image_loader_tiff_set_page_num(gpointer loader, gint page_num)
+{
+       ImageLoader *il = (ImageLoader *) loader;
+       ImageLoaderTiff *lt = (ImageLoaderTiff *) loader;
+
+       lt->page_num = page_num;
+}
+
+static gint image_loader_tiff_get_page_total(gpointer loader)
+{
+       ImageLoaderTiff *lt = (ImageLoaderTiff *) loader;
+
+       return lt->page_total;
+}
 
 void image_loader_backend_set_tiff(ImageLoaderBackend *funcs)
 {
@@ -378,6 +409,9 @@ void image_loader_backend_set_tiff(ImageLoaderBackend *funcs)
 
        funcs->get_format_name = image_loader_tiff_get_format_name;
        funcs->get_format_mime_types = image_loader_tiff_get_format_mime_types;
+
+       funcs->set_page_num = image_loader_tiff_set_page_num;
+       funcs->get_page_total = image_loader_tiff_get_page_total;
 }
 
 
index d2cc2c5..d7edb2d 100644 (file)
@@ -726,7 +726,7 @@ void layout_status_update_image(LayoutWindow *lw)
 
                        if (page_total > 0)
                                {
-                               text = g_strdup_printf(_("( %d x %d ) %s bytes%s%d%s%d%s"), width, height, b, "[", page_num, "/", page_total, "]");
+                               text = g_strdup_printf(_("( %d x %d ) %s bytes %s%d%s%d%s"), width, height, b, "[", page_num, "/", page_total, "]");
                                }
                        else
                                {
@@ -838,7 +838,7 @@ static void layout_status_setup(LayoutWindow *lw, GtkWidget *box, gboolean small
                }
        lw->info_details = layout_status_label(NULL, hbox, TRUE, 0, TRUE);
        DEBUG_NAME(lw->info_details);
-       gtk_widget_set_tooltip_text(GTK_WIDGET(lw->info_details), _("(Image dimensions) Image size"));
+       gtk_widget_set_tooltip_text(GTK_WIDGET(lw->info_details), _("(Image dimensions) Image size [page n of m]"));
        toolbar = layout_actions_toolbar(lw, TOOLBAR_STATUS);
 
        toolbar_frame = gtk_frame_new(NULL);