diff options
author | Timm Bäder <mail@baedert.org> | 2018-03-20 09:19:10 +0100 |
---|---|---|
committer | Timm Bäder <mail@baedert.org> | 2018-03-20 09:40:10 +0100 |
commit | 1d26879fa5ad3079e519850268e31eab06fbe265 (patch) | |
tree | 3480f1d84fe098c81540456f1e9ced7dd5dec965 | |
parent | 0124740fa01d9b50886c4030db34d71716c35c16 (diff) | |
download | gtk+-1d26879fa5ad3079e519850268e31eab06fbe265.tar.gz |
tests: Add testtexture
a test that simply loads a given file as a texture and renders it.
-rw-r--r-- | tests/meson.build | 3 | ||||
-rw-r--r-- | tests/testtexture.c | 144 |
2 files changed, 146 insertions, 1 deletions
diff --git a/tests/meson.build b/tests/meson.build index a3955d430d..c5b1d0792a 100644 --- a/tests/meson.build +++ b/tests/meson.build @@ -128,7 +128,8 @@ gtk_tests = [ ['showrendernode'], ['testborderdrawing'], ['testoutsetshadowdrawing'], - ['testblur'] + ['testblur'], + ['testtexture'], ] if os_linux diff --git a/tests/testtexture.c b/tests/testtexture.c new file mode 100644 index 0000000000..51fd99e56d --- /dev/null +++ b/tests/testtexture.c @@ -0,0 +1,144 @@ +#include <gtk/gtk.h> + + + +typedef struct _GtkTextureView GtkTextureView; +typedef struct _GtkTextureViewClass GtkTextureViewClass; + +#define GTK_TYPE_TEXTURE_VIEW (gtk_texture_view_get_type ()) +#define GTK_TEXTURE_VIEW(obj) (G_TYPE_CHECK_INSTANCE_CAST(obj, GTK_TYPE_TEXTURE_VIEW, GtkTextureView)) +#define GTK_TEXTURE_VIEW_CLASS(cls) (G_TYPE_CHECK_CLASS_CAST(cls, GTK_TYPE_TEXTURE_VIEW, GtkTextureViewClass)) +struct _GtkTextureView +{ + GtkWidget parent_instance; + + GdkTexture *texture; +}; + +struct _GtkTextureViewClass +{ + GtkWidgetClass parent_class; +}; + +GType gtk_texture_view_get_type (void) G_GNUC_CONST; + + +G_DEFINE_TYPE(GtkTextureView, gtk_texture_view, GTK_TYPE_WIDGET) + +static void +gtk_texture_view_measure (GtkWidget *widget, + GtkOrientation orientation, + int for_size, + int *minimum, + int *natural, + int *minimum_baseline, + int *natural_baseline) +{ + GtkTextureView *self = GTK_TEXTURE_VIEW (widget); + + if (self->texture == NULL) + return; + + if (orientation == GTK_ORIENTATION_HORIZONTAL) + { + *minimum = 0; + *natural = gdk_texture_get_width (self->texture); + } + else /* VERTICAL */ + { + *minimum = 0; + *natural = gdk_texture_get_height (self->texture); + } +} + +static void +gtk_texture_view_snapshot (GtkWidget *widget, + GtkSnapshot *snapshot) +{ + GtkTextureView *self = GTK_TEXTURE_VIEW (widget); + int width = gtk_widget_get_width (widget); + int height = gtk_widget_get_height (widget); + + if (self->texture != NULL) + { + graphene_rect_t bounds; + + bounds.origin.x = MAX (0, width / 2 - gdk_texture_get_width (self->texture)); + bounds.origin.y = MAX (0, height / 2 - gdk_texture_get_height (self->texture)); + + bounds.size.width = MIN (width, gdk_texture_get_width (self->texture)); + bounds.size.height = MIN (height, gdk_texture_get_height (self->texture)); + + gtk_snapshot_append_texture (snapshot, self->texture, &bounds, "Texture"); + } +} + +static void +gtk_texture_view_finalize (GObject *object) +{ + GtkTextureView *self = GTK_TEXTURE_VIEW (object); + + g_clear_object (&self->texture); + + G_OBJECT_CLASS (gtk_texture_view_parent_class)->finalize (object); +} + +static void +gtk_texture_view_init (GtkTextureView *self) +{ + gtk_widget_set_has_window (GTK_WIDGET (self), FALSE); +} + +static void +gtk_texture_view_class_init (GtkTextureViewClass *klass) +{ + GObjectClass *object_class = G_OBJECT_CLASS (klass); + GtkWidgetClass *widget_class = GTK_WIDGET_CLASS (klass); + + object_class->finalize = gtk_texture_view_finalize; + + widget_class->measure = gtk_texture_view_measure; + widget_class->snapshot = gtk_texture_view_snapshot; +} + +int +main (int argc, char **argv) +{ + GtkWidget *window; + GtkWidget *view; + GdkTexture *texture; + GFile *file; + GError *error = NULL; + + gtk_init (); + + if (argc != 2) + { + g_error ("No texture file path given."); + return -1; + } + + file = g_file_new_for_path (argv[1]); + texture = gdk_texture_new_from_file (file, &error); + + if (error != NULL) + { + g_error ("Error: %s", error->message); + return -1; + } + + window = gtk_window_new (GTK_WINDOW_TOPLEVEL); + g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL); + view = g_object_new (GTK_TYPE_TEXTURE_VIEW, NULL); + ((GtkTextureView*)view)->texture = g_steal_pointer (&texture); + + gtk_container_add (GTK_CONTAINER (window), view); + + gtk_widget_show (window); + gtk_main (); + + + g_object_unref (file); + + return 0; +} |