+ ev_debug_message (DEBUG_JOBS, "page: %d (%p)", job_render->page, job);
+ ev_profiler_start (EV_PROFILE_JOBS, "%s (%p)", EV_GET_TYPE_NAME (job), job);
+
+ ev_document_doc_mutex_lock ();
+
+ ev_profiler_start (EV_PROFILE_JOBS, "Rendering page %d", job_render->page);
+
+ ev_document_fc_mutex_lock ();
+
+ job_render->ev_page = ev_document_get_page (job->document, job_render->page);
+ rc = ev_render_context_new (job_render->ev_page, job_render->rotation, job_render->scale);
+
+ job_render->surface = ev_document_render (job->document, rc);
+ /* If job was cancelled during the page rendering,
+ * we return now, so that the thread is finished ASAP
+ */
+ if (g_cancellable_is_cancelled (job->cancellable)) {
+ ev_document_fc_mutex_unlock ();
+ ev_document_doc_mutex_unlock ();
+ g_object_unref (rc);
+
+ return FALSE;
+ }
+
+ if ((job_render->flags & EV_RENDER_INCLUDE_SELECTION) && EV_IS_SELECTION (job->document)) {
+ ev_selection_render_selection (EV_SELECTION (job->document),
+ rc,
+ &(job_render->selection),
+ &(job_render->selection_points),
+ NULL,
+ job_render->selection_style,
+ &(job_render->text), &(job_render->base));
+ job_render->selection_region =
+ ev_selection_get_selection_region (EV_SELECTION (job->document),
+ rc,
+ job_render->selection_style,
+ &(job_render->selection_points));
+ }
+
+ ev_job_render_page_ready (job_render);
+
+ ev_document_fc_mutex_unlock ();
+
+ if ((job_render->flags & EV_RENDER_INCLUDE_TEXT) && EV_IS_SELECTION (job->document))
+ job_render->text_mapping =
+ ev_selection_get_selection_map (EV_SELECTION (job->document), rc);
+ if ((job_render->flags & EV_RENDER_INCLUDE_LINKS) && EV_IS_DOCUMENT_LINKS (job->document))
+ job_render->link_mapping =
+ ev_document_links_get_links (EV_DOCUMENT_LINKS (job->document), job_render->page);
+ if ((job_render->flags & EV_RENDER_INCLUDE_FORMS) && EV_IS_DOCUMENT_FORMS (job->document))
+ job_render->form_field_mapping =
+ ev_document_forms_get_form_fields (EV_DOCUMENT_FORMS (job->document),
+ job_render->ev_page);
+ if ((job_render->flags & EV_RENDER_INCLUDE_IMAGES) && EV_IS_DOCUMENT_IMAGES (job->document))
+ job_render->image_mapping =
+ ev_document_images_get_image_mapping (EV_DOCUMENT_IMAGES (job->document),
+ job_render->page);
+ g_object_unref (rc);
+ ev_document_doc_mutex_unlock ();
+
+ ev_job_succeeded (job);
+
+ return FALSE;
+}
+
+static void
+ev_job_render_class_init (EvJobRenderClass *class)
+{
+ GObjectClass *oclass = G_OBJECT_CLASS (class);
+ EvJobClass *job_class = EV_JOB_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_class->run = ev_job_render_run;
+}
+
+EvJob *
+ev_job_render_new (EvDocument *document,
+ gint page,
+ gint rotation,
+ gdouble scale,
+ gint width,
+ gint height,
+ EvRenderFlags flags)
+{
+ EvJobRender *job;
+
+ ev_debug_message (DEBUG_JOBS, "page: %d", page);
+
+ job = g_object_new (EV_TYPE_JOB_RENDER, NULL);
+
+ EV_JOB (job)->document = g_object_ref (document);
+ job->page = page;
+ job->rotation = rotation;
+ job->scale = scale;
+ job->target_width = width;
+ job->target_height = height;
+ job->flags = flags;
+
+ return EV_JOB (job);
+}
+
+void
+ev_job_render_set_selection_info (EvJobRender *job,
+ EvRectangle *selection_points,
+ EvSelectionStyle selection_style,
+ GdkColor *text,
+ GdkColor *base)
+{
+ job->flags |= EV_RENDER_INCLUDE_SELECTION;
+
+ job->selection_points = *selection_points;
+ job->selection_style = selection_style;
+ job->text = *text;
+ job->base = *base;
+}
+
+/* EvJobThumbnail */
+static void
+ev_job_thumbnail_init (EvJobThumbnail *job)
+{
+ EV_JOB (job)->run_mode = EV_JOB_RUN_THREAD;
+}
+
+static void
+ev_job_thumbnail_dispose (GObject *object)
+{
+ EvJobThumbnail *job;
+
+ job = EV_JOB_THUMBNAIL (object);
+
+ ev_debug_message (DEBUG_JOBS, "%d (%p)", job->page, job);
+
+ if (job->thumbnail) {
+ g_object_unref (job->thumbnail);
+ job->thumbnail = NULL;
+ }