* case of twin pages.
*/
int preload_cache_size;
+ guint job_list_len;
+
CacheJobInfo *prev_job;
CacheJobInfo *job_list;
CacheJobInfo *next_job;
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);
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,
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
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;
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));
/* 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. */
{
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);
{
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;