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);
15 static void ev_job_load_init (EvJobLoad *job);
16 static void ev_job_load_class_init (EvJobLoadClass *class);
24 static guint job_signals[LAST_SIGNAL] = { 0 };
26 G_DEFINE_TYPE (EvJob, ev_job, G_TYPE_OBJECT)
27 G_DEFINE_TYPE (EvJobLinks, ev_job_links, EV_TYPE_JOB)
28 G_DEFINE_TYPE (EvJobRender, ev_job_render, EV_TYPE_JOB)
29 G_DEFINE_TYPE (EvJobThumbnail, ev_job_thumbnail, EV_TYPE_JOB)
30 G_DEFINE_TYPE (EvJobLoad, ev_job_load, EV_TYPE_JOB)
32 static void ev_job_init (EvJob *job) { /* Do Nothing */ }
35 ev_job_dispose (GObject *object)
39 job = EV_JOB (object);
42 g_object_unref (job->document);
46 (* G_OBJECT_CLASS (ev_job_parent_class)->dispose) (object);
50 ev_job_class_init (EvJobClass *class)
54 oclass = G_OBJECT_CLASS (class);
56 oclass->dispose = ev_job_dispose;
58 job_signals [FINISHED] =
59 g_signal_new ("finished",
62 G_STRUCT_OFFSET (EvJobClass, finished),
64 g_cclosure_marshal_VOID__VOID,
69 static void ev_job_links_init (EvJobLinks *job) { /* Do Nothing */ }
72 ev_job_links_dispose (GObject *object)
76 job = EV_JOB_LINKS (object);
79 g_object_unref (job->model);
83 (* G_OBJECT_CLASS (ev_job_links_parent_class)->dispose) (object);
87 ev_job_links_class_init (EvJobLinksClass *class)
91 oclass = G_OBJECT_CLASS (class);
93 oclass->dispose = ev_job_links_dispose;
97 static void ev_job_render_init (EvJobRender *job) { /* Do Nothing */ }
100 ev_job_render_dispose (GObject *object)
104 job = EV_JOB_RENDER (object);
107 g_object_unref (job->pixbuf);
111 (* G_OBJECT_CLASS (ev_job_render_parent_class)->dispose) (object);
115 ev_job_render_class_init (EvJobRenderClass *class)
117 GObjectClass *oclass;
119 oclass = G_OBJECT_CLASS (class);
121 oclass->dispose = ev_job_render_dispose;
124 static void ev_job_thumbnail_init (EvJobThumbnail *job) { /* Do Nothing */ }
127 ev_job_thumbnail_dispose (GObject *object)
131 job = EV_JOB_THUMBNAIL (object);
133 if (job->thumbnail) {
134 g_object_unref (job->thumbnail);
135 job->thumbnail = NULL;
138 (* G_OBJECT_CLASS (ev_job_thumbnail_parent_class)->dispose) (object);
142 ev_job_thumbnail_class_init (EvJobThumbnailClass *class)
144 GObjectClass *oclass;
146 oclass = G_OBJECT_CLASS (class);
148 oclass->dispose = ev_job_thumbnail_dispose;
151 static void ev_job_load_init (EvJobLoad *job) { /* Do Nothing */ }
154 ev_job_load_dispose (GObject *object)
158 job = EV_JOB_LOAD (object);
166 g_error_free (job->error);
170 (* G_OBJECT_CLASS (ev_job_load_parent_class)->dispose) (object);
174 ev_job_load_class_init (EvJobLoadClass *class)
176 GObjectClass *oclass;
178 oclass = G_OBJECT_CLASS (class);
180 oclass->dispose = ev_job_load_dispose;
183 /* Public functions */
185 ev_job_finished (EvJob *job)
187 g_return_if_fail (EV_IS_JOB (job));
189 g_signal_emit (job, job_signals[FINISHED], 0);
193 ev_job_links_new (EvDocument *document)
197 job = g_object_new (EV_TYPE_JOB_LINKS, NULL);
198 job->document = g_object_ref (document);
204 ev_job_links_run (EvJobLinks *job)
206 g_return_if_fail (EV_IS_JOB_LINKS (job));
208 ev_document_doc_mutex_lock ();
209 job->model = ev_document_links_get_links_model (EV_DOCUMENT_LINKS (EV_JOB (job)->document));
210 EV_JOB (job)->finished = TRUE;
211 ev_document_doc_mutex_unlock ();
216 ev_job_render_new (EvDocument *document,
221 gboolean include_links)
225 job = g_object_new (EV_TYPE_JOB_RENDER, NULL);
227 EV_JOB (job)->document = g_object_ref (document);
230 job->target_width = width;
231 job->target_height = height;
232 job->include_links = include_links;
234 if (EV_IS_ASYNC_RENDERER (document)) {
235 EV_JOB (job)->async = TRUE;
242 render_finished_cb (EvDocument *document, GdkPixbuf *pixbuf, EvJobRender *job)
244 g_signal_handlers_disconnect_by_func (EV_JOB (job)->document,
245 render_finished_cb, job);
247 EV_JOB (job)->finished = TRUE;
248 job->pixbuf = g_object_ref (pixbuf);
249 ev_job_finished (EV_JOB (job));
253 ev_job_render_run (EvJobRender *job)
255 g_return_if_fail (EV_IS_JOB_RENDER (job));
257 ev_document_doc_mutex_lock ();
259 if (EV_JOB (job)->async) {
260 EvAsyncRenderer *renderer = EV_ASYNC_RENDERER (EV_JOB (job)->document);
261 ev_async_renderer_render_pixbuf (renderer, job->page, job->scale);
262 g_signal_connect (EV_JOB (job)->document, "render_finished",
263 G_CALLBACK (render_finished_cb), job);
265 job->pixbuf = ev_document_render_pixbuf (EV_JOB (job)->document,
268 if (job->include_links)
269 job->link_mapping = ev_document_get_links (EV_JOB (job)->document, job->page);
271 EV_JOB (job)->finished = TRUE;
274 ev_document_doc_mutex_unlock ();
278 ev_job_thumbnail_new (EvDocument *document,
280 gint requested_width)
284 job = g_object_new (EV_TYPE_JOB_THUMBNAIL, NULL);
286 EV_JOB (job)->document = g_object_ref (document);
288 job->requested_width = requested_width;
294 ev_job_thumbnail_run (EvJobThumbnail *job)
296 g_return_if_fail (EV_IS_JOB_THUMBNAIL (job));
298 ev_document_doc_mutex_lock ();
301 ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (EV_JOB (job)->document),
303 job->requested_width,
305 EV_JOB (job)->finished = TRUE;
307 ev_document_doc_mutex_unlock ();
311 ev_job_load_new (EvDocument *document,
316 job = g_object_new (EV_TYPE_JOB_LOAD, NULL);
318 EV_JOB (job)->document = g_object_ref (document);
319 job->uri = g_strdup (uri);
325 ev_job_load_run (EvJobLoad *job)
327 g_return_if_fail (EV_IS_JOB_LOAD (job));
329 ev_document_doc_mutex_lock ();
332 g_error_free (job->error);
336 ev_document_load (EV_JOB(job)->document, job->uri, &job->error);
338 EV_JOB (job)->finished = TRUE;
340 ev_document_doc_mutex_unlock ();