]> www.fi.muni.cz Git - evince.git/blob - backend/ev-jobs.c
355a10378e422ed8af0424db31f88979fdd25c08
[evince.git] / backend / ev-jobs.c
1 #include "ev-jobs.h"
2 #include "ev-job-queue.h"
3 #include "ev-document-thumbnails.h"
4 #include "ev-document-links.h"
5
6 static void ev_job_init                 (EvJob               *job);
7 static void ev_job_class_init           (EvJobClass          *class);
8 static void ev_job_links_init           (EvJobLinks          *job);
9 static void ev_job_links_class_init     (EvJobLinksClass     *class);
10 static void ev_job_render_init          (EvJobRender         *job);
11 static void ev_job_render_class_init    (EvJobRenderClass    *class);
12 static void ev_job_thumbnail_init       (EvJobThumbnail      *job);
13 static void ev_job_thumbnail_class_init (EvJobThumbnailClass *class);
14
15 enum
16 {
17         FINISHED,
18         LAST_SIGNAL
19 };
20
21 static guint job_signals[LAST_SIGNAL] = { 0 };
22
23 G_DEFINE_TYPE (EvJob, ev_job, G_TYPE_OBJECT)
24 G_DEFINE_TYPE (EvJobLinks, ev_job_links, EV_TYPE_JOB)
25 G_DEFINE_TYPE (EvJobRender, ev_job_render, EV_TYPE_JOB)
26 G_DEFINE_TYPE (EvJobThumbnail, ev_job_thumbnail, EV_TYPE_JOB)
27
28
29 static void ev_job_init (EvJob *job) { /* Do Nothing */ }
30
31 static void
32 ev_job_dispose (GObject *object)
33 {
34         EvJob *job;
35
36         job = EV_JOB (object);
37
38         if (job->document) {
39                 g_object_unref (job->document);
40                 job->document = NULL;
41         }
42
43         (* G_OBJECT_CLASS (ev_job_parent_class)->dispose) (object);
44 }
45
46 static void
47 ev_job_class_init (EvJobClass *class)
48 {
49         GObjectClass *oclass;
50
51         oclass = G_OBJECT_CLASS (class);
52
53         oclass->dispose = ev_job_dispose;
54
55         job_signals [FINISHED] =
56                 g_signal_new ("finished",
57                               EV_TYPE_JOB,
58                               G_SIGNAL_RUN_LAST,
59                               G_STRUCT_OFFSET (EvJobClass, finished),
60                               NULL, NULL,
61                               g_cclosure_marshal_VOID__VOID,
62                               G_TYPE_NONE, 0);
63 }
64
65
66 static void ev_job_links_init (EvJobLinks *job) { /* Do Nothing */ }
67
68 static void
69 ev_job_links_dispose (GObject *object)
70 {
71         EvJobLinks *job;
72
73         job = EV_JOB_LINKS (object);
74
75         if (job->model) {
76                 g_object_unref (job->model);
77                 job->model = NULL;
78         }
79
80         (* G_OBJECT_CLASS (ev_job_links_parent_class)->dispose) (object);
81 }
82
83 static void
84 ev_job_links_class_init (EvJobLinksClass *class)
85 {
86         GObjectClass *oclass;
87
88         oclass = G_OBJECT_CLASS (class);
89
90         oclass->dispose = ev_job_links_dispose;
91 }
92
93
94 static void ev_job_render_init (EvJobRender *job) { /* Do Nothing */ }
95
96 static void
97 ev_job_render_dispose (GObject *object)
98 {
99         EvJobRender *job;
100
101         job = EV_JOB_RENDER (object);
102
103         if (job->pixbuf) {
104                 g_object_unref (job->pixbuf);
105                 job->pixbuf = NULL;
106         }
107
108         (* G_OBJECT_CLASS (ev_job_render_parent_class)->dispose) (object);
109 }
110
111 static void
112 ev_job_render_class_init (EvJobRenderClass *class)
113 {
114         GObjectClass *oclass;
115
116         oclass = G_OBJECT_CLASS (class);
117
118         oclass->dispose = ev_job_render_dispose;
119 }
120
121 static void ev_job_thumbnail_init (EvJobThumbnail *job) { /* Do Nothing */ }
122
123 static void
124 ev_job_thumbnail_dispose (GObject *object)
125 {
126         EvJobThumbnail *job;
127
128         job = EV_JOB_THUMBNAIL (object);
129
130         if (job->thumbnail) {
131                 g_object_unref (job->thumbnail);
132                 job->thumbnail = NULL;
133         }
134
135         (* G_OBJECT_CLASS (ev_job_thumbnail_parent_class)->dispose) (object);
136 }
137
138 static void
139 ev_job_thumbnail_class_init (EvJobThumbnailClass *class)
140 {
141         GObjectClass *oclass;
142
143         oclass = G_OBJECT_CLASS (class);
144
145         oclass->dispose = ev_job_thumbnail_dispose;
146 }
147
148 /* Public functions */
149 void
150 ev_job_finished (EvJob *job)
151 {
152         g_return_if_fail (EV_IS_JOB (job));
153
154         g_signal_emit (job, job_signals[FINISHED], 0);
155 }
156
157 EvJob *
158 ev_job_links_new (EvDocument *document)
159 {
160         EvJob *job;
161
162         job = g_object_new (EV_TYPE_JOB_LINKS, NULL);
163         job->document = g_object_ref (document);
164
165         return job;
166 }
167
168 void
169 ev_job_links_run (EvJobLinks *job)
170 {
171         g_return_if_fail (EV_IS_JOB_LINKS (job));
172
173         g_mutex_lock (EV_DOC_MUTEX);
174         job->model = ev_document_links_get_links_model (EV_DOCUMENT_LINKS (EV_JOB (job)->document));
175         EV_JOB (job)->finished = TRUE;
176         g_mutex_unlock (EV_DOC_MUTEX);
177 }
178
179
180 EvJob *
181 ev_job_render_new (EvDocument *document,
182                    gint        page,
183                    double      scale,
184                    gint        width,
185                    gint        height)
186 {
187         EvJobRender *job;
188
189         job = g_object_new (EV_TYPE_JOB_RENDER, NULL);
190
191         EV_JOB (job)->document = g_object_ref (document);
192         job->page = page;
193         job->scale = scale;
194         job->target_width = width;
195         job->target_height = height;
196
197         return EV_JOB (job);
198 }
199
200 void
201 ev_job_render_run (EvJobRender *job)
202 {
203         g_return_if_fail (EV_IS_JOB_RENDER (job));
204
205         g_mutex_lock (EV_DOC_MUTEX);
206
207         ev_document_set_scale (EV_JOB (job)->document, job->scale);
208         ev_document_set_page (EV_JOB (job)->document, job->page);
209         job->pixbuf = ev_document_render_pixbuf (EV_JOB (job)->document);
210         EV_JOB (job)->finished = TRUE;
211
212         g_mutex_unlock (EV_DOC_MUTEX);
213 }
214
215 EvJob *
216 ev_job_thumbnail_new (EvDocument *document,
217                       gint        page,
218                       gint        requested_width)
219 {
220         EvJobThumbnail *job;
221
222         job = g_object_new (EV_TYPE_JOB_THUMBNAIL, NULL);
223
224         EV_JOB (job)->document = g_object_ref (document);
225         job->page = page;
226         job->requested_width = requested_width;
227
228         return EV_JOB (job);
229 }
230
231 void
232 ev_job_thumbnail_run (EvJobThumbnail *job)
233 {
234         g_return_if_fail (EV_IS_JOB_THUMBNAIL (job));
235
236         g_mutex_lock (EV_DOC_MUTEX);
237
238         job->thumbnail =
239                 ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (EV_JOB (job)->document),
240                                                       job->page,
241                                                       job->requested_width,
242                                                       TRUE);
243         EV_JOB (job)->finished = TRUE;
244
245         g_mutex_unlock (EV_DOC_MUTEX);
246 }