X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-jobs.c;h=f6328af64565edae5125b9f84a24ff33ebc3c248;hb=10288dd7e3cb4d0742a32b6327baded62dd0ebfc;hp=45728529c48fda033f3bb967170da2737454c322;hpb=c5de241a3ab5fd9557326bd7135dfb550223f974;p=evince.git diff --git a/shell/ev-jobs.c b/shell/ev-jobs.c index 45728529..f6328af6 100644 --- a/shell/ev-jobs.c +++ b/shell/ev-jobs.c @@ -1,3 +1,4 @@ +#include #include "ev-jobs.h" #include "ev-job-queue.h" #include "ev-document-thumbnails.h" @@ -15,9 +16,6 @@ #include #include #include -#include -#include -#include static void ev_job_init (EvJob *job); static void ev_job_class_init (EvJobClass *class); @@ -405,8 +403,8 @@ ev_job_render_run (EvJobRender *job) job->rc->page); if (job->include_images && EV_IS_DOCUMENT_IMAGES (EV_JOB (job)->document)) job->image_mapping = - ev_document_images_get_images (EV_DOCUMENT_IMAGES (EV_JOB (job)->document), - job->rc->page); + ev_document_images_get_image_mapping (EV_DOCUMENT_IMAGES (EV_JOB (job)->document), + job->rc->page); EV_JOB (job)->finished = TRUE; } @@ -499,6 +497,11 @@ ev_job_load_dispose (GObject *object) job->dest = NULL; } + if (job->search_string) { + g_free (job->search_string); + job->search_string = NULL; + } + (* G_OBJECT_CLASS (ev_job_load_parent_class)->dispose) (object); } @@ -514,7 +517,10 @@ ev_job_load_class_init (EvJobLoadClass *class) EvJob * -ev_job_load_new (const gchar *uri, EvLinkDest *dest, EvWindowRunMode mode) +ev_job_load_new (const gchar *uri, + EvLinkDest *dest, + EvWindowRunMode mode, + const gchar *search_string) { EvJobLoad *job; @@ -525,6 +531,8 @@ ev_job_load_new (const gchar *uri, EvLinkDest *dest, EvWindowRunMode mode) job->dest = g_object_ref (dest); job->mode = mode; + if (search_string) + job->search_string = g_strdup (search_string); return EV_JOB (job); } @@ -735,7 +743,7 @@ ev_job_print_new (EvDocument *document, job->page_set = page_set; - job->pages_per_sheet = pages_per_sheet; + job->pages_per_sheet = CLAMP (pages_per_sheet, 1, 16); job->copies = copies; job->collate = collate; @@ -781,21 +789,6 @@ ev_print_job_get_last_page (EvJobPrint *job) 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) @@ -826,6 +819,14 @@ ev_job_print_get_page_list (EvJobPrint *job, gint rsize; gint start, end; + if (job->ranges[i].start == -1) + job->ranges[i].start = 0; + if (job->ranges[i].end == -1) + job->ranges[i].end = max_page; + + 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 +865,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 +917,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,21 +926,33 @@ ev_job_print_run (EvJobPrint *job) gint page, step; gint n_copies; - step = job->reverse ? -1 : 1; - page = job->reverse ? n_pages - 1 : 0; - n_copies = job->collate ? job->copies : 1; + step = job->reverse ? -1 * job->pages_per_sheet : job->pages_per_sheet; + page = job->reverse ? ((n_pages - 1) / job->pages_per_sheet) * job->pages_per_sheet : 0; + n_copies = job->collate ? 1 : job->copies; while ((job->reverse && (page >= 0)) || (!job->reverse && (page < n_pages))) { - gint j; - - for (j = 0; j < n_copies; j++) { - ev_job_print_do_page (job, page_list[page]); + gint k; + + for (k = 0; k < n_copies; 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]); + ev_file_exporter_do_page (EV_FILE_EXPORTER (document), rc); + } + + ev_file_exporter_end_page (EV_FILE_EXPORTER (document)); } page += step; } - if (job->collate) + if (!job->collate) break; } @@ -956,6 +961,7 @@ ev_job_print_run (EvJobPrint *job) g_free (page_list); close (fd); + g_object_unref (rc); EV_JOB (job)->finished = TRUE; }