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 void
draw_text(GtkDrawingArea * da,cairo_t * cr,int width,int height,gpointer data)11 draw_text (GtkDrawingArea *da,
12            cairo_t        *cr,
13            int             width,
14            int             height,
15            gpointer        data)
16 {
17   cairo_pattern_t *pattern;
18   PangoLayout *layout;
19   PangoFontDescription *desc;
20 
21   cairo_save (cr);
22 
23   layout = gtk_widget_create_pango_layout (GTK_WIDGET (da), "Pango power!\nPango power!\nPango power!");
24   desc = pango_font_description_from_string ("sans bold 34");
25   pango_layout_set_font_description (layout, desc);
26   pango_font_description_free (desc);
27 
28   cairo_move_to (cr, 30, 20);
29   pango_cairo_layout_path (cr, layout);
30   g_object_unref (layout);
31 
32   pattern = cairo_pattern_create_linear (0.0, 0.0, width, height);
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 
54 GtkWidget *
do_textmask(GtkWidget * do_widget)55 do_textmask (GtkWidget *do_widget)
56 {
57   static GtkWidget *window = NULL;
58   static GtkWidget *da;
59 
60   if (!window)
61     {
62       window = gtk_window_new ();
63       gtk_window_set_resizable (GTK_WINDOW (window), TRUE);
64       gtk_widget_set_size_request (window, 400, 240);
65       gtk_window_set_title (GTK_WINDOW (window), "Text Mask");
66       g_object_add_weak_pointer (G_OBJECT (window), (gpointer *)&window);
67 
68       da = gtk_drawing_area_new ();
69 
70       gtk_window_set_child (GTK_WINDOW (window), da);
71       gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), draw_text, NULL, NULL);
72     }
73 
74   if (!gtk_widget_get_visible (window))
75     gtk_widget_show (window);
76   else
77     gtk_window_destroy (GTK_WINDOW (window));
78 
79   return window;
80 }
81