X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=shell%2Fev-jobs.c;h=1218cd063314451300fc05f90a9622c76a93b9cc;hb=4f6105d3df2cbf07bccd7de156693aab7e71bc31;hp=d9cdac8ae33c20e751c184e4c199d8d936ce2a9d;hpb=217797d63b2d3b1c9a7a0511af1bbf3d99f0d482;p=evince.git diff --git a/shell/ev-jobs.c b/shell/ev-jobs.c index d9cdac8a..1218cd06 100644 --- a/shell/ev-jobs.c +++ b/shell/ev-jobs.c @@ -3,6 +3,7 @@ #include "ev-document-thumbnails.h" #include "ev-document-links.h" #include "ev-document-images.h" +#include "ev-document-forms.h" #include "ev-document-factory.h" #include "ev-document-misc.h" #include "ev-file-helpers.h" @@ -31,13 +32,18 @@ static void ev_job_load_class_init (EvJobLoadClass *class); static void ev_job_print_init (EvJobPrint *job); static void ev_job_print_class_init (EvJobPrintClass *class); -enum -{ +enum { FINISHED, LAST_SIGNAL }; +enum { + PAGE_READY, + RENDER_LAST_SIGNAL +}; + static guint job_signals[LAST_SIGNAL] = { 0 }; +static guint job_render_signals[RENDER_LAST_SIGNAL] = { 0 }; G_DEFINE_TYPE (EvJob, ev_job, G_TYPE_OBJECT) G_DEFINE_TYPE (EvJobLinks, ev_job_links, EV_TYPE_JOB) @@ -151,6 +157,15 @@ ev_job_render_class_init (EvJobRenderClass *class) oclass = G_OBJECT_CLASS (class); + job_render_signals [PAGE_READY] = + g_signal_new ("page-ready", + EV_TYPE_JOB_RENDER, + G_SIGNAL_RUN_LAST, + G_STRUCT_OFFSET (EvJobRenderClass, page_ready), + NULL, NULL, + g_cclosure_marshal_VOID__VOID, + G_TYPE_NONE, 0); + oclass->dispose = ev_job_render_dispose; } @@ -265,6 +280,7 @@ ev_job_render_new (EvDocument *document, EvRectangle *selection_points, GdkColor *text, GdkColor *base, + gboolean include_forms, gboolean include_links, gboolean include_images, gboolean include_text, @@ -284,6 +300,7 @@ ev_job_render_new (EvDocument *document, job->target_height = height; job->text = *text; job->base = *base; + job->include_forms = include_forms; job->include_links = include_links; job->include_images = include_images; job->include_text = include_text; @@ -309,10 +326,30 @@ render_finished_cb (EvDocument *document, /* FIXME: ps backend should be ported to cairo */ job->surface = ev_document_misc_surface_from_pixbuf (pixbuf); + job->page_ready = TRUE; + g_signal_emit (job, job_render_signals[PAGE_READY], 0); EV_JOB (job)->finished = TRUE; ev_job_finished (EV_JOB (job)); } +static gboolean +notify_page_ready (EvJobRender *job) +{ + g_signal_emit (job, job_render_signals[PAGE_READY], 0); + + return FALSE; +} + +static void +ev_job_render_page_ready (EvJobRender *job) +{ + job->page_ready = TRUE; + g_idle_add_full (G_PRIORITY_HIGH_IDLE, + (GSourceFunc)notify_page_ready, + g_object_ref (job), + (GDestroyNotify)g_object_unref); +} + void ev_job_render_run (EvJobRender *job) { @@ -330,18 +367,6 @@ ev_job_render_run (EvJobRender *job) ev_document_fc_mutex_lock (); job->surface = ev_document_render (EV_JOB (job)->document, job->rc); - if (job->include_links && EV_IS_DOCUMENT_LINKS (EV_JOB (job)->document)) - job->link_mapping = - ev_document_links_get_links (EV_DOCUMENT_LINKS (EV_JOB (job)->document), - 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); - if (job->include_text && EV_IS_SELECTION (EV_JOB (job)->document)) - job->text_mapping = - ev_selection_get_selection_map (EV_SELECTION (EV_JOB (job)->document), - job->rc); if (job->include_selection && EV_IS_SELECTION (EV_JOB (job)->document)) { ev_selection_render_selection (EV_SELECTION (EV_JOB (job)->document), job->rc, @@ -354,8 +379,27 @@ ev_job_render_run (EvJobRender *job) job->rc, &(job->selection_points)); } + + ev_job_render_page_ready (job); ev_document_fc_mutex_unlock (); + + if (job->include_text && EV_IS_SELECTION (EV_JOB (job)->document)) + job->text_mapping = + ev_selection_get_selection_map (EV_SELECTION (EV_JOB (job)->document), + job->rc); + if (job->include_links && EV_IS_DOCUMENT_LINKS (EV_JOB (job)->document)) + job->link_mapping = + ev_document_links_get_links (EV_DOCUMENT_LINKS (EV_JOB (job)->document), + job->rc->page); + if (job->include_forms && EV_IS_DOCUMENT_FORMS (EV_JOB (job)->document)) + job->form_field_mapping = + ev_document_forms_get_form_fields (EV_DOCUMENT_FORMS (EV_JOB(job)->document), + 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_JOB (job)->finished = TRUE; } @@ -523,6 +567,7 @@ ev_job_print_new (EvDocument *document, EvPrintRange *ranges, gint n_ranges, EvPrintPageSet page_set, + gint pages_per_sheet, gint copies, gdouble collate, gdouble reverse) @@ -545,6 +590,8 @@ ev_job_print_new (EvDocument *document, job->n_ranges = n_ranges; job->page_set = page_set; + + job->pages_per_sheet = pages_per_sheet; job->copies = copies; job->collate = collate; @@ -635,12 +682,13 @@ ev_job_print_do_page (EvJobPrint *job, gint page) void ev_job_print_run (EvJobPrint *job) { - EvDocument *document = EV_JOB (job)->document; - gint fd; - gint last_page; - gint first_page; - gint i; - gchar *filename; + EvDocument *document = EV_JOB (job)->document; + EvFileExporterContext fc; + gint fd; + gint last_page; + gint first_page; + gint i; + gchar *filename; g_return_if_fail (EV_IS_JOB_PRINT (job)); @@ -663,14 +711,18 @@ ev_job_print_run (EvJobPrint *job) first_page = ev_print_job_get_first_page (job); last_page = ev_print_job_get_last_page (job); + fc.format = g_ascii_strcasecmp (job->format, "pdf") == 0 ? + EV_FILE_FORMAT_PDF : EV_FILE_FORMAT_PS; + fc.filename = job->temp_file; + fc.first_page = MIN (first_page, last_page); + fc.last_page = MAX (first_page, last_page); + fc.paper_width = job->width; + fc.paper_height = job->height; + fc.duplex = FALSE; + fc.pages_per_sheet = job->pages_per_sheet; + ev_document_doc_mutex_lock (); - ev_file_exporter_begin (EV_FILE_EXPORTER (document), - g_ascii_strcasecmp (job->format, "pdf") == 0 ? - EV_FILE_FORMAT_PDF : EV_FILE_FORMAT_PS, - job->temp_file, - MIN (first_page, last_page), - MAX (first_page, last_page), - job->width, job->height, FALSE); + ev_file_exporter_begin (EV_FILE_EXPORTER (document), &fc); ev_document_doc_mutex_unlock (); for (i = 0; i < job->copies; i++) {