📄 ffont.cpp
字号:
#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 + -