X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-jobs.c;h=af6ead0fa56b2488936f8466c5286114e6346c2f;hb=f343927df4325959193353c52cff1ea4b20b2286;hp=d38ef663c6678b7a957e967e025df959adea73d6;hpb=5d949a64fcb3f3be02cb5ce4466043c8bdb33f31;p=evince.git diff --git a/shell/ev-jobs.c b/shell/ev-jobs.c index d38ef663..af6ead0f 100644 --- a/shell/ev-jobs.c +++ b/shell/ev-jobs.c @@ -11,6 +11,7 @@ #include "ev-file-helpers.h" #include "ev-document-fonts.h" #include "ev-async-renderer.h" +#include "ev-debug.h" #include #include @@ -98,6 +99,8 @@ ev_job_links_dispose (GObject *object) { EvJobLinks *job; + ev_debug_message (DEBUG_JOBS, NULL); + job = EV_JOB_LINKS (object); if (job->model) { @@ -128,16 +131,17 @@ ev_job_render_dispose (GObject *object) job = EV_JOB_RENDER (object); + if (job->ev_page) { + ev_debug_message (DEBUG_JOBS, "page: %d", job->ev_page->index); + g_object_unref (job->ev_page); + job->ev_page = NULL; + } + if (job->surface) { cairo_surface_destroy (job->surface); job->surface = NULL; } - if (job->rc) { - g_object_unref (job->rc); - job->rc = NULL; - } - if (job->selection) { cairo_surface_destroy (job->selection); job->selection = NULL; @@ -179,16 +183,13 @@ ev_job_thumbnail_dispose (GObject *object) job = EV_JOB_THUMBNAIL (object); + ev_debug_message (DEBUG_JOBS, "%d", job->page); + if (job->thumbnail) { g_object_unref (job->thumbnail); job->thumbnail = NULL; } - if (job->rc) { - g_object_unref (job->rc); - job->rc = NULL; - } - (* G_OBJECT_CLASS (ev_job_thumbnail_parent_class)->dispose) (object); } @@ -211,6 +212,8 @@ ev_job_print_dispose (GObject *object) job = EV_JOB_PRINT (object); + ev_debug_message (DEBUG_JOBS, NULL); + if (job->temp_file) { g_unlink (job->temp_file); g_free (job->temp_file); @@ -245,6 +248,8 @@ ev_job_print_class_init (EvJobPrintClass *class) void ev_job_finished (EvJob *job) { + ev_debug_message (DEBUG_JOBS, NULL); + g_return_if_fail (EV_IS_JOB (job)); g_signal_emit (job, job_signals[FINISHED], 0); @@ -255,6 +260,8 @@ ev_job_links_new (EvDocument *document) { EvJob *job; + ev_debug_message (DEBUG_JOBS, NULL); + job = g_object_new (EV_TYPE_JOB_LINKS, NULL); job->document = g_object_ref (document); @@ -264,6 +271,8 @@ ev_job_links_new (EvDocument *document) void ev_job_links_run (EvJobLinks *job) { + ev_debug_message (DEBUG_JOBS, NULL); + g_return_if_fail (EV_IS_JOB_LINKS (job)); ev_document_doc_mutex_lock (); @@ -272,45 +281,28 @@ ev_job_links_run (EvJobLinks *job) ev_document_doc_mutex_unlock (); } - EvJob * -ev_job_render_new (EvDocument *document, - EvRenderContext *rc, - gint width, - gint height, - EvRectangle *selection_points, - EvSelectionStyle selection_style, - GdkColor *text, - GdkColor *base, - gboolean include_forms, - gboolean include_links, - gboolean include_images, - gboolean include_text, - gboolean include_selection) +ev_job_render_new (EvDocument *document, + gint page, + gint rotation, + gdouble scale, + gint width, + gint height, + EvRenderFlags flags) { EvJobRender *job; - g_return_val_if_fail (EV_IS_RENDER_CONTEXT (rc), NULL); - if (include_selection) - g_return_val_if_fail (selection_points != NULL, NULL); - + ev_debug_message (DEBUG_JOBS, "page: %d", page); + job = g_object_new (EV_TYPE_JOB_RENDER, NULL); EV_JOB (job)->document = g_object_ref (document); - job->rc = g_object_ref (rc); + job->page = page; + job->rotation = rotation; + job->scale = scale; job->target_width = width; job->target_height = height; - job->selection_style = selection_style; - 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; - job->include_selection = include_selection; - - if (include_selection) - job->selection_points = *selection_points; + job->flags = flags; if (EV_IS_ASYNC_RENDERER (document)) { EV_JOB (job)->async = TRUE; @@ -319,6 +311,21 @@ ev_job_render_new (EvDocument *document, return EV_JOB (job); } +void +ev_job_render_set_selection_info (EvJobRender *job, + EvRectangle *selection_points, + EvSelectionStyle selection_style, + GdkColor *text, + GdkColor *base) +{ + job->flags |= EV_RENDER_INCLUDE_SELECTION; + + job->selection_points = *selection_points; + job->selection_style = selection_style; + job->text = *text; + job->base = *base; +} + static void render_finished_cb (EvDocument *document, GdkPixbuf *pixbuf, @@ -327,7 +334,6 @@ render_finished_cb (EvDocument *document, 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); @@ -338,6 +344,8 @@ render_finished_cb (EvDocument *document, static gboolean notify_page_ready (EvJobRender *job) { + ev_debug_message (DEBUG_JOBS, "%d", job->ev_page->index); + g_signal_emit (job, job_render_signals[PAGE_READY], 0); return FALSE; @@ -346,6 +354,8 @@ notify_page_ready (EvJobRender *job) static void ev_job_render_page_ready (EvJobRender *job) { + ev_debug_message (DEBUG_JOBS, "%d", job->ev_page->index); + job->page_ready = TRUE; g_idle_add_full (G_PRIORITY_HIGH_IDLE, (GSourceFunc)notify_page_ready, @@ -358,21 +368,29 @@ ev_job_render_run (EvJobRender *job) { g_return_if_fail (EV_IS_JOB_RENDER (job)); + ev_debug_message (DEBUG_JOBS, "page: %d", job->page); + ev_document_doc_mutex_lock (); if (EV_JOB (job)->async) { EvAsyncRenderer *renderer = EV_ASYNC_RENDERER (EV_JOB (job)->document); - ev_async_renderer_render_pixbuf (renderer, job->rc->page, job->rc->scale, - job->rc->rotation); + ev_async_renderer_render_pixbuf (renderer, job->page, job->scale, + job->rotation); g_signal_connect (EV_JOB (job)->document, "render_finished", G_CALLBACK (render_finished_cb), job); } else { + EvRenderContext *rc; + ev_document_fc_mutex_lock (); + + job->ev_page = ev_document_get_page (EV_JOB (job)->document, job->page); + + rc = ev_render_context_new (job->ev_page, job->rotation, job->scale); - job->surface = ev_document_render (EV_JOB (job)->document, job->rc); - if (job->include_selection && EV_IS_SELECTION (EV_JOB (job)->document)) { + job->surface = ev_document_render (EV_JOB (job)->document, rc); + if ((job->flags & EV_RENDER_INCLUDE_SELECTION) && EV_IS_SELECTION (EV_JOB (job)->document)) { ev_selection_render_selection (EV_SELECTION (EV_JOB (job)->document), - job->rc, + rc, &(job->selection), &(job->selection_points), NULL, @@ -380,7 +398,7 @@ ev_job_render_run (EvJobRender *job) &(job->text), &(job->base)); job->selection_region = ev_selection_get_selection_region (EV_SELECTION (EV_JOB (job)->document), - job->rc, + rc, job->selection_style, &(job->selection_points)); } @@ -389,22 +407,22 @@ ev_job_render_run (EvJobRender *job) ev_document_fc_mutex_unlock (); - if (job->include_text && EV_IS_SELECTION (EV_JOB (job)->document)) + if ((job->flags & EV_RENDER_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)) + ev_selection_get_selection_map (EV_SELECTION (EV_JOB (job)->document), rc); + if ((job->flags & EV_RENDER_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)) + ev_document_links_get_links (EV_DOCUMENT_LINKS (EV_JOB (job)->document), job->page); + if ((job->flags & EV_RENDER_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)) + ev_document_forms_get_form_fields (EV_DOCUMENT_FORMS (EV_JOB (job)->document), + job->ev_page); + if ((job->flags & EV_RENDER_INCLUDE_IMAGES) && EV_IS_DOCUMENT_IMAGES (EV_JOB (job)->document)) job->image_mapping = ev_document_images_get_image_mapping (EV_DOCUMENT_IMAGES (EV_JOB (job)->document), - job->rc->page); + job->page); + g_object_unref (rc); + EV_JOB (job)->finished = TRUE; } @@ -412,15 +430,21 @@ ev_job_render_run (EvJobRender *job) } EvJob * -ev_job_thumbnail_new (EvDocument *document, - EvRenderContext *rc) +ev_job_thumbnail_new (EvDocument *document, + gint page, + gint rotation, + gdouble scale) { EvJobThumbnail *job; + ev_debug_message (DEBUG_JOBS, "%d", page); + job = g_object_new (EV_TYPE_JOB_THUMBNAIL, NULL); EV_JOB (job)->document = g_object_ref (document); - job->rc = g_object_ref (rc); + job->page = page; + job->rotation = rotation; + job->scale = scale; return EV_JOB (job); } @@ -428,16 +452,26 @@ ev_job_thumbnail_new (EvDocument *document, void ev_job_thumbnail_run (EvJobThumbnail *job) { + EvRenderContext *rc; + EvPage *page; + + ev_debug_message (DEBUG_JOBS, "%d", job->page); + g_return_if_fail (EV_IS_JOB_THUMBNAIL (job)); ev_document_doc_mutex_lock (); + page = ev_document_get_page (EV_JOB (job)->document, job->page); + rc = ev_render_context_new (page, job->rotation, job->scale); + g_object_unref (page); + job->thumbnail = ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (EV_JOB (job)->document), - job->rc, TRUE); - EV_JOB (job)->finished = TRUE; - + rc, TRUE); + g_object_unref (rc); ev_document_doc_mutex_unlock (); + + EV_JOB (job)->finished = TRUE; } static void ev_job_fonts_init (EvJobFonts *job) { /* Do Nothing */ } @@ -449,6 +483,8 @@ ev_job_fonts_new (EvDocument *document) { EvJobFonts *job; + ev_debug_message (DEBUG_JOBS, NULL); + job = g_object_new (EV_TYPE_JOB_FONTS, NULL); EV_JOB (job)->document = g_object_ref (document); @@ -461,6 +497,8 @@ ev_job_fonts_run (EvJobFonts *job) { EvDocumentFonts *fonts; + ev_debug_message (DEBUG_JOBS, NULL); + g_return_if_fail (EV_IS_JOB_FONTS (job)); ev_document_doc_mutex_lock (); @@ -482,6 +520,8 @@ ev_job_load_dispose (GObject *object) { EvJobLoad *job = EV_JOB_LOAD (object); + ev_debug_message (DEBUG_JOBS, "%s", job->uri); + if (job->uri) { g_free (job->uri); job->uri = NULL; @@ -524,6 +564,8 @@ ev_job_load_new (const gchar *uri, { EvJobLoad *job; + ev_debug_message (DEBUG_JOBS, "%s", uri); + job = g_object_new (EV_TYPE_JOB_LOAD, NULL); job->uri = g_strdup (uri); @@ -540,6 +582,8 @@ ev_job_load_new (const gchar *uri, void ev_job_load_set_uri (EvJobLoad *job, const gchar *uri) { + ev_debug_message (DEBUG_JOBS, "%s", uri); + if (job->uri) g_free (job->uri); job->uri = g_strdup (uri); @@ -549,6 +593,8 @@ void ev_job_load_run (EvJobLoad *job) { g_return_if_fail (EV_IS_JOB_LOAD (job)); + + ev_debug_message (DEBUG_JOBS, "%s", job->uri); if (job->error) { g_error_free (job->error); @@ -581,6 +627,8 @@ ev_job_save_dispose (GObject *object) { EvJobSave *job = EV_JOB_SAVE (object); + ev_debug_message (DEBUG_JOBS, "%s", job->uri); + if (job->uri) { g_free (job->uri); job->uri = NULL; @@ -616,6 +664,8 @@ ev_job_save_new (EvDocument *document, { EvJobSave *job; + ev_debug_message (DEBUG_JOBS, "uri: %s, document_uri: %s", uri, document_uri); + job = g_object_new (EV_TYPE_JOB_SAVE, NULL); EV_JOB (job)->document = g_object_ref (document); @@ -633,6 +683,8 @@ ev_job_save_run (EvJobSave *job) gchar *filename; gchar *tmp_filename; gchar *local_uri; + + ev_debug_message (DEBUG_JOBS, "uri: %s, document_uri: %s", job->uri, job->document_uri); filename = ev_tmp_filename ("saveacopy"); tmp_filename = g_strdup_printf ("%s.XXXXXX", filename); @@ -726,6 +778,12 @@ ev_job_print_new (EvDocument *document, { EvJobPrint *job; + ev_debug_message (DEBUG_JOBS, "format: %s, width: %f, height:%f," + "n_ranges: %d, pages_per_sheet: %d, copies: %d," + "collate: %s, reverse: %s", + format, width, height, n_ranges, pages_per_sheet, copies, + collate ? "True" : "False", reverse ? "True" : "False"); + job = g_object_new (EV_TYPE_JOB_PRINT, NULL); EV_JOB (job)->document = g_object_ref (document); @@ -819,6 +877,11 @@ 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; @@ -876,6 +939,8 @@ ev_job_print_run (EvJobPrint *job) g_return_if_fail (EV_IS_JOB_PRINT (job)); + ev_debug_message (DEBUG_JOBS, NULL); + if (job->temp_file) g_free (job->temp_file); job->temp_file = NULL; @@ -912,7 +977,7 @@ 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); + rc = ev_render_context_new (NULL, 0, 1.0); ev_document_doc_mutex_lock (); ev_file_exporter_begin (EV_FILE_EXPORTER (document), &fc); @@ -932,12 +997,17 @@ ev_job_print_run (EvJobPrint *job) ev_file_exporter_begin_page (EV_FILE_EXPORTER (document)); for (j = 0; j < job->pages_per_sheet; j++) { + EvPage *ev_page; + gint p = page + j; if (p < 0 || p >= n_pages) break; + + ev_page = ev_document_get_page (document, page_list[p]); + ev_render_context_set_page (rc, ev_page); + g_object_unref (ev_page); - ev_render_context_set_page (rc, page_list[p]); ev_file_exporter_do_page (EV_FILE_EXPORTER (document), rc); }