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

📄 atflashimporter.cpp

📁 flash文件的解码程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
void AtFlashImportHandler::Import(FlashTagDefineShape3 *data)
{
#if 0
	std::cout << "\n<FlashTagDefineShape3>\n";
	std::cout << "ID:" << data.GetID() << "\n";
	PrintRect(data.GetShapes().GetBounds());
	PrintRect(data.rimport);
#endif
	// Update the shape's id into the character idspace
	FlashIDFactory	idFactory;
	UWORD	newid = idFactory.GetCharacterID();
	mIdMap[ data->GetID() ] = newid;
	data->SetID( newid );

	mFlash->GetShapeList().push_back( data );
}

void AtFlashImportHandler::Import(FlashTagFreeCharacter *data)
{
#if 0
	std::cout << "\n<FreeCharacter>\n";
	std::cout << "ID:" << data.GetID() << "\n";
#endif
	delete data;
}

void AtFlashImportHandler::Import(FlashTagDefineSound *data)
{
#if 0
	std::cout << "\n<FlashTagDefineSound>\n";
	std::cout << "ID:" << data.GetID() << "\n";
	std::cout << "Flags:" << (int)data.GetFlags() << "\n";
	std::cout << "Sample Count:" << data.GetSampleCount() << "\n";
	std::cout << "Sample Length:" << data.GetSampleLength() << "\n";
#endif
	delete data;
}

void AtFlashImportHandler::Import(FlashTagDefineSoundMP3 *data)
{
#if 0
	std::cout << "\n<FlashTagDefineSoundMP3>\n";
	std::cout << "ID:" << data.GetID() << "\n";
	std::cout << "Flags:" << (int)data.GetFlags() << "\n";
	std::cout << "Sample Count:" << data.GetSampleCount() << "\n";
	std::cout << "Sample Length:" << data.GetSampleLength() << "\n";
#endif
	delete data;
}

void AtFlashImportHandler::Import(FlashTagStartSound *data)
{
#if 0
	std::cout << "\n<FlashTagStartSound>\n";
	std::cout << "ID:" << data.GetID() << "\n";
	std::cout << "Sound Info:\n";
	std::cout << "  Flags: "  << (int)data.GetSoundInfo().GetFlags()   << "\n";
	
	if(data.GetSoundInfo().GetFlags() & FSI_HAS_IN != 0) std::cout << "  In Point: "  << data.GetSoundInfo().GetInPoint()   << "\n";
	if(data.GetSoundInfo().GetFlags() & FSI_HAS_OUT != 0) std::cout << "  Out Point: " << data.GetSoundInfo().GetOutPoint()  << "\n";
	if(data.GetSoundInfo().GetFlags() & FSI_HAS_LOOP != 0) std::cout << "  Loop Count: " << data.GetSoundInfo().GetLoopCount() <<  "\n";
	if(data.GetSoundInfo().GetFlags() & FSI_HAS_ENVELOPE != 0) std::cout << "  Sound Envelopes Found\n";
#endif
	delete data;
}

void AtFlashImportHandler::Import(FlashTagSoundStreamHead *data)
{
#if 0
	std::cout << "\n<FlashTagSoundStreamHead>\n";
	std::cout << "Play Rate: " <<  (int)data.GetPlayRate() << "\n";
	std::cout << "Play 16 Bit: " << data.GetPlay16bit() << "\n";
	std::cout << "Play Stereo: " << data.GetPlayStereo() << "\n";
	std::cout << "Compression: " << (int)data.GetCompression() << "\n";
	std::cout << "Stream Rate: " << (int)data.GetStreamRate() << "\n";
	std::cout << "Stream 16 Bit: " << data.GetStream16bit() << "\n";
	std::cout << "Stream Stereo: " << data.GetStreamStereo() << "\n";
	std::cout << "Sample Count Avg.: " << data.GetSampleCountAvg() << "\n";
#endif
	delete data;
}

void AtFlashImportHandler::Import(FlashTagSoundStreamHead2 *data)
{
#if 0
	std::cout << "\n<FlashTagSoundStreamHead2>\n";
	std::cout << "Play Rate: " << (int)data.GetPlayRate() << "\n";
	std::cout << "Play 16 Bit: " << data.GetPlay16bit() << "\n";
	std::cout << "Play Stereo: " << data.GetPlayStereo()<< "\n";
	std::cout << "Compression: " << (int)data.GetCompression() << "\n";
	std::cout << "Stream Rate: " << (int)data.GetStreamRate() << "\n";
	std::cout << "Stream 16 Bit: " << data.GetStream16bit() << "\n";
	std::cout << "Stream Stereo: " << data.GetStreamStereo() << "\n";
	std::cout << "Sample Count Avg.: " << data.GetSampleCountAvg() << "\n";
#endif
	delete data;
}

void AtFlashImportHandler::Import(FlashTagSoundStreamBlock *data)
{
#if 0
	std::cout << "\n<FlashTagSoundStreamBlock>\n";
	std::cout << "Length:" << data.GetSampleLength() << "\n";
#endif
	delete data;
}

FlashHeader AtFlashImporter::ImportHeader(std::istream &in, AtFlashImportHandler &i)
{
	FlashHeader h;
	in >> h;
	i.Import(h);
	return h;
}
 

#define IMPORT_MACRO(id, name)                               \
	if(tagHeader.GetTagID() == id)                           \
	{                                                        \
		name *tmp = new name();                              \
		tmp->SetImportSize(tagHeader.GetTagLength());        \
		in >> *tmp;                                          \
		i.Import(tmp);                                       \
}

bool AtFlashImporter::ImportTag(std::istream &in, AtFlashImportHandler &i)
{
	FlashTagHeader tagHeader;
	in >> tagHeader;
	
	std::streampos start = in.tellg();

	if(tagHeader.GetTagID() == 4)
	{
		FlashTagPlaceObject *tmp = new FlashTagPlaceObject();
		tmp->SetImportSize(tagHeader.GetTagLength());
		in >> *tmp;
		i.Import(tmp); // PlaceObject
	}
	else if(tagHeader.GetTagID() == 26)
	{
		FlashTagPlaceObject2 *tmp = new FlashTagPlaceObject2();
		tmp->SetImportSize(tagHeader.GetTagLength());
		in >> *tmp;
		i.Import(tmp); // PlaceObject2
	}
	else if(tagHeader.GetTagID() ==  5)
	{
		FlashTagRemoveObject *tmp = new FlashTagRemoveObject();
		tmp->SetImportSize(tagHeader.GetTagLength());
		in >> *tmp;
		i.Import(tmp); // RemoveObject
	}
	else if(tagHeader.GetTagID() == 28)
	{
		FlashTagRemoveObject2 *tmp = new FlashTagRemoveObject2();
		tmp->SetImportSize(tagHeader.GetTagLength());
		in >> *tmp;
		i.Import(tmp); // RemoveObject2
	}
	else if(tagHeader.GetTagID() == 1)
	{
		FlashTagShowFrame *tmp = new FlashTagShowFrame();
		tmp->SetImportSize(tagHeader.GetTagLength());
		in >> *tmp;
		i.Import(tmp); // ShowFrame
	}
	else if(tagHeader.GetTagID() == 9)
	{
		FlashTagBackgroundColor *tmp = new FlashTagBackgroundColor();
		tmp->SetImportSize(tagHeader.GetTagLength());
		in >> *tmp;
		i.Import(tmp);
	}
	else if(tagHeader.GetTagID() == 43)
	{
		FlashTagLabelFrame *tmp = new FlashTagLabelFrame();
		tmp->SetImportSize(tagHeader.GetTagLength());
		in >> *tmp;
		i.Import(tmp);
	}
	else if(tagHeader.GetTagID() == 24)
	{
		FlashTagProtect *tmp = new FlashTagProtect();
		tmp->SetImportSize(tagHeader.GetTagLength());
		in >> *tmp;
		i.Import(tmp);
	}
	else if(tagHeader.GetTagID() == 0)
	{
		FlashTagEnd *tmp = new FlashTagEnd();
		tmp->SetImportSize(tagHeader.GetTagLength());
		in >> *tmp;
		i.Import(tmp);
	}
	else if(tagHeader.GetTagID() == 56)
	{
		FlashTagExportAssets *tmp = new FlashTagExportAssets();
		tmp->SetImportSize(tagHeader.GetTagLength());
		in >> *tmp;
		i.Import(tmp);
	}
	else if(tagHeader.GetTagID() == 57)
	{
		FlashTagImportAssets *tmp = new FlashTagImportAssets();
		tmp->SetImportSize(tagHeader.GetTagLength());
		in >> *tmp;
		i.Import(tmp);
	}
	else IMPORT_MACRO(8, FlashTagJPEGTables)
	else IMPORT_MACRO(6,  FlashTagDefineBitsJPEG1)
	else IMPORT_MACRO(21, FlashTagDefineBitsJPEG2)
	else IMPORT_MACRO(35, FlashTagDefineBitsJPEG3)
	else IMPORT_MACRO(20, FlashTagDefineBitsLossless)
	else IMPORT_MACRO(36, FlashTagDefineBitsLossless2)

	else IMPORT_MACRO(2,  FlashTagDefineShape1)
	else IMPORT_MACRO(22, FlashTagDefineShape2)
	else IMPORT_MACRO(32, FlashTagDefineShape3)
	else IMPORT_MACRO(3,  FlashTagFreeCharacter)

	else if(tagHeader.GetTagID() == 14)
	{
		
		int c = in.get();
		if(c == EOF)
		{ 
			//throw
		}
		else
		{
			if(c & FTDS_COMPRESS_MP3 != 0) 
			{
				in.putback(c);
				FlashTagDefineSoundMP3 *tmp = new FlashTagDefineSoundMP3();
				tmp->SetImportSize(tagHeader.GetTagLength());
				in >> *tmp;
				i.Import(tmp);
			}
			else
			{
				in.putback(c);
				FlashTagDefineSound *tmp = new FlashTagDefineSound();
				tmp->SetImportSize(tagHeader.GetTagLength());
				in >> *tmp;
				i.Import(tmp);
			}
		}	
	}

	else IMPORT_MACRO(15, FlashTagStartSound)
	else IMPORT_MACRO(18, FlashTagSoundStreamHead)
	else IMPORT_MACRO(45, FlashTagSoundStreamHead2)
	else IMPORT_MACRO(19, FlashTagSoundStreamBlock)
	
	else
	{
		// skip
		for(UDWORD index=0; index < tagHeader.GetTagLength(); index++)
		{
			in.get();
		}
		i.Import(tagHeader);
	}
	
	if(tagHeader.GetTagLength() + start != (UDWORD)in.tellg())
	{
		if(tagHeader.GetTagLength() + start > (UDWORD)in.tellg())
		{
			UDWORD difference = (tagHeader.GetTagLength() + start) - (UDWORD)in.tellg();
			
			std::cerr << "Extra Tag Data Encountered: " <<  difference;

			for(UDWORD index=0; index < difference; index++)
			{
				in.get();
			}
		}
		else
		{
			long difference = (long )in.tellg() - (long)(tagHeader.GetTagLength() + start);
//			std::cout << "Tag Size Discrepancy: -" << difference;
			char msg[256];
			sprintf( msg, "Tag size discrepancy at 0x%x\n", start );
			std::cerr << msg;

			// attempt to recover
			in.seekg( (long)(tagHeader.GetTagLength() + start ) );
			if ( in.fail() )
				throw AtException( msg );
		}
	}
	if(tagHeader.GetTagID() == 0)
	{
		return false;
	}
	return true;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -