]> www.fi.muni.cz Git - evince.git/blobdiff - libview/ev-pixbuf-cache.c
[libdocument] Fix interface properties handling in derived classes
[evince.git] / libview / ev-pixbuf-cache.c
index 530f084cbf0c445d4d446a99f471fb34472f7729..74b8674f293685a68f006d165b6c29add76254f5 100644 (file)
@@ -1,10 +1,6 @@
 #include <config.h>
 #include "ev-pixbuf-cache.h"
 #include "ev-job-scheduler.h"
 #include <config.h>
 #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
 #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 */
        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;
 
        /* Data we get from rendering */
        cairo_surface_t *surface;
@@ -27,7 +23,7 @@ typedef struct _CacheJobInfo
        gboolean         points_set;
        
        cairo_surface_t *selection;
        gboolean         points_set;
        
        cairo_surface_t *selection;
-       GdkRegion *selection_region;
+       cairo_region_t  *selection_region;
 } CacheJobInfo;
 
 struct _EvPixbufCache
 } CacheJobInfo;
 
 struct _EvPixbufCache
@@ -49,6 +45,8 @@ struct _EvPixbufCache
         * case of twin pages.
         */
        int preload_cache_size;
         * case of twin pages.
         */
        int preload_cache_size;
+       guint job_list_len;
+
        CacheJobInfo *prev_job;
        CacheJobInfo *job_list;
        CacheJobInfo *next_job;
        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);
 
 
        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);
 
 
        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) {
                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) {
                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) {
                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_region = NULL;
        }
 
@@ -245,12 +255,12 @@ copy_job_to_job_info (EvJobRender   *job_render,
                        job_info->selection = NULL;
                }
                if (job_info->selection_region) {
                        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 = 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;
                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,
 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;
 {
        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;
        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,
 
        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;
 
            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) {
        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
        }
 
        /* 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 ++;
        }
 
                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->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;
 
        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
 }
 
 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)
 {
        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,
 
        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,
 ev_pixbuf_cache_set_page_range (EvPixbufCache  *pixbuf_cache,
                                gint            start_page,
                                gint            end_page,
-                               gint            rotation,
-                               gfloat          scale,
                                GList          *selection_list)
 {
                                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));
        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. */
 
        /* 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. */
 
        /* 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;
 
 {
        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);
        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;
 
 {
        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;
        /* 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 *
 }
 
 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;
 
 {
        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)
                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,
                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->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);
                }
                
                        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->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);
                }
                
                        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->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);
                }
                
                        retval = g_list_append (retval, selection);
                }
                
@@ -1139,11 +1168,11 @@ ev_pixbuf_cache_get_selection_list (EvPixbufCache *pixbuf_cache)
 }
 
 void
 }
 
 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;
 {
        CacheJobInfo *job_info;
         gint width, height;