?? tagparser.java
字號:
/****************************************************************
* Copyright (c) 2001, David N. Main, All rights reserved.
*
* Redistribution and use in source and binary forms, with or
* without modification, are permitted provided that the
* following conditions are met:
*
* 1. Redistributions of source code must retain the above
* copyright notice, this list of conditions and the following
* disclaimer.
*
* 2. Redistributions in binary form must reproduce the above
* copyright notice, this list of conditions and the following
* disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* 3. The name of the author may not be used to endorse or
* promote products derived from this software without specific
* prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY
* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
* THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
* PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
* AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
* OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
* EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
****************************************************************/
package com.anotherbigidea.flash.readers;
import java.io.*;
import java.util.*;
import java.util.zip.*;
import com.anotherbigidea.flash.interfaces.*;
import com.anotherbigidea.flash.*;
import com.anotherbigidea.flash.structs.*;
import com.anotherbigidea.io.*;
import com.anotherbigidea.flash.writers.*;
/**
* Parse Tags and drive a SWFTagTypes interface.
*/
public class TagParser implements SWFTags, SWFConstants, SWFFileSignature
{
protected String mStringEncoding = SWFConstants.STRING_ENCODING_MX;
protected int mFlashVersion = SWFConstants.FLASH_MX_VERSION;
protected SWFTagTypes mTagtypes;
//protected byte[] contents; //for debugging
public TagParser( SWFTagTypes tagtypes )
{
mTagtypes = tagtypes;
}
/**
* @see SWFFileSignature#signature(String)
*/
public void signature( String sig ) {
if( mTagtypes instanceof SWFFileSignature ) {
((SWFFileSignature) mTagtypes).signature( sig );
}
}
/**
* Interface SWFTags
*/
public void header( int version, long length,
int twipsWidth, int twipsHeight,
int frameRate, int frameCount ) throws IOException
{
mTagtypes.header( version, length,
twipsWidth, twipsHeight,
frameRate, frameCount );
//revert to old encoding for pre-MX
if( version < SWFConstants.FLASH_MX_VERSION ) {
mStringEncoding = SWFConstants.STRING_ENCODING_PRE_MX;
}
mFlashVersion = version;
}
/**
* Interface SWFTags
public void tag( int tagType, boolean longTag, byte[] contents )
throws IOException
{
//this.contents = contents; //for debugging
int length = ( contents != null ) ? contents.length : 0;
InStream in = ( length > 0 ) ? new InStream( contents ) : null;
//System.out.println( "IN Tag " + tagType + " " + longTag + " " + length );
switch( tagType )
{
case TAG_END: tagtypes.tagEnd(); break;
case TAG_SHOWFRAME: tagtypes.tagShowFrame(); break;
//case TAG_DEFINESHAPE :
//case TAG_DEFINESHAPE2:
//case TAG_DEFINESHAPE3: parseDefineShape( tagType, in ); break;
case TAG_DOACTION : parseDoAction( in ); break;
//case TAG_FREECHARACTER : tagtypes.tagFreeCharacter( in.readUI16() ); break;
//case TAG_PLACEOBJECT : parsePlaceObject( in, length ); break;
case TAG_PLACEOBJECT2 : parsePlaceObject2( in ); break;
//case TAG_REMOVEOBJECT : tagtypes.tagRemoveObject( in.readUI16(), in.readUI16() ); break;
//case TAG_REMOVEOBJECT2 : tagtypes.tagRemoveObject2( in.readUI16() ); break;
//case TAG_SETBACKGROUNDCOLOR : tagtypes.tagSetBackgroundColor( new Color(in) ); break;
//case TAG_FRAMELABEL : tagtypes.tagFrameLabel( in.readString() ); break;
case TAG_DEFINESPRITE : parseDefineSprite( in ); break;
//case TAG_PROTECT : tagtypes.tagProtect( (length>0) ? in.read(length) : null ); break;
//case TAG_ENABLEDEBUG : tagtypes.tagEnableDebug( (length>0) ? in.read(length) : null ); break;
//case TAG_DEFINEFONT : parseDefineFont( in ); break;
//case TAG_DEFINEFONTINFO: parseFontInfo( in, length ); break;
//case TAG_DEFINEFONT2 : parseDefineFont2( in ); break;
//case TAG_DEFINETEXT :
//case TAG_DEFINETEXT2 : parseDefineText( tagType, in ); break;
case TAG_DEFINEBUTTON : parseDefineButton( in ); break;
case TAG_DEFINEBUTTON2 : parseDefineButton2( in ); break;
//case TAG_DEFINEBUTTONCXFORM : parseButtonCXForm( in ); break;
//case TAG_EXPORT : parseExport( in ); break;
//case TAG_IMPORT : parseImport( in ); break;
//case TAG_DEFINEQUICKTIMEMOVIE : tagtypes.tagDefineQuickTimeMovie( in.readUI16(), in.readString() ); break;
//case TAG_DEFINEBITSJPEG2 : parseDefineJPEG2( in, length ); break;
//case TAG_DEFINEBITSLOSSLESS : parseDefineBitsLossless( in, length, false ); break;
//case TAG_DEFINEBITSLOSSLESS2 : parseDefineBitsLossless( in, length, true ); break;
//case TAG_DEFINEMORPHSHAPE : parseMorphShape( in ); break;
//case TAG_NAMECHARACTER: tagtypes.tagNameCharacter ( contents ); break;
//case TAG_GENERATOR_TEXT: tagtypes.tagGeneratorText ( contents ); break;
//case TAG_TEMPLATECOMMAND: tagtypes.tagGeneratorCommand( contents ); break;
//case TAG_FLASHGENERATOR: tagtypes.tagGenerator ( contents ); break;
//case TAG_GEN_EXTERNAL_FONT: tagtypes.tagGeneratorFont ( contents ); break;
//case TAG_SERIALNUMBER: tagtypes.tagSerialNumber( in.readString() ); break;
//case TAG_DEFINESOUND: parseDefineSound( in ); break;
//case TAG_STARTSOUND: parseStartSound( in ); break;
//case TAG_DEFINEBUTTONSOUND: parseDefineButtonSound( in ); break;
//case TAG_SOUNDSTREAMHEAD: parseSoundStreamHead( true, in ); break;
//case TAG_SOUNDSTREAMHEAD2: parseSoundStreamHead( false, in ); break;
//case TAG_SOUNDSTREAMBLOCK: parseSoundStreamBlock( in ); break;
//case TAG_DEFINEBITS: parseDefineBits( in ); break;
//case TAG_JPEGTABLES: parseDefineJPEGTables( in ); break;
//case TAG_DEFINEBITSJPEG3: parseDefineBitsJPEG3( in ); break;
default: //--Unknown Tag Type
tagtypes.tag( tagType, longTag, contents );
break;
}
} */
/**
* Interface SWFTags
*/
public void tag( int tagType, boolean longTag, byte[] contents )
throws IOException
{
//this.contents = contents; //for debugging
int length = ( contents != null ) ? contents.length : 0;
InStream in = ( length > 0 ) ? new InStream( contents ) : null;
//System.out.println( "IN Tag " + tagType + " " + longTag + " " + length );
switch( tagType )
{
case TAG_END: mTagtypes.tagEnd(); break;
case TAG_SHOWFRAME: mTagtypes.tagShowFrame(); break;
case TAG_DEFINESHAPE :
case TAG_DEFINESHAPE2:
case TAG_DEFINESHAPE3: parseDefineShape( tagType, in ); break;
case TAG_DOACTION : parseDoAction( in ); break;
case TAG_DOINITACTION : parseDoInitAction( in ); break;
case TAG_FREECHARACTER : mTagtypes.tagFreeCharacter( in.readUI16() ); break;
case TAG_PLACEOBJECT : parsePlaceObject( in, length ); break;
case TAG_PLACEOBJECT2 : parsePlaceObject2( in ); break;
case TAG_REMOVEOBJECT : mTagtypes.tagRemoveObject( in.readUI16(), in.readUI16() ); break;
case TAG_REMOVEOBJECT2 : mTagtypes.tagRemoveObject2( in.readUI16() ); break;
case TAG_SETBACKGROUNDCOLOR : mTagtypes.tagSetBackgroundColor( new Color(in) ); break;
case TAG_FRAMELABEL : parseFrameLabel( in, contents ); break;
case TAG_DEFINESPRITE : parseDefineSprite( in ); break;
case TAG_PROTECT : mTagtypes.tagProtect( (length>0) ? in.read(length) : null ); break;
case TAG_ENABLEDEBUG : mTagtypes.tagEnableDebug( (length>0) ? in.read(length) : null ); break;
case TAG_DEFINEFONT : parseDefineFont( in ); break;
case TAG_DEFINEFONTINFO: parseFontInfo( in, length, false ); break;
case TAG_DEFINEFONTINFO2: parseFontInfo( in, length, true ); break;
case TAG_DEFINEFONT2 : parseDefineFont2( in ); break;
case TAG_DEFINETEXTFIELD: parseDefineTextField( in ); break;
case TAG_DEFINETEXT :
case TAG_DEFINETEXT2 : parseDefineText( tagType, in ); break;
case TAG_DEFINEBUTTON : parseDefineButton( in ); break;
case TAG_DEFINEBUTTON2 : parseDefineButton2( in ); break;
case TAG_DEFINEBUTTONCXFORM : parseButtonCXForm( in ); break;
case TAG_EXPORT : parseExport( in ); break;
case TAG_IMPORT : parseImport( in ); break;
case TAG_DEFINEQUICKTIMEMOVIE : mTagtypes.tagDefineQuickTimeMovie( in.readUI16(), in.readString( mStringEncoding ) ); break;
case TAG_DEFINEBITSJPEG2 : parseDefineJPEG2( in, length ); break;
case TAG_DEFINEBITSLOSSLESS : parseDefineBitsLossless( in, length, false ); break;
case TAG_DEFINEBITSLOSSLESS2 : parseDefineBitsLossless( in, length, true ); break;
case TAG_DEFINEMORPHSHAPE : parseMorphShape( in ); break;
case TAG_NAMECHARACTER: mTagtypes.tagNameCharacter ( contents ); break;
case TAG_GENERATOR_TEXT: mTagtypes.tagGeneratorText ( contents ); break;
case TAG_TEMPLATECOMMAND: mTagtypes.tagGeneratorCommand( contents ); break;
case TAG_FLASHGENERATOR: mTagtypes.tagGenerator ( contents ); break;
case TAG_GEN_EXTERNAL_FONT: mTagtypes.tagGeneratorFont ( contents ); break;
case TAG_SERIALNUMBER: mTagtypes.tagSerialNumber( in.readString( mStringEncoding ) ); break;
case TAG_DEFINESOUND: parseDefineSound( in ); break;
case TAG_STARTSOUND: parseStartSound( in ); break;
case TAG_DEFINEBUTTONSOUND: parseDefineButtonSound( in ); break;
case TAG_SOUNDSTREAMHEAD: parseSoundStreamHead( true, in ); break;
case TAG_SOUNDSTREAMHEAD2: parseSoundStreamHead( false, in ); break;
case TAG_SOUNDSTREAMBLOCK: parseSoundStreamBlock( in ); break;
case TAG_DEFINEBITS: parseDefineBits( in ); break;
case TAG_JPEGTABLES: parseDefineJPEGTables( in ); break;
case TAG_DEFINEBITSJPEG3: parseDefineBitsJPEG3( in ); break;
case TAG_ENABLEDEBUGGER2 : parseEnableDebugger2( in, length ); break;
default: //--Unknown Tag Type
mTagtypes.tag( tagType, longTag, contents );
break;
}
}//*/
protected void parseEnableDebugger2( InStream in, int length ) throws IOException {
int reserved = in.readUI16();
mTagtypes.tagEnableDebug2( (length>2) ? in.read(length-2) : null );
}
protected void parseFrameLabel( InStream in, byte[] contents ) throws IOException {
if( contents != null && contents.length >= 2 ) {
int len = contents.length;
if( contents[len-1] == 1 && contents[len-2] == 0 ) {
//is an anchor label
mTagtypes.tagFrameLabel( in.readString( mStringEncoding ), true );
return;
}
}
mTagtypes.tagFrameLabel( in.readString( mStringEncoding ) );
}
protected void parseDefineSound( InStream in ) throws IOException
{
int id = in.readUI16();
int format = (int)in.readUBits( 4 );
int frequency = (int)in.readUBits( 2 );
boolean bits16 = in.readUBits(1) != 0;
boolean stereo = in.readUBits(1) != 0;
int sampleCount = (int)in.readUI32();
byte[] soundData = in.read();
mTagtypes.tagDefineSound( id, format, frequency, bits16, stereo,
sampleCount, soundData );
}
protected void parseStartSound( InStream in ) throws IOException
{
int id = in.readUI16();
SoundInfo info = new SoundInfo( in );
mTagtypes.tagStartSound( id, info );
}
protected void parseDefineButtonSound( InStream in ) throws IOException
{
int id = in.readUI16();
int rollOverSoundId = in.readUI16();
SoundInfo rollOverSoundInfo = (rollOverSoundId==0) ? null : new SoundInfo( in );
int rollOutSoundId = in.readUI16();
SoundInfo rollOutSoundInfo = (rollOutSoundId==0) ? null : new SoundInfo( in );
int pressSoundId = in.readUI16();
SoundInfo pressSoundInfo = (pressSoundId==0) ? null : new SoundInfo( in );
int releaseSoundId = in.readUI16();
SoundInfo releaseSoundInfo = (releaseSoundId==0) ? null : new SoundInfo( in );
mTagtypes.tagDefineButtonSound( id,
rollOverSoundId, rollOverSoundInfo,
rollOutSoundId, rollOutSoundInfo,
pressSoundId, pressSoundInfo,
releaseSoundId, releaseSoundInfo );
}
protected void parseSoundStreamHead( boolean adpcmOnly, InStream in ) throws IOException
{
int reserved = (int)in.readUBits(4);
int playbackFreq = (int)in.readUBits(2);
boolean playback16bits = ( in.readUBits(1) != 0 );
boolean playbackStereo = ( in.readUBits(1) != 0 );
int format = (int)in.readUBits(4);
int streamFreq = (int)in.readUBits(2);
boolean stream16bits = ( in.readUBits(1) != 0 );
boolean streamStereo = ( in.readUBits(1) != 0 );
int avgSampleCount = (int)in.readUI16();
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -