]> mj.ucw.cz Git - anim.git/blob - test.pl
Initial commit
[anim.git] / test.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 my $PI = 3.1415926535;
12 my $TWOPI = 2*$PI;
13
14 my $rad = 30;
15 my $rim = 2;
16 my $arrow_dist = 10;
17 my $arrow_span = 5;
18
19 sub draw_vertex($$) {
20         my ($x, $y) = @_;
21
22         my $lg = Cairo::RadialGradient->create($x, $y, 0, $x, $y, $rad);
23         $lg->add_color_stop_rgb(0, 0.7, 0, 0.7);
24         $lg->add_color_stop_rgb(1, 0.3, 0, 0.3);
25
26         $cairo->arc($x, $y, $rad, 0, $TWOPI);
27         $cairo->set_source($lg);
28         $cairo->fill;
29
30         $cairo->arc($x, $y, $rad, 0, $TWOPI);
31         $cairo->set_source_rgb(1, 1, 1);
32         $cairo->set_line_width($rim);
33         $cairo->stroke;
34
35         $cairo->set_font_size(0.6*$rad);
36         my $xt = $cairo->text_extents('Brum');
37         $cairo->move_to($x - $xt->{'width'}/2 - $xt->{'x_bearing'},
38                         $y - $xt->{'height'}/2 - $xt->{'y_bearing'});
39         $cairo->show_text("Brum");
40 }
41
42 sub draw_edge($$$$) {
43         my ($x1, $y1, $x2, $y2) = @_;
44         my $dx = $x2 - $x1;
45         my $dy = $y2 - $y1;
46         my $d = sqrt($dx*$dx + $dy*$dy);
47
48         $x1 += $dx * $rad/$d;
49         $y1 += $dy * $rad/$d;
50         $x2 -= $dx * $rad/$d;
51         $y2 -= $dy * $rad/$d;
52
53         $cairo->set_source_rgb(1, 1, 1);
54
55         $cairo->move_to($x1, $y1);
56         $cairo->line_to($x2, $y2);
57         $cairo->set_line_width(2);
58         $cairo->stroke;
59
60         my $ax = $x2 - $dx * $arrow_dist/$d;
61         my $ay = $y2 - $dy * $arrow_dist/$d;
62         my $adx = -$dy;
63         my $ady = $dx;
64         ($adx, $ady) = ($adx * $arrow_span/$d, $ady * $arrow_span/$d);
65         $cairo->move_to($x2, $y2);
66         $cairo->line_to($ax+$adx, $ay+$ady);
67         $cairo->line_to($ax-$adx, $ay-$ady);
68         $cairo->close_path;
69         $cairo->fill;
70 }
71
72 my $xx=0;
73 my $pixmap;
74 my ($lastw, $lasth, $lastd) = (-1, -1, -1);
75 my ($pixw, $pixh) = (-1, -1);
76 sub draw($) {
77         my ($force) = @_;
78         my $win = $area->window;
79         my $wgc = Gtk2::Gdk::GC->new($win);
80         my $alloc = $area->allocation;
81         my $w = $alloc->width;
82         my $h = $alloc->height;
83         my $d = $win->get_depth;
84         # print "Area $w x $h x $d, xx=$xx\n";
85
86         if (!defined($pixmap) || $lastw != $w || $lasth != $h || $lastd != $d) {
87                 ($lastw, $lasth, $lastd) = ($w, $h, $d);
88                 if ($w/$h >= 4/3) {
89                         $pixh = $h;
90                         $pixw = int($h/3*4);
91                 } else {
92                         $pixw = $w;
93                         $pixh = int($w/4*3);
94                 }
95                 print "Resized to ${w}x${h}, pixmap size ${pixw}x${pixh}\n";
96
97                 $pixmap = Gtk2::Gdk::Pixmap->new($win, $pixw, $pixh, $d);
98                 $cairo = Gtk2::Gdk::Cairo::Context->create($pixmap);
99                 $cairo->select_font_face('URW Palladio L', 'normal', 'normal');
100                 my $scale = $pixw/1024;
101                 $cairo->scale($scale, $scale);
102         }
103
104         if ($force) {
105                 $wgc->set_rgb_background(0);
106                 $wgc->set_rgb_foreground(0);
107                 $win->draw_rectangle($wgc, 1, 0, 0, $w, $h);
108         }
109
110         $cairo->rectangle(0, 0, 1024, 768);
111         $cairo->set_source_rgb(0, 0, 0);
112         $cairo->fill;
113
114         my @v = ();
115         for (my $i=0; $i<6; $i++) {
116                 my $a = $TWOPI/6 * $i + $TWOPI/400*$xx;
117                 my $x = int(1024/2 + 300*cos($a));
118                 my $y = int(768/2 + 300*sin($a));
119                 draw_vertex($x, $y);
120                 push @v, { 'x' => $x, 'y' => $y };
121         }
122
123         for (my $i=1; $i<6; $i++) {
124                 for (my $j=0; $j<$i; $j++) {
125                         my $v = $v[$i];
126                         my $w = $v[$j];
127                         draw_edge($v->{'x'}, $v->{'y'}, $w->{'x'}, $w->{'y'});
128                 }
129         }
130
131         $win->draw_drawable($wgc, $pixmap, 0, 0, 0, 0, $pixw, $pixh);
132 }
133
134 sub step() {
135         draw(0);
136         $xx++;
137 }
138
139 my $timer;
140 my $stopped = 0;
141 $area->signal_connect("expose-event" => sub {
142         draw(1);
143         if (!defined $timer) {
144                 $timer = Glib::Timeout->add(30, sub { $stopped || step(); return 1; });
145         }
146 });
147 $area->set_flags('can-focus');
148 # $area->add_events('key-press-mask');
149 $area->signal_connect('key-press-event' => sub {
150         my ($w, $evt) = @_;
151         my $k = Gtk2::Gdk::keyval_name(0, $evt->keyval);
152         print "Pressed key $k\n";
153         if ($k eq "Escape") {
154                 Gtk2->main_quit;
155         } elsif ($k eq "space") {
156                 $stopped = !$stopped;
157         }
158 });
159
160 my $window = Gtk2::Window->new ('toplevel');
161 $window->signal_connect ("delete-event" => sub { Gtk2->main_quit });
162 $window->set_title("Brum");
163 $window->set_wmclass("anim", "Anim");
164 $window->set_default_size(640, 480);
165 $window->add ($area);
166 $window->show_all;
167 #$window->fullscreen;
168
169 Gtk2->main;