# Flash::SWF::Parser package Flash::SWFDump::Writer; require Exporter; @ISA = qw(Exporter); @EXPORT = qw(write); @EXPORT_OK = qw(); sub write { my ($self, $flash) = @_; my ($ver,$len,$xmin,$xmax,$ymin,$ymax,$framec,$framer, $offset) = $flash->get_headers(); my $jpegheader; print STDERR "dumping file\n"; print "----- Reading the file header -----\n"; print "FWS\n"; print "File version $ver\n"; print "File size $len\n"; print "Movie width ".(($xmax-$xmin)/20)."\n"; print "Movie height ".(($ymax-$ymin)/20)."\n"; print "Frame rate $framer\n"; print "Frame count $framec\n"; print "\n----- Reading movie details -----\n"; for (my $a=0; $a{frames}};$a++) { printf ("\n<----- dumping frame %d file offset 0x%04x----->\n",$a,$offset); TAG:for (my $b=0; $b{frames}[$a]}; $b++) { print "tag".$flash->to_tag($flash->{frames}[$a][$b]{'type'})."\n"; if ($flash->{frames}[$a][$b]{'type'}==1) { $offset = $flash->{frames}[$a][$b]{'offset'}; next TAG; } #if ($flash->{frames}[$a][$b]{'type'}==8) #{ #my %tag = %{$flash->{frames}[$a][$b]}; #$jpegheader = $flash->{frames}[$a][$b]{'guts'}; #print "FUCK\n" unless (defined $jpegheader); #$jpegheader =~ s/\n/ /g; #my @jpegheader = split(/\s*/,$jpegheader); #shift @jpegheader; #shift @jpegheader; #pop @jpegheader; #pop @jpegheader; #print "HERE!!!\n"; ###my @jpegs = map(pack("C",$_), @jpegheader); #$jpegheader = join("",map(pack("H",$_), @jpegheader)); #} #if ($flash->{frames}[$a][$b]{'type'}==6) #{ #my %tag = %{$flash->{frames}[$a][$b]}; #my $jpeg = $flash->{frames}[$a][$b]{'guts'}; #$jpeg =~ s/\n/ /g; #my @jpeg = split(/\s*/,$jpeg); #shift @jpeg; #shift @jpeg; #pop @jpeg; #pop @jpeg; #$jpeg = join("",map(pack("H",$_), @jpeg)); #print "HERE!!!\n"; #open (OUT, ">mypic.jpeg") || warn "Couldn't open file $!\n"; #binmode OUT; #print OUT $jpegheader; #print OUT $jpeg; #close OUT; #} while (($name,$value)=each %{$flash->{frames}[$a][$b]}) { unless ($name eq 'type') { if (ref($value) eq 'HASH') { dumpHash($name,$value); }else{ print "\t$name $value" unless ($name eq 'guts');} } } print "\n\n"; } } print "***** Finished Dumping SWF File Information *****\n"; } sub dumpHash { my ($name,$value) = @_; if ($name eq "cx") { my %cx = %{$value}; printf("CXFORM:\n"); printf("Alpha: mul:%04u add:%04u\n", $cx{'aa'},$cx{'ab'}) if (defined($cx{'aa'}) && defined($cx{'ab'})); printf("Red: mul:%04u add:%04u\n", $cx{'ra'}, $cx{'rb'}) if (defined($cx{'ra'}) && defined($cx{'rb'})); printf("Green: mul:%04u add:%04u\n", $cx{'ga'}, $cx{'gb'}) if (defined($cx{'ga'}) && defined($cx{'gb'})); printf("Blue: mul:%04u add:%04u\n", $cx{'ba'}, $cx{'bb'}) if (defined($cx{'ba'}) && defined($cx{'bb'})); }elsif ($name eq "matrix"){ my %matrix = %{$value}; if (defined($matrix{'c'})) { printf("\n\t[%5.3f %5.3f]\n", $matrix{'a'}, $matrix{'b'}); printf("\t[%5.3f %5.3f]\n", $matrix{'c'}, $matrix{'d'}); printf("\t[%5.3f %5.3f]\n", $matrix{'tx'}, $matrix{'ty'}); } } elsif ($name eq "rect") { my %rect = %{$value}; printf("\t(%g, %g)[%g x %g]\n", $rect{'xmin'} / 20, $rect{'ymin'} / 20, ($rect{'xmax'} - $rect{'xmin'}) / 20, ($rect{'ymax'} - $rect{'ymin'}) / 20); }else{ print "\n\t$name\n"; while (($key,$val)=each %{$value}) { if (ref ($val) eq 'HASH') { dumpHash($key,$val); }else{ print "\t\t$key"; print " =$val\n" if (defined $val); } } } } 1;