[evince] [libview] Invert colors of pages after rendering when inverted colors option is enabled



commit 139f0ec4a2f5fe022b9a7d5848b5998615f81834
Author: Carlos Garcia Campos <carlosgc gnome org>
Date:   Sun Nov 29 15:57:08 2009 +0100

    [libview] Invert colors of pages after rendering when inverted colors option is enabled
    
    See bgo#321823.

 libview/ev-pixbuf-cache.c |   36 ++++++++++++++++++++++++++++++++++++
 libview/ev-pixbuf-cache.h |    4 +++-
 libview/ev-view.c         |   21 +++++++++++++++++++++
 3 files changed, 60 insertions(+), 1 deletions(-)
---
diff --git a/libview/ev-pixbuf-cache.c b/libview/ev-pixbuf-cache.c
index df06705..d0f8644 100644
--- a/libview/ev-pixbuf-cache.c
+++ b/libview/ev-pixbuf-cache.c
@@ -45,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
@@ -468,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) {
@@ -759,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)
diff --git a/libview/ev-pixbuf-cache.h b/libview/ev-pixbuf-cache.h
index 4ab0fce..94673c2 100644
--- a/libview/ev-pixbuf-cache.h
+++ b/libview/ev-pixbuf-cache.h
@@ -80,7 +80,9 @@ void           ev_pixbuf_cache_reload_page 	    (EvPixbufCache *pixbuf_cache,
 						     GdkRegion     *region,
                     				     gint           page,
 			                             gint           rotation,
-                         			     gdouble         scale);
+						     gdouble        scale);
+void           ev_pixbuf_cache_set_inverted_colors  (EvPixbufCache *pixbuf_cache,
+						     gboolean       inverted_colors);
 /* Selection */
 cairo_surface_t *ev_pixbuf_cache_get_selection_surface (EvPixbufCache *pixbuf_cache,
 							gint           page,
diff --git a/libview/ev-view.c b/libview/ev-view.c
index 28c8f82..f0502b4 100644
--- a/libview/ev-view.c
+++ b/libview/ev-view.c
@@ -5066,8 +5066,12 @@ ev_view_new (void)
 static void
 setup_caches (EvView *view)
 {
+	gboolean inverted_colors;
+
 	view->height_to_page_cache = ev_view_get_height_to_page_cache (view);
 	view->pixbuf_cache = ev_pixbuf_cache_new (GTK_WIDGET (view), view->document);
+	inverted_colors = ev_document_model_get_inverted_colors (view->model);
+	ev_pixbuf_cache_set_inverted_colors (view->pixbuf_cache, inverted_colors);
 	g_signal_connect (view->pixbuf_cache, "job-finished", G_CALLBACK (job_finished_cb), view);
 }
 
@@ -5220,6 +5224,20 @@ ev_view_rotation_changed_cb (EvDocumentModel *model,
 }
 
 static void
+ev_view_inverted_colors_changed_cb (EvDocumentModel *model,
+				    GParamSpec      *pspec,
+				    EvView          *view)
+{
+	if (view->pixbuf_cache) {
+		gboolean inverted_colors;
+
+		inverted_colors = ev_document_model_get_inverted_colors (model);
+		ev_pixbuf_cache_set_inverted_colors (view->pixbuf_cache, inverted_colors);
+		gtk_widget_queue_resize (GTK_WIDGET (view));
+	}
+}
+
+static void
 ev_view_sizing_mode_changed_cb (EvDocumentModel *model,
 				GParamSpec      *pspec,
 				EvView          *view)
@@ -5318,6 +5336,9 @@ ev_view_set_model (EvView          *view,
 	g_signal_connect (view->model, "notify::rotation",
 			  G_CALLBACK (ev_view_rotation_changed_cb),
 			  view);
+	g_signal_connect (view->model, "notify::inverted-colors",
+			  G_CALLBACK (ev_view_inverted_colors_changed_cb),
+			  view);
 	g_signal_connect (view->model, "notify::sizing-mode",
 			  G_CALLBACK (ev_view_sizing_mode_changed_cb),
 			  view);



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]