X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=shell%2Fev-pixbuf-cache.c;h=46976afe2d23b564912204b0fe3459523c477d9a;hb=b2ad055bb54dd89f3e8748302cfbd5c6f746d6a4;hp=25b6f2cf883dfc3631d0c64c78a717ee73144880;hpb=cd2d4116a78ef055ea5dacfbb9a38bc77618b329;p=evince.git diff --git a/shell/ev-pixbuf-cache.c b/shell/ev-pixbuf-cache.c index 25b6f2cf..46976afe 100644 --- a/shell/ev-pixbuf-cache.c +++ b/shell/ev-pixbuf-cache.c @@ -1,6 +1,6 @@ #include #include "ev-pixbuf-cache.h" -#include "ev-job-queue.h" +#include "ev-job-scheduler.h" #include "ev-page-cache.h" #include "ev-document-images.h" #include "ev-document-forms.h" @@ -94,8 +94,8 @@ static gboolean new_selection_surface_needed(EvPixbufCache *pixbuf_cac /* 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 FIRST_VISIBLE_PREV(pixbuf_cache) \ + (MAX (0, pixbuf_cache->preload_cache_size - 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) - (1 + pixbuf_cache->end_page))) #define PAGE_CACHE_LEN(pixbuf_cache) \ @@ -163,8 +163,8 @@ dispose_cache_job_info (CacheJobInfo *job_info, g_signal_handlers_disconnect_by_func (job_info->job, G_CALLBACK (job_finished_cb), data); - ev_job_queue_remove_job (job_info->job); - g_object_unref (G_OBJECT (job_info->job)); + ev_job_cancel (job_info->job); + g_object_unref (job_info->job); job_info->job = NULL; } if (job_info->surface) { @@ -313,7 +313,7 @@ check_job_size_and_unref (EvPixbufCache *pixbuf_cache, g_signal_handlers_disconnect_by_func (job_info->job, G_CALLBACK (job_finished_cb), pixbuf_cache); - ev_job_queue_remove_job (job_info->job); + ev_job_cancel (job_info->job); g_object_unref (job_info->job); job_info->job = NULL; } @@ -330,11 +330,11 @@ move_one_job (CacheJobInfo *job_info, CacheJobInfo *new_next_job, int start_page, int end_page, - EvJobPriority priority) + gint priority) { CacheJobInfo *target_page = NULL; int page_offset; - EvJobPriority new_priority; + gint new_priority; if (page < (start_page - pixbuf_cache->preload_cache_size) || page > (end_page + pixbuf_cache->preload_cache_size)) { @@ -361,7 +361,7 @@ move_one_job (CacheJobInfo *job_info, page_offset = page - start_page; g_assert (page_offset >= 0 && page_offset <= ((end_page - start_page) + 1)); - new_priority = EV_JOB_PRIORITY_HIGH; + new_priority = EV_JOB_PRIORITY_URGENT; target_page = new_job_list + page_offset; } @@ -374,7 +374,7 @@ move_one_job (CacheJobInfo *job_info, job_info->form_field_mapping = NULL; if (new_priority != priority && target_page->job) { - ev_job_queue_update_job (target_page->job, new_priority); + ev_job_scheduler_update_job (target_page->job, new_priority); } } @@ -421,7 +421,7 @@ ev_pixbuf_cache_update_range (EvPixbufCache *pixbuf_cache, move_one_job (pixbuf_cache->job_list + i, pixbuf_cache, page, new_job_list, new_prev_job, new_next_job, - start_page, end_page, EV_JOB_PRIORITY_HIGH); + start_page, end_page, EV_JOB_PRIORITY_URGENT); page ++; } @@ -501,6 +501,13 @@ copy_job_to_job_info (EvJobRender *job_render, CacheJobInfo *job_info, EvPixbufCache *pixbuf_cache) { + if (!job_info->page_ready) { + g_signal_emit (pixbuf_cache, signals[JOB_FINISHED], 0, job_info->region); + copy_job_page_and_selection_to_job_info (job_render, + job_info, + pixbuf_cache); + } + if (job_render->flags & EV_RENDER_INCLUDE_LINKS) { if (job_info->link_mapping) ev_link_mapping_free (job_info->link_mapping); @@ -529,8 +536,8 @@ copy_job_to_job_info (EvJobRender *job_render, g_signal_handlers_disconnect_by_func (job_info->job, G_CALLBACK (job_finished_cb), pixbuf_cache); - ev_job_queue_remove_job (job_info->job); - g_object_unref (G_OBJECT (job_info->job)); + ev_job_cancel (job_info->job); + g_object_unref (job_info->job); job_info->job = NULL; } } @@ -586,9 +593,6 @@ ev_pixbuf_cache_clear_job_sizes (EvPixbufCache *pixbuf_cache, } } -#define FIRST_VISABLE_PREV(pixbuf_cache) \ - (MAX (0, pixbuf_cache->preload_cache_size + 1 - pixbuf_cache->start_page)) - static void get_selection_colors (GtkWidget *widget, GdkColor **text, GdkColor **base) { @@ -647,13 +651,13 @@ add_job (EvPixbufCache *pixbuf_cache, text, base); } - ev_job_queue_add_job (job_info->job, priority); g_signal_connect (G_OBJECT (job_info->job), "page-ready", G_CALLBACK (job_page_ready_cb), pixbuf_cache); g_signal_connect (G_OBJECT (job_info->job), "finished", G_CALLBACK (job_finished_cb), pixbuf_cache); + ev_job_scheduler_push_job (job_info->job, priority); } static void @@ -701,10 +705,10 @@ ev_pixbuf_cache_add_jobs_if_needed (EvPixbufCache *pixbuf_cache, add_job_if_needed (pixbuf_cache, job_info, page_cache, page, rotation, scale, - EV_JOB_PRIORITY_HIGH); + EV_JOB_PRIORITY_URGENT); } - for (i = FIRST_VISABLE_PREV(pixbuf_cache); i < pixbuf_cache->preload_cache_size; i++) { + for (i = FIRST_VISIBLE_PREV(pixbuf_cache); i < pixbuf_cache->preload_cache_size; i++) { job_info = (pixbuf_cache->prev_job + i); page = pixbuf_cache->start_page - pixbuf_cache->preload_cache_size + i; @@ -852,7 +856,7 @@ new_selection_surface_needed (EvPixbufCache *pixbuf_cache, { EvPageCache *page_cache; - if (job_info->selection) { + if (job_info->selection && job_info->rc) { gint width, height; gint selection_width, selection_height; @@ -978,8 +982,15 @@ ev_pixbuf_cache_get_selection_surface (EvPixbufCache *pixbuf_cache, if (!job_info->points_set) return NULL; + /* Create new render context if needed (selection + fast scrolling) */ + if (job_info->rc == NULL) { + EvPage *ev_page; + ev_page = ev_document_get_page (pixbuf_cache->document, page); + job_info->rc = ev_render_context_new (ev_page, 0, scale); + g_object_unref (ev_page); + } + /* Update the rc */ - g_assert (job_info->rc); ev_render_context_set_scale (job_info->rc, scale); /* If we have a running job, we just return what we have under the @@ -1235,7 +1246,7 @@ ev_pixbuf_cache_reload_page (EvPixbufCache *pixbuf_cache, add_job (pixbuf_cache, job_info, page_cache, region, width, height, page, rotation, scale, - EV_JOB_PRIORITY_HIGH); + EV_JOB_PRIORITY_URGENT); }