#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"
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;
guint idle_id;
gboolean printing;
int next_page;
+ int copies_done;
+ int shift;
};
struct _EvPrintJobClass {
{
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);
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), rc);
+ ev_file_exporter_do_page (EV_FILE_EXPORTER (job->document), rc);
ev_document_doc_mutex_unlock ();
g_object_unref (rc);
- job->next_page++;
+ 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);
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