X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-jobs.c;h=3e2347ee54eee159acaa1021eadf32411026fac1;hb=d47bc2205d248b34dbfcdd349473f54d45d5ec70;hp=a2f54034e8bcce44a3469619473503acb58e1dd2;hpb=1bc11bf9ca800edd4469d5e8c8aeb605d3037bc7;p=evince.git diff --git a/shell/ev-jobs.c b/shell/ev-jobs.c index a2f54034..3e2347ee 100644 --- a/shell/ev-jobs.c +++ b/shell/ev-jobs.c @@ -8,6 +8,7 @@ #include "ev-selection.h" #include "ev-async-renderer.h" #include "ev-ps-exporter.h" +#include "ev-window.h" #include #include @@ -199,6 +200,12 @@ ev_job_print_dispose (GObject *object) job->error = NULL; } + if (job->ranges) { + g_free (job->ranges); + job->ranges = NULL; + job->n_ranges = 0; + } + (* G_OBJECT_CLASS (ev_job_print_parent_class)->dispose) (object); } @@ -520,9 +527,15 @@ ev_job_xfer_run (EvJobXfer *job) } EvJob * -ev_job_print_new (EvDocument *document, - gdouble width, - gdouble height) +ev_job_print_new (EvDocument *document, + gdouble width, + gdouble height, + EvPrintRange *ranges, + gint n_ranges, + EvPrintPageSet page_set, + gint copies, + gdouble collate, + gdouble reverse) { EvJobPrint *job; @@ -532,19 +545,108 @@ ev_job_print_new (EvDocument *document, job->temp_file = NULL; job->error = NULL; - + job->width = width; job->height = height; + + job->ranges = ranges; + job->n_ranges = n_ranges; + job->page_set = page_set; + + job->copies = copies; + job->collate = collate; + job->reverse = reverse; + return EV_JOB (job); } +static gint +ev_print_job_get_first_page (EvJobPrint *job) +{ + gint i; + gint first_page = G_MAXINT; + + if (job->n_ranges == 0) + return 0; + + for (i = 0; i < job->n_ranges; i++) { + if (job->ranges[i].start < first_page) + first_page = job->ranges[i].start; + } + + return MAX (0, first_page); +} + +static gint +ev_print_job_get_last_page (EvJobPrint *job) +{ + gint i; + gint last_page = G_MININT; + gint max_page; + + max_page = ev_document_get_n_pages (EV_JOB (job)->document) - 1; + + if (job->n_ranges == 0) + return max_page; + + for (i = 0; i < job->n_ranges; i++) { + if (job->ranges[i].end > last_page) + last_page = job->ranges[i].end; + } + + 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) +{ + switch (job->page_set) { + case EV_PRINT_PAGE_SET_EVEN: + return page % 2 == 0; + case EV_PRINT_PAGE_SET_ODD: + return page % 2 != 0; + case EV_PRINT_PAGE_SET_ALL: + return TRUE; + } + + return FALSE; +} + +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_ps_exporter_do_page (EV_PS_EXPORTER (document), rc); + g_object_unref (rc); +} + void ev_job_print_run (EvJobPrint *job) { EvDocument *document = EV_JOB (job)->document; gint fd; gint last_page; + gint first_page; gint i; g_return_if_fail (EV_IS_JOB_PRINT (job)); @@ -563,29 +665,51 @@ ev_job_print_run (EvJobPrint *job) return; } - last_page = ev_document_get_n_pages (document) - 1; - + first_page = ev_print_job_get_first_page (job); + last_page = ev_print_job_get_last_page (job); + ev_document_doc_mutex_lock (); ev_ps_exporter_begin (EV_PS_EXPORTER (document), job->temp_file, - MIN (0, last_page), - MAX (0, last_page), + MIN (first_page, last_page), + MAX (first_page, last_page), job->width, job->height, FALSE); - ev_document_doc_mutex_unlock (); - - for (i = 0; i <= last_page; i++) { - EvRenderContext *rc; - rc = ev_render_context_new (0, i, 1.0); + for (i = 0; i < job->copies; i++) { + gint page, step; - ev_document_doc_mutex_lock (); - ev_ps_exporter_do_page (EV_PS_EXPORTER (document), rc); - ev_document_doc_mutex_unlock (); + 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; + } + + 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_job_print_do_page (job, page); + } + + page += step; + } - g_object_unref (rc); + if (job->collate) + break; } - ev_document_doc_mutex_lock (); ev_ps_exporter_end (EV_PS_EXPORTER (document)); ev_document_doc_mutex_unlock ();