mirror of
https://gitlab.gnome.org/GNOME/gtk.git
synced 2024-12-27 06:00:22 +00:00
tests: Add testtexture
a test that simply loads a given file as a texture and renders it.
This commit is contained in:
parent
0124740fa0
commit
1d26879fa5
@ -128,7 +128,8 @@ gtk_tests = [
|
|||||||
['showrendernode'],
|
['showrendernode'],
|
||||||
['testborderdrawing'],
|
['testborderdrawing'],
|
||||||
['testoutsetshadowdrawing'],
|
['testoutsetshadowdrawing'],
|
||||||
['testblur']
|
['testblur'],
|
||||||
|
['testtexture'],
|
||||||
]
|
]
|
||||||
|
|
||||||
if os_linux
|
if os_linux
|
||||||
|
144
tests/testtexture.c
Normal file
144
tests/testtexture.c
Normal file
@ -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;
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user