void DefineSprite::ReadData(SWFReader *swf, int length){ mSprite.SpriteID = swf->ReadUI16(); printf(" SpriteID = %d\n", mSprite.SpriteID ); mSprite.FrameCount = swf->ReadUI16(); printf(" FrameCount = %d\n", mSprite.FrameCount ); printf(" ----------------------------------------\n"); mSprite.TagList.clear(); Tag *p; do { printf(" "); p = new Tag(swf); mSprite.TagList.push_back(*p); } while (p->ID() != 0); list<Tag>::iterator i; int iContentsLength = 0; for (i = mSprite.TagList.begin(); i != mSprite.TagList.end(); ++i) { iContentsLength += (*i).GetLength(); } printf(" # Content length in this Sprite = %d\n", iContentsLength); printf(" ----------------------------------------\n"); }
void DefineSprite::ReplaceSprite(list<Tag>* pMainTagList, const char* szFile){ #if 1 Tag* _TagList_Definitions[256]; Tag* _TagList_4Sprite[256]; Header _Header; int iDefCount = 0; int iActionScount = 0; // 1. Read in new Tag list from file FILE* fp = fopen(szFile, "rb"); if( NULL==fp ){ printf("Open file (%s)error\n", szFile); return; } unsigned char *Buf=0; fseek(fp, 0L, SEEK_END); long lfilesize = ftell(fp); Buf = (unsigned char *)malloc(lfilesize); if(Buf){ fseek(fp, 0L, SEEK_SET); fread(Buf, 1, lfilesize, fp); //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ // 1) Read in the new Tag contents in the file SWFReader* swf = new SWFReader(Buf); _Header.Read(swf); Tag* p; do { p = new Tag(swf); if( p->ID()>0 ){ /* The following tags are valid within a DefineSprite tag: . ShowFrame(1) . StartSound(15) . PlaceObject(4) . FrameLabel(43) . PlaceObject2(26) . SoundStreamHead(18) . RemoveObject(5) . SoundStreamHead2(45) . RemoveObject2(28) . SoundStreamBlock(19) . All Actions (see Actions)(12, 59) . End(0) */ if( p->ID()==1 || p->ID()==15 || p->ID()==4 || p->ID()==43 || p->ID()==26 || p->ID()==18 || p->ID()==5 || p->ID()==45 || p->ID()==28 || p->ID()==19 || p->ID()==12 || p->ID()==59 ) { _TagList_4Sprite[iActionScount++] = p; } else{ // 9 : SetBackgroundColor if( p->ID()!=9 ){ _TagList_Definitions[iDefCount++] = p; } } } else{ _TagList_4Sprite[iActionScount++] = p; } } while (p->ID() != 0); //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ free(Buf); } fclose(fp); //----------------------------------------------------- // 2) Increase the Character IDs in the original list. list<Tag>::iterator i; for (i = pMainTagList->begin(); i != pMainTagList->end(); ++i) { (*i).GetTagContent()->IncreaseCharacterID( iDefCount ); } //----------------------------------------------------- //----------------------------------------------------- // 3) Inject the new Definition Tags into this original Tag list for( int j=iDefCount-1; j>=0; j-- ){ //list<Tag>::iterator j; //for (j = _TagList_Definitions.end(); j != _TagList_Definitions.begin(); --j) { // pMainTagList->push_front( *j ); pMainTagList->insert( ++pMainTagList->begin(), *_TagList_Definitions[j] ); } //pMainTagList->insert( pMainTagList->begin(), _TagList_Definitions.begin(), _TagList_Definitions.end()); //----------------------------------------------------- //----------------------------------------------------- // 4) Inject the new Action and other Tags for this Sprite list<Tag>::iterator k; mSprite.FrameCount = _Header.FrameCount(); mSprite.TagList.clear(); int iContentsLength = 0; for( int k=iActionScount-1; k>=0; k-- ){ //for (k = _TagList_4Sprite.begin(); k != _TagList_4Sprite.end(); ++k) { //mSprite.TagList.push_back( *k ); //iContentsLength += (*k).GetLength(); mSprite.TagList.push_front( *_TagList_4Sprite[k] ); iContentsLength += _TagList_4Sprite[k]->GetLength(); } printf(" # Content length in this Sprite = %d\n", iContentsLength); #endif }