metaforce/Runtime/GuiSys/CRasterFont.cpp

82 lines
2.4 KiB
C++
Raw Normal View History

2016-03-11 22:52:55 +00:00
#include "GuiSys/CRasterFont.hpp"
namespace urde
{
CRasterFont::CRasterFont(urde::CInputStream& in, urde::IObjectStore& store)
{
u32 magic = in.readUint32Big();
if (magic != SBIG('FONT'))
return;
u32 version = in.readUint32Big();
x4_monoWidth = in.readUint32Big();
x8_monoHeight = in.readUint32Big();
if (version >= 1)
x8c_baseline = in.readUint32Big();
else
x8c_baseline = x8_monoHeight;
if (version >= 2)
x90_ = in.readUint32Big();
bool tmp1 = in.readBool();
bool tmp2 = in.readBool();
u32 tmp3 = in.readUint32Big();
u32 tmp4 = in.readUint32Big();
std::string name= in.readString();
u32 txtrId = in.readUint32Big();
x80_texture = store.GetObj({'TXTR', txtrId});
x30_fontInfo = CFontInfo(tmp1, tmp2, tmp3, tmp4, name.c_str());
u32 mode = in.readUint32Big();
/* TODO: Make an enum */
if (mode == 1)
x2c_mode = 1;
else if (mode == 0)
x2c_mode = 0;
u32 glyphCount = in.readUint32Big();
xc_glyphs.reserve(glyphCount);
for (u32 i = 0 ; i < glyphCount ; ++i)
{
wchar_t chr = in.readUint16Big();
float startU = in.readFloatBig();
float startV = in.readFloatBig();
float endU = in.readFloatBig();
float endV = in.readFloatBig();
s32 a = in.readInt32Big();
s32 b = in.readInt32Big();
s32 c = in.readInt32Big();
s32 cellWidth = in.readInt32Big();
s32 cellHeight = in.readInt32Big();
s32 baseline = in.readInt32Big();
s32 kernStart = in.readUint32();
xc_glyphs[i] = std::make_pair(chr, CGlyph(a, b, c, startU, startV, endU, endV,
cellWidth, cellHeight, baseline, kernStart));
}
std::sort(xc_glyphs.begin(), xc_glyphs.end(), [=](auto& a, auto& b) -> bool{
return a.first < b.first;
});
u32 kernCount = in.readUint32Big();
x1c_kerning.reserve(kernCount);
for (u32 i = 0 ; i < kernCount ; ++i)
{
wchar_t first = in.readUint16Big();
wchar_t second = in.readUint16Big();
s32 howMuch = in.readUint32Big();
x1c_kerning[i] = CKernPair(first, second, howMuch);
}
2016-03-11 22:52:55 +00:00
}
2016-03-12 05:10:14 +00:00
std::unique_ptr<IObj> FRasterFontFactory(const SObjectTag& tag, CInputStream& in, const CVParamTransfer& vparms)
{
return TToken<CRasterFont>::GetIObjObjectFor(std::make_unique<CRasterFont>(in, *(reinterpret_cast<IObjectStore*>(vparms.GetObj()))));
}
2016-03-11 22:52:55 +00:00
}