Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell/ev-jobs.c
diff options
context:
space:
mode:
authorCarlos 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)
commit459160ed87739fa5bba5e96d0b53c6fd3bbce6b7 (patch)
tree5e597a016d85d57331d300cad5ac130c4c515cfc /shell/ev-jobs.c
parentc5de241a3ab5fd9557326bd7135dfb550223f974 (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.c58
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;
}