#!/usr/bin/perl -w use strict; use warnings; use Goo::Canvas; use Gtk2 '-init'; use Glib qw(TRUE FALSE); use MIME::Base64; # get a tiny map from web, if not previously downloaded if(! -e 'usa.gif'){ print "getting file from net\n"; &get_web_file; } sub get_web_file { use LWP::Simple; use HTTP::Status; my $URL = 'http://www.google.com/mapdata?CxXA8zUCHYWJS_og____________AQwtwPM1AjWFiUv6QLACSJwBUgJVU2gBkAEP'; my $localfile = 'usa.gif'; my $rc = mirror( $URL, $localfile ); warn status_message( $rc ) if is_error( $rc ); print "done retrieval\n"; } my $window = Gtk2::Window->new('toplevel'); $window->signal_connect('delete_event' => sub { Gtk2->main_quit; }); my $canvas = Goo::Canvas->new(); $canvas->set_size_request(320, 160); $window->add($canvas); my $root = $canvas->get_root_item(); # base file my $im = Gtk2::Gdk::Pixbuf->new_from_file("usa.gif"); my $w = $im->get_width; my $h = $im->get_height; my $image = Goo::Canvas::Image->new( $root, $im, 0, 0, 'width' => $w, 'height' => $h); my $plane = get_plane(); my $pixbuf = do { my $loader = Gtk2::Gdk::PixbufLoader->new(); $loader->write( $plane ); $loader->close(); $loader->get_pixbuf(); }; my $pb2 = $pixbuf->add_alpha(1,0 ,0 ,0); # returns a new pixbuf # makes black transparent # use 0..255 for color levels, NOT hex my $w1 = $pb2->get_width; my $h1 = $pb2->get_height; my $image1 = Goo::Canvas::Image->new( $root, $pb2, $w/2, $h/2, 'width' => $w1, 'height' => $h1); $window->show_all(); my $id = Glib::Timeout->add (100, sub { $image1->rotate (5, $w/2, $h/2); #degrees ,center of rotation return 1; } ); Gtk2->main; sub get_plane{ return decode_base64( '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 icP/Ao7nzeTzMzF3AAAAAElFTkSuQmCC'); }