summaryrefslogtreecommitdiff
path: root/gtk+-mingw/share/gtk-3.0/demo/rotated_text.c
diff options
context:
space:
mode:
Diffstat (limited to 'gtk+-mingw/share/gtk-3.0/demo/rotated_text.c')
-rw-r--r--gtk+-mingw/share/gtk-3.0/demo/rotated_text.c236
1 files changed, 0 insertions, 236 deletions
diff --git a/gtk+-mingw/share/gtk-3.0/demo/rotated_text.c b/gtk+-mingw/share/gtk-3.0/demo/rotated_text.c
deleted file mode 100644
index c83030f..0000000
--- a/gtk+-mingw/share/gtk-3.0/demo/rotated_text.c
+++ /dev/null
@@ -1,236 +0,0 @@
-/* Rotated Text
- *
- * This demo shows how to use PangoCairo to draw rotated and transformed
- * text. The right pane shows a rotated GtkLabel widget.
- *
- * In both cases, a custom PangoCairo shape renderer is installed to draw
- * a red heard using cairo drawing operations instead of the Unicode heart
- * character.
- */
-
-#include <gtk/gtk.h>
-#include <string.h>
-
-static GtkWidget *window = NULL;
-
-#define HEART "♥"
-const char text[] = "I ♥ GTK+";
-
-static void
-fancy_shape_renderer (cairo_t *cr,
- PangoAttrShape *attr,
- gboolean do_path,
- gpointer data)
-{
- double x, y;
- cairo_get_current_point (cr, &x, &y);
- cairo_translate (cr, x, y);
-
- cairo_scale (cr,
- (double) attr->ink_rect.width / PANGO_SCALE,
- (double) attr->ink_rect.height / PANGO_SCALE);
-
- switch (GPOINTER_TO_UINT (attr->data))
- {
- case 0x2665: /* U+2665 BLACK HEART SUIT */
- {
- cairo_move_to (cr, .5, .0);
- cairo_line_to (cr, .9, -.4);
- cairo_curve_to (cr, 1.1, -.8, .5, -.9, .5, -.5);
- cairo_curve_to (cr, .5, -.9, -.1, -.8, .1, -.4);
- cairo_close_path (cr);
- }
- break;
- }
-
- if (!do_path) {
- cairo_set_source_rgb (cr, 1., 0., 0.);
- cairo_fill (cr);
- }
-}
-
-PangoAttrList *
-create_fancy_attr_list_for_layout (PangoLayout *layout)
-{
- PangoAttrList *attrs;
- PangoFontMetrics *metrics;
- int ascent;
- PangoRectangle ink_rect, logical_rect;
- const char *p;
-
- /* Get font metrics and prepare fancy shape size */
- metrics = pango_context_get_metrics (pango_layout_get_context (layout),
- pango_layout_get_font_description (layout),
- NULL);
- ascent = pango_font_metrics_get_ascent (metrics);
- logical_rect.x = 0;
- logical_rect.width = ascent;
- logical_rect.y = -ascent;
- logical_rect.height = ascent;
- ink_rect = logical_rect;
- pango_font_metrics_unref (metrics);
-
- /* Set fancy shape attributes for all hearts */
- attrs = pango_attr_list_new ();
- for (p = text; (p = strstr (p, HEART)); p += strlen (HEART))
- {
- PangoAttribute *attr;
-
- attr = pango_attr_shape_new_with_data (&ink_rect,
- &logical_rect,
- GUINT_TO_POINTER (g_utf8_get_char (p)),
- NULL, NULL);
-
- attr->start_index = p - text;
- attr->end_index = attr->start_index + strlen (HEART);
-
- pango_attr_list_insert (attrs, attr);
- }
-
- return attrs;
-}
-
-static gboolean
-rotated_text_draw (GtkWidget *widget,
- cairo_t *cr,
- gpointer data)
-{
-#define RADIUS 150
-#define N_WORDS 5
-#define FONT "Serif 18"
-
- PangoContext *context;
- PangoLayout *layout;
- PangoFontDescription *desc;
-
- cairo_pattern_t *pattern;
-
- PangoAttrList *attrs;
-
- double device_radius;
- int width, height;
- int i;
-
- /* Create a cairo context and set up a transformation matrix so that the user
- * space coordinates for the centered square where we draw are [-RADIUS, RADIUS],
- * [-RADIUS, RADIUS].
- * We first center, then change the scale. */
- width = gtk_widget_get_allocated_width (widget);
- height = gtk_widget_get_allocated_height (widget);
- device_radius = MIN (width, height) / 2.;
- cairo_translate (cr,
- device_radius + (width - 2 * device_radius) / 2,
- device_radius + (height - 2 * device_radius) / 2);
- cairo_scale (cr, device_radius / RADIUS, device_radius / RADIUS);
-
- /* Create and a subtle gradient source and use it. */
- pattern = cairo_pattern_create_linear (-RADIUS, -RADIUS, RADIUS, RADIUS);
- cairo_pattern_add_color_stop_rgb (pattern, 0., .5, .0, .0);
- cairo_pattern_add_color_stop_rgb (pattern, 1., .0, .0, .5);
- cairo_set_source (cr, pattern);
-
- /* Create a PangoContext and set up our shape renderer */
- context = gtk_widget_create_pango_context (widget);
- pango_cairo_context_set_shape_renderer (context,
- fancy_shape_renderer,
- NULL, NULL);
-
- /* Create a PangoLayout, set the text, font, and attributes */
- layout = pango_layout_new (context);
- pango_layout_set_text (layout, text, -1);
- desc = pango_font_description_from_string (FONT);
- pango_layout_set_font_description (layout, desc);
-
- attrs = create_fancy_attr_list_for_layout (layout);
- pango_layout_set_attributes (layout, attrs);
- pango_attr_list_unref (attrs);
-
- /* Draw the layout N_WORDS times in a circle */
- for (i = 0; i < N_WORDS; i++)
- {
- int width, height;
-
- /* Inform Pango to re-layout the text with the new transformation matrix */
- pango_cairo_update_layout (cr, layout);
-
- pango_layout_get_pixel_size (layout, &width, &height);
- cairo_move_to (cr, - width / 2, - RADIUS * .9);
- pango_cairo_show_layout (cr, layout);
-
- /* Rotate for the next turn */
- cairo_rotate (cr, G_PI*2 / N_WORDS);
- }
-
- /* free the objects we created */
- pango_font_description_free (desc);
- g_object_unref (layout);
- g_object_unref (context);
- cairo_pattern_destroy (pattern);
-
- return FALSE;
-}
-
-GtkWidget *
-do_rotated_text (GtkWidget *do_widget)
-{
- if (!window)
- {
- GtkWidget *box;
- GtkWidget *drawing_area;
- GtkWidget *label;
- PangoLayout *layout;
- PangoAttrList *attrs;
-
- const GdkRGBA white = { 1.0, 1.0, 1.0, 1.0 };
-
- window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
- gtk_window_set_screen (GTK_WINDOW (window),
- gtk_widget_get_screen (do_widget));
- gtk_window_set_title (GTK_WINDOW (window), "Rotated Text");
- gtk_window_set_default_size (GTK_WINDOW (window), 4 * RADIUS, 2 * RADIUS);
- g_signal_connect (window, "destroy", G_CALLBACK (gtk_widget_destroyed), &window);
-
- box = gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 0);
- gtk_box_set_homogeneous (GTK_BOX (box), TRUE);
- gtk_container_add (GTK_CONTAINER (window), box);
-
- /* Add a drawing area */
-
- drawing_area = gtk_drawing_area_new ();
- gtk_container_add (GTK_CONTAINER (box), drawing_area);
-
- /* This overrides the background color from the theme */
- gtk_widget_override_background_color (drawing_area, 0, &white);
-
- g_signal_connect (drawing_area, "draw",
- G_CALLBACK (rotated_text_draw), NULL);
-
- /* And a label */
-
- label = gtk_label_new (text);
- gtk_container_add (GTK_CONTAINER (box), label);
-
- gtk_label_set_angle (GTK_LABEL (label), 45);
-
- /* Set up fancy stuff on the label */
- layout = gtk_label_get_layout (GTK_LABEL (label));
- pango_cairo_context_set_shape_renderer (pango_layout_get_context (layout),
- fancy_shape_renderer,
- NULL, NULL);
- attrs = create_fancy_attr_list_for_layout (layout);
- gtk_label_set_attributes (GTK_LABEL (label), attrs);
- pango_attr_list_unref (attrs);
- }
-
- if (!gtk_widget_get_visible (window))
- {
- gtk_widget_show_all (window);
- }
- else
- {
- gtk_widget_destroy (window);
- window = NULL;
- }
-
- return window;
-}