X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;ds=sidebyside;f=libview%2Fev-pixbuf-cache.c;h=87e78b4ceedbe138bb88ba6963181d862fa90303;hb=c9525f15920d12cb778b342f30dacf9e3782204a;hp=bcc5c023a6bd54eea25ea43c375475059a7f4751;hpb=68d0fc3c59185065d9694ba3f8cb2665b984eb9f;p=evince.git diff --git a/libview/ev-pixbuf-cache.c b/libview/ev-pixbuf-cache.c index bcc5c023..87e78b4c 100644 --- a/libview/ev-pixbuf-cache.c +++ b/libview/ev-pixbuf-cache.c @@ -1,17 +1,15 @@ #include #include "ev-pixbuf-cache.h" #include "ev-job-scheduler.h" -#include "ev-page-cache.h" -#include "ev-document-images.h" +#include "ev-mapping.h" #include "ev-document-forms.h" -#include "ev-document-links.h" -#include "ev-image.h" -#include "ev-form-field.h" +#include "ev-document-images.h" +#include "ev-document-annotations.h" +#include "ev-view-private.h" typedef struct _CacheJobInfo { EvJob *job; - EvRenderContext *rc; gboolean page_ready; /* Region of the page that needs to be drawn */ @@ -19,11 +17,7 @@ typedef struct _CacheJobInfo /* Data we get from rendering */ cairo_surface_t *surface; - GList *link_mapping; - GList *image_mapping; - GList *form_field_mapping; - GdkRegion *text_mapping; - + /* Selection data. * Selection_points are the coordinates encapsulated in selection. * target_points is the target selection size. */ @@ -45,6 +39,7 @@ struct _EvPixbufCache EvDocument *document; int start_page; int end_page; + gboolean inverted_colors; /* preload_cache_size is the number of pages prior to the current * visible area that we cache. It's normally 1, but could be 2 in the @@ -76,18 +71,10 @@ static void ev_pixbuf_cache_init (EvPixbufCache *pixbuf_cach static void ev_pixbuf_cache_class_init (EvPixbufCacheClass *pixbuf_cache); static void ev_pixbuf_cache_finalize (GObject *object); static void ev_pixbuf_cache_dispose (GObject *object); -static void job_page_ready_cb (EvJob *job, - EvPixbufCache *pixbuf_cache); 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); -static void copy_job_page_and_selection_to_job_info (EvJobRender *job_render, - CacheJobInfo *job_info, - EvPixbufCache *pixbuf_cache); static gboolean new_selection_surface_needed(EvPixbufCache *pixbuf_cache, CacheJobInfo *job_info, gint page, @@ -97,8 +84,8 @@ static gboolean new_selection_surface_needed(EvPixbufCache *pixbuf_cac /* These are used for iterating through the prev and next arrays */ #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 VISIBLE_NEXT_LEN(pixbuf_cache) \ + (MIN(pixbuf_cache->preload_cache_size, ev_document_get_n_pages (pixbuf_cache->document) - (1 + pixbuf_cache->end_page))) #define PAGE_CACHE_LEN(pixbuf_cache) \ ((pixbuf_cache->end_page - pixbuf_cache->start_page) + 1) @@ -157,10 +144,8 @@ dispose_cache_job_info (CacheJobInfo *job_info, { if (job_info == NULL) return; + if (job_info->job) { - g_signal_handlers_disconnect_by_func (job_info->job, - G_CALLBACK (job_page_ready_cb), - data); g_signal_handlers_disconnect_by_func (job_info->job, G_CALLBACK (job_finished_cb), data); @@ -176,22 +161,6 @@ dispose_cache_job_info (CacheJobInfo *job_info, gdk_region_destroy (job_info->region); job_info->region = NULL; } - if (job_info->link_mapping) { - ev_link_mapping_free (job_info->link_mapping); - job_info->link_mapping = NULL; - } - if (job_info->image_mapping) { - ev_image_mapping_free (job_info->image_mapping); - job_info->image_mapping = NULL; - } - if (job_info->form_field_mapping) { - ev_form_field_mapping_free (job_info->form_field_mapping); - job_info->form_field_mapping = NULL; - } - if (job_info->text_mapping) { - gdk_region_destroy (job_info->text_mapping); - job_info->text_mapping = NULL; - } if (job_info->selection) { cairo_surface_destroy (job_info->selection); job_info->selection = NULL; @@ -200,10 +169,6 @@ dispose_cache_job_info (CacheJobInfo *job_info, gdk_region_destroy (job_info->selection_region); job_info->selection_region = NULL; } - if (job_info->rc) { - g_object_unref (G_OBJECT (job_info->rc)); - job_info->rc = NULL; - } job_info->points_set = FALSE; } @@ -244,23 +209,46 @@ ev_pixbuf_cache_new (GtkWidget *view, } static void -job_page_ready_cb (EvJob *job, - EvPixbufCache *pixbuf_cache) +copy_job_to_job_info (EvJobRender *job_render, + CacheJobInfo *job_info, + EvPixbufCache *pixbuf_cache) { - CacheJobInfo *job_info; - EvJobRender *job_render = EV_JOB_RENDER (job); + if (job_info->surface) { + cairo_surface_destroy (job_info->surface); + } + job_info->surface = cairo_surface_reference (job_render->surface); + if (pixbuf_cache->inverted_colors) { + ev_document_misc_invert_surface (job_info->surface); + } - /* If the job is outside of our interest, we silently discard it */ - if ((job_render->page < (pixbuf_cache->start_page - pixbuf_cache->preload_cache_size)) || - (job_render->page > (pixbuf_cache->end_page + pixbuf_cache->preload_cache_size))) { - g_object_unref (job); - return; + job_info->points_set = FALSE; + if (job_render->include_selection) { + if (job_info->selection) { + cairo_surface_destroy (job_info->selection); + job_info->selection = NULL; + } + if (job_info->selection_region) { + gdk_region_destroy (job_info->selection_region); + job_info->selection_region = NULL; + } + + job_info->selection_points = job_render->selection_points; + job_info->selection_region = gdk_region_copy (job_render->selection_region); + job_info->selection = cairo_surface_reference (job_render->selection); + g_assert (job_info->selection_points.x1 >= 0); + job_info->points_set = TRUE; } - job_info = find_job_cache (pixbuf_cache, job_render->page); + if (job_info->job) { + g_signal_handlers_disconnect_by_func (job_info->job, + G_CALLBACK (job_finished_cb), + pixbuf_cache); + ev_job_cancel (job_info->job); + g_object_unref (job_info->job); + job_info->job = NULL; + } - copy_job_page_and_selection_to_job_info (job_render, job_info, pixbuf_cache); - g_signal_emit (pixbuf_cache, signals[JOB_FINISHED], 0, job_info->region); + job_info->page_ready = TRUE; } static void @@ -278,7 +266,9 @@ job_finished_cb (EvJob *job, } job_info = find_job_cache (pixbuf_cache, job_render->page); + copy_job_to_job_info (job_render, job_info, pixbuf_cache); + g_signal_emit (pixbuf_cache, signals[JOB_FINISHED], 0, job_info->region); } /* This checks a job to see if the job would generate the right sized pixbuf @@ -286,31 +276,25 @@ job_finished_cb (EvJob *job, */ static void check_job_size_and_unref (EvPixbufCache *pixbuf_cache, - CacheJobInfo *job_info, - EvPageCache *page_cache, - gfloat scale) + CacheJobInfo *job_info, + gfloat scale) { - gint width; - gint height; + gint width, height; g_assert (job_info); if (job_info->job == NULL) return; - ev_page_cache_get_size (page_cache, - EV_JOB_RENDER (job_info->job)->page, - EV_JOB_RENDER (job_info->job)->rotation, - scale, - &width, &height); - + _get_page_size_for_scale_and_rotation (job_info->job->document, + EV_JOB_RENDER (job_info->job)->page, + scale, + EV_JOB_RENDER (job_info->job)->rotation, + &width, &height); if (width == EV_JOB_RENDER (job_info->job)->target_width && height == EV_JOB_RENDER (job_info->job)->target_height) return; - g_signal_handlers_disconnect_by_func (job_info->job, - G_CALLBACK (job_page_ready_cb), - pixbuf_cache); g_signal_handlers_disconnect_by_func (job_info->job, G_CALLBACK (job_finished_cb), pixbuf_cache); @@ -370,9 +354,6 @@ move_one_job (CacheJobInfo *job_info, job_info->job = NULL; job_info->region = NULL; job_info->surface = NULL; - job_info->link_mapping = NULL; - job_info->image_mapping = NULL; - job_info->form_field_mapping = NULL; if (new_priority != priority && target_page->job) { ev_job_scheduler_update_job (target_page->job, new_priority); @@ -387,15 +368,12 @@ ev_pixbuf_cache_update_range (EvPixbufCache *pixbuf_cache, CacheJobInfo *new_job_list; CacheJobInfo *new_prev_job; CacheJobInfo *new_next_job; - EvPageCache *page_cache; int i, page; if (pixbuf_cache->start_page == start_page && pixbuf_cache->end_page == end_page) return; - page_cache = ev_page_cache_get (pixbuf_cache->document); - new_job_list = g_new0 (CacheJobInfo, (end_page - start_page) + 1); new_prev_job = g_new0 (CacheJobInfo, pixbuf_cache->preload_cache_size); new_next_job = g_new0 (CacheJobInfo, pixbuf_cache->preload_cache_size); @@ -427,7 +405,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_document_get_n_pages (pixbuf_cache->document)) { dispose_cache_job_info (pixbuf_cache->next_job + i, pixbuf_cache); } else { move_one_job (pixbuf_cache->next_job + i, @@ -450,99 +428,6 @@ ev_pixbuf_cache_update_range (EvPixbufCache *pixbuf_cache, pixbuf_cache->end_page = end_page; } -static void -copy_job_page_and_selection_to_job_info (EvJobRender *job_render, - CacheJobInfo *job_info, - EvPixbufCache *pixbuf_cache) -{ - if (job_info->rc == NULL) { - job_info->rc = ev_render_context_new (job_render->ev_page, - job_render->rotation, - job_render->scale); - } else { - ev_render_context_set_page (job_info->rc, job_render->ev_page); - ev_render_context_set_rotation (job_info->rc, job_render->rotation); - ev_render_context_set_scale (job_info->rc, job_render->scale); - } - - if (job_info->surface) { - cairo_surface_destroy (job_info->surface); - } - job_info->surface = cairo_surface_reference (job_render->surface); - - job_info->points_set = FALSE; - if (job_render->flags & EV_RENDER_INCLUDE_SELECTION) { - if (job_info->selection) { - cairo_surface_destroy (job_info->selection); - job_info->selection = NULL; - } - if (job_info->selection_region) { - gdk_region_destroy (job_info->selection_region); - job_info->selection_region = NULL; - } - - job_info->selection_points = job_render->selection_points; - job_info->selection_region = gdk_region_copy (job_render->selection_region); - job_info->selection = cairo_surface_reference (job_render->selection); - g_assert (job_info->selection_points.x1 >= 0); - job_info->points_set = TRUE; - } - - if (job_info->job) { - g_signal_handlers_disconnect_by_func (job_info->job, - G_CALLBACK (job_page_ready_cb), - pixbuf_cache); - } - - job_info->page_ready = TRUE; -} - -static void -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); - job_info->link_mapping = job_render->link_mapping; - } - - if (job_render->flags & EV_RENDER_INCLUDE_IMAGES) { - if (job_info->image_mapping) - ev_image_mapping_free (job_info->image_mapping); - job_info->image_mapping = job_render->image_mapping; - } - - if (job_render->flags & EV_RENDER_INCLUDE_FORMS) { - if (job_info->form_field_mapping) - ev_form_field_mapping_free (job_info->form_field_mapping); - job_info->form_field_mapping = job_render->form_field_mapping; - } - - if (job_render->flags & EV_RENDER_INCLUDE_TEXT) { - if (job_info->text_mapping) - gdk_region_destroy (job_info->text_mapping); - job_info->text_mapping = job_render->text_mapping; - } - - if (job_info->job) { - g_signal_handlers_disconnect_by_func (job_info->job, - G_CALLBACK (job_finished_cb), - pixbuf_cache); - ev_job_cancel (job_info->job); - g_object_unref (job_info->job); - job_info->job = NULL; - } -} - static CacheJobInfo * find_job_cache (EvPixbufCache *pixbuf_cache, int page) @@ -579,18 +464,15 @@ static void ev_pixbuf_cache_clear_job_sizes (EvPixbufCache *pixbuf_cache, gfloat scale) { - EvPageCache *page_cache; int i; - page_cache = ev_page_cache_get (pixbuf_cache->document); - for (i = 0; i < PAGE_CACHE_LEN (pixbuf_cache); i++) { - check_job_size_and_unref (pixbuf_cache, pixbuf_cache->job_list + i, page_cache, scale); + check_job_size_and_unref (pixbuf_cache, pixbuf_cache->job_list + i, scale); } for (i = 0; i < pixbuf_cache->preload_cache_size; i++) { - check_job_size_and_unref (pixbuf_cache, pixbuf_cache->prev_job + i, page_cache, scale); - check_job_size_and_unref (pixbuf_cache, pixbuf_cache->next_job + i, page_cache, scale); + check_job_size_and_unref (pixbuf_cache, pixbuf_cache->prev_job + i, scale); + check_job_size_and_unref (pixbuf_cache, pixbuf_cache->next_job + i, scale); } } @@ -609,7 +491,6 @@ get_selection_colors (GtkWidget *widget, GdkColor **text, GdkColor **base) static void add_job (EvPixbufCache *pixbuf_cache, CacheJobInfo *job_info, - EvPageCache *page_cache, GdkRegion *region, gint width, gint height, @@ -618,29 +499,16 @@ add_job (EvPixbufCache *pixbuf_cache, gfloat scale, EvJobPriority priority) { - EvRenderFlags flags = 0; - job_info->page_ready = FALSE; - + if (job_info->region) gdk_region_destroy (job_info->region); job_info->region = region ? gdk_region_copy (region) : NULL; - /* Figure out what else we need for this job */ - if (job_info->link_mapping == NULL) - flags |= EV_RENDER_INCLUDE_LINKS; - if (job_info->image_mapping == NULL) - flags |= EV_RENDER_INCLUDE_IMAGES; - if (job_info->form_field_mapping == NULL) - flags |= EV_RENDER_INCLUDE_FORMS; - if (job_info->text_mapping == NULL) - flags |= EV_RENDER_INCLUDE_TEXT; - job_info->job = ev_job_render_new (pixbuf_cache->document, page, rotation, scale, - width, height, - flags); - + width, height); + if (new_selection_surface_needed (pixbuf_cache, job_info, page, scale)) { GdkColor *text, *base; @@ -652,10 +520,7 @@ add_job (EvPixbufCache *pixbuf_cache, text, base); } - 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_signal_connect (job_info->job, "finished", G_CALLBACK (job_finished_cb), pixbuf_cache); ev_job_scheduler_push_job (job_info->job, priority); @@ -664,7 +529,6 @@ add_job (EvPixbufCache *pixbuf_cache, static void add_job_if_needed (EvPixbufCache *pixbuf_cache, CacheJobInfo *job_info, - EvPageCache *page_cache, gint page, gint rotation, gfloat scale, @@ -675,15 +539,16 @@ add_job_if_needed (EvPixbufCache *pixbuf_cache, if (job_info->job) return; - ev_page_cache_get_size (page_cache, page, rotation, - scale, &width, &height); + _get_page_size_for_scale_and_rotation (pixbuf_cache->document, + page, scale, rotation, + &width, &height); if (job_info->surface && cairo_image_surface_get_width (job_info->surface) == width && cairo_image_surface_get_height (job_info->surface) == height) return; - add_job (pixbuf_cache, job_info, page_cache, NULL, + add_job (pixbuf_cache, job_info, NULL, width, height, page, rotation, scale, priority); } @@ -693,19 +558,16 @@ ev_pixbuf_cache_add_jobs_if_needed (EvPixbufCache *pixbuf_cache, gint rotation, gfloat scale) { - EvPageCache *page_cache; CacheJobInfo *job_info; int page; int i; - page_cache = ev_page_cache_get (pixbuf_cache->document); - for (i = 0; i < PAGE_CACHE_LEN (pixbuf_cache); i++) { job_info = (pixbuf_cache->job_list + i); page = pixbuf_cache->start_page + i; add_job_if_needed (pixbuf_cache, job_info, - page_cache, page, rotation, scale, + page, rotation, scale, EV_JOB_PRIORITY_URGENT); } @@ -714,16 +576,16 @@ ev_pixbuf_cache_add_jobs_if_needed (EvPixbufCache *pixbuf_cache, page = pixbuf_cache->start_page - pixbuf_cache->preload_cache_size + i; add_job_if_needed (pixbuf_cache, job_info, - page_cache, page, rotation, scale, + page, rotation, scale, EV_JOB_PRIORITY_LOW); } - for (i = 0; i < VISIBLE_NEXT_LEN(pixbuf_cache, page_cache); 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_cache, page, rotation, scale, + page, rotation, scale, EV_JOB_PRIORITY_LOW); } @@ -737,14 +599,10 @@ ev_pixbuf_cache_set_page_range (EvPixbufCache *pixbuf_cache, gfloat scale, GList *selection_list) { - EvPageCache *page_cache; - g_return_if_fail (EV_IS_PIXBUF_CACHE (pixbuf_cache)); - page_cache = ev_page_cache_get (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_document_get_n_pages (pixbuf_cache->document)); + 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); /* First, resize the page_range as needed. We cull old pages @@ -763,90 +621,59 @@ ev_pixbuf_cache_set_page_range (EvPixbufCache *pixbuf_cache, ev_pixbuf_cache_add_jobs_if_needed (pixbuf_cache, rotation, scale); } -cairo_surface_t * -ev_pixbuf_cache_get_surface (EvPixbufCache *pixbuf_cache, - gint page) +void +ev_pixbuf_cache_set_inverted_colors (EvPixbufCache *pixbuf_cache, + gboolean inverted_colors) { - CacheJobInfo *job_info; - - job_info = find_job_cache (pixbuf_cache, page); - if (job_info == NULL) - return NULL; + gint i; - if (job_info->page_ready) - return job_info->surface; - - /* We don't need to wait for the idle to handle the callback */ - if (job_info->job && - EV_JOB_RENDER (job_info->job)->page_ready) { - copy_job_page_and_selection_to_job_info (EV_JOB_RENDER (job_info->job), job_info, pixbuf_cache); - g_signal_emit (pixbuf_cache, signals[JOB_FINISHED], 0, job_info->region); - } + if (pixbuf_cache->inverted_colors == inverted_colors) + return; - return job_info->surface; -} + pixbuf_cache->inverted_colors = inverted_colors; -GList * -ev_pixbuf_cache_get_link_mapping (EvPixbufCache *pixbuf_cache, - gint page) -{ - CacheJobInfo *job_info; + for (i = 0; i < pixbuf_cache->preload_cache_size; i++) { + CacheJobInfo *job_info; - job_info = find_job_cache (pixbuf_cache, page); - if (job_info == NULL) - return NULL; + job_info = pixbuf_cache->prev_job + i; + if (job_info->surface) + ev_document_misc_invert_surface (job_info->surface); - /* 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); + job_info = pixbuf_cache->next_job + i; + if (job_info->surface) + ev_document_misc_invert_surface (job_info->surface); } - return job_info->link_mapping; -} - -GList * -ev_pixbuf_cache_get_image_mapping (EvPixbufCache *pixbuf_cache, - gint page) -{ - CacheJobInfo *job_info; - - if (!EV_IS_DOCUMENT_IMAGES (pixbuf_cache->document)) - return NULL; - - job_info = find_job_cache (pixbuf_cache, page); - if (job_info == NULL) - return NULL; + for (i = 0; i < PAGE_CACHE_LEN (pixbuf_cache); i++) { + CacheJobInfo *job_info; - /* 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); + job_info = pixbuf_cache->job_list + i; + if (job_info->surface) + ev_document_misc_invert_surface (job_info->surface); } - - return job_info->image_mapping; } -GList * -ev_pixbuf_cache_get_form_field_mapping (EvPixbufCache *pixbuf_cache, - gint page) +cairo_surface_t * +ev_pixbuf_cache_get_surface (EvPixbufCache *pixbuf_cache, + gint page) { CacheJobInfo *job_info; - if (!EV_IS_DOCUMENT_FORMS (pixbuf_cache->document)) - return NULL; - job_info = find_job_cache (pixbuf_cache, page); if (job_info == NULL) return NULL; + if (job_info->page_ready) + return job_info->surface; + /* 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); + EV_JOB_RENDER (job_info->job)->page_ready) { + copy_job_to_job_info (EV_JOB_RENDER (job_info->job), job_info, pixbuf_cache); + g_signal_emit (pixbuf_cache, signals[JOB_FINISHED], 0, job_info->region); } - - return job_info->form_field_mapping; + + return job_info->surface; } static gboolean @@ -855,16 +682,13 @@ new_selection_surface_needed (EvPixbufCache *pixbuf_cache, gint page, gfloat scale) { - EvPageCache *page_cache; - - if (job_info->selection && job_info->rc) { + if (job_info->selection) { gint width, height; gint selection_width, selection_height; - - page_cache = ev_page_cache_get (pixbuf_cache->document); - ev_page_cache_get_size (page_cache, page, - job_info->rc->rotation, - scale, &width, &height); + + _get_page_size_for_scale_and_rotation (pixbuf_cache->document, + page, scale, 0, + &width, &height); selection_width = cairo_image_surface_get_width (job_info->selection); selection_height = cairo_image_surface_get_height (job_info->selection); @@ -893,25 +717,6 @@ clear_selection_if_needed (EvPixbufCache *pixbuf_cache, } } -GdkRegion * -ev_pixbuf_cache_get_text_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->text_mapping; -} - /* Clears the cache of jobs and pixbufs. */ void @@ -983,21 +788,10 @@ 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 */ - ev_render_context_set_scale (job_info->rc, scale); - /* If we have a running job, we just return what we have under the * assumption that it'll be updated later and we can scale it as need * be */ - if (job_info->job && (EV_JOB_RENDER (job_info->job)->flags & EV_RENDER_INCLUDE_SELECTION)) + if (job_info->job && EV_JOB_RENDER (job_info->job)->include_selection) return job_info->selection; /* Now, lets see if we need to resize the image. If we do, we clear the @@ -1012,6 +806,8 @@ ev_pixbuf_cache_get_selection_surface (EvPixbufCache *pixbuf_cache, if (ev_rect_cmp (&(job_info->target_points), &(job_info->selection_points))) { EvRectangle *old_points; GdkColor *text, *base; + EvRenderContext *rc; + EvPage *ev_page; /* we need to get a new selection pixbuf */ ev_document_doc_mutex_lock (); @@ -1023,12 +819,15 @@ ev_pixbuf_cache_get_selection_surface (EvPixbufCache *pixbuf_cache, old_points = &(job_info->selection_points); } + ev_page = ev_document_get_page (pixbuf_cache->document, page); + rc = ev_render_context_new (ev_page, 0, scale); + g_object_unref (ev_page); + if (job_info->selection_region) gdk_region_destroy (job_info->selection_region); job_info->selection_region = ev_selection_get_selection_region (EV_SELECTION (pixbuf_cache->document), - job_info->rc, - job_info->selection_style, + rc, job_info->selection_style, &(job_info->target_points)); gtk_widget_ensure_style (pixbuf_cache->view); @@ -1036,12 +835,13 @@ ev_pixbuf_cache_get_selection_surface (EvPixbufCache *pixbuf_cache, get_selection_colors (pixbuf_cache->view, &text, &base); ev_selection_render_selection (EV_SELECTION (pixbuf_cache->document), - job_info->rc, &(job_info->selection), + rc, &(job_info->selection), &(job_info->target_points), old_points, job_info->selection_style, text, base); job_info->selection_points = job_info->target_points; + g_object_unref (rc); ev_document_doc_mutex_unlock (); } if (region) @@ -1078,7 +878,6 @@ void ev_pixbuf_cache_set_selection_list (EvPixbufCache *pixbuf_cache, GList *selection_list) { - EvPageCache *page_cache; EvViewSelection *selection; GList *list = selection_list; int page; @@ -1089,8 +888,6 @@ ev_pixbuf_cache_set_selection_list (EvPixbufCache *pixbuf_cache, if (!EV_IS_SELECTION (pixbuf_cache->document)) return; - page_cache = ev_page_cache_get (pixbuf_cache->document); - /* We check each area to see what needs updating, and what needs freeing; */ page = pixbuf_cache->start_page - pixbuf_cache->preload_cache_size; for (i = 0; i < pixbuf_cache->preload_cache_size; i++) { @@ -1136,7 +933,7 @@ ev_pixbuf_cache_set_selection_list (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_document_get_n_pages (pixbuf_cache->document)) break; selection = NULL; @@ -1163,7 +960,6 @@ ev_pixbuf_cache_set_selection_list (EvPixbufCache *pixbuf_cache, GList * ev_pixbuf_cache_get_selection_list (EvPixbufCache *pixbuf_cache) { - EvPageCache *page_cache; EvViewSelection *selection; GList *retval = NULL; int page; @@ -1171,8 +967,6 @@ ev_pixbuf_cache_get_selection_list (EvPixbufCache *pixbuf_cache) g_return_val_if_fail (EV_IS_PIXBUF_CACHE (pixbuf_cache), NULL); - page_cache = ev_page_cache_get (pixbuf_cache->document); - /* We check each area to see what needs updating, and what needs freeing; */ page = pixbuf_cache->start_page - pixbuf_cache->preload_cache_size; for (i = 0; i < pixbuf_cache->preload_cache_size; i++) { @@ -1208,7 +1002,7 @@ ev_pixbuf_cache_get_selection_list (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_document_get_n_pages (pixbuf_cache->document)) break; if (pixbuf_cache->next_job[i].selection_points.x1 != -1) { @@ -1226,7 +1020,7 @@ ev_pixbuf_cache_get_selection_list (EvPixbufCache *pixbuf_cache) return retval; } -void +void ev_pixbuf_cache_reload_page (EvPixbufCache *pixbuf_cache, GdkRegion *region, gint page, @@ -1234,18 +1028,16 @@ ev_pixbuf_cache_reload_page (EvPixbufCache *pixbuf_cache, gdouble scale) { CacheJobInfo *job_info; - EvPageCache *page_cache; gint width, height; job_info = find_job_cache (pixbuf_cache, page); if (job_info == NULL) return; - - page_cache = ev_page_cache_get (pixbuf_cache->document); - ev_page_cache_get_size (page_cache, page, rotation, scale, - &width, &height); - add_job (pixbuf_cache, job_info, page_cache, region, + _get_page_size_for_scale_and_rotation (pixbuf_cache->document, + page, scale, rotation, + &width, &height); + add_job (pixbuf_cache, job_info, region, width, height, page, rotation, scale, EV_JOB_PRIORITY_URGENT); }