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