+static gboolean
+notify_page_ready (EvJobRender *job)
+{
+ ev_debug_message (DEBUG_JOBS, "%d (%p)", job->ev_page->index, job);
+ ev_profiler_stop (EV_PROFILE_JOBS, "Rendering page %d", job->ev_page->index);
+
+ if (EV_JOB (job)->cancelled) {
+ ev_debug_message (DEBUG_JOBS, "%s (%p) job was cancelled, do not emit page_ready", EV_GET_TYPE_NAME (job), job);
+ } else {
+ g_signal_emit (job, job_render_signals[PAGE_READY], 0);
+ }
+
+ return FALSE;
+}
+
+static void
+ev_job_render_page_ready (EvJobRender *job)
+{
+ ev_debug_message (DEBUG_JOBS, "%d (%p)", job->ev_page->index, 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);
+}
+
+static gboolean
+ev_job_render_run (EvJob *job)
+{
+ EvJobRender *job_render = EV_JOB_RENDER (job);
+ EvRenderContext *rc;
+
+ 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;
+}
+