diff options
author | Carlos Garcia Campos <carlosgc@gnome.org> | 2007-10-11 10:18:58 (GMT) |
---|---|---|
committer | Carlos Garcia Campos <carlosgc@src.gnome.org> | 2007-10-11 10:18:58 (GMT) |
commit | 459160ed87739fa5bba5e96d0b53c6fd3bbce6b7 (patch) | |
tree | 5e597a016d85d57331d300cad5ac130c4c515cfc /shell/ev-jobs.c | |
parent | c5de241a3ab5fd9557326bd7135dfb550223f974 (diff) |
When printing multiple pages per sheet in reverse option, do not invert
2007-10-11 Carlos Garcia Campos <carlosgc@gnome.org>
* backend/pdf/ev-poppler.cc:
(pdf_document_file_exporter_begin_page),
(pdf_document_file_exporter_do_page),
(pdf_document_file_exporter_end_page),
(pdf_document_file_exporter_iface_init):
* libdocument/ev-file-exporter.[ch]:
(ev_file_exporter_begin_page), (ev_file_exporter_end_page):
* shell/ev-jobs.c: (ev_job_print_get_page_list),
(ev_job_print_run):
When printing multiple pages per sheet in reverse option, do not
invert the order of the pages in every sheet, but the order of the
sheets. Do not print blank pages when page range is invalid. Fixes
bugs #484857 and #485521.
svn path=/trunk/; revision=2700
Diffstat (limited to 'shell/ev-jobs.c')
-rw-r--r-- | shell/ev-jobs.c | 58 |
1 files changed, 26 insertions, 32 deletions
diff --git a/shell/ev-jobs.c b/shell/ev-jobs.c index 4572852..84eb365 100644 --- a/shell/ev-jobs.c +++ b/shell/ev-jobs.c @@ -782,21 +782,6 @@ ev_print_job_get_last_page (EvJobPrint *job) } 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) { @@ -826,6 +811,9 @@ ev_job_print_get_page_list (EvJobPrint *job, 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; @@ -864,28 +852,18 @@ ev_job_print_get_page_list (EvJobPrint *job, return page_list; } -static void -ev_job_print_do_page (EvJobPrint *job, gint page) -{ - EvDocument *document = EV_JOB (job)->document; - EvRenderContext *rc; - - rc = ev_render_context_new (0, page, 1.0); - ev_file_exporter_do_page (EV_FILE_EXPORTER (document), rc); - g_object_unref (rc); -} - void ev_job_print_run (EvJobPrint *job) { EvDocument *document = EV_JOB (job)->document; EvFileExporterContext fc; + EvRenderContext *rc; gint fd; gint *page_list; gint n_pages; gint last_page; gint first_page; - gint i; + gint i, j; gchar *filename; g_return_if_fail (EV_IS_JOB_PRINT (job)); @@ -926,6 +904,8 @@ ev_job_print_run (EvJobPrint *job) 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); @@ -933,17 +913,30 @@ ev_job_print_run (EvJobPrint *job) gint page, step; gint n_copies; - step = job->reverse ? -1 : 1; - page = job->reverse ? n_pages - 1 : 0; + 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 j; + 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 (j = 0; j < n_copies; j++) { - ev_job_print_do_page (job, page_list[page]); + for (k = 0; k < n_copies; k++) { + ev_file_exporter_do_page (EV_FILE_EXPORTER (document), rc); + } } + ev_file_exporter_end_page (EV_FILE_EXPORTER (document)); + page += step; } @@ -956,6 +949,7 @@ ev_job_print_run (EvJobPrint *job) g_free (page_list); close (fd); + g_object_unref (rc); EV_JOB (job)->finished = TRUE; } |