[gthumb: 37/40] removed unnecessary operations when the original size is ready



commit b426544b399e377075f200ade64cb332056c3a65
Author: Paolo Bacchilega <paobac src gnome org>
Date:   Fri Sep 10 10:22:08 2010 +0200

    removed unnecessary operations when the original size is ready
    
    do not reset the zoom and reload the metadata when the
    image has been loaded at the original size.

 extensions/image_viewer/gth-image-viewer-page.c |   50 ++++++++++++++++++-----
 gthumb/gth-image-preloader.c                    |   43 ++++++++++++++++++-
 gthumb/gth-image-preloader.h                    |    8 +++-
 gthumb/gth-image-viewer.c                       |   45 ++++++++++++++++-----
 gthumb/gth-image-viewer.h                       |    4 ++
 5 files changed, 127 insertions(+), 23 deletions(-)
---
diff --git a/extensions/image_viewer/gth-image-viewer-page.c b/extensions/image_viewer/gth-image-viewer-page.c
index 1c846f0..85c95fe 100644
--- a/extensions/image_viewer/gth-image-viewer-page.c
+++ b/extensions/image_viewer/gth-image-viewer-page.c
@@ -39,7 +39,8 @@ struct _GthImageViewerPagePrivate {
 	guint              merge_id;
 	GthImageHistory   *history;
 	GthFileData       *file_data;
-	gulong             preloader_sig_id;
+	gulong             requested_ready_id;
+	gulong             original_size_ready_id;
 	guint              cnxn_id[GCONF_NOTIFICATIONS];
 	guint              hide_mouse_timeout;
 	guint              motion_signal;
@@ -302,15 +303,12 @@ image_preloader_requested_ready_cb (GthImagePreloader  *preloader,
 	}
 
 	gth_viewer_page_focus (GTH_VIEWER_PAGE (self));
-
 	gth_image_viewer_set_animation (GTH_IMAGE_VIEWER (self->priv->viewer),
 					animation,
 					original_width,
 					original_height);
-
 	if (self->priv->shrink_wrap)
 		gth_image_viewer_page_shrink_wrap (self, TRUE);
-
 	gth_image_history_clear (self->priv->history);
 	gth_image_history_add_image (self->priv->history,
 				     gth_image_viewer_get_current_pixbuf (GTH_IMAGE_VIEWER (self->priv->viewer)),
@@ -320,6 +318,32 @@ image_preloader_requested_ready_cb (GthImagePreloader  *preloader,
 
 
 static void
+image_preloader_original_size_ready_cb (GthImagePreloader  *preloader,
+				        GthFileData        *requested,
+				        GdkPixbufAnimation *animation,
+				        int                 original_width,
+				        int                 original_height,
+				        GError             *error,
+				        GthImageViewerPage *self)
+{
+	if (! _g_file_equal (requested->file, self->priv->file_data->file))
+		return;
+
+	if (error != NULL)
+		return;
+
+	gth_image_viewer_set_better_quality (GTH_IMAGE_VIEWER (self->priv->viewer),
+					     animation,
+					     original_width,
+					     original_height);
+	gth_image_history_clear (self->priv->history);
+	gth_image_history_add_image (self->priv->history,
+				     gth_image_viewer_get_current_pixbuf (GTH_IMAGE_VIEWER (self->priv->viewer)),
+				     FALSE);
+}
+
+
+static void
 pref_zoom_quality_changed (GConfClient *client,
 			   guint        cnxn_id,
 			   GConfEntry  *entry,
@@ -452,10 +476,14 @@ gth_image_viewer_page_real_activate (GthViewerPage *base,
 	gtk_ui_manager_insert_action_group (gth_browser_get_ui_manager (browser), self->priv->actions, 0);
 
 	self->priv->preloader = gth_browser_get_image_preloader (browser);
-	self->priv->preloader_sig_id = g_signal_connect (G_OBJECT (self->priv->preloader),
-							 "requested_ready",
-							 G_CALLBACK (image_preloader_requested_ready_cb),
-							 self);
+	self->priv->requested_ready_id = g_signal_connect (G_OBJECT (self->priv->preloader),
+							   "requested_ready",
+							   G_CALLBACK (image_preloader_requested_ready_cb),
+							   self);
+	self->priv->original_size_ready_id = g_signal_connect (G_OBJECT (self->priv->preloader),
+							       "original_size_ready",
+							       G_CALLBACK (image_preloader_original_size_ready_cb),
+							       self);
 
 	self->priv->viewer = gth_image_viewer_new ();
 	gth_image_viewer_set_zoom_quality (GTH_IMAGE_VIEWER (self->priv->viewer), eel_gconf_get_enum (PREF_ZOOM_QUALITY, GTH_TYPE_ZOOM_QUALITY, GTH_ZOOM_QUALITY_HIGH));
@@ -572,8 +600,10 @@ gth_image_viewer_page_real_deactivate (GthViewerPage *base)
 	g_object_unref (self->priv->actions);
 	self->priv->actions = NULL;
 
-	g_signal_handler_disconnect (self->priv->preloader, self->priv->preloader_sig_id);
-	self->priv->preloader_sig_id = 0;
+	g_signal_handler_disconnect (self->priv->preloader, self->priv->requested_ready_id);
+	g_signal_handler_disconnect (self->priv->preloader, self->priv->original_size_ready_id);
+	self->priv->requested_ready_id = 0;
+	self->priv->original_size_ready_id = 0;
 
 	g_object_unref (self->priv->preloader);
 	self->priv->preloader = NULL;
diff --git a/gthumb/gth-image-preloader.c b/gthumb/gth-image-preloader.c
index 5b81305..bf57b54 100644
--- a/gthumb/gth-image-preloader.c
+++ b/gthumb/gth-image-preloader.c
@@ -36,6 +36,7 @@
 
 enum {
 	REQUESTED_READY,
+	ORIGINAL_SIZE_READY,
 	LAST_SIGNAL
 };
 
@@ -175,6 +176,30 @@ preloader_needs_second_step (Preloader *preloader)
 }
 
 
+static int
+preloader_signal_to_emit (Preloader *preloader)
+{
+	int signal = -1;
+
+	switch (preloader->self->priv->load_policy) {
+	case GTH_LOAD_POLICY_ONE_STEP:
+		signal = REQUESTED_READY;
+		break;
+
+	case GTH_LOAD_POLICY_TWO_STEPS:
+		if (preloader->self->priv->requested_size == -1)
+			signal = ORIGINAL_SIZE_READY;
+		else
+			signal = REQUESTED_READY;
+		break;
+	}
+
+	g_assert (signal != -1);
+
+	return signal;
+}
+
+
 /* -- GthImagePreloader -- */
 
 
@@ -228,6 +253,20 @@ gth_image_preloader_class_init (GthImagePreloaderClass *class)
 			      G_TYPE_INT,
 			      G_TYPE_INT,
 			      G_TYPE_POINTER);
+	gth_image_preloader_signals[ORIGINAL_SIZE_READY] =
+		g_signal_new ("original_size_ready",
+			      G_TYPE_FROM_CLASS (class),
+			      G_SIGNAL_RUN_LAST,
+			      G_STRUCT_OFFSET (GthImagePreloaderClass, original_size_ready),
+			      NULL, NULL,
+			      gth_marshal_VOID__OBJECT_OBJECT_INT_INT_POINTER,
+			      G_TYPE_NONE,
+			      5,
+			      G_TYPE_OBJECT,
+			      G_TYPE_OBJECT,
+			      G_TYPE_INT,
+			      G_TYPE_INT,
+			      G_TYPE_POINTER);
 
 	object_class = G_OBJECT_CLASS (class);
 	object_class->finalize = gth_image_preloader_finalize;
@@ -389,7 +428,7 @@ image_loader_ready_cb (GObject      *source_object,
 #endif
 
 		g_signal_emit (G_OBJECT (self),
-			       gth_image_preloader_signals[REQUESTED_READY],
+			       gth_image_preloader_signals[preloader_signal_to_emit (preloader)],
 			       0,
 			       preloader->file_data,
 			       preloader->animation,
@@ -571,7 +610,7 @@ assign_loaders (LoadData *load_data)
 					self->priv->requested = i;
 
 					g_signal_emit (G_OBJECT (self),
-							gth_image_preloader_signals[REQUESTED_READY],
+							gth_image_preloader_signals[preloader_signal_to_emit (preloader)],
 							0,
 							preloader->file_data,
 							preloader->animation,
diff --git a/gthumb/gth-image-preloader.h b/gthumb/gth-image-preloader.h
index 46fdbff..c2db0b4 100644
--- a/gthumb/gth-image-preloader.h
+++ b/gthumb/gth-image-preloader.h
@@ -54,7 +54,13 @@ struct _GthImagePreloaderClass {
 
 	/*< signals >*/
 
-	void      (* requested_ready)  (GthImagePreloader  *preloader,
+	void  (* requested_ready)      (GthImagePreloader  *preloader,
+					GthFileData        *requested,
+					GdkPixbufAnimation *animation,
+					int                 original_width,
+					int                 original_height,
+					GError             *error);
+	void  (* original_size_ready)  (GthImagePreloader  *preloader,
 					GthFileData        *requested,
 					GdkPixbufAnimation *animation,
 					int                 original_width,
diff --git a/gthumb/gth-image-viewer.c b/gthumb/gth-image-viewer.c
index 085366c..62a85b7 100644
--- a/gthumb/gth-image-viewer.c
+++ b/gthumb/gth-image-viewer.c
@@ -1616,17 +1616,21 @@ _gth_image_viewer_set_original_size (GthImageViewer *self,
 
 
 static void
-_gth_image_viewer_content_changed (GthImageViewer *self)
+_gth_image_viewer_content_changed (GthImageViewer *self,
+				   gboolean        better_quality)
 {
 	halt_animation (self);
 
-	if (self->priv->reset_scrollbars) {
+	if (! better_quality && self->priv->reset_scrollbars) {
 		self->x_offset = 0;
 		self->y_offset = 0;
 	}
 
 	gth_image_viewer_tool_image_changed (self->priv->tool);
 
+	if (better_quality)
+		return;
+
 	switch (self->priv->zoom_change) {
 	case GTH_ZOOM_CHANGE_ACTUAL_SIZE:
 		gth_image_viewer_set_zoom (self, 1.0);
@@ -1660,11 +1664,12 @@ _gth_image_viewer_content_changed (GthImageViewer *self)
 }
 
 
-void
-gth_image_viewer_set_animation (GthImageViewer     *self,
-				GdkPixbufAnimation *animation,
-				int                 original_width,
-				int                 original_height)
+static void
+_set_animation (GthImageViewer     *self,
+		GdkPixbufAnimation *animation,
+		int                 original_width,
+		int                 original_height,
+		gboolean            better_quality)
 {
 	g_return_if_fail (self != NULL);
 
@@ -1681,7 +1686,27 @@ gth_image_viewer_set_animation (GthImageViewer     *self,
 	}
 	_gth_image_viewer_set_original_size (self, original_width, original_height);
 
-	_gth_image_viewer_content_changed (self);
+	_gth_image_viewer_content_changed (self, better_quality);
+}
+
+
+void
+gth_image_viewer_set_animation (GthImageViewer     *self,
+				GdkPixbufAnimation *animation,
+				int                 original_width,
+				int                 original_height)
+{
+	_set_animation (self, animation, original_width, original_height, FALSE);
+}
+
+
+void
+gth_image_viewer_set_better_quality (GthImageViewer     *self,
+				     GdkPixbufAnimation *animation,
+				     int                 original_width,
+				     int                 original_height)
+{
+	_set_animation (self, animation, original_width, original_height, TRUE);
 }
 
 
@@ -1702,7 +1727,7 @@ gth_image_viewer_set_pixbuf (GthImageViewer *self,
 	self->priv->is_animation = FALSE;
 	_gth_image_viewer_set_original_size (self, original_width, original_height);
 
-	_gth_image_viewer_content_changed (self);
+	_gth_image_viewer_content_changed (self, FALSE);
 }
 
 
@@ -1718,7 +1743,7 @@ gth_image_viewer_set_void (GthImageViewer *self)
 	self->priv->is_void = TRUE;
 	self->priv->is_animation = FALSE;
 
-	_gth_image_viewer_content_changed (self);
+	_gth_image_viewer_content_changed (self, FALSE);
 }
 
 
diff --git a/gthumb/gth-image-viewer.h b/gthumb/gth-image-viewer.h
index 6273042..c789f25 100644
--- a/gthumb/gth-image-viewer.h
+++ b/gthumb/gth-image-viewer.h
@@ -157,6 +157,10 @@ void           gth_image_viewer_set_pixbuf               (GthImageViewer     *vi
 							  GdkPixbuf          *pixbuf,
 							  int                 original_width,
 							  int                 original_height);
+void           gth_image_viewer_set_better_quality       (GthImageViewer     *viewer,
+							  GdkPixbufAnimation *animation,
+							  int                 original_width,
+							  int                 original_height);
 void           gth_image_viewer_set_void                 (GthImageViewer     *viewer);
 gboolean       gth_image_viewer_is_void                  (GthImageViewer     *viewer);
 void           gth_image_viewer_update_view              (GthImageViewer     *viewer);



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