X-Git-Url: https://www.fi.muni.cz/~kas/git//home/kas/public_html/git/?a=blobdiff_plain;f=libview%2Fev-pixbuf-cache.c;h=74b8674f293685a68f006d165b6c29add76254f5;hb=03887c145d9614a0ca83f81d359a1e86b13b06c5;hp=530f084cbf0c445d4d446a99f471fb34472f7729;hpb=d375c36972ff3a01b7979984b5a1043eb4c807b0;p=evince.git diff --git a/libview/ev-pixbuf-cache.c b/libview/ev-pixbuf-cache.c index 530f084c..74b8674f 100644 --- a/libview/ev-pixbuf-cache.c +++ b/libview/ev-pixbuf-cache.c @@ -1,10 +1,6 @@ #include #include "ev-pixbuf-cache.h" #include "ev-job-scheduler.h" -#include "ev-mapping.h" -#include "ev-document-forms.h" -#include "ev-document-images.h" -#include "ev-document-annotations.h" #include "ev-view-private.h" typedef struct _CacheJobInfo @@ -13,7 +9,7 @@ typedef struct _CacheJobInfo gboolean page_ready; /* Region of the page that needs to be drawn */ - GdkRegion *region; + cairo_region_t *region; /* Data we get from rendering */ cairo_surface_t *surface; @@ -27,7 +23,7 @@ typedef struct _CacheJobInfo gboolean points_set; cairo_surface_t *selection; - GdkRegion *selection_region; + cairo_region_t *selection_region; } CacheJobInfo; struct _EvPixbufCache @@ -49,6 +45,8 @@ struct _EvPixbufCache * case of twin pages. */ int preload_cache_size; + guint job_list_len; + CacheJobInfo *prev_job; CacheJobInfo *job_list; CacheJobInfo *next_job; @@ -131,9 +129,21 @@ ev_pixbuf_cache_finalize (GObject *object) pixbuf_cache = EV_PIXBUF_CACHE (object); - g_free (pixbuf_cache->prev_job); - g_free (pixbuf_cache->job_list); - g_free (pixbuf_cache->next_job); + if (pixbuf_cache->job_list) { + g_slice_free1 (sizeof (CacheJobInfo) * pixbuf_cache->job_list_len, + pixbuf_cache->job_list); + pixbuf_cache->job_list = NULL; + } + if (pixbuf_cache->prev_job) { + g_slice_free1 (sizeof (CacheJobInfo) * pixbuf_cache->preload_cache_size, + pixbuf_cache->prev_job); + pixbuf_cache->prev_job = NULL; + } + if (pixbuf_cache->next_job) { + g_slice_free1 (sizeof (CacheJobInfo) * pixbuf_cache->preload_cache_size, + pixbuf_cache->next_job); + pixbuf_cache->next_job = NULL; + } g_object_unref (pixbuf_cache->model); @@ -160,7 +170,7 @@ dispose_cache_job_info (CacheJobInfo *job_info, job_info->surface = NULL; } if (job_info->region) { - gdk_region_destroy (job_info->region); + cairo_region_destroy (job_info->region); job_info->region = NULL; } if (job_info->selection) { @@ -168,7 +178,7 @@ dispose_cache_job_info (CacheJobInfo *job_info, job_info->selection = NULL; } if (job_info->selection_region) { - gdk_region_destroy (job_info->selection_region); + cairo_region_destroy (job_info->selection_region); job_info->selection_region = NULL; } @@ -245,12 +255,12 @@ copy_job_to_job_info (EvJobRender *job_render, job_info->selection = NULL; } if (job_info->selection_region) { - gdk_region_destroy (job_info->selection_region); + cairo_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_region = cairo_region_reference (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; @@ -450,15 +460,16 @@ ev_pixbuf_cache_get_preload_size (EvPixbufCache *pixbuf_cache, static void ev_pixbuf_cache_update_range (EvPixbufCache *pixbuf_cache, gint start_page, - gint end_page) + gint end_page, + guint rotation, + gdouble scale) { CacheJobInfo *new_job_list; CacheJobInfo *new_prev_job = NULL; CacheJobInfo *new_next_job = NULL; gint new_preload_cache_size; + guint new_job_list_len; int i, page; - gdouble scale = ev_document_model_get_scale (pixbuf_cache->model); - gint rotation = ev_document_model_get_rotation (pixbuf_cache->model); new_preload_cache_size = ev_pixbuf_cache_get_preload_size (pixbuf_cache, start_page, @@ -470,10 +481,11 @@ ev_pixbuf_cache_update_range (EvPixbufCache *pixbuf_cache, pixbuf_cache->preload_cache_size == new_preload_cache_size) return; - new_job_list = g_new0 (CacheJobInfo, (end_page - start_page) + 1); + new_job_list_len = (end_page - start_page) + 1; + new_job_list = g_slice_alloc0 (sizeof (CacheJobInfo) * new_job_list_len); if (new_preload_cache_size > 0) { - new_prev_job = g_new0 (CacheJobInfo, new_preload_cache_size); - new_next_job = g_new0 (CacheJobInfo, new_preload_cache_size); + new_prev_job = g_slice_alloc0 (sizeof (CacheJobInfo) * new_preload_cache_size); + new_next_job = g_slice_alloc0 (sizeof (CacheJobInfo) * new_preload_cache_size); } /* We go through each job in the old cache and either clear it or move @@ -517,11 +529,21 @@ ev_pixbuf_cache_update_range (EvPixbufCache *pixbuf_cache, page ++; } - g_free (pixbuf_cache->job_list); - g_free (pixbuf_cache->prev_job); - g_free (pixbuf_cache->next_job); + if (pixbuf_cache->job_list) { + g_slice_free1 (sizeof (CacheJobInfo) * pixbuf_cache->job_list_len, + pixbuf_cache->job_list); + } + if (pixbuf_cache->prev_job) { + g_slice_free1 (sizeof (CacheJobInfo) * pixbuf_cache->preload_cache_size, + pixbuf_cache->prev_job); + } + if (pixbuf_cache->next_job) { + g_slice_free1 (sizeof (CacheJobInfo) * pixbuf_cache->preload_cache_size, + pixbuf_cache->next_job); + } pixbuf_cache->preload_cache_size = new_preload_cache_size; + pixbuf_cache->job_list_len = new_job_list_len; pixbuf_cache->job_list = new_job_list; pixbuf_cache->prev_job = new_prev_job; @@ -594,21 +616,21 @@ get_selection_colors (GtkWidget *widget, GdkColor **text, GdkColor **base) } static void -add_job (EvPixbufCache *pixbuf_cache, - CacheJobInfo *job_info, - GdkRegion *region, - gint width, - gint height, - gint page, - gint rotation, - gfloat scale, - EvJobPriority priority) +add_job (EvPixbufCache *pixbuf_cache, + CacheJobInfo *job_info, + cairo_region_t *region, + gint width, + gint height, + gint page, + gint rotation, + gfloat scale, + EvJobPriority priority) { job_info->page_ready = FALSE; if (job_info->region) - gdk_region_destroy (job_info->region); - job_info->region = region ? gdk_region_copy (region) : NULL; + cairo_region_destroy (job_info->region); + job_info->region = region ? cairo_region_reference (region) : NULL; job_info->job = ev_job_render_new (pixbuf_cache->document, page, rotation, scale, @@ -713,10 +735,11 @@ void ev_pixbuf_cache_set_page_range (EvPixbufCache *pixbuf_cache, gint start_page, gint end_page, - gint rotation, - gfloat scale, GList *selection_list) { + gdouble scale = ev_document_model_get_scale (pixbuf_cache->model); + gint rotation = ev_document_model_get_rotation (pixbuf_cache->model); + g_return_if_fail (EV_IS_PIXBUF_CACHE (pixbuf_cache)); g_return_if_fail (start_page >= 0 && start_page < ev_document_get_n_pages (pixbuf_cache->document)); @@ -725,7 +748,7 @@ ev_pixbuf_cache_set_page_range (EvPixbufCache *pixbuf_cache, /* First, resize the page_range as needed. We cull old pages * mercilessly. */ - ev_pixbuf_cache_update_range (pixbuf_cache, start_page, end_page); + ev_pixbuf_cache_update_range (pixbuf_cache, start_page, end_page, rotation, scale); /* Then, we update the current jobs to see if any of them are the wrong * size, we remove them if we need to. */ @@ -842,6 +865,9 @@ ev_pixbuf_cache_clear (EvPixbufCache *pixbuf_cache) { int i; + if (!pixbuf_cache->job_list) + return; + for (i = 0; i < pixbuf_cache->preload_cache_size; i++) { dispose_cache_job_info (pixbuf_cache->prev_job + i, pixbuf_cache); dispose_cache_job_info (pixbuf_cache->next_job + i, pixbuf_cache); @@ -858,6 +884,9 @@ ev_pixbuf_cache_style_changed (EvPixbufCache *pixbuf_cache) { gint i; + if (!pixbuf_cache->job_list) + return; + /* FIXME: doesn't update running jobs. */ for (i = 0; i < pixbuf_cache->preload_cache_size; i++) { CacheJobInfo *job_info; @@ -887,10 +916,10 @@ ev_pixbuf_cache_style_changed (EvPixbufCache *pixbuf_cache) } cairo_surface_t * -ev_pixbuf_cache_get_selection_surface (EvPixbufCache *pixbuf_cache, - gint page, - gfloat scale, - GdkRegion **region) +ev_pixbuf_cache_get_selection_surface (EvPixbufCache *pixbuf_cache, + gint page, + gfloat scale, + cairo_region_t **region) { CacheJobInfo *job_info; @@ -942,7 +971,7 @@ ev_pixbuf_cache_get_selection_surface (EvPixbufCache *pixbuf_cache, g_object_unref (ev_page); if (job_info->selection_region) - gdk_region_destroy (job_info->selection_region); + cairo_region_destroy (job_info->selection_region); job_info->selection_region = ev_selection_get_selection_region (EV_SELECTION (pixbuf_cache->document), rc, job_info->selection_style, @@ -1098,7 +1127,7 @@ ev_pixbuf_cache_get_selection_list (EvPixbufCache *pixbuf_cache) selection->page = page; selection->rect = pixbuf_cache->prev_job[i].selection_points; if (pixbuf_cache->prev_job[i].selection_region) - selection->covered_region = gdk_region_copy (pixbuf_cache->prev_job[i].selection_region); + selection->covered_region = cairo_region_reference (pixbuf_cache->prev_job[i].selection_region); retval = g_list_append (retval, selection); } @@ -1112,7 +1141,7 @@ ev_pixbuf_cache_get_selection_list (EvPixbufCache *pixbuf_cache) selection->page = page; selection->rect = pixbuf_cache->job_list[i].selection_points; if (pixbuf_cache->job_list[i].selection_region) - selection->covered_region = gdk_region_copy (pixbuf_cache->job_list[i].selection_region); + selection->covered_region = cairo_region_reference (pixbuf_cache->job_list[i].selection_region); retval = g_list_append (retval, selection); } @@ -1128,7 +1157,7 @@ ev_pixbuf_cache_get_selection_list (EvPixbufCache *pixbuf_cache) selection->page = page; selection->rect = pixbuf_cache->next_job[i].selection_points; if (pixbuf_cache->next_job[i].selection_region) - selection->covered_region = gdk_region_copy (pixbuf_cache->next_job[i].selection_region); + selection->covered_region = cairo_region_reference (pixbuf_cache->next_job[i].selection_region); retval = g_list_append (retval, selection); } @@ -1139,11 +1168,11 @@ ev_pixbuf_cache_get_selection_list (EvPixbufCache *pixbuf_cache) } void -ev_pixbuf_cache_reload_page (EvPixbufCache *pixbuf_cache, - GdkRegion *region, - gint page, - gint rotation, - gdouble scale) +ev_pixbuf_cache_reload_page (EvPixbufCache *pixbuf_cache, + cairo_region_t *region, + gint page, + gint rotation, + gdouble scale) { CacheJobInfo *job_info; gint width, height;