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, $lastd) = (-1, -1, -1);
49 my ($pixw, $pixh) = (-1, -1);
50 my ($last_scene, $last_frame) = (-1, -1);
54 my $win = $area->window;
55 my $wgc = Gtk2::Gdk::GC->new($win);
56 my $alloc = $area->allocation;
57 my $w = $alloc->width;
58 my $h = $alloc->height;
59 my $d = $win->get_depth;
60 # print "Area $w x $h x $d, xx=$xx\n";
62 if (!defined($pixmap) || $lastw != $w || $lasth != $h || $lastd != $d) {
63 ($lastw, $lasth, $lastd) = ($w, $h, $d);
71 print "Resized to ${w}x${h}, pixmap size ${pixw}x${pixh}\n" if $debug;
73 $pixmap = Gtk2::Gdk::Pixmap->new($win, $pixw, $pixh, $d);
74 $cairo = Gtk2::Gdk::Cairo::Context->create($pixmap);
75 my $scale = $pixw/1024;
76 $cairo->scale($scale, $scale);
80 $wgc->set_rgb_background(0);
81 $wgc->set_rgb_foreground(0);
82 $win->draw_rectangle($wgc, 1, 0, 0, $w, $h);
85 $cairo->rectangle(0, 0, 1024, 768);
86 $cairo->set_source_rgb(0, 0, 0);
90 print "@@@ Scene $u_scene frame $u_frame\n" if $debug;
91 $u_scenes[$u_scene]->[$u_frame]->Draw($cairo);
92 $cairo->set_source_rgb(.5, .5, .5);
93 $cairo->set_font_size(15);
94 $cairo->move_to(950,750);
95 $cairo->show_text($u_scene . "/" . $#u_scenes);
101 $win->draw_drawable($wgc, $pixmap, 0, 0, 0, 0, $pixw, $pixh);
102 $last_scene = $u_scene;
103 $last_frame = $u_frame;
107 # FIXME: the timer still runs
109 if ($u_direction > 0) {
110 if ($u_frame < $u_last_frame[$u_scene]) {
112 } elsif ($u_scene < @u_scenes - 1) {
116 if ($u_frame == $u_last_frame[$u_scene]) {
117 $u_direction = 0 unless $movie;
119 } elsif ($u_direction < 0) {
124 $u_frame = $u_last_frame[$u_scene];
125 $u_direction = 0 unless $movie;
128 return if ($u_scene == $last_scene && $u_frame == $last_frame);
136 $window = Gtk2::Window->new ('toplevel');
137 $area = Gtk2::DrawingArea->new();
138 $area->signal_connect("expose-event" => sub {
140 if (!defined $timer) {
141 $timer = Glib::Timeout->add(30, sub { $stopped || step(); return 1; });
144 $area->set_flags('can-focus');
145 # $area->add_events('key-press-mask');
146 $area->signal_connect('key-press-event' => sub {
148 my $k = Gtk2::Gdk::keyval_name(0, $evt->keyval);
149 print "Pressed key $k\n" if $debug;
150 if ($k eq "Escape") {
152 } elsif ($k eq "f") {
153 if ($fullscreen = !$fullscreen) {
156 $window->unfullscreen;
158 } elsif ($k eq "space" || $k eq "Right" || $k eq "Page_Down") {
160 if ($stopped || $k eq "Page_Down") {
161 if ($u_scene+1 < @u_scenes) {
163 $u_frame = $u_last_frame[$u_scene];
166 } elsif ($u_direction > 0) {
167 $u_frame = $u_last_frame[$u_scene];
174 while (AA::Anim->step) { AA->calculate; }
175 if ($u_scene+1 < @$u_scenario) {
178 &{$u_scenario->[$u_scene]};
182 } elsif ($k eq "BackSpace" || $k eq "Left" || $k eq "Page_Up") {
184 if ($stopped || $k eq "Page_Up") {
187 $u_frame = $u_last_frame[$u_scene];
190 } elsif ($u_direction < 0) {
197 } elsif ($k eq "Home" || $k eq "0") {
204 } elsif ($k eq "End" || $k eq "9") {
206 $u_scene = $#u_scenes;
207 $u_frame = $u_last_frame[$u_scene];
211 } elsif ($k eq "p") {
212 $stopped = !$stopped;
213 $u_direction = 0 if $stopped;
214 print "Stopped is $stopped\n" if $debug;
215 } elsif ($k eq "m") {
217 print "Movie mode is $movie\n" if $debug;
218 } elsif ($k eq "Return") {
220 $u_frame = ($u_direction > 0) ? $u_last_frame[$u_scene] : 0;
222 while (AA::Anim->step) { AA->calculate; }
227 $window->signal_connect ("delete-event" => sub { Gtk2->main_quit });
228 $window->set_title("Brum");
229 $window->set_wmclass("brum", "Brum");
230 $window->set_default_size(640, 480);
231 $window->add ($area);
235 sub RunScenario($$) {
236 my ($ui, $scenario) = @_;
239 print "Rendering...\n";
240 foreach my $s (@$scenario) {
241 print ">>> Scene ", scalar @u_scenes, "\n" if $debug;
245 while (AA::Anim->step) {
246 print "\t>>> Frame ", scalar @$show, "\n" if $debug;
248 push @$show, AA::Scene->new();
250 push @u_scenes, $show;
251 push @u_last_frame, scalar @$show - 1;
255 $u_scenario = $scenario;
269 our @ISA = ('AA::UI');
272 my ($class, $name) = @_;
274 $ui->{SURF} = Cairo::PdfSurface->create($name, 512, 384) or die "Unable to create PDF surface $name\n";
275 $ui->{CAIRO} = Cairo::Context->create($ui->{SURF});
276 $ui->{CAIRO}->scale(.5, .5);
277 return bless($ui, $class);
280 sub RunScenario($$$) {
281 my ($ui, $scenario) = @_;
283 print "Rendering to PDF\n";
284 foreach my $s (@$scenario) {
286 print "### Page $page ###\n";
291 } while (AA::Anim->step);
292 AA->draw($ui->{CAIRO});
293 $ui->{CAIRO}->show_page;
299 our @ISA = ('AA::UI');
302 my ($class, $name) = @_;
305 $ui->{SURF} = Cairo::ImageSurface->create('argb32', 1024, 768) or die "Unable to create image surface $name\n";
306 $ui->{CAIRO} = Cairo::Context->create($ui->{SURF});
307 return bless($ui, $class);
310 sub RunScenario($$$) {
311 my ($ui, $scenario) = @_;
312 my $cairo = $ui->{CAIRO};
314 print "Rendering to PNG images\n";
315 foreach my $s (@$scenario) {
317 print "### Page $page ###\n";
322 } while (AA::Anim->step);
325 my $name = sprintf($ui->{NAME}, $page);
326 $ui->{SURF}->write_to_png($name) or die "Unable to write to $name\n";