The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl

use strict;
use warnings;
use Cairo;

use constant
{
	WIDTH => 450,
	HEIGHT => 900,
	NUM_STRINGS => 3,
	M_PI => 4 * atan2(1, 1),
};

{
	my $surface = Cairo::ImageSurface->create ('argb32', WIDTH, HEIGHT);
	my $cr = Cairo::Context->create ($surface);

	$cr->set_source_rgb (0.0, 0.0, 0.0);

	$cr->translate (40, 40);

	$cr->select_font_face ('mono', 'normal', 'normal');
	$cr->set_font_size (12);
	$cr->show_text ('+CTM rotation');

	$cr->save;
	$cr->select_font_face ('serif', 'normal', 'normal');
	$cr->set_font_size (40);
	for (my $i = 0; $i < NUM_STRINGS; $i++) {
		my $angle = $i * 0.5 * M_PI / (NUM_STRINGS - 1);
		$cr->save;
		$cr->rotate ($angle);
		$cr->move_to (100, 0);
		$cr->show_text ("Text");
		$cr->restore;
	}
	$cr->restore;

	$cr->translate (0, HEIGHT / 3);

	$cr->move_to (0, 0);
	$cr->show_text ('+CTM rotation');
	$cr->rel_move_to (0, 12);
	$cr->show_text ('-font rotation');

	$cr->save;
	$cr->select_font_face ('serif', 'normal', 'normal');
	$cr->set_font_size (40);
	for (my $i = 0; $i < NUM_STRINGS; $i++) {
		my $angle = $i * 0.5 * M_PI / (NUM_STRINGS - 1);
		$cr->save;
		$cr->rotate ($angle);
		my $matrix = Cairo::Matrix->init_identity;
		$matrix->scale (40, 40);
		$matrix->rotate (-$angle);
		$cr->set_font_matrix ($matrix);
		$cr->move_to (100, 0);
		$cr->show_text ('Text');
		$cr->restore;
	}
	$cr->restore;

	$cr->translate (0, HEIGHT / 3);

	$cr->move_to (0, 0);
	$cr->show_text ('+CTM rotation');
	$cr->rel_move_to (0, 12);
	$cr->show_text ('-CTM rotation');

	$cr->save;
	$cr->select_font_face ('serif', 'normal', 'normal');
	$cr->set_font_size (40);
	for (my $i = 0; $i < NUM_STRINGS; $i++) {
		my $angle = $i * 0.5 * M_PI / (NUM_STRINGS - 1);
		$cr->save;
		$cr->rotate ($angle);
		$cr->move_to (100, 0);
		$cr->rotate (-$angle);
		$cr->show_text ('Text');
		$cr->restore;
	}
	$cr->restore;

	$surface->write_to_png ('text-rotate.png');
}