]> www.fi.muni.cz Git - evince.git/blobdiff - pdf/ev-poppler.cc
Release the poppler document on dispose
[evince.git] / pdf / ev-poppler.cc
index d20acb04823e5106c12279c45df29846976ddf97..9cb15348736c38e653dbdf63d50085ddd54ace46 100644 (file)
@@ -87,9 +87,22 @@ G_DEFINE_TYPE_WITH_CODE (PdfDocument, pdf_document, G_TYPE_OBJECT,
                                                        pdf_document_ps_exporter_iface_init);
                         });
 
+static void
+pdf_document_dispose (GObject *object)
+{
+       PdfDocument *pdf_document = PDF_DOCUMENT(object);
+
+       if (pdf_document->document) {
+               g_object_unref (pdf_document->document);
+       }
+}
+
 static void
 pdf_document_class_init (PdfDocumentClass *klass)
 {
+       GObjectClass *g_object_class = G_OBJECT_CLASS (klass);
+
+       g_object_class->dispose = pdf_document_dispose;
 }
 
 static void
@@ -254,8 +267,8 @@ pdf_document_render_pixbuf (EvDocument   *document,
                                                  page);
 
        poppler_page_get_size (poppler_page, &width_points, &height_points);
-       width = (int) ceil (width_points * scale);
-       height = (int) ceil (height_points * scale);
+       width = (int) ((width_points * scale) + 0.5);
+       height = (int) ((height_points * scale) + 0.5);
 
        pixbuf = gdk_pixbuf_new (GDK_COLORSPACE_RGB,
                                 FALSE, 8,
@@ -305,6 +318,7 @@ pdf_document_get_info (EvDocument *document)
        PopplerPageLayout layout;
        PopplerPageMode mode;
        PopplerViewerPreferences view_prefs;
+       PopplerPermissions permissions;
 
        info = g_new0 (EvDocumentInfo, 1);
 
@@ -316,6 +330,7 @@ pdf_document_get_info (EvDocument *document)
                            EV_DOCUMENT_INFO_LAYOUT |
                            EV_DOCUMENT_INFO_START_MODE |
                            /* Missing EV_DOCUMENT_INFO_CREATION_DATE | */
+                           EV_DOCUMENT_INFO_PERMISSIONS |
                            EV_DOCUMENT_INFO_UI_HINTS;
 
 
@@ -328,6 +343,7 @@ pdf_document_get_info (EvDocument *document)
                      "page-mode", &mode,
                      "page-layout", &layout,
                      "viewer-preferences", &view_prefs,
+                     "permissions", &permissions,
                      NULL);
 
        switch (layout) {
@@ -394,6 +410,19 @@ pdf_document_get_info (EvDocument *document)
                info->ui_hints |=  EV_DOCUMENT_UI_HINT_DIRECTION_RTL;
        }
 
+       info->permissions = 0;
+       if (permissions & POPPLER_PERMISSIONS_OK_TO_PRINT) {
+               info->permissions |= EV_DOCUMENT_PERMISSIONS_OK_TO_PRINT;
+       }
+       if (permissions & POPPLER_PERMISSIONS_OK_TO_MODIFY) {
+               info->permissions |= EV_DOCUMENT_PERMISSIONS_OK_TO_MODIFY;
+       }
+       if (permissions & POPPLER_PERMISSIONS_OK_TO_COPY) {
+               info->permissions |= EV_DOCUMENT_PERMISSIONS_OK_TO_COPY;
+       }
+       if (permissions & POPPLER_PERMISSIONS_OK_TO_ADD_NOTES) {
+               info->permissions |= EV_DOCUMENT_PERMISSIONS_OK_TO_ADD_NOTES;
+       }
        return info;
 }
 
@@ -659,7 +688,7 @@ pdf_document_search_idle_callback (void *data)
 {
         PdfDocumentSearch *search = (PdfDocumentSearch*) data;
         PdfDocument *pdf_document = search->document;
-        int n_pages, changed_page;
+        int n_pages;
        GList *matches;
        PopplerPage *page;
 
@@ -671,9 +700,10 @@ pdf_document_search_idle_callback (void *data)
        ev_document_doc_mutex_unlock ();
 
        search->pages[search->search_page] = matches;
-        n_pages = pdf_document_get_n_pages (EV_DOCUMENT (search->document));
+       ev_document_find_changed (EV_DOCUMENT_FIND (pdf_document),
+                                 search->search_page);
 
-       changed_page = search->search_page;
+        n_pages = pdf_document_get_n_pages (EV_DOCUMENT (search->document));
         search->search_page += 1;
         if (search->search_page == n_pages) {
                 /* wrap around */
@@ -681,8 +711,6 @@ pdf_document_search_idle_callback (void *data)
         }
 
         if (search->search_page != search->start_page) {
-               ev_document_find_changed (EV_DOCUMENT_FIND (pdf_document),
-                                         changed_page);
                return TRUE;
        }
 
@@ -869,14 +897,14 @@ pdf_document_find_iface_init (EvDocumentFindIface *iface)
 }
 
 static void
-pdf_document_ps_exporter_begin (EvPSExporter *exporter, const char *filename)
+pdf_document_ps_exporter_begin (EvPSExporter *exporter, const char *filename,
+                               int first_page, int last_page)
 {
        PdfDocument *pdf_document = PDF_DOCUMENT (exporter);
-       int n_pages;
        
-       n_pages = pdf_document_get_n_pages (EV_DOCUMENT (exporter));
-       pdf_document->ps_file = poppler_ps_file_new (pdf_document->document,
-                                                    filename, n_pages);
+       pdf_document->ps_file = poppler_ps_file_new (pdf_document->document, filename,
+                                                    first_page,
+                                                    last_page - first_page + 1);
 }
 
 static void