⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 tagparser.java

📁 java版本的flash文件(swf)播放器
💻 JAVA
📖 第 1 页 / 共 4 页
字号:
/****************************************************************
 * 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_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 : 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 + -