[gtk+/wip/baedert/gtkimageview: 2075/2075] imageview+demo: Port to gtk4
- From: Timm Bäder <baedert src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gtk+/wip/baedert/gtkimageview: 2075/2075] imageview+demo: Port to gtk4
- Date: Sun, 12 Feb 2017 10:04:59 +0000 (UTC)
commit 229ecc72d59e88f0cfa1ac9fe6cd8d632f733823
Author: Timm Bäder <mail baedert org>
Date: Sat Feb 11 10:22:53 2017 +0100
imageview+demo: Port to gtk4
demos/gtk-demo/image_view.c | 3 +-
demos/gtk-demo/image_view.ui | 2 -
gtk/gtkabstractimage.c | 2 +-
gtk/gtkimageview.c | 221 ++++++++++++++++++++++++-----------------
4 files changed, 132 insertions(+), 96 deletions(-)
---
diff --git a/demos/gtk-demo/image_view.c b/demos/gtk-demo/image_view.c
index 9c078e1..03d7c9f 100644
--- a/demos/gtk-demo/image_view.c
+++ b/demos/gtk-demo/image_view.c
@@ -33,6 +33,7 @@ file_set_cb (GtkFileChooserButton *widget,
NULL);
g_free (filename);
+ g_object_unref (file);
}
static void
@@ -259,7 +260,7 @@ do_image_view (GtkWidget *do_widget)
gtk_builder_connect_signals (builder, NULL);
gtk_window_resize (GTK_WINDOW (window), 800, 600);
- gtk_widget_show_all (window);
+ gtk_widget_show (window);
g_object_unref (builder);
diff --git a/demos/gtk-demo/image_view.ui b/demos/gtk-demo/image_view.ui
index 3dfd6b0..a7ef066 100644
--- a/demos/gtk-demo/image_view.ui
+++ b/demos/gtk-demo/image_view.ui
@@ -97,7 +97,6 @@
<child>
<object class="GtkButton">
<property name="visible">false</property>
- <property name="no_show_all">true</property>
<property name="label" translatable="yes">Load Surface</property>
<signal name="clicked" handler="load_surface_button_clicked_cb" />
</object>
@@ -112,7 +111,6 @@
<child>
<object class="GtkButton">
<property name="visible">false</property>
- <property name="no_show_all">true</property>
<property name="label" translatable="yes">Clear</property>
<signal name="clicked" handler="clear_button_clicked_cb" />
</object>
diff --git a/gtk/gtkabstractimage.c b/gtk/gtkabstractimage.c
index cd29a54..060b5db 100644
--- a/gtk/gtkabstractimage.c
+++ b/gtk/gtkabstractimage.c
@@ -45,7 +45,7 @@ gtk_abstract_image_class_init (GtkAbstractImageClass *klass)
G_SIGNAL_RUN_FIRST,
G_STRUCT_OFFSET (GtkAbstractImageClass, changed),
NULL, NULL,
- _gtk_marshal_VOID__VOID,
+ NULL,
G_TYPE_NONE, 0);
klass->changed = NULL;
diff --git a/gtk/gtkimageview.c b/gtk/gtkimageview.c
index 54fb011..24cc24e 100644
--- a/gtk/gtkimageview.c
+++ b/gtk/gtkimageview.c
@@ -53,6 +53,7 @@
#include "gtkadjustment.h"
#include "gtkabstractimage.h"
#include "gtkprogresstrackerprivate.h"
+#include "gtksnapshot.h"
#include <gdk/gdkcairo.h>
#include <math.h>
@@ -1019,23 +1020,29 @@ gtk_image_view_init (GtkImageView *image_view)
gtk_image_view_ensure_gestures (image_view);
}
-static gboolean
-gtk_image_view_draw (GtkWidget *widget, cairo_t *ct)
+static void
+gtk_image_view_snapshot (GtkWidget *widget,
+ GtkSnapshot *snapshot)
{
GtkImageView *image_view = GTK_IMAGE_VIEW (widget);
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
GtkStyleContext *sc = gtk_widget_get_style_context (widget);
+ GtkAllocation allocation;
+ cairo_t *ct;
int widget_width = gtk_widget_get_allocated_width (widget);
int widget_height = gtk_widget_get_allocated_height (widget);
double draw_x = 0;
double draw_y = 0;
- int image_width;
- int image_height;
double draw_width;
double draw_height;
+ int image_width;
+ int image_height;
double scale = 0.0;
int scale_factor;
+ gtk_widget_get_allocation (widget, &allocation);
+
+
if (priv->vadjustment && priv->hadjustment)
{
int x = - gtk_adjustment_get_value (priv->hadjustment);
@@ -1045,25 +1052,25 @@ gtk_image_view_draw (GtkWidget *widget, cairo_t *ct)
if (w > 0 && h > 0)
{
- gtk_render_background (sc, ct, x, y, w, h);
- gtk_render_frame (sc, ct, x, y, w, h);
+ gtk_snapshot_render_background (snapshot, sc, x, y, w, h);
+ gtk_snapshot_render_frame (snapshot, sc, x, y, w, h);
}
}
else
{
- gtk_render_background (sc, ct, 0, 0, widget_width, widget_height);
- gtk_render_frame (sc, ct, 0, 0, widget_width, widget_height);
+ gtk_snapshot_render_background (snapshot, sc, 0, 0, widget_width, widget_height);
+ gtk_snapshot_render_frame (snapshot, sc, 0, 0, widget_width, widget_height);
}
if (!priv->image)
- return GDK_EVENT_PROPAGATE;
+ return;
gtk_image_view_compute_bounding_box (image_view,
&draw_width, &draw_height,
&scale);
if (draw_width == 0 || draw_height == 0)
- return GDK_EVENT_PROPAGATE;
+ return;
scale_factor = gtk_abstract_image_get_scale_factor (priv->image);
if (scale_factor == 0)
@@ -1071,7 +1078,6 @@ gtk_image_view_draw (GtkWidget *widget, cairo_t *ct)
image_width = priv->image_width * scale / scale_factor;
image_height = priv->image_height* scale / scale_factor;
-
if (priv->hadjustment && priv->vadjustment)
{
draw_x = (gtk_adjustment_get_page_size (priv->hadjustment) - image_width) / 2.0;
@@ -1083,7 +1089,6 @@ gtk_image_view_draw (GtkWidget *widget, cairo_t *ct)
draw_y = (widget_height - image_height) / 2.0;
}
- cairo_rectangle (ct, 0, 0, widget_width, widget_height);
if (priv->hadjustment && draw_width >= widget_width)
{
@@ -1097,21 +1102,75 @@ gtk_image_view_draw (GtkWidget *widget, cairo_t *ct)
draw_y -= gtk_adjustment_get_value (priv->vadjustment);
}
+
+ g_message ("draw_x: %f, draw_y: %f", draw_x, draw_y);
+ g_message ("Widget width: %d, draw_width: %f, image_width: %d",
+ allocation.width, draw_width, image_width);
+
+
+ gtk_snapshot_push_clip (snapshot,
+ &GRAPHENE_RECT_INIT (
+ allocation.x,
+ allocation.y,
+ allocation.width,
+ allocation.height),
+ "GtkImageView clip");
+
+
/* Rotate around the center */
- cairo_translate (ct,
- draw_x + (image_width / 2.0),
- draw_y + (image_height / 2.0));
- cairo_rotate (ct, DEG_TO_RAD (gtk_image_view_get_real_angle (image_view)));
- cairo_translate (ct,
- - draw_x - (image_width / 2.0),
- - draw_y - (image_height / 2.0));
+ {
+ graphene_matrix_t rotate;
+ graphene_vec3_t rotate_vector;
+
+ graphene_vec3_init (&rotate_vector, 0, 0, 1);
+
+ graphene_matrix_init_identity (&rotate);
+
+
+ graphene_matrix_translate (&rotate,
+ &GRAPHENE_POINT3D_INIT(
+ -(image_width / 2),
+ -(image_height / 2),
+ 0
+ ));
+
+ graphene_matrix_rotate (&rotate,
+ gtk_image_view_get_real_angle (image_view),
+ &rotate_vector);
+
+
+ graphene_matrix_translate (&rotate,
+ &GRAPHENE_POINT3D_INIT(
+ (image_width / 2),
+ (image_height / 2),
+ 0
+ ));
+
+
+ graphene_matrix_scale (&rotate, scale, scale, 1);
+
+ graphene_matrix_translate (&rotate,
+ &GRAPHENE_POINT3D_INIT (draw_x, draw_y, 0));
+
+ gtk_snapshot_push_transform (snapshot, &rotate, "ImageView rotate");
- cairo_scale (ct, scale, scale);
- cairo_translate (ct, draw_x / scale, draw_y / scale);
- gtk_abstract_image_draw (priv->image, ct);
- cairo_paint (ct);
+ ct = gtk_snapshot_append_cairo (snapshot,
+ &GRAPHENE_RECT_INIT (
+ 0,
+ 0,
+ draw_width / scale,
+ draw_height / scale
+ ),
+ "ImageView");
- return GDK_EVENT_PROPAGATE;
+ gtk_abstract_image_draw (priv->image, ct);
+ cairo_paint (ct);
+ cairo_destroy (ct);
+
+ gtk_snapshot_pop (snapshot);
+ }
+
+ gtk_snapshot_pop (snapshot); /* Clip */
}
static void
@@ -1673,37 +1732,25 @@ gtk_image_view_realize (GtkWidget *widget)
{
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (GTK_IMAGE_VIEW (widget));
GtkAllocation allocation;
- GdkWindowAttr attributes = { 0, };
GdkWindow *window;
+ GTK_WIDGET_CLASS (gtk_image_view_parent_class)->realize (widget);
+
gtk_widget_get_allocation (widget, &allocation);
- gtk_widget_set_realized (widget, TRUE);
-
- attributes.x = allocation.x;
- attributes.y = allocation.y;
- attributes.width = allocation.width;
- attributes.height = allocation.height;
- attributes.window_type = GDK_WINDOW_CHILD;
- attributes.event_mask = gtk_widget_get_events (widget) |
- GDK_POINTER_MOTION_MASK |
- GDK_BUTTON_PRESS_MASK |
- GDK_BUTTON_RELEASE_MASK |
- GDK_SMOOTH_SCROLL_MASK |
- GDK_SCROLL_MASK |
- GDK_TOUCH_MASK;
- attributes.wclass = GDK_INPUT_ONLY;
-
- window = gtk_widget_get_parent_window (widget);
-
- gtk_widget_set_window (widget, window);
- g_object_ref (G_OBJECT (window));
-
- window = gdk_window_new (gtk_widget_get_parent_window (widget),
- &attributes, GDK_WA_X | GDK_WA_Y);
+
+ window = gdk_window_new_input (gtk_widget_get_window (widget),
+ gtk_widget_get_events (widget) |
+ GDK_POINTER_MOTION_MASK |
+ GDK_BUTTON_PRESS_MASK |
+ GDK_BUTTON_RELEASE_MASK |
+ GDK_SMOOTH_SCROLL_MASK |
+ GDK_SCROLL_MASK |
+ GDK_TOUCH_MASK,
+ &allocation);
+
priv->event_window = window;
gtk_widget_register_window (widget, priv->event_window);
- gdk_window_set_user_data (window, widget);
}
static void
@@ -1783,19 +1830,24 @@ adjustment_value_changed_cb (GtkAdjustment *adjustment,
}
static void
-gtk_image_view_get_preferred_height (GtkWidget *widget,
- int *minimal,
- int *natural)
+gtk_image_view_measure (GtkWidget *widget,
+ GtkOrientation orientation,
+ int for_size,
+ int *minimum,
+ int *natural,
+ int *minimum_baseline,
+ int *natural_baselien)
{
GtkImageView *image_view = GTK_IMAGE_VIEW (widget);
GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
-
-
if (priv->fit_allocation && priv->image)
{
- *minimal = 0;
- *natural = gtk_abstract_image_get_height (priv->image);
+ *minimum = 0;
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ *natural = gtk_abstract_image_get_width (priv->image);
+ else /* VERTICAL */
+ *natural = gtk_abstract_image_get_height (priv->image);
}
else
{
@@ -1804,34 +1856,17 @@ gtk_image_view_get_preferred_height (GtkWidget *widget,
&width,
&height,
NULL);
- *minimal = height;
- *natural = height;
- }
-}
-
-static void
-gtk_image_view_get_preferred_width (GtkWidget *widget,
- int *minimal,
- int *natural)
-{
- GtkImageView *image_view = GTK_IMAGE_VIEW (widget);
- GtkImageViewPrivate *priv = gtk_image_view_get_instance_private (image_view);
- if (priv->fit_allocation && priv->image)
- {
- *minimal = 0;
- *natural = gtk_abstract_image_get_width (priv->image);
- }
- else
- {
- double width, height;
-
- gtk_image_view_compute_bounding_box (image_view,
- &width,
- &height,
- NULL);
- *minimal = width;
- *natural = width;
+ if (orientation == GTK_ORIENTATION_HORIZONTAL)
+ {
+ *minimum = (int)width;
+ *natural = (int)width;
+ }
+ else /* VERTICAL */
+ {
+ *minimum = (int)height;
+ *natural = (int)height;
+ }
}
}
@@ -1999,15 +2034,14 @@ gtk_image_view_class_init (GtkImageViewClass *view_class)
object_class->get_property = gtk_image_view_get_property;
object_class->finalize = gtk_image_view_finalize;
- widget_class->draw = gtk_image_view_draw;
- widget_class->realize = gtk_image_view_realize;
- widget_class->unrealize = gtk_image_view_unrealize;
- widget_class->size_allocate = gtk_image_view_size_allocate;
- widget_class->map = gtk_image_view_map;
- widget_class->unmap = gtk_image_view_unmap;
- widget_class->scroll_event = gtk_image_view_scroll_event;
- widget_class->get_preferred_width = gtk_image_view_get_preferred_width;
- widget_class->get_preferred_height = gtk_image_view_get_preferred_height;
+ widget_class->realize = gtk_image_view_realize;
+ widget_class->unrealize = gtk_image_view_unrealize;
+ widget_class->size_allocate = gtk_image_view_size_allocate;
+ widget_class->map = gtk_image_view_map;
+ widget_class->unmap = gtk_image_view_unmap;
+ widget_class->scroll_event = gtk_image_view_scroll_event;
+ widget_class->measure = gtk_image_view_measure;
+ widget_class->snapshot = gtk_image_view_snapshot;
/**
* GtkImageView:scale:
@@ -2221,6 +2255,9 @@ gtk_image_view_load_image_from_stream (GtkImageView *image_view,
gtk_image_view_set_abstract_image (image_view, image);
}
+
+ g_input_stream_close (input_stream, NULL, NULL);
+ g_object_unref (input_stream);
}
static void
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]