2 #include "ev-job-queue.h"
3 #include "ev-document-thumbnails.h"
4 #include "ev-document-links.h"
5 #include "ev-async-renderer.h"
7 static void ev_job_init (EvJob *job);
8 static void ev_job_class_init (EvJobClass *class);
9 static void ev_job_links_init (EvJobLinks *job);
10 static void ev_job_links_class_init (EvJobLinksClass *class);
11 static void ev_job_render_init (EvJobRender *job);
12 static void ev_job_render_class_init (EvJobRenderClass *class);
13 static void ev_job_thumbnail_init (EvJobThumbnail *job);
14 static void ev_job_thumbnail_class_init (EvJobThumbnailClass *class);
22 static guint job_signals[LAST_SIGNAL] = { 0 };
24 G_DEFINE_TYPE (EvJob, ev_job, G_TYPE_OBJECT)
25 G_DEFINE_TYPE (EvJobLinks, ev_job_links, EV_TYPE_JOB)
26 G_DEFINE_TYPE (EvJobRender, ev_job_render, EV_TYPE_JOB)
27 G_DEFINE_TYPE (EvJobThumbnail, ev_job_thumbnail, EV_TYPE_JOB)
30 static void ev_job_init (EvJob *job) { /* Do Nothing */ }
33 ev_job_dispose (GObject *object)
37 job = EV_JOB (object);
40 g_object_unref (job->document);
44 (* G_OBJECT_CLASS (ev_job_parent_class)->dispose) (object);
48 ev_job_class_init (EvJobClass *class)
52 oclass = G_OBJECT_CLASS (class);
54 oclass->dispose = ev_job_dispose;
56 job_signals [FINISHED] =
57 g_signal_new ("finished",
60 G_STRUCT_OFFSET (EvJobClass, finished),
62 g_cclosure_marshal_VOID__VOID,
67 static void ev_job_links_init (EvJobLinks *job) { /* Do Nothing */ }
70 ev_job_links_dispose (GObject *object)
74 job = EV_JOB_LINKS (object);
77 g_object_unref (job->model);
81 (* G_OBJECT_CLASS (ev_job_links_parent_class)->dispose) (object);
85 ev_job_links_class_init (EvJobLinksClass *class)
89 oclass = G_OBJECT_CLASS (class);
91 oclass->dispose = ev_job_links_dispose;
95 static void ev_job_render_init (EvJobRender *job) { /* Do Nothing */ }
98 ev_job_render_dispose (GObject *object)
102 job = EV_JOB_RENDER (object);
105 g_object_unref (job->pixbuf);
109 (* G_OBJECT_CLASS (ev_job_render_parent_class)->dispose) (object);
113 ev_job_render_class_init (EvJobRenderClass *class)
115 GObjectClass *oclass;
117 oclass = G_OBJECT_CLASS (class);
119 oclass->dispose = ev_job_render_dispose;
122 static void ev_job_thumbnail_init (EvJobThumbnail *job) { /* Do Nothing */ }
125 ev_job_thumbnail_dispose (GObject *object)
129 job = EV_JOB_THUMBNAIL (object);
131 if (job->thumbnail) {
132 g_object_unref (job->thumbnail);
133 job->thumbnail = NULL;
136 (* G_OBJECT_CLASS (ev_job_thumbnail_parent_class)->dispose) (object);
140 ev_job_thumbnail_class_init (EvJobThumbnailClass *class)
142 GObjectClass *oclass;
144 oclass = G_OBJECT_CLASS (class);
146 oclass->dispose = ev_job_thumbnail_dispose;
149 /* Public functions */
151 ev_job_finished (EvJob *job)
153 g_return_if_fail (EV_IS_JOB (job));
155 g_signal_emit (job, job_signals[FINISHED], 0);
159 ev_job_links_new (EvDocument *document)
163 job = g_object_new (EV_TYPE_JOB_LINKS, NULL);
164 job->document = g_object_ref (document);
170 ev_job_links_run (EvJobLinks *job)
172 g_return_if_fail (EV_IS_JOB_LINKS (job));
174 ev_document_doc_mutex_lock ();
175 job->model = ev_document_links_get_links_model (EV_DOCUMENT_LINKS (EV_JOB (job)->document));
176 EV_JOB (job)->finished = TRUE;
177 ev_document_doc_mutex_unlock ();
182 ev_job_render_new (EvDocument *document,
187 gboolean include_links)
191 job = g_object_new (EV_TYPE_JOB_RENDER, NULL);
193 EV_JOB (job)->document = g_object_ref (document);
196 job->target_width = width;
197 job->target_height = height;
198 job->include_links = include_links;
200 if (EV_IS_ASYNC_RENDERER (document)) {
201 EV_JOB (job)->async = TRUE;
208 render_finished_cb (EvDocument *document, GdkPixbuf *pixbuf, EvJobRender *job)
210 g_signal_handlers_disconnect_by_func (EV_JOB (job)->document,
211 render_finished_cb, job);
213 EV_JOB (job)->finished = TRUE;
214 job->pixbuf = g_object_ref (pixbuf);
215 ev_job_finished (EV_JOB (job));
219 ev_job_render_run (EvJobRender *job)
221 g_return_if_fail (EV_IS_JOB_RENDER (job));
223 ev_document_doc_mutex_lock ();
225 if (EV_JOB (job)->async) {
226 EvAsyncRenderer *renderer = EV_ASYNC_RENDERER (EV_JOB (job)->document);
227 ev_async_renderer_render_pixbuf (renderer, job->page, job->scale);
228 g_signal_connect (EV_JOB (job)->document, "render_finished",
229 G_CALLBACK (render_finished_cb), job);
231 job->pixbuf = ev_document_render_pixbuf (EV_JOB (job)->document,
234 if (job->include_links)
235 job->link_mapping = ev_document_get_links (EV_JOB (job)->document, job->page);
237 EV_JOB (job)->finished = TRUE;
240 ev_document_doc_mutex_unlock ();
244 ev_job_thumbnail_new (EvDocument *document,
246 gint requested_width)
250 job = g_object_new (EV_TYPE_JOB_THUMBNAIL, NULL);
252 EV_JOB (job)->document = g_object_ref (document);
254 job->requested_width = requested_width;
260 ev_job_thumbnail_run (EvJobThumbnail *job)
262 g_return_if_fail (EV_IS_JOB_THUMBNAIL (job));
264 ev_document_doc_mutex_lock ();
267 ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (EV_JOB (job)->document),
269 job->requested_width,
271 EV_JOB (job)->finished = TRUE;
273 ev_document_doc_mutex_unlock ();