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