From bca369672136e5ff831ece9832afd42085808fba Mon Sep 17 00:00:00 2001 From: Nickolay V. Shmyrev Date: Tue, 07 Jun 2005 23:28:54 +0000 Subject: PageCache and EvJobs are moved from backend to shell. Two new jobs to load document in background and a statusbar to display this process. FileChooser now can select multiple uris. --- (limited to 'backend') diff --git a/backend/Makefile.am b/backend/Makefile.am index 322cc7d..b000dc4 100644 --- a/backend/Makefile.am +++ b/backend/Makefile.am @@ -28,12 +28,6 @@ libevbackend_la_SOURCES= \ ev-document-find.c \ ev-document-find.h \ ev-document-info.h \ - ev-job-queue.h \ - ev-job-queue.c \ - ev-jobs.h \ - ev-jobs.c \ - ev-page-cache.h \ - ev-page-cache.c \ ev-ps-exporter.c \ ev-ps-exporter.h \ ev-document-misc.h \ diff --git a/backend/ev-document-fonts.c b/backend/ev-document-fonts.c index 9c4d4d6..fca1976 100644 --- a/backend/ev-document-fonts.c +++ b/backend/ev-document-fonts.c @@ -24,7 +24,6 @@ #include "config.h" #include "ev-document-fonts.h" -#include "ev-job-queue.h" GType ev_document_fonts_get_type (void) diff --git a/backend/ev-document-links.c b/backend/ev-document-links.c index d9baae0..7ab3468 100644 --- a/backend/ev-document-links.c +++ b/backend/ev-document-links.c @@ -24,7 +24,6 @@ #include "config.h" #include "ev-document-links.h" -#include "ev-job-queue.h" GType ev_document_links_get_type (void) diff --git a/backend/ev-document.c b/backend/ev-document.c index 3793050..d413083 100644 --- a/backend/ev-document.c +++ b/backend/ev-document.c @@ -23,7 +23,6 @@ #include "ev-document.h" #include "ev-backend-marshalers.h" -#include "ev-job-queue.h" static void ev_document_class_init (gpointer g_class); @@ -69,24 +68,6 @@ ev_document_class_init (gpointer g_class) { } -#define PAGE_CACHE_STRING "ev-page-cache" - -EvPageCache * -ev_document_get_page_cache (EvDocument *document) -{ - EvPageCache *page_cache; - - g_return_val_if_fail (EV_IS_DOCUMENT (document), NULL); - - page_cache = g_object_get_data (G_OBJECT (document), PAGE_CACHE_STRING); - if (page_cache == NULL) { - page_cache = _ev_page_cache_new (document); - g_object_set_data_full (G_OBJECT (document), PAGE_CACHE_STRING, page_cache, g_object_unref); - } - - return page_cache; -} - GMutex * ev_document_get_doc_mutex (void) { @@ -120,10 +101,6 @@ ev_document_load (EvDocument *document, LOG ("ev_document_load"); retval = iface->load (document, uri, error); - /* Call this to make the initial cached copy */ - if (retval) - ev_document_get_page_cache (document); - return retval; } diff --git a/backend/ev-document.h b/backend/ev-document.h index 6ff356f..ffc9c2e 100644 --- a/backend/ev-document.h +++ b/backend/ev-document.h @@ -43,7 +43,6 @@ typedef struct _EvDocumentIface EvDocumentIface; typedef struct _EvPageCache EvPageCache; typedef struct _EvPageCacheClass EvPageCacheClass; -#include "ev-page-cache.h" #define EV_DOCUMENT_ERROR ev_document_error_quark () @@ -95,7 +94,6 @@ struct _EvDocumentIface GType ev_document_get_type (void); GQuark ev_document_error_quark (void); -EvPageCache *ev_document_get_page_cache (EvDocument *document); GMutex *ev_document_get_doc_mutex (void); void ev_document_doc_mutex_lock (void); void ev_document_doc_mutex_unlock (void); diff --git a/backend/ev-job-queue.c b/backend/ev-job-queue.c deleted file mode 100644 index 1b3e496..0000000 --- a/backend/ev-job-queue.c +++ /dev/null @@ -1,380 +0,0 @@ -#include "ev-job-queue.h" - -/* Like glib calling convention, all functions with _locked in their name assume - * that we've already locked the doc mutex and can freely and safely access - * data. - */ -GCond *render_cond = NULL; -GMutex *ev_queue_mutex = NULL; - -static GQueue *links_queue = NULL; -static GQueue *render_queue_high = NULL; -static GQueue *render_queue_low = NULL; -static GQueue *thumbnail_queue_high = NULL; -static GQueue *thumbnail_queue_low = NULL; - -/* Queues used for backends supporting EvAsyncRender interface, - they are executed on the main thread */ -static GQueue *async_render_queue_high = NULL; -static GQueue *async_render_queue_low = NULL; -static gboolean async_rendering = FALSE; - -static void ev_job_queue_run_next (void); - -static gboolean -remove_job_from_queue_locked (GQueue *queue, EvJob *job) -{ - GList *list; - - list = g_queue_find (queue, job); - if (list) { - g_object_unref (G_OBJECT (job)); - g_queue_delete_link (queue, list); - - return TRUE; - } - return FALSE; -} - -static gboolean -remove_job_from_async_queue (GQueue *queue, EvJob *job) -{ - return remove_job_from_queue_locked (queue, job); -} - -static void -add_job_to_async_queue (GQueue *queue, EvJob *job) -{ - g_object_ref (job); - g_queue_push_tail (queue, job); -} - -static void -add_job_to_queue_locked (GQueue *queue, - EvJob *job) -{ - g_object_ref (job); - g_queue_push_tail (queue, job); - g_cond_broadcast (render_cond); -} - -static gboolean -notify_finished (GObject *job) -{ - ev_job_finished (EV_JOB (job)); - - return FALSE; -} - -static void -job_finished_cb (EvJob *job) -{ - g_object_unref (job); - async_rendering = FALSE; - ev_job_queue_run_next (); -} - -static void -handle_job (EvJob *job) -{ - g_object_ref (G_OBJECT (job)); - - if (EV_JOB (job)->async) { - async_rendering = TRUE; - if (EV_IS_JOB_RENDER (job)) { - g_signal_connect (job, "finished", - G_CALLBACK (job_finished_cb), NULL); - } else { - g_assert_not_reached (); - } - } - - if (EV_IS_JOB_THUMBNAIL (job)) - ev_job_thumbnail_run (EV_JOB_THUMBNAIL (job)); - else if (EV_IS_JOB_LINKS (job)) - ev_job_links_run (EV_JOB_LINKS (job)); - else if (EV_IS_JOB_RENDER (job)) - ev_job_render_run (EV_JOB_RENDER (job)); - - if (!EV_JOB (job)->async) { - /* We let the idle own a ref, as we (the queue) are done with the job. */ - g_idle_add_full (G_PRIORITY_DEFAULT_IDLE, - (GSourceFunc) notify_finished, - job, - g_object_unref); - } -} - -static EvJob * -search_for_jobs_unlocked (void) -{ - EvJob *job; - - job = (EvJob *) g_queue_pop_head (render_queue_high); - if (job) - return job; - - job = (EvJob *) g_queue_pop_head (thumbnail_queue_high); - if (job) - return job; - - job = (EvJob *) g_queue_pop_head (render_queue_low); - if (job) - return job; - - job = (EvJob *) g_queue_pop_head (links_queue); - if (job) - return job; - - job = (EvJob *) g_queue_pop_head (thumbnail_queue_low); - if (job) - return job; - - return NULL; -} - -static gboolean -no_jobs_available_unlocked (void) -{ - return g_queue_is_empty (render_queue_high) - && g_queue_is_empty (render_queue_low) - && g_queue_is_empty (links_queue) - && g_queue_is_empty (thumbnail_queue_high) - && g_queue_is_empty (thumbnail_queue_low); -} - -/* the thread mainloop function */ -static gpointer -ev_render_thread (gpointer data) -{ - while (TRUE) { - EvJob *job; - - g_mutex_lock (ev_queue_mutex); - if (no_jobs_available_unlocked ()) { - g_cond_wait (render_cond, ev_queue_mutex); - } - - job = search_for_jobs_unlocked (); - g_mutex_unlock (ev_queue_mutex); - - /* Now that we have our job, we handle it */ - if (job) { - handle_job (job); - g_object_unref (G_OBJECT (job)); - } - } - return NULL; - -} - -static void -ev_job_queue_run_next (void) -{ - EvJob *job; - - job = (EvJob *) g_queue_pop_head (async_render_queue_high); - - if (job == NULL) { - job = (EvJob *) g_queue_pop_head (async_render_queue_low); - } - - /* Now that we have our job, we handle it */ - if (job) { - handle_job (job); - g_object_unref (G_OBJECT (job)); - } -} - -/* Public Functions */ -void -ev_job_queue_init (void) -{ - if (!g_thread_supported ()) g_thread_init (NULL); - - render_cond = g_cond_new (); - ev_queue_mutex = g_mutex_new (); - - links_queue = g_queue_new (); - render_queue_high = g_queue_new (); - render_queue_low = g_queue_new (); - async_render_queue_high = g_queue_new (); - async_render_queue_low = g_queue_new (); - thumbnail_queue_high = g_queue_new (); - thumbnail_queue_low = g_queue_new (); - - g_thread_create (ev_render_thread, NULL, FALSE, NULL); - -} - -static GQueue * -find_queue (EvJob *job, - EvJobPriority priority) -{ - if (EV_JOB (job)->async) { - if (EV_IS_JOB_RENDER (job)) { - if (priority == EV_JOB_PRIORITY_HIGH) - return async_render_queue_high; - else - return async_render_queue_low; - } - } else { - if (EV_IS_JOB_RENDER (job)) { - if (priority == EV_JOB_PRIORITY_HIGH) - return render_queue_high; - else - return render_queue_low; - } else if (EV_IS_JOB_THUMBNAIL (job)) { - if (priority == EV_JOB_PRIORITY_HIGH) - return thumbnail_queue_high; - else - return thumbnail_queue_low; - } else if (EV_IS_JOB_LINKS (job)) { - /* the priority doesn't effect links */ - return links_queue; - } - } - - g_assert_not_reached (); - return NULL; -} - -void -ev_job_queue_add_job (EvJob *job, - EvJobPriority priority) -{ - GQueue *queue; - - g_return_if_fail (EV_IS_JOB (job)); - - queue = find_queue (job, priority); - - if (!EV_JOB (job)->async) { - g_mutex_lock (ev_queue_mutex); - add_job_to_queue_locked (queue, job); - g_mutex_unlock (ev_queue_mutex); - } else { - add_job_to_async_queue (queue, job); - if (!async_rendering) { - ev_job_queue_run_next (); - } - } -} - -static gboolean -move_job_async (EvJob *job, GQueue *old_queue, GQueue *new_queue) -{ - gboolean retval = FALSE; - - g_object_ref (job); - - if (remove_job_from_queue_locked (old_queue, job)) { - add_job_to_async_queue (new_queue, job); - retval = TRUE; - } - - g_object_unref (job); - - return retval; -} - -static gboolean -move_job (EvJob *job, GQueue *old_queue, GQueue *new_queue) -{ - gboolean retval = FALSE; - - g_mutex_lock (ev_queue_mutex); - g_object_ref (job); - - if (remove_job_from_queue_locked (old_queue, job)) { - add_job_to_queue_locked (new_queue, job); - retval = TRUE; - } - - g_object_unref (job); - g_mutex_unlock (ev_queue_mutex); - - return retval; -} - -gboolean -ev_job_queue_update_job (EvJob *job, - EvJobPriority new_priority) -{ - gboolean retval = FALSE; - - g_return_val_if_fail (EV_IS_JOB (job), FALSE); - - if (EV_JOB (job)->async) { - if (EV_IS_JOB_RENDER (job)) { - if (new_priority == EV_JOB_PRIORITY_LOW) { - retval = move_job_async (job, async_render_queue_high, - async_render_queue_low); - } else if (new_priority == EV_JOB_PRIORITY_HIGH) { - retval = move_job_async (job, async_render_queue_low, - async_render_queue_high); - } - } else { - g_assert_not_reached (); - } - } else { - if (EV_IS_JOB_THUMBNAIL (job)) { - if (new_priority == EV_JOB_PRIORITY_LOW) { - retval = move_job (job, thumbnail_queue_high, - thumbnail_queue_low); - } else if (new_priority == EV_JOB_PRIORITY_HIGH) { - retval = move_job (job, thumbnail_queue_low, - thumbnail_queue_high); - } - } else if (EV_IS_JOB_RENDER (job)) { - if (new_priority == EV_JOB_PRIORITY_LOW) { - retval = move_job (job, render_queue_high, - render_queue_low); - } else if (new_priority == EV_JOB_PRIORITY_HIGH) { - retval = move_job (job, render_queue_low, - render_queue_high); - } - } else { - g_assert_not_reached (); - } - } - - return retval; -} - -gboolean -ev_job_queue_remove_job (EvJob *job) -{ - gboolean retval = FALSE; - - g_return_val_if_fail (EV_IS_JOB (job), FALSE); - - if (EV_JOB (job)->async) { - if (EV_IS_JOB_RENDER (job)) { - retval = remove_job_from_async_queue (async_render_queue_high, job); - retval = retval || remove_job_from_async_queue (async_render_queue_low, job); - } else { - g_assert_not_reached (); - } - } else { - g_mutex_lock (ev_queue_mutex); - - if (EV_IS_JOB_THUMBNAIL (job)) { - retval = remove_job_from_queue_locked (thumbnail_queue_high, job); - retval = retval || remove_job_from_queue_locked (thumbnail_queue_low, job); - } else if (EV_IS_JOB_RENDER (job)) { - retval = remove_job_from_queue_locked (render_queue_high, job); - retval = retval || remove_job_from_queue_locked (render_queue_low, job); - } else if (EV_IS_JOB_LINKS (job)) { - retval = remove_job_from_queue_locked (links_queue, job); - } else { - g_assert_not_reached (); - } - - g_mutex_unlock (ev_queue_mutex); - } - - return retval; -} - - diff --git a/backend/ev-job-queue.h b/backend/ev-job-queue.h deleted file mode 100644 index e6e4c0e..0000000 --- a/backend/ev-job-queue.h +++ /dev/null @@ -1,39 +0,0 @@ -/* this file is part of evince, a gnome document viewer - * - * Copyright (C) 2005 Red Hat, Inc - * - * Evince is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * Evince is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef __EV_JOB_QUEUE_H__ -#define __EV_JOB_QUEUE_H__ - -#include -#include "ev-jobs.h" - -G_BEGIN_DECLS - - -void ev_job_queue_init (void); - -void ev_job_queue_add_job (EvJob *job, - EvJobPriority priority); -gboolean ev_job_queue_update_job (EvJob *job, - EvJobPriority new_priority); -gboolean ev_job_queue_remove_job (EvJob *job); - -G_END_DECLS - -#endif /* __EV_JOB_QUEUE_H__ */ diff --git a/backend/ev-jobs.c b/backend/ev-jobs.c deleted file mode 100644 index 73b0614..0000000 --- a/backend/ev-jobs.c +++ /dev/null @@ -1,274 +0,0 @@ -#include "ev-jobs.h" -#include "ev-job-queue.h" -#include "ev-document-thumbnails.h" -#include "ev-document-links.h" -#include "ev-async-renderer.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)); - - ev_document_doc_mutex_lock (); - job->model = ev_document_links_get_links_model (EV_DOCUMENT_LINKS (EV_JOB (job)->document)); - EV_JOB (job)->finished = TRUE; - ev_document_doc_mutex_unlock (); -} - - -EvJob * -ev_job_render_new (EvDocument *document, - gint page, - double scale, - gint width, - gint height, - gboolean include_links) -{ - 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; - job->include_links = include_links; - - if (EV_IS_ASYNC_RENDERER (document)) { - EV_JOB (job)->async = TRUE; - } - - return EV_JOB (job); -} - -static void -render_finished_cb (EvDocument *document, GdkPixbuf *pixbuf, EvJobRender *job) -{ - g_signal_handlers_disconnect_by_func (EV_JOB (job)->document, - render_finished_cb, job); - - EV_JOB (job)->finished = TRUE; - job->pixbuf = g_object_ref (pixbuf); - ev_job_finished (EV_JOB (job)); -} - -void -ev_job_render_run (EvJobRender *job) -{ - g_return_if_fail (EV_IS_JOB_RENDER (job)); - - ev_document_doc_mutex_lock (); - - if (EV_JOB (job)->async) { - EvAsyncRenderer *renderer = EV_ASYNC_RENDERER (EV_JOB (job)->document); - ev_async_renderer_render_pixbuf (renderer, job->page, job->scale); - g_signal_connect (EV_JOB (job)->document, "render_finished", - G_CALLBACK (render_finished_cb), job); - } else { - job->pixbuf = ev_document_render_pixbuf (EV_JOB (job)->document, - job->page, - job->scale); - if (job->include_links) - job->link_mapping = ev_document_get_links (EV_JOB (job)->document, job->page); - - EV_JOB (job)->finished = TRUE; - } - - ev_document_doc_mutex_unlock (); -} - -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)); - - ev_document_doc_mutex_lock (); - - 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; - - ev_document_doc_mutex_unlock (); -} diff --git a/backend/ev-jobs.h b/backend/ev-jobs.h deleted file mode 100644 index c89aa1e..0000000 --- a/backend/ev-jobs.h +++ /dev/null @@ -1,154 +0,0 @@ -/* this file is part of evince, a gnome document viewer - * - * Copyright (C) 2005 Red Hat, Inc - * - * Evince is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * Evince is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef __EV_JOBS_H__ -#define __EV_JOBS_H__ - -#include -#include "ev-document.h" - -G_BEGIN_DECLS - -typedef struct _EvJob EvJob; -typedef struct _EvJobClass EvJobClass; - -typedef struct _EvJobRender EvJobRender; -typedef struct _EvJobRenderClass EvJobRenderClass; - -typedef struct _EvJobThumbnail EvJobThumbnail; -typedef struct _EvJobThumbnailClass EvJobThumbnailClass; - -typedef struct _EvJobLinks EvJobLinks; -typedef struct _EvJobLinksClass EvJobLinksClass; - -#define EV_TYPE_JOB (ev_job_get_type()) -#define EV_JOB(object) (G_TYPE_CHECK_INSTANCE_CAST((object), EV_TYPE_JOB, EvJob)) -#define EV_JOB_CLASS(klass) (G_TYPE_CHACK_CLASS_CAST((klass), EV_TYPE_JOB, EvJobClass)) -#define EV_IS_JOB(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), EV_TYPE_JOB)) - -#define EV_TYPE_JOB_LINKS (ev_job_links_get_type()) -#define EV_JOB_LINKS(object) (G_TYPE_CHECK_INSTANCE_CAST((object), EV_TYPE_JOB_LINKS, EvJobLinks)) -#define EV_JOB_LINKS_CLASS(klass) (G_TYPE_CHACK_CLASS_CAST((klass), EV_TYPE_JOB_LINKS, EvJobLinksClass)) -#define EV_IS_JOB_LINKS(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), EV_TYPE_JOB_LINKS)) - -#define EV_TYPE_JOB_RENDER (ev_job_render_get_type()) -#define EV_JOB_RENDER(object) (G_TYPE_CHECK_INSTANCE_CAST((object), EV_TYPE_JOB_RENDER, EvJobRender)) -#define EV_JOB_RENDER_CLASS(klass) (G_TYPE_CHACK_CLASS_CAST((klass), EV_TYPE_JOB_RENDER, EvJobRenderClass)) -#define EV_IS_JOB_RENDER(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), EV_TYPE_JOB_RENDER)) - -#define EV_TYPE_JOB_THUMBNAIL (ev_job_thumbnail_get_type()) -#define EV_JOB_THUMBNAIL(object) (G_TYPE_CHECK_INSTANCE_CAST((object), EV_TYPE_JOB_THUMBNAIL, EvJobThumbnail)) -#define EV_JOB_THUMBNAIL_CLASS(klass) (G_TYPE_CHACK_CLASS_CAST((klass), EV_TYPE_JOB_THUMBNAIL, EvJobThumbnailClass)) -#define EV_IS_JOB_THUMBNAIL(object) (G_TYPE_CHECK_INSTANCE_TYPE((object), EV_TYPE_JOB_THUMBNAIL)) - -typedef enum { - EV_JOB_PRIORITY_LOW, - EV_JOB_PRIORITY_HIGH, -} EvJobPriority; - -struct _EvJob -{ - GObject parent; - EvDocument *document; - gboolean finished; - gboolean async; -}; - -struct _EvJobClass -{ - GObjectClass parent_class; - - void (* finished) (EvJob *job); -}; - -struct _EvJobLinks -{ - EvJob parent; - - GtkTreeModel *model; -}; - -struct _EvJobLinksClass -{ - EvJobClass parent_class; -}; - -struct _EvJobRender -{ - EvJob parent; - - gint page; - double scale; - gint target_width; - gint target_height; - GdkPixbuf *pixbuf; - GList *link_mapping; - gboolean include_links; -}; - -struct _EvJobRenderClass -{ - EvJobClass parent_class; -}; - -struct _EvJobThumbnail -{ - EvJob parent; - - gint page; - gint requested_width; - GdkPixbuf *thumbnail; -}; - -struct _EvJobThumbnailClass -{ - EvJobClass parent_class; -}; - - -/* Base job class */ -GType ev_job_get_type (void); -void ev_job_finished (EvJob *job); - -/* EvJobLinks */ -GType ev_job_links_get_type (void); -EvJob *ev_job_links_new (EvDocument *document); -void ev_job_links_run (EvJobLinks *thumbnail); - -/* EvJobRender */ -GType ev_job_render_get_type (void); -EvJob *ev_job_render_new (EvDocument *document, - gint page, - double scale, - gint width, - gint height, - gboolean include_links); -void ev_job_render_run (EvJobRender *thumbnail); - -/* EvJobThumbnail */ -GType ev_job_thumbnail_get_type (void); -EvJob *ev_job_thumbnail_new (EvDocument *document, - gint page, - gint requested_width); -void ev_job_thumbnail_run (EvJobThumbnail *thumbnail); - - -G_END_DECLS - -#endif /* __EV_JOBS_H__ */ diff --git a/backend/ev-page-cache.c b/backend/ev-page-cache.c deleted file mode 100644 index 573e57e..0000000 --- a/backend/ev-page-cache.c +++ /dev/null @@ -1,466 +0,0 @@ -#include "ev-page-cache.h" -#include "ev-job-queue.h" -#include -#include - -typedef struct _EvPageCacheInfo -{ - double width; - double height; -} -EvPageCacheInfo; - - -struct _EvPageCache -{ - GObject parent; - - gint current_page; - int n_pages; - char *title; - char **page_labels; - - gint max_label_chars; - gboolean has_labels; - gboolean uniform; - - double uniform_width; - double uniform_height; - - double max_width; - double max_height; - double* height_to_page; - double* dual_height_to_page; - - EvPageCacheInfo *size_cache; - EvDocumentInfo *page_info; -}; - -struct _EvPageCacheClass -{ - GObjectClass parent_class; - - void (* page_changed) (EvPageCache *page_cache, gint page); -}; - -enum -{ - PAGE_CHANGED, - N_SIGNALS, -}; - -static guint signals[N_SIGNALS] = {0, }; - -static void ev_page_cache_init (EvPageCache *page_cache); -static void ev_page_cache_class_init (EvPageCacheClass *page_cache); -static void ev_page_cache_finalize (GObject *object); - -G_DEFINE_TYPE (EvPageCache, ev_page_cache, G_TYPE_OBJECT) - -static void -ev_page_cache_init (EvPageCache *page_cache) -{ - page_cache->current_page = -1; - page_cache->max_label_chars = 0; -} - -static void -ev_page_cache_class_init (EvPageCacheClass *class) -{ - GObjectClass *object_class; - - object_class = G_OBJECT_CLASS (class); - - object_class->finalize = ev_page_cache_finalize; - - signals [PAGE_CHANGED] = - g_signal_new ("page-changed", - EV_TYPE_PAGE_CACHE, - G_SIGNAL_RUN_LAST, - G_STRUCT_OFFSET (EvPageCacheClass, page_changed), - NULL, NULL, - g_cclosure_marshal_VOID__INT, - G_TYPE_NONE, 1, - G_TYPE_INT); - -} - -static void -ev_page_cache_finalize (GObject *object) -{ - EvPageCache *page_cache; - - page_cache = EV_PAGE_CACHE (object); - - g_free (page_cache->title); - g_free (page_cache->size_cache); - g_free (page_cache->height_to_page); - g_free (page_cache->dual_height_to_page); - - ev_document_info_free (page_cache->page_info); -} - -EvPageCache * -_ev_page_cache_new (EvDocument *document) -{ - EvPageCache *page_cache; - EvPageCacheInfo *info; - gint i; - double saved_height; - - page_cache = (EvPageCache *) g_object_new (EV_TYPE_PAGE_CACHE, NULL); - - ev_document_doc_mutex_lock (); - - /* We read page information out of the document */ - - /* Assume all pages are the same size until proven otherwise */ - page_cache->uniform = TRUE; - page_cache->has_labels = FALSE; - page_cache->n_pages = ev_document_get_n_pages (document); - page_cache->page_labels = g_new0 (char *, page_cache->n_pages); - page_cache->max_width = 0; - page_cache->max_height = 0; - page_cache->page_info = ev_document_get_info (document); - - if (page_cache->page_info->fields_mask & EV_DOCUMENT_INFO_TITLE) { - page_cache->title = g_strdup (page_cache->page_info->title); - } else { - page_cache->title = NULL; - } - - for (i = 0; i < page_cache->n_pages; i++) { - double page_width = 0; - double page_height = 0; - - ev_document_get_page_size (document, i, &page_width, &page_height); - - page_cache->page_labels[i] = ev_document_get_page_label (document, i); - - if (page_cache->page_labels[i] != NULL) { - - page_cache->max_label_chars = MAX(page_cache->max_label_chars, - g_utf8_strlen (page_cache->page_labels[i], 256)); - if (!page_cache->has_labels) { - gchar *expected_label; - - expected_label = g_strdup_printf ("%d", i + 1); - if (strcmp (expected_label, page_cache->page_labels[i])) - page_cache->has_labels = TRUE; - g_free (expected_label); - } - } - - if (page_width > page_cache->max_width) { - page_cache->max_width = page_width; - } - - if (page_height > page_cache->max_height) { - page_cache->max_height = page_height; - } - - if (i == 0) { - page_cache->uniform_width = page_width; - page_cache->uniform_height = page_height; - } else if (page_cache->uniform && - (page_cache->uniform_width != page_width || - page_cache->uniform_height != page_height)) { - /* It's a different page size. Backfill the array. */ - int j; - - page_cache->size_cache = g_new0 (EvPageCacheInfo, page_cache->n_pages); - - for (j = 0; j < i; j++) { - info = &(page_cache->size_cache [j]); - info->width = page_cache->uniform_width; - info->height = page_cache->uniform_height; - } - page_cache->uniform = FALSE; - - } - - if (! page_cache->uniform) { - info = &(page_cache->size_cache [i]); - - info->width = page_width; - info->height = page_height; - } - } - - page_cache->height_to_page = g_new0(double, page_cache->n_pages); - page_cache->dual_height_to_page = g_new0(double, page_cache->n_pages / 2 + 1); - - saved_height = 0; - for (i = 0; i < page_cache->n_pages; i++) { - - if (page_cache->uniform) { - page_cache->height_to_page [i] = (i + 1) * page_cache->uniform_height; - } else { - page_cache->height_to_page [i] = saved_height + page_cache->size_cache [i].height; - saved_height = page_cache->height_to_page [i]; - } - } - - saved_height = 0; - for (i = 0; i < page_cache->n_pages; i += 2) { - - if (page_cache->uniform) { - page_cache->dual_height_to_page [i / 2] = (i / 2 + 1) * page_cache->uniform_height; - } else { - if (i == page_cache->n_pages - 1) { - page_cache->dual_height_to_page [i / 2] = - saved_height + page_cache->size_cache [i].height; - } - else { - page_cache->dual_height_to_page [i / 2] = saved_height + - MAX(page_cache->size_cache [i].height, - page_cache->size_cache [i + 1].height); - saved_height = page_cache->dual_height_to_page [i / 2]; - } - } - } - - /* make some sanity check assertions */ - if (! page_cache->uniform) - g_assert (page_cache->size_cache != NULL); - if (page_cache->uniform) - g_assert (page_cache->uniform_width > 0 && page_cache->uniform_height > 0); - - ev_document_doc_mutex_unlock (); - - if (page_cache->n_pages > 0) - ev_page_cache_set_current_page (page_cache, 0); - - return page_cache; -} - -gint -ev_page_cache_get_n_pages (EvPageCache *page_cache) -{ - g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), 0); - - return page_cache->n_pages; -} - -gint -ev_page_cache_get_current_page (EvPageCache *page_cache) -{ - g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), 0); - - return page_cache->current_page; -} - -void -ev_page_cache_set_current_page (EvPageCache *page_cache, - int page) -{ - g_return_if_fail (EV_IS_PAGE_CACHE (page_cache)); - g_return_if_fail (page >= 0 || page < page_cache->n_pages); - - if (page == page_cache->current_page) - return; - - page_cache->current_page = page; - g_signal_emit (page_cache, signals[PAGE_CHANGED], 0, page); -} - -gboolean -ev_page_cache_set_page_label (EvPageCache *page_cache, - const char *page_label) -{ - gint i, page; - long value; - char *endptr = NULL; - - g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), FALSE); - g_return_val_if_fail (page_label != NULL, FALSE); - - /* First, look for a literal label match */ - for (i = 0; i < page_cache->n_pages; i ++) { - if (page_cache->page_labels[i] != NULL && - ! strcmp (page_label, page_cache->page_labels[i])) { - ev_page_cache_set_current_page (page_cache, i); - return TRUE; - } - } - - /* Next, parse the label, and see if the number fits */ - value = strtol (page_label, &endptr, 10); - if (endptr[0] == '\0') { - /* Page number is an integer */ - page = MIN (G_MAXINT, value); - - /* convert from a page label to a page offset */ - page --; - if (page >= 0 && - page < page_cache->n_pages && - page_cache->page_labels[page] == NULL) { - ev_page_cache_set_current_page (page_cache, page); - return TRUE; - } - } - - return FALSE; -} - -void -ev_page_cache_set_link (EvPageCache *page_cache, - EvLink *link) -{ - g_return_if_fail (EV_IS_PAGE_CACHE (page_cache)); - g_return_if_fail (EV_IS_LINK (link)); - - ev_page_cache_set_current_page (page_cache, ev_link_get_page (link)); -} - -const char * -ev_page_cache_get_title (EvPageCache *page_cache) -{ - g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), NULL); - - return page_cache->title; -} - -void -ev_page_cache_get_size (EvPageCache *page_cache, - gint page, - gfloat scale, - gint *width, - gint *height) -{ - g_return_if_fail (EV_IS_PAGE_CACHE (page_cache)); - g_return_if_fail (page >= 0 && page < page_cache->n_pages); - - if (page_cache->uniform) { - if (width) - *width = page_cache->uniform_width; - if (height) - *height = page_cache->uniform_height; - } else { - EvPageCacheInfo *info; - - info = &(page_cache->size_cache [page]); - - if (width) - *width = info->width; - if (height) - *height = info->height; - } - - if (width) - *width = (int) ((*width) * scale + 0.5); - if (width) - *height = (int) ((*height) * scale + 0.5); - -} - - -void -ev_page_cache_get_max_width (EvPageCache *page_cache, - gfloat scale, - gint *width) -{ - g_return_if_fail (EV_IS_PAGE_CACHE (page_cache)); - - if (width) - *width = page_cache->max_width * scale; -} - -void -ev_page_cache_get_max_height (EvPageCache *page_cache, - gfloat scale, - gint *height) -{ - g_return_if_fail (EV_IS_PAGE_CACHE (page_cache)); - - if (height) - *height = page_cache->max_height * scale; -} - -void -ev_page_cache_get_height_to_page (EvPageCache *page_cache, - gint page, - gfloat scale, - gint *height, - gint *dual_height) -{ - double result = 0.0; - double dual_result = 0.0; - - g_return_if_fail (EV_IS_PAGE_CACHE (page_cache)); - - if (page > 0) - result = page_cache->height_to_page [page - 1]; - - if (height) - *height = result * scale; - - if (page > 1) - dual_result = page_cache->dual_height_to_page [page / 2 - 1]; - - if (dual_height) - *dual_height = dual_result * scale; -} - -gint -ev_page_cache_get_max_label_chars (EvPageCache *page_cache) -{ - g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), 0); - - return page_cache->max_label_chars; -} - -gchar * -ev_page_cache_get_page_label (EvPageCache *page_cache, - gint page) -{ - g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), NULL); - g_return_val_if_fail (page >= 0 && page < page_cache->n_pages, NULL); - - if (page_cache->page_labels[page] == NULL) - return g_strdup_printf ("%d", page + 1); - - return g_strdup (page_cache->page_labels[page]); -} - -gboolean -ev_page_cache_has_nonnumeric_page_labels (EvPageCache *page_cache) -{ - g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), FALSE); - return page_cache->has_labels; -} - -const EvDocumentInfo * -ev_page_cache_get_info (EvPageCache *page_cache) -{ - g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), NULL); - - return page_cache->page_info; -} - - -gboolean -ev_page_cache_next_page (EvPageCache *page_cache) -{ - g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), FALSE); - - if (page_cache->current_page >= page_cache->n_pages - 1) - return FALSE; - - ev_page_cache_set_current_page (page_cache, page_cache->current_page + 1); - return TRUE; - -} - -gboolean -ev_page_cache_prev_page (EvPageCache *page_cache) -{ - g_return_val_if_fail (EV_IS_PAGE_CACHE (page_cache), FALSE); - - if (page_cache->current_page <= 0) - return FALSE; - - ev_page_cache_set_current_page (page_cache, page_cache->current_page - 1); - return TRUE; -} - diff --git a/backend/ev-page-cache.h b/backend/ev-page-cache.h deleted file mode 100644 index 9de48b8..0000000 --- a/backend/ev-page-cache.h +++ /dev/null @@ -1,73 +0,0 @@ -/* this file is part of evince, a gnome document viewer - * - * Copyright (C) 2005 Red Hat, Inc - * - * Evince is free software; you can redistribute it and/or modify it - * under the terms of the GNU General Public License as published by - * the Free Software Foundation; either version 2 of the License, or - * (at your option) any later version. - * - * Evince is distributed in the hope that it will be useful, but - * WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - * General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA. - */ - -#ifndef __EV_PAGE_CACHE_H__ -#define __EV_PAGE_CACHE_H__ - -#include -#include "ev-document.h" - -G_BEGIN_DECLS -#define EV_TYPE_PAGE_CACHE (ev_page_cache_get_type ()) -#define EV_PAGE_CACHE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), EV_TYPE_PAGE_CACHE, EvPageCache)) -#define EV_IS_PAGE_CACHE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), EV_TYPE_PAGE_CACHE)) - -GType ev_page_cache_get_type (void) G_GNUC_CONST; - -/* Used by ev-document.c only */ -EvPageCache *_ev_page_cache_new (EvDocument *document); -gint ev_page_cache_get_n_pages (EvPageCache *page_cache); -const char *ev_page_cache_get_title (EvPageCache *page_cache); -void ev_page_cache_get_size (EvPageCache *page_cache, - gint page, - gfloat scale, - gint *width, - gint *height); -void ev_page_cache_get_max_width (EvPageCache *page_cache, - gfloat scale, - gint *width); -void ev_page_cache_get_max_height (EvPageCache *page_cache, - gfloat scale, - gint *height); -void ev_page_cache_get_height_to_page (EvPageCache *page_cache, - gint page, - gfloat scale, - gint *height, - gint *dual_height); -gint ev_page_cache_get_max_label_chars (EvPageCache *page_cache); -char *ev_page_cache_get_page_label (EvPageCache *page_cache, - gint page); -gboolean ev_page_cache_has_nonnumeric_page_labels (EvPageCache *page_cache); -const EvDocumentInfo *ev_page_cache_get_info (EvPageCache *page_cache); - -/* Navigation */ -gint ev_page_cache_get_current_page (EvPageCache *page_cache); -void ev_page_cache_set_current_page (EvPageCache *page_cache, - int page); -gboolean ev_page_cache_set_page_label (EvPageCache *page_cache, - const char *page_label); -void ev_page_cache_set_link (EvPageCache *page_cache, - EvLink *link); -gboolean ev_page_cache_next_page (EvPageCache *page_cache); -gboolean ev_page_cache_prev_page (EvPageCache *page_cache); - - -G_END_DECLS - -#endif /* __EV_PAGE_CACHE_H__ */ -- cgit v0.9.1