Bug fix: pdf and djvu files
authorColin Clark <colin.clark@cclark.uk>
Fri, 26 Jul 2019 11:48:48 +0000 (12:48 +0100)
committerColin Clark <colin.clark@cclark.uk>
Fri, 26 Jul 2019 11:48:48 +0000 (12:48 +0100)
Set default orientation for djvu files (FIXME)
Remove class Pdf and implement class Document
Improve error detection of file types

12 files changed:
src/filefilter.c
src/image-load.c
src/image.c
src/image_load_djvu.c
src/pixbuf_util.c
src/preferences.c
src/remote.c
src/search.c
src/thumb.c
src/thumb_standard.c
src/typedefs.h
src/ui_fileops.c

index 0ea3d08..c9c3766 100644 (file)
@@ -291,9 +291,18 @@ void filter_add_defaults(void)
 
        /* other supported formats */
        filter_add_if_missing("dds", "DirectDraw Surface", ".dds", FORMAT_CLASS_IMAGE, FALSE, FALSE, TRUE);
-       filter_add_if_missing("pdf", "Portable Document Format", ".pdf", FORMAT_CLASS_PDF, FALSE, FALSE, TRUE);
+#ifdef HAVE_PDF
+       filter_add_if_missing("pdf", "Portable Document Format", ".pdf", FORMAT_CLASS_DOCUMENT, FALSE, FALSE, TRUE);
+#endif
+#ifdef HAVE_HEIF
        filter_add_if_missing("HEIF", "HEIF Format", ".heic", FORMAT_CLASS_IMAGE, FALSE, FALSE, TRUE);
+#endif
+#ifdef HAVE_WEBP
        filter_add_if_missing("webp", "WebP Format", ".webp", FORMAT_CLASS_IMAGE, FALSE, FALSE, TRUE);
+#endif
+#ifdef HAVE_DJVU
+       filter_add_if_missing("djvu", "DjVu Format", ".djvu;.djv", FORMAT_CLASS_DOCUMENT, FALSE, FALSE, TRUE);
+#endif
 }
 
 GList *filter_to_list(const gchar *extensions)
@@ -473,7 +482,7 @@ FileFormatClass filter_file_get_class(const gchar *name)
        if (filter_file_class(name, FORMAT_CLASS_META)) return FORMAT_CLASS_META;
        if (filter_file_class(name, FORMAT_CLASS_VIDEO)) return FORMAT_CLASS_VIDEO;
        if (filter_file_class(name, FORMAT_CLASS_COLLECTION)) return FORMAT_CLASS_COLLECTION;
-       if (filter_file_class(name, FORMAT_CLASS_PDF)) return FORMAT_CLASS_PDF;
+       if (filter_file_class(name, FORMAT_CLASS_DOCUMENT)) return FORMAT_CLASS_DOCUMENT;
        return FORMAT_CLASS_UNKNOWN;
 }
 
index c9ddb5f..578e0ae 100644 (file)
@@ -613,6 +613,8 @@ static void image_loader_stop_loader(ImageLoader *il)
 
 static void image_loader_setup_loader(ImageLoader *il)
 {
+       gchar *format;
+
        g_mutex_lock(il->data_mutex);
 #ifdef HAVE_FFMPEGTHUMBNAILER
        if (il->fd->format_class == FORMAT_CLASS_VIDEO)
@@ -623,7 +625,8 @@ static void image_loader_setup_loader(ImageLoader *il)
        else
 #endif
 #ifdef HAVE_PDF
-       if (il->fd->format_class == FORMAT_CLASS_PDF)
+       if (il->bytes_total >= 4 &&
+           (memcmp(il->mapped_file + 0, "%PDF", 4) == 0))
                {
                DEBUG_1("Using custom pdf loader");
                image_loader_backend_set_pdf(&il->backend);
@@ -651,6 +654,7 @@ static void image_loader_setup_loader(ImageLoader *il)
 #endif
 #ifdef HAVE_DJVU
        if (il->bytes_total >= 16 &&
+               (memcmp(il->mapped_file, "AT&TFORM", 8) == 0) &&
                (memcmp(il->mapped_file + 12, "DJV", 3) == 0))
                {
                DEBUG_1("Using custom djvu loader");
@@ -695,17 +699,21 @@ 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_PDF
-       if (il->fd->format_class == FORMAT_CLASS_PDF)
+       format = il->backend.get_format_name(il->loader);
+       if (g_strcmp0(format, "pdf") == 0)
                {
                il->backend.set_page_num(il->loader, il->fd->page_num);
                }
+       g_free(format);
 #endif
 
 #ifdef HAVE_DJVU
-       if (g_strcmp0(il->fd->extension, ".djvu") == 0)
+       format = il->backend.get_format_name(il->loader);
+       if (g_strcmp0(format, "djvu") == 0)
                {
                il->backend.set_page_num(il->loader, il->fd->page_num);
                }
+       g_free(format);
 #endif
 
        g_mutex_unlock(il->data_mutex);
@@ -768,6 +776,7 @@ static gboolean image_loader_continue(ImageLoader *il)
 static gboolean image_loader_begin(ImageLoader *il)
 {
        gssize b;
+       gchar *format;
 
        if (il->pixbuf) return FALSE;
 
@@ -792,18 +801,22 @@ static gboolean image_loader_begin(ImageLoader *il)
                }
 
 #ifdef HAVE_PDF
-       if (il->fd->format_class == FORMAT_CLASS_PDF)
+       format = il->backend.get_format_name(il->loader);
+       if (g_strcmp0(format, "pdf") == 0)
                {
                gint i = il->backend.get_page_total(il->loader);
                file_data_set_page_total(il->fd, i);
                }
+       g_free(format);
 #endif
 #ifdef HAVE_DJVU
-       if (g_strcmp0(il->fd->extension, ".djvu") == 0)
+       format = il->backend.get_format_name(il->loader);
+       if (g_strcmp0(format, "djvu") == 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 31fb26a..23d2a20 100644 (file)
@@ -874,7 +874,7 @@ static void image_load_done_cb(ImageLoader *il, gpointer data)
                        case FORMAT_CLASS_COLLECTION:
                                pixbuf = pixbuf_inline(PIXBUF_INLINE_COLLECTION);
                                break;
-                       case FORMAT_CLASS_PDF:
+                       case FORMAT_CLASS_DOCUMENT:
                                pixbuf = pixbuf_inline(PIXBUF_INLINE_ICON_PDF);
                                break;
                        default:
index 46b1a5d..61d4efc 100644 (file)
@@ -92,10 +92,18 @@ static gboolean image_loader_djvu_load(gpointer loader, const guchar *buf, gsize
 
        ddjvu_page_render(page, DDJVU_RENDER_COLOR, &prect, &rrect, fmt, stride, pixels);
 
-       ld->pixbuf = gdk_pixbuf_new_from_data(pixels, GDK_COLORSPACE_RGB, alpha, 8, width, height, stride, free_buffer, NULL);
+       /* FIXME implementation of rotation is not correct */
+       GdkPixbuf *tmp1;
+       GdkPixbuf *tmp2;
+       tmp1 = gdk_pixbuf_new_from_data(pixels, GDK_COLORSPACE_RGB, alpha, 8, width, height, stride, free_buffer, NULL);
+       tmp2 = gdk_pixbuf_flip(tmp1, TRUE);
+       g_object_unref(tmp1);
+
+       ld->pixbuf = gdk_pixbuf_rotate_simple(tmp2,GDK_PIXBUF_ROTATE_UPSIDEDOWN);
 
        ld->area_updated_cb(loader, 0, 0, width, height, ld->data);
 
+
        cairo_surface_destroy(surface);
        ddjvu_page_release(page);
        ddjvu_document_release(doc);
index 97017aa..4243537 100644 (file)
@@ -298,7 +298,7 @@ GdkPixbuf *pixbuf_fallback(FileData *fd, gint requested_width, gint requested_he
                case FORMAT_CLASS_COLLECTION:
                        pixbuf = pixbuf_inline(PIXBUF_INLINE_COLLECTION);
                        break;
-               case FORMAT_CLASS_PDF:
+               case FORMAT_CLASS_DOCUMENT:
                        pixbuf = pixbuf_inline(PIXBUF_INLINE_ICON_PDF);
                        break;
                default:
index 9f14ac4..c3e9329 100644 (file)
@@ -117,7 +117,7 @@ gchar *format_class_list[] = {
        N_("Metadata"),
        N_("Video"),
        N_("Collection"),
-       N_("Pdf"),
+       N_("Document"),
        N_("HEIF")
        };
 
index aab8043..48c6540 100644 (file)
@@ -856,8 +856,8 @@ static void get_filelist(const gchar *text, GIOChannel *channel, gboolean recurs
                        case FORMAT_CLASS_COLLECTION:
                                out_string = g_string_append(out_string, "    Class: Collection");
                                break;
-                       case FORMAT_CLASS_PDF:
-                               out_string = g_string_append(out_string, "    Class: PDF");
+                       case FORMAT_CLASS_DOCUMENT:
+                               out_string = g_string_append(out_string, "    Class: Document");
                                break;
                        case FORMAT_CLASS_UNKNOWN:
                                out_string = g_string_append(out_string, "    Class: Unknown");
index b5cfc5f..7a0dd85 100644 (file)
@@ -2190,9 +2190,9 @@ static gboolean search_file_next(SearchData *sd)
                        search_class = FORMAT_CLASS_VIDEO;
                        }
                else if (g_strcmp0(gtk_combo_box_text_get_active_text(
-                                               GTK_COMBO_BOX_TEXT(sd->class_type)), _("Pdf")) == 0)
+                                               GTK_COMBO_BOX_TEXT(sd->class_type)), _("Document")) == 0)
                        {
-                       search_class = FORMAT_CLASS_PDF;
+                       search_class = FORMAT_CLASS_DOCUMENT;
                        }
                else if (g_strcmp0(gtk_combo_box_text_get_active_text(
                                                GTK_COMBO_BOX_TEXT(sd->class_type)), _("Metadata")) == 0)
@@ -3375,7 +3375,7 @@ void search_new(FileData *dir_fd, FileData *example_file)
        gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Image"));
        gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Raw Image"));
        gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Video"));
-       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Pdf"));
+       gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Document"));
        gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Metadata"));
        gtk_combo_box_text_append_text(GTK_COMBO_BOX_TEXT(sd->class_type), _("Unknown"));
        gtk_box_pack_start(GTK_BOX(hbox), sd->class_type, FALSE, FALSE, 0);
index bf18c60..6d464bb 100644 (file)
@@ -337,7 +337,7 @@ gboolean thumb_loader_start(ThumbLoader *tl, FileData *fd)
 
        if (!tl->fd) tl->fd = file_data_ref(fd);
 
-       if (tl->fd->format_class != FORMAT_CLASS_IMAGE && tl->fd->format_class != FORMAT_CLASS_RAWIMAGE && tl->fd->format_class != FORMAT_CLASS_COLLECTION && tl->fd->format_class != FORMAT_CLASS_VIDEO && tl->fd->format_class != FORMAT_CLASS_PDF && !options->file_filter.disable)
+       if (tl->fd->format_class != FORMAT_CLASS_IMAGE && tl->fd->format_class != FORMAT_CLASS_RAWIMAGE && tl->fd->format_class != FORMAT_CLASS_COLLECTION && tl->fd->format_class != FORMAT_CLASS_VIDEO && tl->fd->format_class != FORMAT_CLASS_DOCUMENT && !options->file_filter.disable)
                {
                thumb_loader_set_fallback(tl);
                return FALSE;
index f21906b..657760f 100644 (file)
@@ -667,7 +667,7 @@ gboolean thumb_loader_std_start(ThumbLoaderStd *tl, FileData *fd)
 
 
        tl->fd = file_data_ref(fd);
-       if (!stat_utf8(fd->path, &st) || (tl->fd->format_class != FORMAT_CLASS_IMAGE && tl->fd->format_class != FORMAT_CLASS_RAWIMAGE && tl->fd->format_class != FORMAT_CLASS_VIDEO && tl->fd->format_class != FORMAT_CLASS_COLLECTION && tl->fd->format_class != FORMAT_CLASS_PDF && !options->file_filter.disable))
+       if (!stat_utf8(fd->path, &st) || (tl->fd->format_class != FORMAT_CLASS_IMAGE && tl->fd->format_class != FORMAT_CLASS_RAWIMAGE && tl->fd->format_class != FORMAT_CLASS_VIDEO && tl->fd->format_class != FORMAT_CLASS_COLLECTION && tl->fd->format_class != FORMAT_CLASS_DOCUMENT && !options->file_filter.disable))
                {
                thumb_loader_std_set_fallback(tl);
                return FALSE;
index 6136fbe..729a9f9 100644 (file)
@@ -144,7 +144,7 @@ typedef enum {
        FORMAT_CLASS_META,
        FORMAT_CLASS_VIDEO,
        FORMAT_CLASS_COLLECTION,
-       FORMAT_CLASS_PDF,
+       FORMAT_CLASS_DOCUMENT,
        FILE_FORMAT_CLASSES
 } FileFormatClass;
 
index 1002272..722fdf8 100644 (file)
@@ -1067,7 +1067,7 @@ gboolean download_web_file(const gchar *text, gpointer data)
                {
                format_class = filter_file_get_class(text);
 
-               if (format_class == FORMAT_CLASS_IMAGE || format_class == FORMAT_CLASS_RAWIMAGE || format_class == FORMAT_CLASS_VIDEO || format_class == FORMAT_CLASS_PDF)
+               if (format_class == FORMAT_CLASS_IMAGE || format_class == FORMAT_CLASS_RAWIMAGE || format_class == FORMAT_CLASS_VIDEO || format_class == FORMAT_CLASS_DOCUMENT)
                        {
                        tmp_dir = g_dir_make_tmp("geeqie_XXXXXX", &error);
                        if (error)