Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/backend/ev-jobs.c
diff options
context:
space:
mode:
authorMarco Pesenti Gritti <marco@src.gnome.org>2005-03-23 11:07:32 (GMT)
committer Marco Pesenti Gritti <marco@src.gnome.org>2005-03-23 11:07:32 (GMT)
commit1c0d19bd22598eca159c3febdcdaf4168891cb8f (patch)
tree76cc5403e6c20380228ab3f7718130162fbf864d /backend/ev-jobs.c
parent730f128d1fb4feb815c8111c9956d1598c655408 (diff)
merge evince-threads branch
Diffstat (limited to 'backend/ev-jobs.c')
-rw-r--r--backend/ev-jobs.c246
1 files changed, 246 insertions, 0 deletions
diff --git a/backend/ev-jobs.c b/backend/ev-jobs.c
new file mode 100644
index 0000000..355a103
--- /dev/null
+++ b/backend/ev-jobs.c
@@ -0,0 +1,246 @@
+#include "ev-jobs.h"
+#include "ev-job-queue.h"
+#include "ev-document-thumbnails.h"
+#include "ev-document-links.h"
+
+static void ev_job_init (EvJob *job);
+static void ev_job_class_init (EvJobClass *class);
+static void ev_job_links_init (EvJobLinks *job);
+static void ev_job_links_class_init (EvJobLinksClass *class);
+static void ev_job_render_init (EvJobRender *job);
+static void ev_job_render_class_init (EvJobRenderClass *class);
+static void ev_job_thumbnail_init (EvJobThumbnail *job);
+static void ev_job_thumbnail_class_init (EvJobThumbnailClass *class);
+
+enum
+{
+ FINISHED,
+ LAST_SIGNAL
+};
+
+static guint job_signals[LAST_SIGNAL] = { 0 };
+
+G_DEFINE_TYPE (EvJob, ev_job, G_TYPE_OBJECT)
+G_DEFINE_TYPE (EvJobLinks, ev_job_links, EV_TYPE_JOB)
+G_DEFINE_TYPE (EvJobRender, ev_job_render, EV_TYPE_JOB)
+G_DEFINE_TYPE (EvJobThumbnail, ev_job_thumbnail, EV_TYPE_JOB)
+
+
+static void ev_job_init (EvJob *job) { /* Do Nothing */ }
+
+static void
+ev_job_dispose (GObject *object)
+{
+ EvJob *job;
+
+ job = EV_JOB (object);
+
+ if (job->document) {
+ g_object_unref (job->document);
+ job->document = NULL;
+ }
+
+ (* G_OBJECT_CLASS (ev_job_parent_class)->dispose) (object);
+}
+
+static void
+ev_job_class_init (EvJobClass *class)
+{
+ GObjectClass *oclass;
+
+ oclass = G_OBJECT_CLASS (class);
+
+ oclass->dispose = ev_job_dispose;
+
+ job_signals [FINISHED] =
+ g_signal_new ("finished",
+ EV_TYPE_JOB,
+ G_SIGNAL_RUN_LAST,
+ G_STRUCT_OFFSET (EvJobClass, finished),
+ NULL, NULL,
+ g_cclosure_marshal_VOID__VOID,
+ G_TYPE_NONE, 0);
+}
+
+
+static void ev_job_links_init (EvJobLinks *job) { /* Do Nothing */ }
+
+static void
+ev_job_links_dispose (GObject *object)
+{
+ EvJobLinks *job;
+
+ job = EV_JOB_LINKS (object);
+
+ if (job->model) {
+ g_object_unref (job->model);
+ job->model = NULL;
+ }
+
+ (* G_OBJECT_CLASS (ev_job_links_parent_class)->dispose) (object);
+}
+
+static void
+ev_job_links_class_init (EvJobLinksClass *class)
+{
+ GObjectClass *oclass;
+
+ oclass = G_OBJECT_CLASS (class);
+
+ oclass->dispose = ev_job_links_dispose;
+}
+
+
+static void ev_job_render_init (EvJobRender *job) { /* Do Nothing */ }
+
+static void
+ev_job_render_dispose (GObject *object)
+{
+ EvJobRender *job;
+
+ job = EV_JOB_RENDER (object);
+
+ if (job->pixbuf) {
+ g_object_unref (job->pixbuf);
+ job->pixbuf = NULL;
+ }
+
+ (* G_OBJECT_CLASS (ev_job_render_parent_class)->dispose) (object);
+}
+
+static void
+ev_job_render_class_init (EvJobRenderClass *class)
+{
+ GObjectClass *oclass;
+
+ oclass = G_OBJECT_CLASS (class);
+
+ oclass->dispose = ev_job_render_dispose;
+}
+
+static void ev_job_thumbnail_init (EvJobThumbnail *job) { /* Do Nothing */ }
+
+static void
+ev_job_thumbnail_dispose (GObject *object)
+{
+ EvJobThumbnail *job;
+
+ job = EV_JOB_THUMBNAIL (object);
+
+ if (job->thumbnail) {
+ g_object_unref (job->thumbnail);
+ job->thumbnail = NULL;
+ }
+
+ (* G_OBJECT_CLASS (ev_job_thumbnail_parent_class)->dispose) (object);
+}
+
+static void
+ev_job_thumbnail_class_init (EvJobThumbnailClass *class)
+{
+ GObjectClass *oclass;
+
+ oclass = G_OBJECT_CLASS (class);
+
+ oclass->dispose = ev_job_thumbnail_dispose;
+}
+
+/* Public functions */
+void
+ev_job_finished (EvJob *job)
+{
+ g_return_if_fail (EV_IS_JOB (job));
+
+ g_signal_emit (job, job_signals[FINISHED], 0);
+}
+
+EvJob *
+ev_job_links_new (EvDocument *document)
+{
+ EvJob *job;
+
+ job = g_object_new (EV_TYPE_JOB_LINKS, NULL);
+ job->document = g_object_ref (document);
+
+ return job;
+}
+
+void
+ev_job_links_run (EvJobLinks *job)
+{
+ g_return_if_fail (EV_IS_JOB_LINKS (job));
+
+ g_mutex_lock (EV_DOC_MUTEX);
+ job->model = ev_document_links_get_links_model (EV_DOCUMENT_LINKS (EV_JOB (job)->document));
+ EV_JOB (job)->finished = TRUE;
+ g_mutex_unlock (EV_DOC_MUTEX);
+}
+
+
+EvJob *
+ev_job_render_new (EvDocument *document,
+ gint page,
+ double scale,
+ gint width,
+ gint height)
+{
+ EvJobRender *job;
+
+ job = g_object_new (EV_TYPE_JOB_RENDER, NULL);
+
+ EV_JOB (job)->document = g_object_ref (document);
+ job->page = page;
+ job->scale = scale;
+ job->target_width = width;
+ job->target_height = height;
+
+ return EV_JOB (job);
+}
+
+void
+ev_job_render_run (EvJobRender *job)
+{
+ g_return_if_fail (EV_IS_JOB_RENDER (job));
+
+ g_mutex_lock (EV_DOC_MUTEX);
+
+ ev_document_set_scale (EV_JOB (job)->document, job->scale);
+ ev_document_set_page (EV_JOB (job)->document, job->page);
+ job->pixbuf = ev_document_render_pixbuf (EV_JOB (job)->document);
+ EV_JOB (job)->finished = TRUE;
+
+ g_mutex_unlock (EV_DOC_MUTEX);
+}
+
+EvJob *
+ev_job_thumbnail_new (EvDocument *document,
+ gint page,
+ gint requested_width)
+{
+ EvJobThumbnail *job;
+
+ job = g_object_new (EV_TYPE_JOB_THUMBNAIL, NULL);
+
+ EV_JOB (job)->document = g_object_ref (document);
+ job->page = page;
+ job->requested_width = requested_width;
+
+ return EV_JOB (job);
+}
+
+void
+ev_job_thumbnail_run (EvJobThumbnail *job)
+{
+ g_return_if_fail (EV_IS_JOB_THUMBNAIL (job));
+
+ g_mutex_lock (EV_DOC_MUTEX);
+
+ job->thumbnail =
+ ev_document_thumbnails_get_thumbnail (EV_DOCUMENT_THUMBNAILS (EV_JOB (job)->document),
+ job->page,
+ job->requested_width,
+ TRUE);
+ EV_JOB (job)->finished = TRUE;
+
+ g_mutex_unlock (EV_DOC_MUTEX);
+}