package SWF::File; use strict; use SWF::Element; use SWF::BinStream::File; use Carp; our $VERSION = '0.033'; our @ISA = ('SWF::BinStream::Write::SubStream'); sub new { my ($class, $file, %header) = @_; my $stream = SWF::BinStream::File::Write->new($file, $header{Version}); my $self = $stream->sub_stream; bless $self, ref($class)||$class; $self->{_header_CompressFlag} = 0; $self->FrameRate( $header{FrameRate} || 12 ); $self->FrameSize( $header{FrameSize} || [0, 0, 12800, 9600] ); $self; } sub FrameRate { $_[0]->{_header_FrameRate} = $_[1] if defined $_[1]; $_[0]->{_header_FrameRate}; } sub FrameCount { $_[0]->{_framecount} = $_[1] if defined $_[1]; $_[0]->{_framecount}; } sub FrameSize { my $self = shift; return $self->{_header_FrameSize} if @_==0; if (eval{$_[0]->isa('SWF::Element::RECT')}) { $self->{_header_FrameSize} = $_[0]->clone; } else { my @param; if (ref($_[0]) eq 'ARRAY') { @param = @{$_[0]}; } else { @param = @_; } @param = map {(qw/Xmin Ymin Xmax Ymax/)[$_], $param[$_]} (0..3) if (@param == 4); $self->{_header_FrameSize} = SWF::Element::RECT->new(@param); } } sub compress { my ($self, $flag) = @_; $flag = 1 unless defined $flag; if ($self->Version < 6) { croak "Compressed SWF is supported by version 6 or higher "; } else { $self->{_header_CompressedFlag} = $flag; } } sub close { my ($self, $file) = @_; my $file_stream = $self->{_parent}; my $cf = $self->{_header_CompressedFlag}; $file_stream->open($file) if defined $file; $file_stream->set_string( $cf ? 'CWS' : 'FWS' ); $file_stream->set_UI8($self->Version); my $temp = $file_stream->sub_stream; $self->FrameSize->pack($temp); $file_stream->set_UI32( 3+1+4+ $temp->tell +2+2+ $self->tell); # Total File Length if ($cf) { $file_stream->add_codec('Zlib'); } $temp->flush_stream; $file_stream->set_UI16($self->FrameRate * 256); $file_stream->set_UI16($self->FrameCount); $self->SUPER::flush_stream; $file_stream->close; } *SWF::File::save = \&close; sub flush_stream {} 1; __END__ =head1 NAME SWF::File - Create SWF file. =head1 SYNOPSIS use SWF::File; $swf = SWF::File->new('movie.swf', Version => 4); # set header data $swf->FrameSize( 0, 0, 1000, 1000); $swf->FrameRate(12); # set tags $tag = SWF::Element::Tag->new( .... ) $tag->pack($swf); .... # save SWF and close $swf->close; =head1 DESCRIPTION I module can be used to make SWF (Macromedia Flash(R)) movie. I is a subclass of I, so you can pack Is in it. =head2 METHODS =over 4 =item SWF::File->new( [$filename, [Version => $version, FrameRate => $framerate, FrameSize => [$x1, $y1, $x2, $y2]]] ) Creates a new SWF file. You can set SWF header parameters. NOTE: Unlike the previous version, SWF version can be set only here. Default is 5. =item $swf->FrameRate( [$framerate] ) Sets and gets the frame rate of the movie (frames per second). Default is 12. =item $swf->FrameSize( [$x1, $y1, $x2, $y2] ) Sets the bounding box size of the movie frame in TWIPs (1 TWIP = 1/20 pixel), and gets the size as I object. Default is (0, 0, 12800, 9600). =item $swf->FrameCount( [$count] ) Sets and gets the frame count of the movie. Usually you don't need to set because I object automatically count the I tags. If you want to set the different value, you should set it just before I<$swf-Eclose>. =item $swf->compress Makes output SWF compressed. You should set the version to 6 or higher before call it. =item $swf->close( [$filename] ) / $swf->save( [$filename] ) Saves SWF to the file and closes it. =back =head1 COPYRIGHT Copyright 2001 Yasuhiro Sasama (ySas), This library is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 SEE ALSO L, L SWF file format specification from Macromedia. =cut