2 #include "ev-job-queue.h"
3 #include "ev-document-thumbnails.h"
4 #include "ev-document-links.h"
5 #include "ev-document-fonts.h"
6 #include "ev-async-renderer.h"
8 static void ev_job_init (EvJob *job);
9 static void ev_job_class_init (EvJobClass *class);
10 static void ev_job_links_init (EvJobLinks *job);
11 static void ev_job_links_class_init (EvJobLinksClass *class);
12 static void ev_job_render_init (EvJobRender *job);
13 static void ev_job_render_class_init (EvJobRenderClass *class);
14 static void ev_job_thumbnail_init (EvJobThumbnail *job);
15 static void ev_job_thumbnail_class_init (EvJobThumbnailClass *class);
16 static void ev_job_load_init (EvJobLoad *job);
17 static void ev_job_load_class_init (EvJobLoadClass *class);
25 static guint job_signals[LAST_SIGNAL] = { 0 };
27 G_DEFINE_TYPE (EvJob, ev_job, G_TYPE_OBJECT)
28 G_DEFINE_TYPE (EvJobLinks, ev_job_links, EV_TYPE_JOB)
29 G_DEFINE_TYPE (EvJobRender, ev_job_render, EV_TYPE_JOB)
30 G_DEFINE_TYPE (EvJobThumbnail, ev_job_thumbnail, EV_TYPE_JOB)
31 G_DEFINE_TYPE (EvJobLoad, ev_job_load, EV_TYPE_JOB)
32 G_DEFINE_TYPE (EvJobFonts, ev_job_fonts, EV_TYPE_JOB)
34 static void ev_job_init (EvJob *job) { /* Do Nothing */ }
37 ev_job_dispose (GObject *object)
41 job = EV_JOB (object);
44 g_object_unref (job->document);
48 (* G_OBJECT_CLASS (ev_job_parent_class)->dispose) (object);
52 ev_job_class_init (EvJobClass *class)
56 oclass = G_OBJECT_CLASS (class);
58 oclass->dispose = ev_job_dispose;
60 job_signals [FINISHED] =
61 g_signal_new ("finished",
64 G_STRUCT_OFFSET (EvJobClass, finished),
66 g_cclosure_marshal_VOID__VOID,
71 static void ev_job_links_init (EvJobLinks *job) { /* Do Nothing */ }
74 ev_job_links_dispose (GObject *object)
78 job = EV_JOB_LINKS (object);
81 g_object_unref (job->model);
85 (* G_OBJECT_CLASS (ev_job_links_parent_class)->dispose) (object);
89 ev_job_links_class_init (EvJobLinksClass *class)
93 oclass = G_OBJECT_CLASS (class);
95 oclass->dispose = ev_job_links_dispose;
99 static void ev_job_render_init (EvJobRender *job) { /* Do Nothing */ }
102 ev_job_render_dispose (GObject *object)
106 job = EV_JOB_RENDER (object);
109 g_object_unref (job->pixbuf);
113 (* G_OBJECT_CLASS (ev_job_render_parent_class)->dispose) (object);
117 ev_job_render_class_init (EvJobRenderClass *class)
119 GObjectClass *oclass;
121 oclass = G_OBJECT_CLASS (class);
123 oclass->dispose = ev_job_render_dispose;
126 static void ev_job_thumbnail_init (EvJobThumbnail *job) { /* Do Nothing */ }
129 ev_job_thumbnail_dispose (GObject *object)
133 job = EV_JOB_THUMBNAIL (object);
135 if (job->thumbnail) {
136 g_object_unref (job->thumbnail);
137 job->thumbnail = NULL;
140 (* G_OBJECT_CLASS (ev_job_thumbnail_parent_class)->dispose) (object);
144 ev_job_thumbnail_class_init (EvJobThumbnailClass *class)
146 GObjectClass *oclass;
148 oclass = G_OBJECT_CLASS (class);
150 oclass->dispose = ev_job_thumbnail_dispose;
153 static void ev_job_load_init (EvJobLoad *job) { /* Do Nothing */ }
156 ev_job_load_dispose (GObject *object)
160 job = EV_JOB_LOAD (object);
168 g_error_free (job->error);
172 (* G_OBJECT_CLASS (ev_job_load_parent_class)->dispose) (object);
176 ev_job_load_class_init (EvJobLoadClass *class)
178 GObjectClass *oclass;
180 oclass = G_OBJECT_CLASS (class);
182 oclass->dispose = ev_job_load_dispose;
185 /* Public functions */
187 ev_job_finished (EvJob *job)
189 g_return_if_fail (EV_IS_JOB (job));
191 g_signal_emit (job, job_signals[FINISHED], 0);
195 ev_job_links_new (EvDocument *document)
199 job = g_object_new (EV_TYPE_JOB_LINKS, NULL);
200 job->document = g_object_ref (document);
206 ev_job_links_run (EvJobLinks *job)
208 g_return_if_fail (EV_IS_JOB_LINKS (job));
210 ev_document_doc_mutex_lock ();
211 job->model = ev_document_links_get_links_model (EV_DOCUMENT_LINKS (EV_JOB (job)->document));
212 EV_JOB (job)->finished = TRUE;
213 ev_document_doc_mutex_unlock ();
218 ev_job_render_new (EvDocument *document,
223 gboolean include_links)
227 job = g_object_new (EV_TYPE_JOB_RENDER, NULL);
229 EV_JOB (job)->document = g_object_ref (document);
232 job->target_width = width;
233 job->target_height = height;
234 job->include_links = include_links;
236 if (EV_IS_ASYNC_RENDERER (document)) {
237 EV_JOB (job)->async = TRUE;
244 render_finished_cb (EvDocument *document, GdkPixbuf *pixbuf, EvJobRender *job)
246 g_signal_handlers_disconnect_by_func (EV_JOB (job)->document,
247 render_finished_cb, job);
249 EV_JOB (job)->finished = TRUE;
250 job->pixbuf = g_object_ref (pixbuf);
251 ev_job_finished (EV_JOB (job));
255 ev_job_render_run (EvJobRender *job)
257 g_return_if_fail (EV_IS_JOB_RENDER (job));
259 ev_document_doc_mutex_lock ();
261 if (EV_JOB (job)->async) {
262 EvAsyncRenderer *renderer = EV_ASYNC_RENDERER (EV_JOB (job)->document);
263 ev_async_renderer_render_pixbuf (renderer, job->page, job->scale);
264 g_signal_connect (EV_JOB (job)->document, "render_finished",
265 G_CALLBACK (render_finished_cb), job);
267 job->pixbuf = ev_document_render_pixbuf (EV_JOB (job)->document,
270 if (job->include_links)
271 job->link_mapping = ev_document_get_links (EV_JOB (job)->document, job->page);
273 EV_JOB (job)->finished = TRUE;
276 ev_document_doc_mutex_unlock ();
280 ev_job_thumbnail_new (EvDocument *document,
282 gint requested_width)
286 job = g_object_new (EV_TYPE_JOB_THUMBNAIL, NULL);
288 EV_JOB (job)->document = g_object_ref (document);
290 job->requested_width = requested_width;
296 ev_job_thumbnail_run (EvJobThumbnail *job)
298 g_return_if_fail (EV_IS_JOB_THUMBNAIL (job));
300 ev_document_doc_mutex_lock ();
303 ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (EV_JOB (job)->document),
305 job->requested_width,
307 EV_JOB (job)->finished = TRUE;
309 ev_document_doc_mutex_unlock ();
313 ev_job_load_new (EvDocument *document,
318 job = g_object_new (EV_TYPE_JOB_LOAD, NULL);
320 EV_JOB (job)->document = g_object_ref (document);
321 job->uri = g_strdup (uri);
327 ev_job_load_run (EvJobLoad *job)
329 g_return_if_fail (EV_IS_JOB_LOAD (job));
331 ev_document_doc_mutex_lock ();
334 g_error_free (job->error);
338 ev_document_load (EV_JOB(job)->document, job->uri, &job->error);
340 EV_JOB (job)->finished = TRUE;
342 ev_document_doc_mutex_unlock ();
345 static void ev_job_fonts_init (EvJobFonts *job) { /* Do Nothing */ }
347 static void ev_job_fonts_class_init (EvJobFontsClass *class) { /* Do Nothing */ }
350 ev_job_fonts_new (EvDocument *document)
354 job = g_object_new (EV_TYPE_JOB_FONTS, NULL);
356 EV_JOB (job)->document = g_object_ref (document);
362 ev_job_fonts_run (EvJobFonts *job)
364 EvDocumentFonts *fonts;
366 g_return_if_fail (EV_IS_JOB_FONTS (job));
368 ev_document_doc_mutex_lock ();
370 fonts = EV_DOCUMENT_FONTS (EV_JOB (job)->document);
371 job->scan_completed = !ev_document_fonts_scan (fonts, 20);
373 EV_JOB (job)->finished = TRUE;
375 ev_document_doc_mutex_unlock ();