[Xfce4-commits] <ristretto:master> Improve the rendering of the background-color, add management of the adjustments.
Stephan Arts
noreply at xfce.org
Mon Aug 8 15:04:07 CEST 2011
Updating branch refs/heads/master
to 777433e8be174ada99a1cdbe8bc945563fba1ecb (commit)
from bd53ac198cbee5b3e4e90076e1c9739dc46840cf (commit)
commit 777433e8be174ada99a1cdbe8bc945563fba1ecb
Author: Stephan Arts <stephan at xfce.org>
Date: Tue Jul 26 20:06:43 2011 +0200
Improve the rendering of the background-color,
add management of the adjustments.
src/image_viewer.c | 137 ++++++++++++++++++++++++++++++++++++++--------------
1 files changed, 101 insertions(+), 36 deletions(-)
diff --git a/src/image_viewer.c b/src/image_viewer.c
index 734efd7..e5337ab 100644
--- a/src/image_viewer.c
+++ b/src/image_viewer.c
@@ -63,6 +63,10 @@ struct _RsttoImageViewerPriv
gdouble scale;
gboolean auto_scale;
+ gdouble image_scale;
+ gint image_width;
+ gint image_height;
+
struct
{
gint idle_id;
@@ -93,6 +97,10 @@ struct _RsttoImageViewerTransaction
GCancellable *cancellable;
GdkPixbufLoader *loader;
+ gint image_width;
+ gint image_height;
+ gdouble image_scale;
+
/* File I/O data */
/*****************/
guchar *buffer;
@@ -197,6 +205,8 @@ rstto_image_viewer_init(RsttoImageViewer *viewer)
viewer->priv = g_new0(RsttoImageViewerPriv, 1);
viewer->priv->cb_value_changed = cb_rstto_image_viewer_value_changed;
viewer->priv->settings = rstto_settings_new();
+ viewer->priv->image_width = 0;
+ viewer->priv->image_height = 0;
gtk_widget_set_double_buffered (GTK_WIDGET(viewer), TRUE);
@@ -317,7 +327,6 @@ rstto_image_viewer_size_request(GtkWidget *widget, GtkRequisition *requisition)
* @widget:
* @allocation:
*
- *
*/
static void
rstto_image_viewer_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
@@ -334,17 +343,14 @@ rstto_image_viewer_size_allocate(GtkWidget *widget, GtkAllocation *allocation)
allocation->width - border_width * 2,
allocation->height - border_width * 2);
- viewer->hadjustment->page_size = allocation->width;
- gtk_adjustment_changed(viewer->hadjustment);
-
- viewer->vadjustment->page_size = allocation->height;
- gtk_adjustment_changed(viewer->vadjustment);
+ gtk_adjustment_set_page_size (viewer->hadjustment, ((gdouble)allocation->width));
+ gtk_adjustment_set_page_size (viewer->vadjustment, ((gdouble)allocation->height));
}
/**
* TODO: Check if we really nead a refresh
* This is required for the occasions the widget is
- * resized and shrunk, because that won't trigger an expose event.
+ * resized and shrunk, because that apparently won't trigger an expose event.
*/
rstto_image_viewer_queued_repaint (viewer, TRUE);
}
@@ -396,13 +402,20 @@ rstto_image_viewer_set_scroll_adjustments(RsttoImageViewer *viewer, GtkAdjustmen
viewer->hadjustment = hadjustment;
viewer->vadjustment = vadjustment;
+
if(viewer->hadjustment)
{
+ gtk_adjustment_set_lower (viewer->hadjustment, 0);
+ gtk_adjustment_set_upper (viewer->hadjustment, 0);
+
g_signal_connect(G_OBJECT(viewer->hadjustment), "value-changed", (GCallback)viewer->priv->cb_value_changed, viewer);
g_object_ref(viewer->hadjustment);
}
if(viewer->vadjustment)
{
+ gtk_adjustment_set_lower (viewer->vadjustment, 0);
+ gtk_adjustment_set_upper (viewer->vadjustment, 0);
+
g_signal_connect(G_OBJECT(viewer->vadjustment), "value-changed", (GCallback)viewer->priv->cb_value_changed, viewer);
g_object_ref(viewer->vadjustment);
}
@@ -412,7 +425,6 @@ rstto_image_viewer_set_scroll_adjustments(RsttoImageViewer *viewer, GtkAdjustmen
static void
rstto_image_viewer_paint (GtkWidget *widget)
{
-
RsttoImageViewer *viewer = RSTTO_IMAGE_VIEWER (widget);
GdkColor *bg_color = NULL;
@@ -461,6 +473,7 @@ rstto_image_viewer_paint (GtkWidget *widget)
gdk_colormap_alloc_color (gdk_gc_get_colormap (gc), bg_color, FALSE, TRUE);
gdk_gc_set_rgb_bg_color (gc, bg_color);
+ gdk_gc_set_foreground (gc, bg_color);
gdk_draw_rectangle(GDK_DRAWABLE(buffer), gc, TRUE, 0, 0, widget->allocation.width, widget->allocation.height);
@@ -774,7 +787,6 @@ rstto_image_viewer_set_file (RsttoImageViewer *viewer, GFile *file)
static void
rstto_image_viewer_load_image (RsttoImageViewer *viewer, GFile *file)
{
-
/*
* This will first need to return to the 'main' loop before it cleans up after itself.
* We can forget about the transaction, once it's cancelled, it will clean-up itself. -- (it should)
@@ -854,6 +866,7 @@ rstto_image_viewer_get_scale (RsttoImageViewer *viewer)
static void
cb_rstto_image_viewer_value_changed(GtkAdjustment *adjustment, RsttoImageViewer *viewer)
{
+ rstto_image_viewer_queued_repaint (viewer, TRUE);
}
static void
@@ -864,10 +877,8 @@ cb_rstto_image_viewer_read_file_ready (GObject *source_object, GAsyncResult *res
GFileInputStream *file_input_stream = g_file_read_finish (file, result, NULL);
- /* TODO: FIXME -- Clean up the transaction*/
if (file_input_stream == NULL)
{
- rstto_image_viewer_transaction_free (transaction);
return;
}
@@ -887,11 +898,9 @@ cb_rstto_image_viewer_read_input_stream_ready (GObject *source_object, GAsyncRes
RsttoImageViewerTransaction *transaction = (RsttoImageViewerTransaction *)user_data;
gssize read_bytes = g_input_stream_read_finish (G_INPUT_STREAM (source_object), result, &error);
- /* TODO: FIXME -- Clean up the transaction*/
if (read_bytes == -1)
{
gdk_pixbuf_loader_close (transaction->loader, NULL);
- rstto_image_viewer_transaction_free (transaction);
return;
}
@@ -902,7 +911,6 @@ cb_rstto_image_viewer_read_input_stream_ready (GObject *source_object, GAsyncRes
g_input_stream_close (G_INPUT_STREAM (source_object), NULL, NULL);
gdk_pixbuf_loader_close (transaction->loader, NULL);
- rstto_image_viewer_transaction_free (transaction);
}
else
{
@@ -920,10 +928,6 @@ cb_rstto_image_viewer_read_input_stream_ready (GObject *source_object, GAsyncRes
g_input_stream_close (G_INPUT_STREAM (source_object), NULL, NULL);
gdk_pixbuf_loader_close (transaction->loader, NULL);
- if (g_cancellable_is_cancelled(transaction->cancellable))
- {
- rstto_image_viewer_transaction_free (transaction);
- }
}
}
@@ -970,20 +974,8 @@ cb_rstto_image_loader_size_prepared (GdkPixbufLoader *loader, gint width, gint h
gint s_width = gdk_screen_get_width (default_screen);
gint s_height = gdk_screen_get_height (default_screen);
- /* TODO:
- * place these values inside the transaction
- * so the adjustments get adjusted at a later time
- */
- RsttoImageViewer *viewer = transaction->viewer;
-
- viewer->hadjustment->upper = width;
- viewer->hadjustment->lower = 0;
- gtk_adjustment_changed(viewer->hadjustment);
-
- viewer->vadjustment->upper = height;
- viewer->vadjustment->lower = 0;
- gtk_adjustment_changed(viewer->vadjustment);
- /****************************/
+ transaction->image_width = width;
+ transaction->image_height = height;
/*
* Set the maximum size of the loaded image to the screen-size.
@@ -991,7 +983,21 @@ cb_rstto_image_loader_size_prepared (GdkPixbufLoader *loader, gint width, gint h
*/
if (s_width < width || s_height < height)
{
- gdk_pixbuf_loader_set_size (loader, s_width, s_height);
+ /*
+ * The image is loaded at the screen_size, calculate how this fits best.
+ * scale = MIN(width / screen_width, height / screen_height)
+ *
+ */
+ if(((gdouble)width / (gdouble)s_width) < ((gdouble)height / (gdouble)s_height))
+ {
+ transaction->image_scale = (gdouble)s_width / (gdouble)width;
+ gdk_pixbuf_loader_set_size (loader, s_width, (gint)((gdouble)height/(gdouble)width*(gdouble)s_width));
+ }
+ else
+ {
+ transaction->image_scale = (gdouble)s_height / (gdouble)height;
+ gdk_pixbuf_loader_set_size (loader, (gint)((gdouble)width/(gdouble)height*(gdouble)s_width), s_height);
+ }
}
}
@@ -999,6 +1005,19 @@ cb_rstto_image_loader_size_prepared (GdkPixbufLoader *loader, gint width, gint h
static void
cb_rstto_image_loader_closed (GdkPixbufLoader *loader, RsttoImageViewerTransaction *transaction)
{
+ RsttoImageViewer *viewer = transaction->viewer;
+
+ if (viewer->priv->transaction == transaction)
+ {
+ viewer->priv->image_scale = transaction->image_scale;
+ viewer->priv->image_width = transaction->image_width;
+ viewer->priv->image_height = transaction->image_height;
+ }
+
+ if (g_cancellable_is_cancelled(transaction->cancellable))
+ {
+ rstto_image_viewer_transaction_free (transaction);
+ }
rstto_image_viewer_queued_repaint (transaction->viewer, TRUE);
}
@@ -1079,7 +1098,7 @@ cb_rstto_image_viewer_queued_repaint (RsttoImageViewer *viewer)
* widget-dimensions and image-dimensions, the smallest
* one is used for scaling the image.
*/
- if (h_scale > v_scale)
+ if (h_scale < v_scale)
{
viewer->priv->scale = v_scale;
}
@@ -1088,6 +1107,7 @@ cb_rstto_image_viewer_queued_repaint (RsttoImageViewer *viewer)
viewer->priv->scale = h_scale;
}
+
viewer->priv->auto_scale = TRUE;
/*
@@ -1126,15 +1146,52 @@ cb_rstto_image_viewer_queued_repaint (RsttoImageViewer *viewer)
}
}
}
- /**
- * TODO: subpixbuf stuff for zooming
+
+ /*
+ *
*
*/
+ if ((gtk_adjustment_get_page_size (viewer->vadjustment) + gtk_adjustment_get_value(viewer->vadjustment)) > (height*viewer->priv->scale))
+ {
+ gtk_adjustment_set_value (viewer->vadjustment,
+ (height*viewer->priv->scale) - gtk_adjustment_get_page_size (viewer->vadjustment));
+ }
+ if ((gtk_adjustment_get_page_size (viewer->hadjustment) + gtk_adjustment_get_value(viewer->hadjustment)) > (width*viewer->priv->scale))
+ {
+ gtk_adjustment_set_value (viewer->hadjustment,
+ (width*viewer->priv->scale) - gtk_adjustment_get_page_size (viewer->hadjustment));
+ }
+ if (gtk_adjustment_get_page_size (viewer->vadjustment) > 0)
+ {
+ GdkPixbuf *tmp_pixbuf = gdk_pixbuf_new_subpixbuf (viewer->priv->pixbuf,
+ (gint)(gtk_adjustment_get_value (viewer->hadjustment) / viewer->priv->scale),
+ (gint)(gtk_adjustment_get_value (viewer->vadjustment) / viewer->priv->scale),
+ (gint)((gtk_adjustment_get_page_size (viewer->hadjustment) / viewer->priv->scale) < width)?
+ (gtk_adjustment_get_page_size (viewer->hadjustment) / viewer->priv->scale):
+ (width),
+ (gint)((gtk_adjustment_get_page_size (viewer->vadjustment) / viewer->priv->scale) < height)?
+ (gtk_adjustment_get_page_size (viewer->vadjustment) / viewer->priv->scale):
+ (height));
+
+ viewer->priv->dst_pixbuf = gdk_pixbuf_scale_simple (tmp_pixbuf,
+ (gint)(gdk_pixbuf_get_width(tmp_pixbuf)*viewer->priv->scale),
+ (gint)(gdk_pixbuf_get_height(tmp_pixbuf)*viewer->priv->scale),
+ GDK_INTERP_BILINEAR);
+ }
+ /*
viewer->priv->dst_pixbuf = gdk_pixbuf_scale_simple (viewer->priv->pixbuf,
(gint)((gdouble)width*viewer->priv->scale),
(gint)((gdouble)height*viewer->priv->scale),
GDK_INTERP_BILINEAR);
+ */
+
+ /*
+ * Set adjustments
+ */
+ gtk_adjustment_set_upper (viewer->hadjustment, (gdouble)width*(viewer->priv->scale));
+ gtk_adjustment_set_upper (viewer->vadjustment, (gdouble)height*(viewer->priv->scale));
+
}
else
{
@@ -1143,7 +1200,15 @@ cb_rstto_image_viewer_queued_repaint (RsttoImageViewer *viewer)
g_object_unref (viewer->priv->dst_pixbuf);
viewer->priv->dst_pixbuf = NULL;
}
+
+ /*
+ * Set adjustments
+ */
+ gtk_adjustment_set_upper (viewer->hadjustment, 0);
+ gtk_adjustment_set_upper (viewer->vadjustment, 0);
}
+
+
rstto_image_viewer_paint (GTK_WIDGET (viewer));
}
More information about the Xfce4-commits
mailing list