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