1#!/usr/bin/perl
2
3# This is adopted from the cairosimple.c example in the pango distribution
4# written by Behdad Esfahbod.
5
6use strict;
7use warnings;
8
9use Math::Trig qw(pi);
10use Cairo;
11use Glib qw(TRUE FALSE);
12use Gtk2 -init;
13use Gtk2::Pango;
14
15use constant RADIUS => 150;
16use constant N_WORDS => 10;
17use constant FONT => "Sans Bold 27";
18
19sub draw_text {
20  my ($cr) = @_;
21
22  $cr -> translate(RADIUS, RADIUS);
23
24  my $layout = Pango::Cairo::create_layout($cr);
25  $layout -> set_text("Text");
26
27  my $desc = Pango::FontDescription -> from_string(FONT);
28  $layout -> set_font_description($desc);
29
30  # Draw the layout N_WORDS times in a circle
31  foreach (0 .. N_WORDS) {
32    my $angle = (360. * $_) / N_WORDS;
33
34    $cr -> save();
35
36    # Gradient from red at angle == 60 to blue at angle == 300
37    my $red = (1 + cos(($angle - 60) * pi / 180.)) / 2;
38    $cr -> set_source_rgb($red, 0, 1.0 - $red);
39
40    $cr -> rotate($angle * pi / 180.);
41
42    # Inform Pango to re-layout the text with the new transformation
43    Pango::Cairo::update_layout($cr, $layout);
44
45    my ($width, $height) = $layout -> get_size();
46    $cr -> move_to(- ($width / PANGO_SCALE) / 2, - RADIUS);
47    Pango::Cairo::show_layout($cr, $layout);
48
49    $cr -> restore();
50  }
51}
52
53my $window = Gtk2::Window -> new();
54$window -> signal_connect(delete_event => sub { Gtk2 -> main_quit(); });
55
56my $area = Gtk2::DrawingArea -> new();
57$area -> signal_connect(expose_event => sub {
58  my ($widget, $event) = @_;
59
60  my $cr = Gtk2::Gdk::Cairo::Context -> create($widget -> window());
61  $cr -> set_source_rgb(1.0, 1.0, 1.0);
62  $cr -> rectangle(0, 0, 2 * RADIUS, 2 * RADIUS);
63  $cr -> fill();
64
65  draw_text($cr);
66
67  return FALSE;
68});
69
70$window -> set_default_size(2 * RADIUS, 2 * RADIUS);
71$window -> add($area);
72$window -> show_all();
73
74Gtk2 -> main();
75