summaryrefslogtreecommitdiff
path: root/tests/testglarea.c
diff options
context:
space:
mode:
authorAlexander Larsson <alexl@redhat.com>2014-10-09 11:14:09 +0200
committerMatthias Clasen <mclasen@redhat.com>2014-10-13 10:43:31 -0400
commit3b3726ae5790a82a1e918da589bc6f724f6bd726 (patch)
tree6be72a94fc853571c97e0ad18ab1a6267091e745 /tests/testglarea.c
parent535723ce867d96c3ca0ee6b3d77cb5f5d8173432 (diff)
downloadgtk+-3b3726ae5790a82a1e918da589bc6f724f6bd726.tar.gz
Add tests/testglarea
This is a very simple test of GtkGLArea.
Diffstat (limited to 'tests/testglarea.c')
-rw-r--r--tests/testglarea.c159
1 files changed, 159 insertions, 0 deletions
diff --git a/tests/testglarea.c b/tests/testglarea.c
new file mode 100644
index 0000000000..23e5d8fab7
--- /dev/null
+++ b/tests/testglarea.c
@@ -0,0 +1,159 @@
+#include <stdlib.h>
+#include <gtk/gtk.h>
+
+#include <epoxy/gl.h>
+
+enum {
+ X_AXIS,
+ Y_AXIS,
+ Z_AXIS,
+
+ N_AXIS
+};
+
+static float rotation_angles[N_AXIS] = { 0.0 };
+
+static GtkWidget *gl_area;
+
+static void
+draw_triangle (void)
+{
+ glColor3f (1.0f, 0.85f, 0.35f);
+ glBegin (GL_TRIANGLES);
+ {
+ glVertex3f ( 0.0, 0.6, 0.0);
+ glVertex3f (-0.2, -0.3, 0.0);
+ glVertex3f ( 0.2, -0.3, 0.0);
+ }
+ glEnd ();
+}
+
+static gboolean
+render (GtkGLArea *area,
+ GdkGLContext *context)
+{
+ glClearColor (0.5, 0.5, 0.5, 1.0);
+ glClear (GL_COLOR_BUFFER_BIT);
+
+ glMatrixMode (GL_MODELVIEW);
+ glLoadIdentity ();
+ glRotatef (rotation_angles[X_AXIS], 1, 0, 0);
+ glRotatef (rotation_angles[Y_AXIS], 0, 1, 0);
+ glRotatef (rotation_angles[Z_AXIS], 0, 0, 1);
+
+ draw_triangle ();
+
+ glFlush ();
+
+ return TRUE;
+}
+
+static void
+on_axis_value_change (GtkAdjustment *adjustment,
+ gpointer data)
+{
+ int axis = GPOINTER_TO_INT (data);
+
+ if (axis < 0 || axis >= N_AXIS)
+ return;
+
+ rotation_angles[axis] = gtk_adjustment_get_value (adjustment);
+
+ gtk_widget_queue_draw (gl_area);
+}
+
+static GtkWidget *
+create_axis_slider (int axis)
+{
+ GtkWidget *box, *label, *slider;
+ GtkAdjustment *adj;
+ const char *text;
+
+ box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, FALSE);
+
+ switch (axis)
+ {
+ case X_AXIS:
+ text = "X axis";
+ break;
+
+ case Y_AXIS:
+ text = "Y axis";
+ break;
+
+ case Z_AXIS:
+ text = "Z axis";
+ break;
+
+ default:
+ g_assert_not_reached ();
+ }
+
+ label = gtk_label_new (text);
+ gtk_container_add (GTK_CONTAINER (box), label);
+ gtk_widget_show (label);
+
+ adj = gtk_adjustment_new (0.0, 0.0, 360.0, 1.0, 12.0, 0.0);
+ g_signal_connect (adj, "value-changed",
+ G_CALLBACK (on_axis_value_change),
+ GINT_TO_POINTER (axis));
+ slider = gtk_scale_new (GTK_ORIENTATION_HORIZONTAL, adj);
+ gtk_container_add (GTK_CONTAINER (box), slider);
+ gtk_widget_set_hexpand (slider, TRUE);
+ gtk_widget_show (slider);
+
+ gtk_widget_show (box);
+
+ return box;
+}
+
+int
+main (int argc, char *argv[])
+{
+ GtkWidget *window, *box, *button, *controls;
+ int i;
+
+ gtk_init (&argc, &argv);
+
+ /* create a new pixel format; we use this to configure the
+ * GL context, and to check for features
+ */
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+ gtk_window_set_title (GTK_WINDOW (window), "GtkGLArea - Golden Triangle");
+ gtk_window_set_default_size (GTK_WINDOW (window), 400, 400);
+ gtk_container_set_border_width (GTK_CONTAINER (window), 12);
+ g_signal_connect (window, "destroy", G_CALLBACK (gtk_main_quit), NULL);
+
+ box = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE);
+ gtk_box_set_spacing (GTK_BOX (box), 6);
+ gtk_container_add (GTK_CONTAINER (window), box);
+ gtk_widget_show (box);
+
+ gl_area = gtk_gl_area_new ();
+ gtk_widget_set_hexpand (gl_area, TRUE);
+ gtk_widget_set_vexpand (gl_area, TRUE);
+ gtk_container_add (GTK_CONTAINER (box), gl_area);
+ g_signal_connect (gl_area, "render", G_CALLBACK (render), NULL);
+ gtk_widget_show (gl_area);
+
+ controls = gtk_box_new (GTK_ORIENTATION_VERTICAL, FALSE);
+ gtk_container_add (GTK_CONTAINER (box), controls);
+ gtk_widget_set_hexpand (controls, TRUE);
+ gtk_widget_show (controls);
+
+ for (i = 0; i < N_AXIS; i++)
+ gtk_container_add (GTK_CONTAINER (controls), create_axis_slider (i));
+
+ button = gtk_button_new_with_label ("Quit");
+ gtk_widget_set_hexpand (button, TRUE);
+ gtk_container_add (GTK_CONTAINER (box), button);
+ g_signal_connect_swapped (button, "clicked", G_CALLBACK (gtk_widget_destroy), window);
+ gtk_widget_show (button);
+
+ gtk_widget_show (window);
+
+ gtk_main ();
+
+ return EXIT_SUCCESS;
+}