]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-jobs.c
Fix printing with poppler splash backend. Fixes bug #489774.
[evince.git] / shell / ev-jobs.c
index c08fb0839ca72ea0f9ef7aa0224b789eaeae90c5..84eb365cd17c290512f4320a73a8a92ea522b4c2 100644 (file)
@@ -781,21 +781,6 @@ ev_print_job_get_last_page (EvJobPrint *job)
        return MIN (max_page, last_page);
 }
 
        return MIN (max_page, last_page);
 }
 
-static gboolean
-ev_print_job_print_page_in_range (EvJobPrint *job,
-                                 gint        page)
-{
-       gint i;
-
-       for (i = 0; i < job->n_ranges; i++) {
-               if (page >= job->ranges[i].start &&
-                   page <= job->ranges[i].end)
-                       return TRUE;
-       }
-
-       return FALSE;
-}
-
 static gboolean
 ev_print_job_print_page_in_set (EvJobPrint *job,
                                gint        page)
 static gboolean
 ev_print_job_print_page_in_set (EvJobPrint *job,
                                gint        page)
@@ -812,15 +797,59 @@ ev_print_job_print_page_in_set (EvJobPrint *job,
        return FALSE;
 }
 
        return FALSE;
 }
 
-static void
-ev_job_print_do_page (EvJobPrint *job, gint page)
+static gint *
+ev_job_print_get_page_list (EvJobPrint *job,
+                           gint       *n_pages)
 {
 {
-       EvDocument      *document = EV_JOB (job)->document;
-       EvRenderContext *rc;
+       gint  i, j, page, max_page;
+       gint  pages = 0;
+       gint *page_list;
 
 
-       rc = ev_render_context_new (0, page, 1.0);
-       ev_file_exporter_do_page (EV_FILE_EXPORTER (document), rc);
-       g_object_unref (rc);
+       max_page = ev_document_get_n_pages (EV_JOB (job)->document) - 1;
+
+       for (i = 0; i < job->n_ranges; i++) {
+               gint rsize;
+               gint start, end;
+
+               if (job->ranges[i].start > max_page)
+                       continue;
+               
+               start = job->ranges[i].start + 1;
+               end = job->ranges[i].end <= max_page ? job->ranges[i].end + 1 : max_page + 1;
+               rsize = end - start + 1;
+
+               switch (job->page_set) {
+                       case EV_PRINT_PAGE_SET_EVEN:
+                               pages += start % 2 == 0 ? (rsize / 2) + (rsize % 2) : (rsize / 2);
+                               break;
+                       case EV_PRINT_PAGE_SET_ODD:
+                               pages += start % 2 != 0 ? (rsize / 2) + (rsize % 2) : (rsize / 2);
+                               break;
+                       default:
+                               pages += rsize;
+                               break;
+               }
+       }
+
+       *n_pages = pages;
+
+       if (pages == 0)
+               return NULL;
+
+       page_list = g_new (gint, pages);
+
+       page = 0;
+       for (i = 0; i < job->n_ranges; i++) {
+               for (j = job->ranges[i].start; j <= job->ranges[i].end; j++) {
+                       if (j > max_page)
+                               break;
+               
+                       if (ev_print_job_print_page_in_set (job, j + 1))
+                               page_list[page++] = j;
+               }
+       }
+
+       return page_list;
 }
 
 void
 }
 
 void
@@ -828,10 +857,13 @@ ev_job_print_run (EvJobPrint *job)
 {
        EvDocument            *document = EV_JOB (job)->document;
        EvFileExporterContext  fc;
 {
        EvDocument            *document = EV_JOB (job)->document;
        EvFileExporterContext  fc;
+       EvRenderContext       *rc;
        gint                   fd;
        gint                   fd;
+       gint                  *page_list;
+       gint                   n_pages;
        gint                   last_page;
        gint                   first_page;
        gint                   last_page;
        gint                   first_page;
-       gint                   i;
+       gint                   i, j;
        gchar                 *filename;
        
        g_return_if_fail (EV_IS_JOB_PRINT (job));
        gchar                 *filename;
        
        g_return_if_fail (EV_IS_JOB_PRINT (job));
@@ -852,6 +884,13 @@ ev_job_print_run (EvJobPrint *job)
                return;
        }
 
                return;
        }
 
+       page_list = ev_job_print_get_page_list (job, &n_pages);
+       if (n_pages == 0) {
+               close (fd);
+               EV_JOB (job)->finished = TRUE;
+               return;
+       }
+
        first_page = ev_print_job_get_first_page (job);
        last_page = ev_print_job_get_last_page (job);
 
        first_page = ev_print_job_get_first_page (job);
        last_page = ev_print_job_get_last_page (job);
 
@@ -865,40 +904,38 @@ ev_job_print_run (EvJobPrint *job)
        fc.duplex = FALSE;
        fc.pages_per_sheet = MAX (1, job->pages_per_sheet);
 
        fc.duplex = FALSE;
        fc.pages_per_sheet = MAX (1, job->pages_per_sheet);
 
+       rc = ev_render_context_new (0, 0, 1.0);
+
        ev_document_doc_mutex_lock ();
        ev_file_exporter_begin (EV_FILE_EXPORTER (document), &fc);
        ev_document_doc_mutex_lock ();
        ev_file_exporter_begin (EV_FILE_EXPORTER (document), &fc);
-       ev_document_doc_mutex_unlock ();
 
        for (i = 0; i < job->copies; i++) {
                gint page, step;
 
        for (i = 0; i < job->copies; i++) {
                gint page, step;
+               gint n_copies;
                
                
-               step = job->reverse ? -1 : 1;
-               page = job->reverse ? last_page : first_page;
-               
-               while ((job->reverse && (page >= first_page)) ||
-                      (!job->reverse && (page <= last_page))) {
-                       gint n_pages = 1;
-                       gint j;
-
-                       if (job->n_ranges > 0 &&
-                           !ev_print_job_print_page_in_range (job, page)) {
-                               page += step;
-                               continue;
+               step = job->reverse ? -1 * job->pages_per_sheet : job->pages_per_sheet;
+               page = job->reverse ? (n_pages / job->pages_per_sheet) * job->pages_per_sheet  : 0;
+               n_copies = job->collate ? job->copies : 1;
+
+               while ((job->reverse && (page >= 0)) || (!job->reverse && (page < n_pages))) {
+                       gint k;
+
+                       ev_file_exporter_begin_page (EV_FILE_EXPORTER (document));
+                       
+                       for (j = 0; j < job->pages_per_sheet; j++) {
+                               gint p = page + j;
+                               
+                               if (p < 0 || p >= n_pages)
+                                       break;
+
+                               ev_render_context_set_page (rc, page_list[p]);
+
+                               for (k = 0; k < n_copies; k++) {
+                                       ev_file_exporter_do_page (EV_FILE_EXPORTER (document), rc);
+                               }
                        }
 
                        }
 
-                       if (!ev_print_job_print_page_in_set (job, page + 1)) {
-                               page += step;
-                               continue;
-                       }
-
-                       if (job->collate)
-                               n_pages = job->copies;
-
-                       for (j = 0; j < n_pages; j++) {
-                               ev_document_doc_mutex_lock ();
-                               ev_job_print_do_page (job, page);
-                               ev_document_doc_mutex_unlock ();
-                       }
+                       ev_file_exporter_end_page (EV_FILE_EXPORTER (document));
 
                        page += step;
                }
 
                        page += step;
                }
@@ -907,11 +944,12 @@ ev_job_print_run (EvJobPrint *job)
                        break;
        }
 
                        break;
        }
 
-       ev_document_doc_mutex_lock ();
        ev_file_exporter_end (EV_FILE_EXPORTER (document));
        ev_document_doc_mutex_unlock ();
        ev_file_exporter_end (EV_FILE_EXPORTER (document));
        ev_document_doc_mutex_unlock ();
-
+       
+       g_free (page_list);
        close (fd);
        close (fd);
+       g_object_unref (rc);
        
        EV_JOB (job)->finished = TRUE;
 }
        
        EV_JOB (job)->finished = TRUE;
 }