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 |
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), 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 | |
54 | GtkWidget * |
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 (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 | |