1 /* Pango/Text Mask
2  *
3  * This demo shows how to use PangoCairo to draw text with more than
4  * just a single color.
5  */
6 
7 #include <glib/gi18n.h>
8 #include <gtk/gtk.h>
9 
10 static gboolean
draw_text(GtkWidget * da,cairo_t * cr,gpointer data)11 draw_text (GtkWidget *da,
12            cairo_t   *cr,
13            gpointer   data)
14 {
15   cairo_pattern_t *pattern;
16   PangoLayout *layout;
17   PangoFontDescription *desc;
18 
19   cairo_save (cr);
20 
21   layout = gtk_widget_create_pango_layout (da, "Pango power!\nPango power!\nPango power!");
22   desc = pango_font_description_from_string ("sans bold 34");
23   pango_layout_set_font_description (layout, desc);
24   pango_font_description_free (desc);
25 
26   cairo_move_to (cr, 30, 20);
27   pango_cairo_layout_path (cr, layout);
28   g_object_unref (layout);
29 
30   pattern = cairo_pattern_create_linear (0.0, 0.0,
31                                          gtk_widget_get_allocated_width (da),
32                                          gtk_widget_get_allocated_height (da));
33   cairo_pattern_add_color_stop_rgb (pattern, 0.0, 1.0, 0.0, 0.0);
34   cairo_pattern_add_color_stop_rgb (pattern, 0.2, 1.0, 0.0, 0.0);
35   cairo_pattern_add_color_stop_rgb (pattern, 0.3, 1.0, 1.0, 0.0);
36   cairo_pattern_add_color_stop_rgb (pattern, 0.4, 0.0, 1.0, 0.0);
37   cairo_pattern_add_color_stop_rgb (pattern, 0.6, 0.0, 1.0, 1.0);
38   cairo_pattern_add_color_stop_rgb (pattern, 0.7, 0.0, 0.0, 1.0);
39   cairo_pattern_add_color_stop_rgb (pattern, 0.8, 1.0, 0.0, 1.0);
40   cairo_pattern_add_color_stop_rgb (pattern, 1.0, 1.0, 0.0, 1.0);
41 
42   cairo_set_source (cr, pattern);
43   cairo_fill_preserve (cr);
44 
45   cairo_pattern_destroy (pattern);
46 
47   cairo_set_source_rgb (cr, 0.0, 0.0, 0.0);
48   cairo_set_line_width (cr, 0.5);
49   cairo_stroke (cr);
50 
51   cairo_restore (cr);
52 
53   return TRUE;
54 }
55 
56 GtkWidget *
do_textmask(GtkWidget * do_widget)57 do_textmask (GtkWidget *do_widget)
58 {
59   static GtkWidget *window = NULL;
60   static GtkWidget *da;
61 
62   if (!window)
63     {
64       window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
65       gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
66       gtk_widget_set_size_request (window, 400, 200);
67       gtk_window_set_title (GTK_WINDOW (window), "Text Mask");
68 
69       g_signal_connect (window, "destroy",
70                         G_CALLBACK (gtk_widget_destroyed), &window);
71 
72       da = gtk_drawing_area_new ();
73 
74       gtk_container_add (GTK_CONTAINER (window), da);
75       g_signal_connect (da, "draw",
76                         G_CALLBACK (draw_text), NULL);
77     }
78 
79   if (!gtk_widget_get_visible (window))
80     gtk_widget_show_all (window);
81   else
82     gtk_widget_destroy (window);
83 
84   return window;
85 }
86