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

📄 ffont.cpp

📁 这是一个用VC++开发的flashsource端的程序
💻 CPP
📖 第 1 页 / 共 2 页
字号:
#include "FFont.h"
#include <sstream>
#include <strstream>


std::ostream &operator << (std::ostream &out, FlashTagDefineFontInfo &data)
{
	out << FlashTagHeader(13, (UDWORD)strlen(data.str)+2+2+data.codes.size()*((data.flags & 1) ? 2:1));
	WRITE_UWORD(data.FontID);
	out.put((unsigned char)strlen(data.str));
	out << data.str;
	out.put((unsigned char)data.flags);
	if((data.flags & 1) == 1)
	{
		for(std::vector<UWORD>::iterator i = data.codes.begin(); i != data.codes.end(); i++)
		{
			WRITE_UWORD(*i);		
		}
	}
	else
	{
		for(std::vector<UWORD>::iterator i = data.codes.begin(); i != data.codes.end(); i++)
		{
			out.put((char)*i);
		}
	}
	return out;
}

std::istream &operator >> (std::istream &in,  FlashTagDefineFontInfo &data)
{

	READ_UWORD(data.FontID);
	
	int len = in.get();
	//if(i == EOF) throw;
	
	data.str = (char *)malloc(len+1);
	data.strings.push_back(data.str);
	data.str[len] = 0;
	
	unsigned char * tmp = (unsigned char *)data.str;
	
	for(int i=0; (i < len); i++)
	{
		int c = in.get();
		//if(c == EOF) throw;
		tmp[i] = c;
	}
	int flags = in.get();
	//if(flags == EOF) throw;
	
	data.flags = flags;
	
	UWORD size = data.importsize - (len+2+2);
	
	if(data.flags & 1)
	{
		for(UWORD i = 0; i < size; i+=2)
		{
			UWORD tmp;
			READ_UWORD(tmp);
			data.codes.push_back(tmp);		
		}
	}
	else
	{
		for(UWORD i = 0; i < size; i++)
		{
			int c = in.get();
			//if(c == EOF) throw;
			data.codes.push_back(c);
		}
		
	}
	return in;
}


int FlashTagDefineFont::AddShape(FlashShape &shape)
{
	shapes.push_back(shape);
	return shapes.size() - 1;
}

int FlashTagDefineFont::AddShape(FlashShape &shape, int glyphId)
{
	shapes.push_back(shape);
	int index = shapes.size() - 1;
	glyphs[glyphId] = index;
	return index;
	}

int FlashTagDefineFont::GetGlyphId(int glyph)
{	
	if(glyphs.find(glyph) == glyphs.end())
	{
		return -1;
	}
	return glyphs[glyph];
}

std::ostream &operator << (std::ostream &out, FlashTagDefineFont &data)
{
	
	std::ostrstream tmp;
		
	std::vector<UWORD> offsets;

	for(std::vector<FlashShape>::iterator i = data.shapes.begin(); i < data.shapes.end(); i++)
	{
		offsets.push_back(tmp.pcount());
		tmp << *i;
	}
	
	out << FlashTagHeader(10, (UDWORD)2+offsets.size()*2+tmp.pcount());
	WRITE_UWORD(data.GetID());
	
	for(std::vector<UWORD>::iterator i2 = offsets.begin(); i2 < offsets.end(); i2++)
	{
		WRITE_UWORD((UWORD)(*i2+offsets.size()*2));
	}
	
	out.write(tmp.rdbuf()->str(), tmp.pcount());

	return out;
}

std::istream &operator >> (std::istream &in,  FlashTagDefineFont &data)
{
	UWORD FontId;
	READ_UWORD(FontId);
	data.SetID(FontId);
	
	UWORD Offset1;
	READ_UWORD(Offset1);
	UWORD NumGlyphs = Offset1/2;

	std::vector<UWORD> offsets;
	offsets.push_back(Offset1);

	for(int i = 0; i < NumGlyphs-1; i++)
	{
		UWORD Offset;
		READ_UWORD(Offset);
		offsets.push_back(Offset);
	}

	for(int i2 = 0; i2 < NumGlyphs; i2++)
	{
		FlashShape s;
		in >> s;		
		data.shapes.push_back(s);
	}
	
	return in;
}

void FlashTextRecordStyle::Write(std::ostream &out, unsigned char bitsGlyph, unsigned char bitsAdvance)
{
	out.put((char)((char)(1 << 7)  | (char)(mhasFont << 3) | (char)(mhasFlashRGB << 2) | (char)(mhasOffsetx << 1) | (char)(mhasOffsety)));
	if(mhasFont)
	{
		WRITE_UWORD(mFontID);
	}
	if(mhasFlashRGB)
	{		
		mcolor.SetAlphaWriteMode(GetTagVersion() > 1);
		out << mcolor;
	}
	if(mhasOffsetx)
	{
		WRITE_SWORD(moffsetx);
	}
	if(mhasOffsety)
	{
		WRITE_SWORD(moffsety);
	}
	if(mhasFont)
	{
		WRITE_UWORD(mFontHeight);
	}
}

void FlashTextRecordStyle::Read(std::istream &in, unsigned char bitsGlyph, unsigned char bitsAdvance)
{
	int c = in.get();

	mhasFont		= (bool)(GetIsolatedBits(c,3,4) == 1);
	mhasFlashRGB	= (bool)(GetIsolatedBits(c,2,3) == 1);
	mhasOffsetx		= (bool)(GetIsolatedBits(c,1,2) == 1);
	mhasOffsety		= (bool)(GetIsolatedBits(c,0,1) == 1);
	
	if(mhasFont)
	{
		READ_UWORD(mFontID);
	}
	if(mhasFlashRGB)
	{		
		mcolor.SetAlphaWriteMode(GetTagVersion() > 1);
		in >> mcolor;
	}
	if(mhasOffsetx)
	{
		READ_SWORD(moffsetx);
	}
	if(mhasOffsety)
	{
		READ_SWORD(moffsety);
	}
	if(mhasFont)
	{
		READ_UWORD(mFontHeight);
	}
}

bool FlashTextRecordStyle::isGlyph(void)
{
	return false;
}

void FlashTextRecordGlyph::Write(std::ostream &out, unsigned char bitsGlyph, unsigned char bitsAdvance)
{
	out.put((char)v.size());
	BitStreamOut b(&out);
	for(std::vector<FlashGlyphEntry>::iterator i=v.begin(); i != v.end(); i++)
	{
		b.Write((*i).first, bitsGlyph);
		b.Write(PackBitsSigned((*i).second), bitsAdvance);
	}
	b.Align();
}

void FlashTextRecordGlyph::Read(std::istream &in, unsigned char bitsGlyph, unsigned char bitsAdvance)
{
	int c = in.get();
	BitStreamIn b(&in);
	
	for(int i = 0; i < c; i++)
	{
		FlashGlyphEntry tmp;
		b.Read(tmp.first, bitsGlyph);
		b.Read(tmp.second, bitsAdvance);
		v.push_back(tmp);
	}

	b.Align();

}
int FlashTextRecordGlyph::returnGlyphBits(void)
{
	int ret=0;
	for(std::vector<FlashGlyphEntry>::iterator i=v.begin(); i != v.end(); i++)
	{
		if(GetBitSize((*i).first) > ret) ret = GetBitSize((*i).first);
	}
	return ret;
}

int FlashTextRecordGlyph::returnAdvBits(void)
{
		int ret=0;
	for(std::vector<FlashGlyphEntry>::iterator i=v.begin(); i != v.end(); i++)
	{
		if(GetBitSizeSigned((*i).second) > ret) ret = GetBitSizeSigned((*i).second);
	}
	return ret;
}


void FlashTagDefineText::AddTextRecord(FlashTextRecord *r)
{
	records.push_back(r);
}

std::ostream &operator << (std::ostream &out, FlashTagDefineText &data)
{
	std::ostrstream tmp;
	int gbits=0;
	int abits=0;
	for(std::vector<FlashTextRecord *>::iterator i = data.records.begin(); i != data.records.end(); i++)
	{
		if((*i)->isGlyph())
		{
			if((*i)->returnGlyphBits() > gbits) { gbits=(*i)->returnGlyphBits(); }
			if((*i)->returnAdvBits()   > abits) { abits=(*i)->returnAdvBits(); }
		}
	}
	

	WRITE_UWORD2(data.GetID(), tmp);
	tmp << data.rect;
	tmp << data.matrix;
	tmp << (char)gbits;
	tmp << (char)abits;
	
	for(std::vector<FlashTextRecord *>::iterator i2 = data.records.begin(); i2 != data.records.end(); i2++)
	{
		(*i2)->SetTagVersion(1);
		(*i2)->Write(tmp,gbits,abits);
	}
	
	tmp << (char)0;

	out << FlashTagHeader(11, tmp.pcount());
	out.write(tmp.rdbuf()->str(), tmp.pcount());

	return out;
}

std::istream &operator >> (std::istream &in,  FlashTagDefineText &data)
{
	UWORD id;	
	READ_UWORD(id);
	data.SetID(id);

	in >> data.rect;
	in >> data.matrix;
	int gbits = in.get();
	int abits = in.get();
	
	
	for(;;)
	{
		int c = in.get();
		if(in.eof())
		{
			break;
			//throw;
		}

		if(c == 0)
		{
			break;
		}

		if(GetIsolatedBits(c,7,8) == 1)
		{
			in.putback(c);
			FlashTextRecordStyle *s = new FlashTextRecordStyle();
			s->Read(in, gbits, abits);
			data.AddTextRecord(s);
			data.gc_records.push_back(s);
			
		}
		else
		{
			in.putback(c);
			FlashTextRecordGlyph *g = new FlashTextRecordGlyph();
			g->Read(in, gbits, abits);
			data.AddTextRecord(g);
			data.gc_records.push_back(g);
		}
	}
	return in;
}

void FlashTagDefineText2::AddTextRecord(FlashTextRecord *r)
{
	records.push_back(r);
}

std::ostream &operator << (std::ostream &out, FlashTagDefineText2 &data)
{
	std::ostrstream tmp;
	int gbits=0;
	int abits=0;
	for(std::vector<FlashTextRecord *>::iterator i = data.records.begin(); i != data.records.end(); i++)
	{
		if((*i)->isGlyph())

⌨️ 快捷键说明

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