gint n_pages_to_print;
gint uncollated_copies;
gint collated_copies;
- gint uncollated, collated, total;
+ gint uncollated, collated, total, blank;
gint range, n_ranges;
GtkPageRange *ranges;
find_range (export);
export->page = export->start;
}
- } while ((export->page_set == GTK_PAGE_SET_EVEN && export->page % 2 == 0) ||
- (export->page_set == GTK_PAGE_SET_ODD && export->page % 2 == 1));
+ } while ((export->page_set == GTK_PAGE_SET_EVEN && (export->page / export->pages_per_sheet) % 2 == 0) ||
+ (export->page_set == GTK_PAGE_SET_ODD && (export->page / export->pages_per_sheet) % 2 == 1));
return TRUE;
}
{
EvPrintOperation *op = EV_PRINT_OPERATION (export);
- if (export->pages_per_sheet == 1 || export->total % export->pages_per_sheet == 0) {
+ if (export->pages_per_sheet == 1 || (export->total + export->blank) % export->pages_per_sheet == 0 ) {
ev_document_doc_mutex_lock ();
ev_file_exporter_end_page (EV_FILE_EXPORTER (op->document));
ev_document_doc_mutex_unlock ();
export->total++;
export->collated++;
+ /* when printing multiple collated copies & multiple pages per sheet we want to
+ prevent the next copy bleeding into the last sheet of the previous one
+ we therefore check whether we've reached the last page in a document
+ if that is the case and the given sheet is not filled with pages,
+ we introduce a few blank pages to finish off the sheet
+ to make sure nothing goes wrong, the final condition ensures that
+ we're not at the end of a sheet, otherwise we'd introduce a blank sheet! */
+
+ if (export->collate == 1 && export->total > 1 && export->pages_per_sheet > 1 &&
+ (export->page + 1) % export->n_pages == 0 && (export->total - 1 + export->blank) % export->pages_per_sheet != 0) {
+ ev_document_doc_mutex_lock ();
+ ev_file_exporter_end_page (EV_FILE_EXPORTER (op->document));
+ /* keep track of how many blank pages have been added */
+ export->blank += export->pages_per_sheet - (export->total - 1 + export->blank) % export->pages_per_sheet;
+ ev_document_doc_mutex_unlock ();
+ }
+
+
if (export->collated == export->collated_copies) {
export->collated = 0;
if (!export_print_inc_page (export)) {
ev_document_doc_mutex_lock ();
- if (export->pages_per_sheet > 1 &&
- export->total - 1 % export->pages_per_sheet == 0)
- ev_file_exporter_end_page (EV_FILE_EXPORTER (op->document));
ev_file_exporter_end (EV_FILE_EXPORTER (op->document));
ev_document_doc_mutex_unlock ();
close (export->fd);
export->fd = -1;
-
update_progress (export);
-
export_print_done (export);
return FALSE;
}
}
- if (export->pages_per_sheet == 1 || export->total % export->pages_per_sheet == 1) {
+ if (export->pages_per_sheet == 1 || (export->total + export->blank) % export->pages_per_sheet == 1) {
ev_document_doc_mutex_lock ();
ev_file_exporter_begin_page (EV_FILE_EXPORTER (op->document));
ev_document_doc_mutex_unlock ();
break;
}
- if (!clamp_ranges (export)) {
+ if (export->n_ranges < 1 || !clamp_ranges (export)) {
GtkWidget *message_dialog;
message_dialog = gtk_message_dialog_new (GTK_WINDOW (dialog),
{
EvPrintOperation *op = EV_PRINT_OPERATION (print);
cairo_t *cr;
+ gdouble cr_width, cr_height;
+ gint width, height;
gtk_print_operation_set_defer_drawing (print->op);
ev_job_print_set_page (EV_JOB_PRINT (print->job_print), page);
cr = gtk_print_context_get_cairo_context (context);
- ev_job_print_set_cairo (EV_JOB_PRINT (print->job_print), cr);
+ cr_width = gtk_print_context_get_width (context);
+ cr_height = gtk_print_context_get_height (context);
+ ev_page_cache_get_size (ev_page_cache_get (op->document),
+ page, 0, 1.0,
+ &width, &height);
+ cairo_scale (cr, cr_width / (gdouble)width, cr_height / (gdouble)height);
+ ev_job_print_set_cairo (EV_JOB_PRINT (print->job_print), cr);
ev_job_scheduler_push_job (print->job_print, EV_JOB_PRIORITY_NONE);
}
}
#endif /* GTK_CHECK_VERSION (2, 17, 1) */
+gboolean ev_print_operation_exists_for_document (EvDocument *document)
+{
+#if GTK_CHECK_VERSION (2, 17, 1)
+ return (EV_IS_FILE_EXPORTER(document) || EV_IS_DOCUMENT_PRINT(document));
+#else
+ return EV_IS_FILE_EXPORTER(document);
+#endif
+}
+
/* Factory method */
EvPrintOperation *
ev_print_operation_new (EvDocument *document)