diff src/pixbuf-renderer.c @ 1045:0ab0deb0cfcc

added possibility to redraw only the parts of image that are already loaded
author nadvornik
date Mon, 08 Sep 2008 19:57:51 +0000
parents 5fc64d6252e7
children 81ec7d977d5f
line wrap: on
line diff
--- a/src/pixbuf-renderer.c	Mon Sep 08 15:53:01 2008 +0000
+++ b/src/pixbuf-renderer.c	Mon Sep 08 19:57:51 2008 +0000
@@ -181,6 +181,7 @@
 	PR_ZOOM_NEW		= 1 << 1,
 	PR_ZOOM_CENTER		= 1 << 2,
 	PR_ZOOM_INVALIDATE	= 1 << 3,
+	PR_ZOOM_LAZY		= 1 << 4  /* wait with redraw for pixbuf_renderer_area_changed */
 } PrZoomFlags;
 
 static guint signals[SIGNAL_COUNT] = { 0 };
@@ -3192,6 +3193,7 @@
 	gboolean force = !!(flags & PR_ZOOM_FORCE);
 	gboolean new = !!(flags & PR_ZOOM_NEW);
 	gboolean invalidate = !!(flags & PR_ZOOM_INVALIDATE);
+	gboolean lazy = !!(flags & PR_ZOOM_LAZY);
 
 	zoom = CLAMP(zoom, pr->zoom_min, pr->zoom_max);
 
@@ -3285,7 +3287,7 @@
 	if (invalidate || invalid)
 		{
 		pr_tile_invalidate_all(pr);
-		pr_redraw(pr, TRUE);
+		if (!lazy) pr_redraw(pr, TRUE);
 		}
 	if (redrawn) *redrawn = (invalidate || invalid);
 
@@ -3305,6 +3307,7 @@
 	gboolean center_point = !!(flags & PR_ZOOM_CENTER);
 	gboolean force = !!(flags & PR_ZOOM_FORCE);
 	gboolean new = !!(flags & PR_ZOOM_NEW);
+	gboolean lazy = !!(flags & PR_ZOOM_LAZY);
 	PrZoomFlags clamp_flags = flags;
 	gdouble old_center_x = pr->norm_center_x;
 	gdouble old_center_y = pr->norm_center_y;
@@ -3325,6 +3328,7 @@
 		}
 
 	if (force) clamp_flags |= PR_ZOOM_INVALIDATE;
+	if (lazy) clamp_flags |= PR_ZOOM_LAZY;
 	if (!pr_zoom_clamp(pr, zoom, clamp_flags, &redrawn)) return;
 
 	clamped = pr_size_clamp(pr);
@@ -3374,7 +3378,15 @@
 	 * so redraw the window anyway :/
 	 */
 	if (sized || clamped) pr_border_clear(pr);
-	pr_redraw(pr, redrawn);
+	
+	if (lazy)
+		{
+		pr_queue_clear(pr);
+		}
+	else
+		{
+		pr_redraw(pr, redrawn);
+		}
 
 	pr_scroll_notify_signal(pr);
 	pr_zoom_signal(pr);
@@ -3820,8 +3832,12 @@
 		}
 }
 
-static void pr_pixbuf_sync(PixbufRenderer *pr, gdouble zoom)
+static void pr_set_pixbuf(PixbufRenderer *pr, GdkPixbuf *pixbuf, gdouble zoom, PrZoomFlags flags)
 {
+	if (pixbuf) g_object_ref(pixbuf);
+	if (pr->pixbuf) g_object_unref(pr->pixbuf);
+	pr->pixbuf = pixbuf;
+
 	if (!pr->pixbuf)
 		{
 		GtkWidget *box;
@@ -3845,16 +3861,7 @@
 		}
 
 	pr_pixbuf_size_sync(pr);
-	pr_zoom_sync(pr, zoom, PR_ZOOM_FORCE | PR_ZOOM_NEW, 0, 0);
-}
-
-static void pr_set_pixbuf(PixbufRenderer *pr, GdkPixbuf *pixbuf, gdouble zoom)
-{
-	if (pixbuf) g_object_ref(pixbuf);
-	if (pr->pixbuf) g_object_unref(pr->pixbuf);
-	pr->pixbuf = pixbuf;
-
-	pr_pixbuf_sync(pr, zoom);
+	pr_zoom_sync(pr, zoom, flags | PR_ZOOM_FORCE | PR_ZOOM_NEW, 0, 0);
 }
 
 void pixbuf_renderer_set_pixbuf(PixbufRenderer *pr, GdkPixbuf *pixbuf, gdouble zoom)
@@ -3863,7 +3870,19 @@
 
 	pr_source_tile_unset(pr);
 
-	pr_set_pixbuf(pr, pixbuf, zoom);
+	pr_set_pixbuf(pr, pixbuf, zoom, 0);
+
+	pr_update_signal(pr);
+}
+
+void pixbuf_renderer_set_pixbuf_lazy(PixbufRenderer *pr, GdkPixbuf *pixbuf, gdouble zoom, gint orientation)
+{
+	g_return_if_fail(IS_PIXBUF_RENDERER(pr));
+
+	pr_source_tile_unset(pr);
+
+	pr->orientation = orientation;
+	pr_set_pixbuf(pr, pixbuf, zoom, PR_ZOOM_LAZY);
 
 	pr_update_signal(pr);
 }