Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/shell/ev-pixbuf-cache.c
diff options
context:
space:
mode:
authorJonathan Blandford <jrb@redhat.com>2005-03-31 15:34:35 (GMT)
committer Jonathan Blandford <jrb@src.gnome.org>2005-03-31 15:34:35 (GMT)
commite8096c18ba580156072e8c84103bee6f6d3f0bfc (patch)
tree4da3a4264a48a6830e7b12ec734ee4dc34de2b65 /shell/ev-pixbuf-cache.c
parent52ba586fff36cceccb753342a38deff970b18107 (diff)
Remove pixbuf backend for now
Thu Mar 31 01:21:58 2005 Jonathan Blandford <jrb@redhat.com> * Makefile.am: Remove pixbuf backend for now * configure.ac: Require poppler-glib instead of just poppler. * backend/ev-document-thumbnails.h: Add a comment * backend/ev-document.h: * backend/ev-document.c: (ev_document_class_init), (ev_document_load), (ev_document_get_link), (ev_document_get_links): Remove 3 methods and add get_links. Also, made 0 based. * backend/ev-jobs.c: (ev_job_render_new), (ev_job_render_run): * backend/ev-jobs.h: now EvJobRender can grab the links for a document. * backend/ev-link.c: (ev_link_set_title), (ev_link_mapping_free_foreach), (ev_link_mapping_free), (ev_link_mapping_find): * backend/ev-link.h: Allow NULL titles. Also, introduce a mapping link. * backend/ev-page-cache.c: (ev_page_cache_init), (_ev_page_cache_new), (ev_page_cache_set_current_page), (ev_page_cache_get_size), (ev_page_cache_next_page), (ev_page_cache_prev_page): Fix to be 0 based. * pdf/Makefile.am: * pdf/ev-poppler.h: * pdf/ev-poppler.cc: New backend. * ps/ps-document.c: (ps_document_init), (ps_document_set_page), (ps_document_get_page), (ps_document_document_iface_init): * shell/ev-pixbuf-cache.h: * shell/ev-pixbuf-cache.c: (ev_pixbuf_cache_init), (dispose_cache_job_info), (job_finished_cb), (move_one_job), (ev_pixbuf_cache_update_range), (copy_job_to_job_info), (add_job_if_needed), (ev_pixbuf_cache_set_page_range), (ev_pixbuf_cache_get_pixbuf), (ev_pixbuf_cache_get_link_mapping): Fix up code to grab a page cache per each doc. Also, fix to be 0 based. * shell/ev-sidebar-thumbnails.c: (ev_sidebar_tree_selection_changed), (page_changed_cb), (ev_sidebar_thumbnails_set_document): Fix to be 0 based. * shell/ev-view.c: (status_message_from_link), (find_page_at_location), (get_link_at_location), (ev_view_motion_notify_event), (ev_view_button_release_event), (ev_view_init): Use the new link code. Fix to be 0 based. * shell/ev-window.c: (update_action_sensitivity), (document_supports_sidebar): 0 based.
Diffstat (limited to 'shell/ev-pixbuf-cache.c')
-rw-r--r--shell/ev-pixbuf-cache.c74
1 files changed, 60 insertions, 14 deletions
diff --git a/shell/ev-pixbuf-cache.c b/shell/ev-pixbuf-cache.c
index 7d076db..7200b37 100644
--- a/shell/ev-pixbuf-cache.c
+++ b/shell/ev-pixbuf-cache.c
@@ -6,6 +6,7 @@ typedef struct _CacheJobInfo
{
EvJob *job;
GdkPixbuf *pixbuf;
+ GList *link_mapping;
} CacheJobInfo;
struct _EvPixbufCache
@@ -50,14 +51,16 @@ static void job_finished_cb (EvJob *job,
EvPixbufCache *pixbuf_cache);
static CacheJobInfo *find_job_cache (EvPixbufCache *pixbuf_cache,
int page);
-
+static void copy_job_to_job_info (EvJobRender *job_render,
+ CacheJobInfo *job_info,
+ EvPixbufCache *pixbuf_cache);
/* These are used for iterating through the prev and next arrays */
#define FIRST_VISABLE_PREV(pixbuf_cache) \
(MAX (0, pixbuf_cache->preload_cache_size + 1 - pixbuf_cache->start_page))
#define VISIBLE_NEXT_LEN(pixbuf_cache, page_cache) \
- (MIN(pixbuf_cache->preload_cache_size, ev_page_cache_get_n_pages (page_cache) - pixbuf_cache->end_page))
+ (MIN(pixbuf_cache->preload_cache_size, ev_page_cache_get_n_pages (page_cache) - (1 + pixbuf_cache->end_page)))
#define PAGE_CACHE_LEN(pixbuf_cache) \
((pixbuf_cache->end_page - pixbuf_cache->start_page) + 1)
@@ -66,8 +69,8 @@ G_DEFINE_TYPE (EvPixbufCache, ev_pixbuf_cache, G_TYPE_OBJECT)
static void
ev_pixbuf_cache_init (EvPixbufCache *pixbuf_cache)
{
- pixbuf_cache->start_page = 1;
- pixbuf_cache->end_page = 1;
+ pixbuf_cache->start_page = 0;
+ pixbuf_cache->end_page = 0;
pixbuf_cache->job_list = g_new0 (CacheJobInfo, PAGE_CACHE_LEN (pixbuf_cache));
pixbuf_cache->preload_cache_size = 1;
@@ -123,6 +126,10 @@ dispose_cache_job_info (CacheJobInfo *job_info,
g_object_unref (G_OBJECT (job_info->pixbuf));
job_info->pixbuf = NULL;
}
+ if (job_info->link_mapping) {
+ ev_link_mapping_free (job_info->link_mapping);
+ job_info->link_mapping = NULL;
+ }
}
static void
@@ -177,6 +184,12 @@ job_finished_cb (EvJob *job,
g_object_unref (job_info->pixbuf);
job_info->pixbuf = pixbuf;
+ if (job_render->link_mapping) {
+ if (job_info->link_mapping)
+ ev_link_mapping_free (job_info->link_mapping);
+ job_info->link_mapping = job_render->link_mapping;
+ }
+
if (job_info->job == job)
job_info->job = NULL;
g_object_unref (job);
@@ -268,6 +281,7 @@ move_one_job (CacheJobInfo *job_info,
*target_page = *job_info;
job_info->job = NULL;
job_info->pixbuf = NULL;
+ job_info->link_mapping = NULL;
if (new_priority != priority && target_page->job) {
g_print ("FIXME: update priority \n");
@@ -303,7 +317,7 @@ ev_pixbuf_cache_update_range (EvPixbufCache *pixbuf_cache,
/* Start with the prev cache. */
page = pixbuf_cache->start_page - pixbuf_cache->preload_cache_size;
for (i = 0; i < pixbuf_cache->preload_cache_size; i++) {
- if (page < 1) {
+ if (page < 0) {
dispose_cache_job_info (pixbuf_cache->prev_job + i, pixbuf_cache);
} else {
move_one_job (pixbuf_cache->prev_job + i,
@@ -324,7 +338,7 @@ ev_pixbuf_cache_update_range (EvPixbufCache *pixbuf_cache,
}
for (i = 0; i < pixbuf_cache->preload_cache_size; i++) {
- if (page > ev_page_cache_get_n_pages (page_cache)) {
+ if (page >= ev_page_cache_get_n_pages (page_cache)) {
dispose_cache_job_info (pixbuf_cache->next_job + i, pixbuf_cache);
} else {
move_one_job (pixbuf_cache->next_job + i,
@@ -347,6 +361,22 @@ ev_pixbuf_cache_update_range (EvPixbufCache *pixbuf_cache,
pixbuf_cache->end_page = end_page;
}
+static void
+copy_job_to_job_info (EvJobRender *job_render,
+ CacheJobInfo *job_info,
+ EvPixbufCache *pixbuf_cache)
+{
+ GdkPixbuf *pixbuf;
+
+ pixbuf = g_object_ref (job_render->pixbuf);
+
+ dispose_cache_job_info (job_info, pixbuf_cache);
+
+ job_info->pixbuf = pixbuf;
+ if (job_render->link_mapping)
+ job_info->link_mapping = job_render->link_mapping;
+}
+
static CacheJobInfo *
find_job_cache (EvPixbufCache *pixbuf_cache,
int page)
@@ -426,7 +456,8 @@ add_job_if_needed (EvPixbufCache *pixbuf_cache,
/* make a new job now */
job_info->job = ev_job_render_new (pixbuf_cache->document,
page, scale,
- width, height);
+ width, height,
+ (job_info->link_mapping == NULL)?TRUE:FALSE);
ev_job_queue_add_job (job_info->job, priority);
g_signal_connect (job_info->job, "finished", G_CALLBACK (job_finished_cb), pixbuf_cache);
}
@@ -484,8 +515,8 @@ ev_pixbuf_cache_set_page_range (EvPixbufCache *pixbuf_cache,
page_cache = ev_document_get_page_cache (pixbuf_cache->document);
- g_return_if_fail (start_page > 0 && start_page <= ev_page_cache_get_n_pages (page_cache));
- g_return_if_fail (end_page > 0 && end_page <= ev_page_cache_get_n_pages (page_cache));
+ g_return_if_fail (start_page >= 0 && start_page < ev_page_cache_get_n_pages (page_cache));
+ g_return_if_fail (end_page >= 0 && end_page < ev_page_cache_get_n_pages (page_cache));
g_return_if_fail (end_page >= start_page);
/* First, resize the page_range as needed. We cull old pages
@@ -514,12 +545,27 @@ ev_pixbuf_cache_get_pixbuf (EvPixbufCache *pixbuf_cache,
/* We don't need to wait for the idle to handle the callback */
if (job_info->job &&
EV_JOB (job_info->job)->finished) {
- GdkPixbuf *pixbuf;
-
- pixbuf = g_object_ref (EV_JOB_RENDER (job_info->job)->pixbuf);
- dispose_cache_job_info (job_info, pixbuf_cache);
- job_info->pixbuf = pixbuf;
+ copy_job_to_job_info (EV_JOB_RENDER (job_info->job), job_info, pixbuf_cache);
}
return job_info->pixbuf;
}
+
+GList *
+ev_pixbuf_cache_get_link_mapping (EvPixbufCache *pixbuf_cache,
+ gint page)
+{
+ CacheJobInfo *job_info;
+
+ job_info = find_job_cache (pixbuf_cache, page);
+ if (job_info == NULL)
+ return NULL;
+
+ /* We don't need to wait for the idle to handle the callback */
+ if (job_info->job &&
+ EV_JOB (job_info->job)->finished) {
+ copy_job_to_job_info (EV_JOB_RENDER (job_info->job), job_info, pixbuf_cache);
+ }
+
+ return job_info->link_mapping;
+}