summaryrefslogtreecommitdiff
path: root/src/testgradient.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/testgradient.c')
-rw-r--r--src/testgradient.c246
1 files changed, 246 insertions, 0 deletions
diff --git a/src/testgradient.c b/src/testgradient.c
new file mode 100644
index 0000000..aac882a
--- /dev/null
+++ b/src/testgradient.c
@@ -0,0 +1,246 @@
+/* Metacity gradient test program */
+
+/*
+ * Copyright (C) 2002 Havoc Pennington
+ *
+ * This program is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU General Public License as
+ * published by the Free Software Foundation; either version 2 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
+ * 02111-1307, USA. */
+
+#include "gradient.h"
+#include <gtk/gtk.h>
+
+typedef void (* RenderGradientFunc) (GdkDrawable *drawable,
+ GdkGC *gc,
+ int width,
+ int height);
+
+static void
+render_simple (GdkDrawable *drawable,
+ GdkGC *gc,
+ int width, int height,
+ MetaGradientType type)
+{
+ GdkPixbuf *pixbuf;
+ GdkColor from, to;
+
+ gdk_color_parse ("blue", &from);
+ gdk_color_parse ("green", &to);
+
+ pixbuf = meta_gradient_create_simple (width, height,
+ &from, &to,
+ type);
+
+ gdk_pixbuf_render_to_drawable (pixbuf,
+ drawable,
+ gc,
+ 0, 0,
+ 0, 0, width, height,
+ GDK_RGB_DITHER_NORMAL,
+ 0, 0);
+
+ g_object_unref (G_OBJECT (pixbuf));
+}
+
+static void
+render_vertical_func (GdkDrawable *drawable,
+ GdkGC *gc,
+ int width, int height)
+{
+ render_simple (drawable, gc, width, height, META_GRADIENT_VERTICAL);
+}
+
+static void
+render_horizontal_func (GdkDrawable *drawable,
+ GdkGC *gc,
+ int width, int height)
+{
+ render_simple (drawable, gc, width, height, META_GRADIENT_HORIZONTAL);
+}
+
+static void
+render_diagonal_func (GdkDrawable *drawable,
+ GdkGC *gc,
+ int width, int height)
+{
+ render_simple (drawable, gc, width, height, META_GRADIENT_DIAGONAL);
+}
+
+static void
+render_multi (GdkDrawable *drawable,
+ GdkGC *gc,
+ int width, int height,
+ MetaGradientType type)
+{
+ GdkPixbuf *pixbuf;
+#define N_COLORS 5
+ GdkColor colors[N_COLORS];
+
+ gdk_color_parse ("red", &colors[0]);
+ gdk_color_parse ("blue", &colors[1]);
+ gdk_color_parse ("orange", &colors[2]);
+ gdk_color_parse ("pink", &colors[3]);
+ gdk_color_parse ("green", &colors[4]);
+
+ pixbuf = meta_gradient_create_multi (width, height,
+ colors, N_COLORS,
+ type);
+
+ gdk_pixbuf_render_to_drawable (pixbuf,
+ drawable,
+ gc,
+ 0, 0,
+ 0, 0, width, height,
+ GDK_RGB_DITHER_NORMAL,
+ 0, 0);
+
+ g_object_unref (G_OBJECT (pixbuf));
+}
+
+static void
+render_vertical_multi_func (GdkDrawable *drawable,
+ GdkGC *gc,
+ int width, int height)
+{
+ render_multi (drawable, gc, width, height, META_GRADIENT_VERTICAL);
+}
+
+static void
+render_horizontal_multi_func (GdkDrawable *drawable,
+ GdkGC *gc,
+ int width, int height)
+{
+ render_multi (drawable, gc, width, height, META_GRADIENT_HORIZONTAL);
+}
+
+static void
+render_diagonal_multi_func (GdkDrawable *drawable,
+ GdkGC *gc,
+ int width, int height)
+{
+ render_multi (drawable, gc, width, height, META_GRADIENT_DIAGONAL);
+}
+
+static void
+render_interwoven_func (GdkDrawable *drawable,
+ GdkGC *gc,
+ int width, int height)
+{
+ GdkPixbuf *pixbuf;
+#define N_COLORS 4
+ GdkColor colors[N_COLORS];
+
+ gdk_color_parse ("red", &colors[0]);
+ gdk_color_parse ("blue", &colors[1]);
+ gdk_color_parse ("pink", &colors[2]);
+ gdk_color_parse ("green", &colors[3]);
+
+ pixbuf = meta_gradient_create_interwoven (width, height,
+ colors, height / 10,
+ colors + 2, height / 14);
+
+ gdk_pixbuf_render_to_drawable (pixbuf,
+ drawable,
+ gc,
+ 0, 0,
+ 0, 0, width, height,
+ GDK_RGB_DITHER_NORMAL,
+ 0, 0);
+
+ g_object_unref (G_OBJECT (pixbuf));
+}
+
+static gboolean
+expose_callback (GtkWidget *widget,
+ GdkEventExpose *event,
+ gpointer data)
+{
+ RenderGradientFunc func = data;
+
+ (* func) (widget->window,
+ widget->style->fg_gc[widget->state],
+ widget->allocation.width,
+ widget->allocation.height);
+
+ return TRUE;
+}
+
+static GtkWidget*
+create_gradient_window (const char *title,
+ RenderGradientFunc func)
+{
+ GtkWidget *window;
+ GtkWidget *drawing_area;
+
+ window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
+
+ gtk_window_set_title (GTK_WINDOW (window), title);
+
+ drawing_area = gtk_drawing_area_new ();
+
+ gtk_widget_set_size_request (drawing_area, 1, 1);
+
+ gtk_window_set_default_size (GTK_WINDOW (window), 175, 175);
+
+ g_signal_connect (G_OBJECT (drawing_area),
+ "expose_event",
+ G_CALLBACK (expose_callback),
+ func);
+
+ gtk_container_add (GTK_CONTAINER (window), drawing_area);
+
+ gtk_widget_show_all (window);
+
+ return window;
+}
+
+static void
+meta_gradient_test (void)
+{
+ GtkWidget *window;
+
+ window = create_gradient_window ("Simple vertical",
+ render_vertical_func);
+
+ window = create_gradient_window ("Simple horizontal",
+ render_horizontal_func);
+
+ window = create_gradient_window ("Simple diagonal",
+ render_diagonal_func);
+
+ window = create_gradient_window ("Multi vertical",
+ render_vertical_multi_func);
+
+ window = create_gradient_window ("Multi horizontal",
+ render_horizontal_multi_func);
+
+ window = create_gradient_window ("Multi diagonal",
+ render_diagonal_multi_func);
+
+ window = create_gradient_window ("Interwoven",
+ render_interwoven_func);
+}
+
+int
+main (int argc, char **argv)
+{
+ gtk_init (&argc, &argv);
+
+ meta_gradient_test ();
+
+ gtk_main ();
+
+ return 0;
+}
+