#include #include #include #define WIN_WIDTH 256 #define WIN_HEIGHT 256 cairo_t* g_pCairoContext; gboolean on_key_press (GtkWidget * pWidget, GdkEventKey* pKey, gpointer userData) { if (pKey->type == GDK_KEY_PRESS) { switch (pKey->keyval) { case GDK_Escape : gtk_main_quit (); break; } } return FALSE; } void render (int width, int height) { cairo_pattern_t* pPattern; cairo_scale (g_pCairoContext, (double) width / 1.0f, (double) height / 1.0f); pPattern = cairo_pattern_create_radial (0.55f, 0.55f, 0.25f, 0.5f, 1.0f, 0.525f); cairo_pattern_add_color_stop_rgba (pPattern, 0.0f, 0.0f, 0.0f, 1.0f, 0.811f); cairo_pattern_add_color_stop_rgba (pPattern, 0.64f, 0.345f, 0.345f, 1.0f, 0.317f); cairo_pattern_add_color_stop_rgba (pPattern, 0.84f, 0.713f, 0.713f, 1.0f, 0.137f); cairo_pattern_add_color_stop_rgba (pPattern, 1.0f, 1.0f, 1.0f, 1.0f, 0.0f); cairo_pattern_set_filter (pPattern, CAIRO_FILTER_BILINEAR); cairo_set_source (g_pCairoContext, pPattern); cairo_arc (g_pCairoContext, 0.5f, 0.5f, 142.0f/150.0f, 0.0f, M_PI * 2.0f); cairo_fill (g_pCairoContext); cairo_pattern_destroy (pPattern); } static gboolean on_window_expose (GtkWidget* pWidget, GdkEventExpose* pExpose) { g_pCairoContext = gdk_cairo_create (pWidget->window); render (WIN_WIDTH, WIN_HEIGHT); cairo_destroy (g_pCairoContext); return FALSE; } int main(int argc, char **argv) { GtkWidget *window; gtk_init (&argc, &argv); window = gtk_window_new (GTK_WINDOW_TOPLEVEL); gtk_window_set_resizable (GTK_WINDOW(window), FALSE); gtk_widget_set_size_request (window, WIN_WIDTH, WIN_HEIGHT); gtk_window_set_title (GTK_WINDOW (window), "pattern example"); gtk_widget_set_app_paintable (window, TRUE); g_signal_connect (G_OBJECT (window), "destroy", G_CALLBACK (gtk_main_quit), NULL); g_signal_connect (G_OBJECT (window), "key-press-event", G_CALLBACK (on_key_press), NULL); g_signal_connect (G_OBJECT (window), "expose-event", G_CALLBACK (on_window_expose), NULL); gtk_widget_show (window); g_pCairoContext = gdk_cairo_create (window->window); gtk_main (); return 0; }