7 my ($class, $name) = @_;
9 return AA::UI::GTK->new(1);
10 } elsif ($name eq "gtk") {
11 return AA::UI::GTK->new(0);
12 } elsif ($name =~ /\.pdf$/) {
13 return AA::UI::PDF->new($name);
14 } elsif ($name =~ /\.png$/) {
15 return AA::UI::PNG->new($name);
23 our @ISA = ('AA::UI');
26 my ($class, $mode) = @_;
30 return bless($ui, $class);
38 my @u_last_frame = ();
48 my ($lastw, $lasth) = (-1, -1);
49 my ($pixw, $pixh) = (-1, -1);
50 my ($last_scene, $last_frame) = (-1, -1);
59 my $w = $area->get_allocated_width;
60 my $h = $area->get_allocated_height;
61 # print "Area $w x $h\n";
63 if ($lastw != $w || $lasth != $h) {
64 ($lastw, $lasth) = ($w, $h);
72 print "Resized to ${w}x${h}, pixmap size ${pixw}x${pixh}\n" if $debug;
75 $cairo->rectangle(0, 0, $w, $h);
76 $cairo->set_source_rgb(0, 0, 0);
79 $cairo->translate(($w - $pixw) / 2, 0);
80 my $scale = $pixw/1024;
81 $cairo->scale($scale, $scale);
84 print "@@@ Scene $u_scene frame $u_frame\n" if $debug;
85 $u_scenes[$u_scene]->[$u_frame]->Draw($cairo);
86 $cairo->set_source_rgb(.5, .5, .5);
87 $cairo->set_font_size(15);
88 $cairo->move_to(950,750);
89 $cairo->show_text($u_scene . "/" . $#u_scenes);
95 $last_scene = $u_scene;
96 $last_frame = $u_frame;
100 # FIXME: the timer still runs
102 if ($u_direction > 0) {
103 if ($u_frame < $u_last_frame[$u_scene]) {
105 } elsif ($u_scene < @u_scenes - 1) {
109 if ($u_frame == $u_last_frame[$u_scene]) {
110 $u_direction = 0 unless $movie;
112 } elsif ($u_direction < 0) {
117 $u_frame = $u_last_frame[$u_scene];
118 $u_direction = 0 unless $movie;
121 return if ($u_scene == $last_scene && $u_frame == $last_frame);
129 $window = Gtk3::Window->new ('toplevel');
130 $area = Gtk3::DrawingArea->new();
131 $area->signal_connect("draw" => sub {
135 if (!defined $timer) {
136 $timer = Glib::Timeout->add(30, sub { $stopped || step(); return 1; });
139 $area->set_can_focus(1);
140 $area->add_events('key-press-mask');
141 $area->signal_connect('key-press-event' => sub {
143 my $k = Gtk3::Gdk::keyval_name($evt->keyval);
144 print "Pressed key $k\n" if $debug;
145 if ($k eq "Escape") {
147 } elsif ($k eq "f") {
148 if ($fullscreen = !$fullscreen) {
151 $window->unfullscreen;
153 } elsif ($k eq "space" || $k eq "Right" || $k eq "Page_Down") {
155 if ($stopped || $k eq "Page_Down") {
156 if ($u_scene+1 < @u_scenes) {
158 $u_frame = $u_last_frame[$u_scene];
161 } elsif ($u_direction > 0) {
162 $u_frame = $u_last_frame[$u_scene];
169 while (AA::Anim->step) { AA->calculate; }
170 if ($u_scene+1 < @$u_scenario) {
173 &{$u_scenario->[$u_scene]};
177 } elsif ($k eq "BackSpace" || $k eq "Left" || $k eq "Page_Up") {
179 if ($stopped || $k eq "Page_Up") {
182 $u_frame = $u_last_frame[$u_scene];
185 } elsif ($u_direction < 0) {
192 } elsif ($k eq "Home" || $k eq "0") {
199 } elsif ($k eq "End" || $k eq "9") {
201 $u_scene = $#u_scenes;
202 $u_frame = $u_last_frame[$u_scene];
206 } elsif ($k eq "p") {
207 $stopped = !$stopped;
208 $u_direction = 0 if $stopped;
209 print "Stopped is $stopped\n" if $debug;
210 } elsif ($k eq "m") {
212 print "Movie mode is $movie\n" if $debug;
213 } elsif ($k eq "Return") {
215 $u_frame = ($u_direction > 0) ? $u_last_frame[$u_scene] : 0;
217 while (AA::Anim->step) { AA->calculate; }
222 $window->signal_connect ("delete-event" => sub { Gtk3->main_quit });
223 $window->set_title("Brum");
224 $window->set_wmclass("brum", "Brum");
225 $window->set_default_size(640, 480);
226 $window->add ($area);
230 sub RunScenario($$) {
231 my ($ui, $scenario) = @_;
234 print "Rendering...\n";
235 foreach my $s (@$scenario) {
236 print ">>> Scene ", scalar @u_scenes, "\n" if $debug;
240 while (AA::Anim->step) {
241 print "\t>>> Frame ", scalar @$show, "\n" if $debug;
243 push @$show, AA::Scene->new();
245 push @u_scenes, $show;
246 push @u_last_frame, scalar @$show - 1;
250 $u_scenario = $scenario;
264 our @ISA = ('AA::UI');
267 my ($class, $name) = @_;
269 $ui->{SURF} = Cairo::PdfSurface->create($name, 512, 384) or die "Unable to create PDF surface $name\n";
270 $ui->{CAIRO} = Cairo::Context->create($ui->{SURF});
271 $ui->{CAIRO}->scale(.5, .5);
272 return bless($ui, $class);
275 sub RunScenario($$$) {
276 my ($ui, $scenario) = @_;
278 print "Rendering to PDF\n";
279 foreach my $s (@$scenario) {
281 print "### Page $page ###\n";
286 } while (AA::Anim->step);
287 AA->draw($ui->{CAIRO});
288 $ui->{CAIRO}->show_page;
294 our @ISA = ('AA::UI');
297 my ($class, $name) = @_;
300 $ui->{SURF} = Cairo::ImageSurface->create('argb32', 1024, 768) or die "Unable to create image surface $name\n";
301 $ui->{CAIRO} = Cairo::Context->create($ui->{SURF});
302 return bless($ui, $class);
305 sub RunScenario($$$) {
306 my ($ui, $scenario) = @_;
307 my $cairo = $ui->{CAIRO};
309 print "Rendering to PNG images\n";
310 foreach my $s (@$scenario) {
312 print "### Page $page ###\n";
317 } while (AA::Anim->step);
320 my $name = sprintf($ui->{NAME}, $page);
321 $ui->{SURF}->write_to_png($name) or die "Unable to write to $name\n";