X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-jobs.c;h=1218cd063314451300fc05f90a9622c76a93b9cc;hb=4f6105d3df2cbf07bccd7de156693aab7e71bc31;hp=9fb242a0c6cd5a35dd2559f7e48c366a3c7afc08;hpb=ca679febd93eef2a4a6afd99cbd7aee8ab537443;p=evince.git diff --git a/shell/ev-jobs.c b/shell/ev-jobs.c index 9fb242a0..1218cd06 100644 --- a/shell/ev-jobs.c +++ b/shell/ev-jobs.c @@ -3,7 +3,9 @@ #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" #include "ev-document-fonts.h" #include "ev-selection.h" @@ -30,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) @@ -120,9 +127,9 @@ ev_job_render_dispose (GObject *object) job = EV_JOB_RENDER (object); - if (job->pixbuf) { - g_object_unref (job->pixbuf); - job->pixbuf = NULL; + if (job->surface) { + cairo_surface_destroy (job->surface); + job->surface = NULL; } if (job->rc) { @@ -131,7 +138,7 @@ ev_job_render_dispose (GObject *object) } if (job->selection) { - g_object_unref (job->selection); + cairo_surface_destroy (job->selection); job->selection = NULL; } @@ -150,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; } @@ -167,6 +183,11 @@ ev_job_thumbnail_dispose (GObject *object) job->thumbnail = NULL; } + if (job->rc) { + g_object_unref (job->rc); + job->rc = NULL; + } + (* G_OBJECT_CLASS (ev_job_thumbnail_parent_class)->dispose) (object); } @@ -259,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, @@ -278,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; @@ -294,16 +317,39 @@ ev_job_render_new (EvDocument *document, } static void -render_finished_cb (EvDocument *document, GdkPixbuf *pixbuf, EvJobRender *job) +render_finished_cb (EvDocument *document, + GdkPixbuf *pixbuf, + EvJobRender *job) { g_signal_handlers_disconnect_by_func (EV_JOB (job)->document, render_finished_cb, job); + /* 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; - job->pixbuf = g_object_ref (pixbuf); 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) { @@ -320,19 +366,7 @@ ev_job_render_run (EvJobRender *job) } else { ev_document_fc_mutex_lock (); - job->pixbuf = ev_document_render_pixbuf (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); + job->surface = ev_document_render (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, @@ -345,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; } @@ -354,19 +407,15 @@ ev_job_render_run (EvJobRender *job) } EvJob * -ev_job_thumbnail_new (EvDocument *document, - gint page, - int rotation, - gint requested_width) +ev_job_thumbnail_new (EvDocument *document, + EvRenderContext *rc) { EvJobThumbnail *job; job = g_object_new (EV_TYPE_JOB_THUMBNAIL, NULL); EV_JOB (job)->document = g_object_ref (document); - job->page = page; - job->rotation = rotation; - job->requested_width = requested_width; + job->rc = g_object_ref (rc); return EV_JOB (job); } @@ -380,10 +429,7 @@ ev_job_thumbnail_run (EvJobThumbnail *job) job->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (EV_JOB (job)->document), - job->page, - job->rotation, - job->requested_width, - TRUE); + job->rc, TRUE); EV_JOB (job)->finished = TRUE; ev_document_doc_mutex_unlock (); @@ -521,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) @@ -543,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; @@ -633,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)); @@ -661,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++) {