]> www.fi.muni.cz Git - evince.git/blobdiff - libview/ev-pixbuf-cache.c
[libview] Don't try to show/hide annot windows the first time page range changes
[evince.git] / libview / ev-pixbuf-cache.c
index b81b7d1900417eb3b85f11106ca25356c9b570b2..d0f8644e57dd2757622bc2c0ed554f6c26479c35 100644 (file)
@@ -1,14 +1,11 @@
 #include <config.h>
 #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-document-images.h"
 #include "ev-document-annotations.h"
-#include "ev-image.h"
-#include "ev-form-field.h"
-#include "ev-annotation.h"
+#include "ev-view-private.h"
 
 typedef struct _CacheJobInfo
 {
@@ -48,6 +45,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
@@ -100,8 +98,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)
 
@@ -180,19 +178,19 @@ dispose_cache_job_info (CacheJobInfo *job_info,
                job_info->region = NULL;
        }
        if (job_info->link_mapping) {
-               ev_link_mapping_free (job_info->link_mapping);
+               ev_mapping_list_free (job_info->link_mapping, g_object_unref);
                job_info->link_mapping = NULL;
        }
        if (job_info->image_mapping) {
-               ev_image_mapping_free (job_info->image_mapping);
+               ev_mapping_list_free (job_info->image_mapping, g_object_unref);
                job_info->image_mapping = NULL;
        }
        if (job_info->form_field_mapping) {
-               ev_form_field_mapping_free (job_info->form_field_mapping);
+               ev_mapping_list_free (job_info->form_field_mapping, g_object_unref);
                job_info->form_field_mapping = NULL;
        }
        if (job_info->annots_mapping) {
-               ev_annotation_mapping_free (job_info->annots_mapping);
+               ev_mapping_list_free (job_info->annots_mapping, g_object_unref);
                job_info->annots_mapping = NULL;
        }
        if (job_info->text_mapping) {
@@ -293,24 +291,21 @@ 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;
@@ -395,15 +390,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);
@@ -435,7 +427,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,
@@ -477,6 +469,9 @@ copy_job_page_and_selection_to_job_info (EvJobRender   *job_render,
                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);
+       }
 
        job_info->points_set = FALSE;
        if (job_render->flags & EV_RENDER_INCLUDE_SELECTION) {
@@ -519,25 +514,25 @@ copy_job_to_job_info (EvJobRender   *job_render,
        
        if (job_render->flags & EV_RENDER_INCLUDE_LINKS) {
                if (job_info->link_mapping)
-                       ev_link_mapping_free (job_info->link_mapping);
+                       ev_mapping_list_free (job_info->link_mapping, g_object_unref);
                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);
+                       ev_mapping_list_free (job_info->image_mapping, g_object_unref);
                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);
+                       ev_mapping_list_free (job_info->form_field_mapping, g_object_unref);
                job_info->form_field_mapping = job_render->form_field_mapping;
        }
 
        if (job_render->flags & EV_RENDER_INCLUDE_ANNOTS) {
                if (job_info->annots_mapping)
-                       ev_annotation_mapping_free (job_info->annots_mapping);
+                       ev_mapping_list_free (job_info->annots_mapping, g_object_unref);
                job_info->annots_mapping = job_render->annots_mapping;
        }
 
@@ -593,18 +588,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);
        }
 }
 
@@ -623,7 +615,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,
@@ -680,7 +671,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,
@@ -691,15 +681,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);
 }
@@ -709,19 +700,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);
        }
 
@@ -730,16 +718,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);
        }
 
@@ -753,14 +741,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
@@ -779,6 +763,38 @@ ev_pixbuf_cache_set_page_range (EvPixbufCache  *pixbuf_cache,
        ev_pixbuf_cache_add_jobs_if_needed (pixbuf_cache, rotation, scale);
 }
 
+void
+ev_pixbuf_cache_set_inverted_colors (EvPixbufCache *pixbuf_cache,
+                                    gboolean       inverted_colors)
+{
+       gint i;
+
+       if (pixbuf_cache->inverted_colors == inverted_colors)
+               return;
+
+       pixbuf_cache->inverted_colors = inverted_colors;
+
+       for (i = 0; i < pixbuf_cache->preload_cache_size; i++) {
+               CacheJobInfo *job_info;
+
+               job_info = pixbuf_cache->prev_job + i;
+               if (job_info->surface)
+                       ev_document_misc_invert_surface (job_info->surface);
+
+               job_info = pixbuf_cache->next_job + i;
+               if (job_info->surface)
+                       ev_document_misc_invert_surface (job_info->surface);
+       }
+
+       for (i = 0; i < PAGE_CACHE_LEN (pixbuf_cache); i++) {
+               CacheJobInfo *job_info;
+
+               job_info = pixbuf_cache->job_list + i;
+               if (job_info->surface)
+                       ev_document_misc_invert_surface (job_info->surface);
+       }
+}
+
 cairo_surface_t *
 ev_pixbuf_cache_get_surface (EvPixbufCache *pixbuf_cache,
                             gint           page)
@@ -893,16 +909,13 @@ new_selection_surface_needed (EvPixbufCache *pixbuf_cache,
                              gint           page,
                              gfloat         scale)
 {
-       EvPageCache *page_cache;
-
        if (job_info->selection && job_info->rc) {
                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, job_info->rc->rotation,
+                                                      &width, &height);
 
                selection_width = cairo_image_surface_get_width (job_info->selection);
                selection_height = cairo_image_surface_get_height (job_info->selection);
@@ -1116,7 +1129,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;
@@ -1127,8 +1139,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++) {
@@ -1174,7 +1184,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;
@@ -1201,7 +1211,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;
@@ -1209,8 +1218,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++) {
@@ -1246,7 +1253,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) {
@@ -1264,7 +1271,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,
@@ -1272,18 +1279,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);
 }