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
10static void
11draw_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), text: "Pango power!\nPango power!\nPango power!");
24 desc = pango_font_description_from_string (str: "sans bold 34");
25 pango_layout_set_font_description (layout, desc);
26 pango_font_description_free (desc);
27
28 cairo_move_to (cr, x: 30, y: 20);
29 pango_cairo_layout_path (cr, layout);
30 g_object_unref (object: layout);
31
32 pattern = cairo_pattern_create_linear (x0: 0.0, y0: 0.0, x1: width, y1: height);
33 cairo_pattern_add_color_stop_rgb (pattern, offset: 0.0, red: 1.0, green: 0.0, blue: 0.0);
34 cairo_pattern_add_color_stop_rgb (pattern, offset: 0.2, red: 1.0, green: 0.0, blue: 0.0);
35 cairo_pattern_add_color_stop_rgb (pattern, offset: 0.3, red: 1.0, green: 1.0, blue: 0.0);
36 cairo_pattern_add_color_stop_rgb (pattern, offset: 0.4, red: 0.0, green: 1.0, blue: 0.0);
37 cairo_pattern_add_color_stop_rgb (pattern, offset: 0.6, red: 0.0, green: 1.0, blue: 1.0);
38 cairo_pattern_add_color_stop_rgb (pattern, offset: 0.7, red: 0.0, green: 0.0, blue: 1.0);
39 cairo_pattern_add_color_stop_rgb (pattern, offset: 0.8, red: 1.0, green: 0.0, blue: 1.0);
40 cairo_pattern_add_color_stop_rgb (pattern, offset: 1.0, red: 1.0, green: 0.0, blue: 1.0);
41
42 cairo_set_source (cr, source: pattern);
43 cairo_fill_preserve (cr);
44
45 cairo_pattern_destroy (pattern);
46
47 cairo_set_source_rgb (cr, red: 0.0, green: 0.0, blue: 0.0);
48 cairo_set_line_width (cr, width: 0.5);
49 cairo_stroke (cr);
50
51 cairo_restore (cr);
52}
53
54GtkWidget *
55do_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 (widget: window, width: 400, height: 240);
65 gtk_window_set_title (GTK_WINDOW (window), title: "Text Mask");
66 g_object_add_weak_pointer (G_OBJECT (window), weak_pointer_location: (gpointer *)&window);
67
68 da = gtk_drawing_area_new ();
69
70 gtk_window_set_child (GTK_WINDOW (window), child: da);
71 gtk_drawing_area_set_draw_func (GTK_DRAWING_AREA (da), draw_func: draw_text, NULL, NULL);
72 }
73
74 if (!gtk_widget_get_visible (widget: window))
75 gtk_widget_show (widget: window);
76 else
77 gtk_window_destroy (GTK_WINDOW (window));
78
79 return window;
80}
81

source code of gtk/demos/gtk-demo/textmask.c