#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-misc.h"
#include "ev-file-helpers.h"
#include "ev-document-fonts.h"
#include "ev-selection.h"
static void ev_job_print_init (EvJobPrint *job);
static void ev_job_print_class_init (EvJobPrintClass *class);
-enum
-{
+enum {
FINISHED,
LAST_SIGNAL
};
+enum {
+ PAGE_READY,
+ RENDER_LAST_SIGNAL
+};
+
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)
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->selection) {
- g_object_unref (job->selection);
+ cairo_surface_destroy (job->selection);
job->selection = NULL;
}
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;
}
job->thumbnail = NULL;
}
+ if (job->rc) {
+ g_object_unref (job->rc);
+ job->rc = NULL;
+ }
+
(* G_OBJECT_CLASS (ev_job_thumbnail_parent_class)->dispose) (object);
}
EvRectangle *selection_points,
GdkColor *text,
GdkColor *base,
+ gboolean include_forms,
gboolean include_links,
gboolean include_images,
gboolean include_text,
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;
}
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);
+ /* 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;
- job->pixbuf = g_object_ref (pixbuf);
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)
{
} 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,
job->rc,
&(job->selection_points));
}
+
+ ev_job_render_page_ready (job);
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;
}
}
EvJob *
-ev_job_thumbnail_new (EvDocument *document,
- gint page,
- int rotation,
- gint requested_width)
+ev_job_thumbnail_new (EvDocument *document,
+ EvRenderContext *rc)
{
EvJobThumbnail *job;
job = g_object_new (EV_TYPE_JOB_THUMBNAIL, NULL);
EV_JOB (job)->document = g_object_ref (document);
- job->page = page;
- job->rotation = rotation;
- job->requested_width = requested_width;
+ job->rc = g_object_ref (rc);
return EV_JOB (job);
}
job->thumbnail =
ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (EV_JOB (job)->document),
- job->page,
- job->rotation,
- job->requested_width,
- TRUE);
+ job->rc, TRUE);
EV_JOB (job)->finished = TRUE;
ev_document_doc_mutex_unlock ();
EvPrintRange *ranges,
gint n_ranges,
EvPrintPageSet page_set,
+ gint pages_per_sheet,
gint copies,
gdouble collate,
gdouble reverse)
job->n_ranges = n_ranges;
job->page_set = page_set;
+
+ job->pages_per_sheet = pages_per_sheet;
job->copies = copies;
job->collate = collate;
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));
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_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++) {