]> www.fi.muni.cz Git - evince.git/blobdiff - shell/ev-print-job.c
Use cairo image surfaces instead of GDK pixbufs for drawing pages and
[evince.git] / shell / ev-print-job.c
index 1f215c77c817b4b235c0a55a1e52ce03a529e9fd..79076f90b8fa88766238995c09459f5c1c90aad6 100644 (file)
@@ -32,7 +32,7 @@
 #define GNOME_PRINT_UNSTABLE_API
 #include <libgnomeprint/gnome-print-job.h>
 
-#include "ev-ps-exporter.h"
+#include "ev-file-exporter.h"
 #include "ev-print-job.h"
 #include "ev-page-cache.h"
 
@@ -48,8 +48,8 @@ struct _EvPrintJob {
        double width; /* FIXME unused */
        double height; /* FIXME unused */
        gboolean duplex; /* FIXME unused */
-       int copies; /* FIXME unused */
-       int collate; /* FIXME unsued */
+       int copies;
+       int collate;
 
        /* range printing */
        int first_page;
@@ -60,6 +60,8 @@ struct _EvPrintJob {
        guint idle_id;
        gboolean printing;
        int next_page;
+       int copies_done;
+       int shift;
 };
 
 struct _EvPrintJobClass {
@@ -258,29 +260,54 @@ idle_print_handler (EvPrintJob *job)
 {
        if (!job->printing) {
                ev_document_doc_mutex_lock ();
-               ev_ps_exporter_begin (
-                        EV_PS_EXPORTER (job->document),
-                        job->temp_file, job->first_page, job->last_page,
+               ev_file_exporter_begin (
+                        EV_FILE_EXPORTER (job->document),
+                       EV_FILE_FORMAT_PS,
+                        job->temp_file, 
+                       MIN (job->first_page, job->last_page),
+                       MAX (job->first_page, job->last_page),
                         job->width, job->height, job->duplex);
                ev_document_doc_mutex_unlock ();
                job->next_page = job->first_page;
+               job->shift = (job->first_page > job->last_page) ? -1 : 1;
                job->printing = TRUE;
                return TRUE;
        }
-
-       if (job->next_page <= job->last_page) {
+       
+       if ((job->next_page - job->last_page) * job->shift <= 0) {
+               EvRenderContext *rc;
 #if 0
                g_printerr ("Printing page %d\n", job->next_page);
 #endif
+               rc = ev_render_context_new (0, job->next_page, 1.0);
+
                ev_document_doc_mutex_lock ();
-               ev_ps_exporter_do_page (EV_PS_EXPORTER (job->document),
-                                       job->next_page);
+               ev_file_exporter_do_page (EV_FILE_EXPORTER (job->document), rc);
                ev_document_doc_mutex_unlock ();
-               job->next_page++;
+
+               g_object_unref (rc);
+
+               if (job->collate) {
+                       /* collate must repeat the same page */
+                       job->copies_done++;
+                       if(job->copies == job->copies_done) {
+                               job->next_page += job->shift;
+                               job->copies_done = 0;
+                       }
+               } else {
+                       job->next_page += job->shift;
+                       if ((job->next_page - job->last_page) * job->shift > 0){
+                               job->copies_done++;
+                               if(job->copies_done < job->copies) {
+                                       /* more copies to go, restart to the first page */
+                                       job->next_page = job->first_page;
+                               }
+                       }
+               }
                return TRUE;
-       } else { /* no more pages */
+       } else { /* no more pages or copies */
                ev_document_doc_mutex_lock ();
-               ev_ps_exporter_end (EV_PS_EXPORTER (job->document));
+               ev_file_exporter_end (EV_FILE_EXPORTER (job->document));
                ev_document_doc_mutex_unlock ();
 
                close (job->fd);
@@ -314,7 +341,7 @@ ev_print_job_print (EvPrintJob *job, GtkWindow *parent)
 
        g_return_if_fail (EV_IS_PRINT_JOB (job));
        g_return_if_fail (job->document != NULL);
-       g_return_if_fail (EV_IS_PS_EXPORTER (job->document));
+       g_return_if_fail (EV_IS_FILE_EXPORTER (job->document));
 #if 0
        g_printerr ("Printing...\n");
 #endif