[evince] djvu: Add support for page labels.



commit 52af06325a4730b816eaa164b7bc3bbf53f95379
Author: José Aliste <jaliste src gnome org>
Date:   Wed Feb 6 00:13:41 2013 +0100

    djvu: Add support for page labels.
    
    DjvuLibre provides a fileinfo structure where the title, if different
    from the id , corresponds to the label of the page.

 backend/djvu/djvu-document-private.h |    2 +
 backend/djvu/djvu-document.c         |   69 ++++++++++++++++++++++++++--------
 2 files changed, 55 insertions(+), 16 deletions(-)
---
diff --git a/backend/djvu/djvu-document-private.h b/backend/djvu/djvu-document-private.h
index 2ec9b67..dfc75f4 100644
--- a/backend/djvu/djvu-document-private.h
+++ b/backend/djvu/djvu-document-private.h
@@ -38,6 +38,8 @@ struct _DjvuDocument {
         /* PS exporter */
         gchar           *ps_filename;
         GString         *opts;
+       ddjvu_fileinfo_t *fileinfo_pages;
+       gint              n_pages;
 };
 
 int  djvu_document_get_n_pages (EvDocument   *document);
diff --git a/backend/djvu/djvu-document.c b/backend/djvu/djvu-document.c
index 9c1b135..b8243c3 100644
--- a/backend/djvu/djvu-document.c
+++ b/backend/djvu/djvu-document.c
@@ -151,7 +151,11 @@ djvu_document_load (EvDocument  *document,
        ddjvu_document_t *doc;
        gchar *filename;
        gboolean missing_files = FALSE;
+       gboolean check_for_missing_files = FALSE;
        GError *djvu_error = NULL;
+       gint n_files;
+       gint i;
+       gchar *base;
 
        /* FIXME: We could actually load uris  */
        filename = g_filename_from_uri (uri, NULL, error);
@@ -207,35 +211,43 @@ djvu_document_load (EvDocument  *document,
        g_free (djvu_document->uri);
        djvu_document->uri = g_strdup (uri);
 
-       if (ddjvu_document_get_type (djvu_document->d_document) == DDJVU_DOCTYPE_INDIRECT) {
-               gint n_files;
-               gint i;
-               gchar *base;
+       djvu_document->n_pages = ddjvu_document_get_pagenum (djvu_document->d_document);
 
-               base = g_path_get_dirname (filename);
+       if (djvu_document->n_pages > 0) {
+               djvu_document->fileinfo_pages = g_new0 (ddjvu_fileinfo_t, djvu_document->n_pages);
+       }
+
+       if (ddjvu_document_get_type (djvu_document->d_document) == DDJVU_DOCTYPE_INDIRECT)
+               check_for_missing_files = TRUE;
+
+       base = g_path_get_dirname (filename);
 
-               n_files = ddjvu_document_get_filenum (djvu_document->d_document);
-               for (i = 0; i < n_files; i++) {
-                       struct ddjvu_fileinfo_s fileinfo;
-                       gchar *file;
+       n_files = ddjvu_document_get_filenum (djvu_document->d_document);
+       for (i = 0; i < n_files; i++) {
+               ddjvu_fileinfo_t fileinfo;
+               gchar *file;
                        
-                       ddjvu_document_get_fileinfo (djvu_document->d_document,
-                                                    i, &fileinfo);
+               ddjvu_document_get_fileinfo (djvu_document->d_document,
+                                            i, &fileinfo);
 
-                       if (fileinfo.type != 'P')
-                               continue;
+               if (fileinfo.type != 'P')
+                       continue;
+
+               if (fileinfo.pageno >= 0 && fileinfo.pageno < djvu_document->n_pages) {
+                       djvu_document->fileinfo_pages[fileinfo.pageno] = fileinfo;
+               }
 
+
+               if (check_for_missing_files && !missing_files) {
                        file = g_build_filename (base, fileinfo.id, NULL);
                        if (!g_file_test (file, G_FILE_TEST_EXISTS)) {
                                missing_files = TRUE;
                                g_free (file);
-                               
-                               break;
                        }
                        g_free (file);
                }
-               g_free (base);
        }
+       g_free (base);
        g_free (filename);
 
        if (missing_files) {
@@ -394,6 +406,27 @@ djvu_document_render (EvDocument      *document,
        return surface;
 }
 
+static char *
+djvu_document_get_page_label (EvDocument *document,
+                              EvPage     *page)
+{
+       DjvuDocument *djvu_document = DJVU_DOCUMENT (document);
+       const gchar *title = NULL;
+       gchar *label = NULL;
+
+       g_assert (page->index >= 0 && page->index < djvu_document->n_pages);
+
+       if (djvu_document->fileinfo_pages == NULL)
+               return NULL;
+
+       title = djvu_document->fileinfo_pages[page->index].title;
+
+       if (!g_str_has_suffix (title, ".djvu"))
+               label = g_strdup (title);
+
+       return label;
+}
+
 static GdkPixbuf *
 djvu_document_get_thumbnail (EvDocument      *document,
                             EvRenderContext *rc)
@@ -446,6 +479,9 @@ djvu_document_finalize (GObject *object)
        if (djvu_document->ps_filename)
            g_free (djvu_document->ps_filename);
            
+       if (djvu_document->fileinfo_pages) 
+           g_free (djvu_document->fileinfo_pages);
+       
        ddjvu_context_release (djvu_document->d_context);
        ddjvu_format_release (djvu_document->d_format);
        ddjvu_format_release (djvu_document->thumbs_format);
@@ -465,6 +501,7 @@ djvu_document_class_init (DjvuDocumentClass *klass)
        ev_document_class->load = djvu_document_load;
        ev_document_class->save = djvu_document_save;
        ev_document_class->get_n_pages = djvu_document_get_n_pages;
+       ev_document_class->get_page_label = djvu_document_get_page_label;
        ev_document_class->get_page_size = djvu_document_get_page_size;
        ev_document_class->render = djvu_document_render;
        ev_document_class->get_thumbnail = djvu_document_get_thumbnail;


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]