diff options
author | Carlos Garcia Campos <[email protected]> | 2013-07-01 21:16:27 +0200 |
---|---|---|
committer | raveit65 <[email protected]> | 2017-09-06 18:25:34 +0200 |
commit | 24f9aab02d59b31114ee26b490a586501b35b986 (patch) | |
tree | 5e40dc76ed8ca06f089c6a4c584bb65cb7e701df | |
parent | 8a59a37f8da626f236e00127a28e306fe2d00fc3 (diff) | |
download | atril-24f9aab02d59b31114ee26b490a586501b35b986.tar.bz2 atril-24f9aab02d59b31114ee26b490a586501b35b986.tar.xz |
ev-pixbuf-cache: schedule prev or next jobs first depending on the scroll direction
If we are scrolling down schedule next pages first, otherwise schedule
the previous pages first.
origin commit:
https://git.gnome.org/browse/evince/commit/?h=gnome-3-10&id=b6f27b6
-rw-r--r-- | libview/ev-pixbuf-cache.c | 83 |
1 files changed, 69 insertions, 14 deletions
diff --git a/libview/ev-pixbuf-cache.c b/libview/ev-pixbuf-cache.c index 17555c6b..c6844f64 100644 --- a/libview/ev-pixbuf-cache.c +++ b/libview/ev-pixbuf-cache.c @@ -3,6 +3,11 @@ #include "ev-job-scheduler.h" #include "ev-view-private.h" +typedef enum { + SCROLL_DIRECTION_DOWN, + SCROLL_DIRECTION_UP +} ScrollDirection; + typedef struct _CacheJobInfo { EvJob *job; @@ -43,6 +48,7 @@ struct _EvPixbufCache EvDocumentModel *model; int start_page; int end_page; + ScrollDirection scroll_direction; gboolean inverted_colors; gsize max_size; @@ -741,6 +747,44 @@ add_job_if_needed (EvPixbufCache *pixbuf_cache, } static void +add_prev_jobs_if_needed (EvPixbufCache *pixbuf_cache, + gint rotation, + gfloat scale) +{ + CacheJobInfo *job_info; + int page; + int i; + + for (i = pixbuf_cache->preload_cache_size - 1; i >= FIRST_VISIBLE_PREV(pixbuf_cache); i--) { + job_info = (pixbuf_cache->prev_job + i); + page = pixbuf_cache->start_page - pixbuf_cache->preload_cache_size + i; + + add_job_if_needed (pixbuf_cache, job_info, + page, rotation, scale, + EV_JOB_PRIORITY_LOW); + } +} + +static void +add_next_jobs_if_needed (EvPixbufCache *pixbuf_cache, + gint rotation, + gfloat scale) +{ + CacheJobInfo *job_info; + int page; + int i; + + for (i = 0; i < VISIBLE_NEXT_LEN(pixbuf_cache); i++) { + job_info = (pixbuf_cache->next_job + i); + page = pixbuf_cache->end_page + 1 + i; + + add_job_if_needed (pixbuf_cache, job_info, + page, rotation, scale, + EV_JOB_PRIORITY_LOW); + } +} + +static void ev_pixbuf_cache_add_jobs_if_needed (EvPixbufCache *pixbuf_cache, gint rotation, gfloat scale) @@ -758,24 +802,33 @@ ev_pixbuf_cache_add_jobs_if_needed (EvPixbufCache *pixbuf_cache, EV_JOB_PRIORITY_URGENT); } - for (i = pixbuf_cache->preload_cache_size - 1; i >= FIRST_VISIBLE_PREV(pixbuf_cache); i--) { - job_info = (pixbuf_cache->prev_job + i); - page = pixbuf_cache->start_page - pixbuf_cache->preload_cache_size + i; + if (pixbuf_cache->scroll_direction == SCROLL_DIRECTION_UP) { + add_prev_jobs_if_needed (pixbuf_cache, rotation, scale); + add_next_jobs_if_needed (pixbuf_cache, rotation, scale); + } else { + add_next_jobs_if_needed (pixbuf_cache, rotation, scale); + add_prev_jobs_if_needed (pixbuf_cache, rotation, scale); + } +} - add_job_if_needed (pixbuf_cache, job_info, - page, rotation, scale, - EV_JOB_PRIORITY_LOW); - } +static ScrollDirection +ev_pixbuf_cache_get_scroll_direction (EvPixbufCache *pixbuf_cache, + gint start_page, + gint end_page) +{ + if (start_page < pixbuf_cache->start_page) + return SCROLL_DIRECTION_UP; - for (i = 0; i < VISIBLE_NEXT_LEN(pixbuf_cache); i++) { - job_info = (pixbuf_cache->next_job + i); - page = pixbuf_cache->end_page + 1 + i; + if (end_page > pixbuf_cache->end_page) + return SCROLL_DIRECTION_DOWN; - add_job_if_needed (pixbuf_cache, job_info, - page, rotation, scale, - EV_JOB_PRIORITY_LOW); - } + if (start_page > pixbuf_cache->start_page) + return SCROLL_DIRECTION_DOWN; + if (end_page < pixbuf_cache->end_page) + return SCROLL_DIRECTION_UP; + + return pixbuf_cache->scroll_direction; } void @@ -793,6 +846,8 @@ ev_pixbuf_cache_set_page_range (EvPixbufCache *pixbuf_cache, g_return_if_fail (end_page >= 0 && end_page < ev_document_get_n_pages (pixbuf_cache->document)); g_return_if_fail (end_page >= start_page); + pixbuf_cache->scroll_direction = ev_pixbuf_cache_get_scroll_direction (pixbuf_cache, start_page, end_page); + /* First, resize the page_range as needed. We cull old pages * mercilessly. */ ev_pixbuf_cache_update_range (pixbuf_cache, start_page, end_page, rotation, scale); |