]> mj.ucw.cz Git - anim.git/blob - test1.pl
Initial commit
[anim.git] / test1.pl
1 #!/usr/bin/perl
2
3 use strict;
4 use warnings;
5
6 use Gtk2 -init;
7 use Cairo;
8
9 my $area = Gtk2::DrawingArea->new();
10 my $cairo;
11
12 sub draw_vertex($$) {
13         my ($x, $y) = @_;
14         my $rad = 100;
15         my $rim = 3;
16
17         my $lg = Cairo::RadialGradient->create($x, $y, 0, $x, $y, $rad);
18         $lg->add_color_stop_rgb(0, 0.7, 0, 0.7);
19         $lg->add_color_stop_rgb(1, 0.3, 0, 0.3);
20
21         $cairo->arc($x, $y, $rad, 0, 2*3.141592);
22         $cairo->set_source($lg);
23         $cairo->fill;
24
25         $cairo->arc($x, $y, $rad, 0, 2*3.141592);
26         $cairo->set_source_rgb(1, 1, 1);
27         $cairo->set_line_width($rim);
28         $cairo->stroke;
29
30         $cairo->set_font_size(0.6*$rad);
31         my $xt = $cairo->text_extents('Brum');
32         $cairo->move_to($x - $xt->{'width'}/2 - $xt->{'x_bearing'},
33                         $y - $xt->{'height'}/2 - $xt->{'y_bearing'});
34         $cairo->show_text("Brum");
35 }
36
37 my $xx=0;
38 my $pixmap;
39 my ($lastw, $lasth, $lastd) = (-1, -1, -1);
40 my ($pixw, $pixh) = (-1, -1);
41 sub draw($) {
42         my ($force) = @_;
43         my $win = $area->window;
44         my $wgc = Gtk2::Gdk::GC->new($win);
45         my $alloc = $area->allocation;
46         my $w = $alloc->width;
47         my $h = $alloc->height;
48         my $d = $win->get_depth;
49         # print "Area $w x $h x $d, xx=$xx\n";
50
51         if (!defined($pixmap) || $lastw != $w || $lasth != $h || $lastd != $d) {
52                 ($lastw, $lasth, $lastd) = ($w, $h, $d);
53                 if ($w/$h >= 4/3) {
54                         $pixh = $h;
55                         $pixw = int($h/3*4);
56                 } else {
57                         $pixw = $w;
58                         $pixh = int($w/4*3);
59                 }
60                 print "Resized to ${w}x${h}, pixmap size ${pixw}x${pixh}\n";
61
62                 if ($force) {
63                         $wgc->set_rgb_background(0);
64                         $wgc->set_rgb_foreground(0);
65                         $win->draw_rectangle($wgc, 1, 0, 0, $w, $h);
66                 }
67
68                 $pixmap = Gtk2::Gdk::Pixmap->new($win, $pixw, $pixh, $d);
69                 $cairo = Gtk2::Gdk::Cairo::Context->create($pixmap);
70                 $cairo->select_font_face('URW Palladio L', 'normal', 'normal');
71                 my $scale = $pixw/1024;
72                 $cairo->scale($scale, $scale);
73         }
74
75         $cairo->rectangle(0, 0, 1024, 768);
76         $cairo->set_source_rgb(0, 0, 0);
77         $cairo->fill;
78
79         draw_vertex(4/3*$xx, $xx);
80
81         $win->draw_drawable($wgc, $pixmap, 0, 0, 0, 0, $pixw, $pixh);
82 }
83
84 sub step() {
85         draw(0);
86         $xx++;
87 }
88
89 my $timer;
90 my $stopped = 0;
91 $area->signal_connect("expose-event" => sub {
92         draw(1);
93         if (!defined $timer) {
94                 $timer = Glib::Timeout->add(100, sub { $stopped || step(); return 1; });
95         }
96 });
97 $area->set_flags('can-focus');
98 # $area->add_events('key-press-mask');
99 $area->signal_connect('key-press-event' => sub {
100         my ($w, $evt) = @_;
101         my $k = Gtk2::Gdk::keyval_name(0, $evt->keyval);
102         print "Pressed key $k\n";
103         if ($k eq "Escape") {
104                 Gtk2->main_quit;
105         } elsif ($k eq "space") {
106                 $stopped = !$stopped;
107         }
108 });
109
110 my $window = Gtk2::Window->new ('toplevel');
111 $window->signal_connect ("delete-event" => sub { Gtk2->main_quit });
112 $window->set_title("Brum");
113 $window->set_wmclass("anim", "Anim");
114 $window->set_default_size(640, 480);
115 $window->add ($area);
116 $window->show_all;
117 #$window->fullscreen;
118
119 Gtk2->main;