]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-jobs.c
Fixed wrong translation.
[evince.git] / shell / ev-jobs.c
index 6ad4dfcaa876e5a4f64ed7e59c9ecaf20809883b..1218cd063314451300fc05f90a9622c76a93b9cc 100644 (file)
@@ -3,7 +3,9 @@
 #include "ev-document-thumbnails.h"
 #include "ev-document-links.h"
 #include "ev-document-images.h"
 #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-factory.h"
+#include "ev-document-misc.h"
 #include "ev-file-helpers.h"
 #include "ev-document-fonts.h"
 #include "ev-selection.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);
 
 static void ev_job_print_init           (EvJobPrint          *job);
 static void ev_job_print_class_init     (EvJobPrintClass     *class);
 
-enum
-{
+enum {
        FINISHED,
        LAST_SIGNAL
 };
 
        FINISHED,
        LAST_SIGNAL
 };
 
+enum {
+       PAGE_READY,
+       RENDER_LAST_SIGNAL
+};
+
 static guint job_signals[LAST_SIGNAL] = { 0 };
 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)
 
 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);
 
 
        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) {
        }
 
        if (job->rc) {
@@ -131,7 +138,7 @@ ev_job_render_dispose (GObject *object)
        }
 
        if (job->selection) {
        }
 
        if (job->selection) {
-               g_object_unref (job->selection);
+               cairo_surface_destroy (job->selection);
                job->selection = NULL;
        }
 
                job->selection = NULL;
        }
 
@@ -150,6 +157,15 @@ ev_job_render_class_init (EvJobRenderClass *class)
 
        oclass = G_OBJECT_CLASS (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;
 }
 
        oclass->dispose = ev_job_render_dispose;
 }
 
@@ -264,6 +280,7 @@ ev_job_render_new (EvDocument      *document,
                   EvRectangle     *selection_points,
                   GdkColor        *text,
                   GdkColor        *base,
                   EvRectangle     *selection_points,
                   GdkColor        *text,
                   GdkColor        *base,
+                  gboolean         include_forms,
                   gboolean         include_links,
                   gboolean         include_images,
                   gboolean         include_text,
                   gboolean         include_links,
                   gboolean         include_images,
                   gboolean         include_text,
@@ -283,6 +300,7 @@ ev_job_render_new (EvDocument      *document,
        job->target_height = height;
        job->text = *text;
        job->base = *base;
        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;
        job->include_links = include_links;
        job->include_images = include_images;
        job->include_text = include_text;
@@ -299,16 +317,39 @@ ev_job_render_new (EvDocument      *document,
 }
 
 static void
 }
 
 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);
 
 {
        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;
        EV_JOB (job)->finished = TRUE;
-       job->pixbuf = g_object_ref (pixbuf);
        ev_job_finished (EV_JOB (job));
 }
 
        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)
 {
 void
 ev_job_render_run (EvJobRender *job)
 {
@@ -325,19 +366,7 @@ ev_job_render_run (EvJobRender *job)
        } else {
                ev_document_fc_mutex_lock ();
                
        } 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,
                if (job->include_selection && EV_IS_SELECTION (EV_JOB (job)->document)) {
                        ev_selection_render_selection (EV_SELECTION (EV_JOB (job)->document),
                                                       job->rc,
@@ -350,8 +379,27 @@ ev_job_render_run (EvJobRender *job)
                                                                   job->rc,
                                                                   &(job->selection_points));
                }
                                                                   job->rc,
                                                                   &(job->selection_points));
                }
+
+               ev_job_render_page_ready (job);
                
                ev_document_fc_mutex_unlock ();
                
                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;
        }
 
                EV_JOB (job)->finished = TRUE;
        }
 
@@ -519,6 +567,7 @@ ev_job_print_new (EvDocument    *document,
                  EvPrintRange  *ranges,
                  gint           n_ranges,
                  EvPrintPageSet page_set,
                  EvPrintRange  *ranges,
                  gint           n_ranges,
                  EvPrintPageSet page_set,
+                 gint           pages_per_sheet,
                  gint           copies,
                  gdouble        collate,
                  gdouble        reverse)
                  gint           copies,
                  gdouble        collate,
                  gdouble        reverse)
@@ -541,6 +590,8 @@ ev_job_print_new (EvDocument    *document,
        job->n_ranges = n_ranges;
 
        job->page_set = page_set;
        job->n_ranges = n_ranges;
 
        job->page_set = page_set;
+
+       job->pages_per_sheet = pages_per_sheet;
        
        job->copies = copies;
        job->collate = collate;
        
        job->copies = copies;
        job->collate = collate;
@@ -631,12 +682,13 @@ ev_job_print_do_page (EvJobPrint *job, gint page)
 void
 ev_job_print_run (EvJobPrint *job)
 {
 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));
 
        
        g_return_if_fail (EV_IS_JOB_PRINT (job));
 
@@ -659,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);
 
        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_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++) {
        ev_document_doc_mutex_unlock ();
 
        for (i = 0; i < job->copies; i++) {