mirror of https://github.com/AxioDL/metaforce.git
Fixed GZip memory font access
This commit is contained in:
parent
05287d1058
commit
2c138d138e
|
@ -1 +1 @@
|
||||||
Subproject commit 76e74ad732af7278fbed227fdf57f1f38f44ac76
|
Subproject commit bddbb5dd8a91591218ba2f50f4ef1c90ed8a4ca7
|
|
@ -10,6 +10,17 @@
|
||||||
namespace Specter
|
namespace Specter
|
||||||
{
|
{
|
||||||
|
|
||||||
|
class FreeTypeGZipMemFace
|
||||||
|
{
|
||||||
|
FT_StreamRec m_comp = {};
|
||||||
|
FT_StreamRec m_decomp = {};
|
||||||
|
FT_Face m_face;
|
||||||
|
public:
|
||||||
|
FreeTypeGZipMemFace(FT_Library lib, const uint8_t* data, size_t sz);
|
||||||
|
~FreeTypeGZipMemFace();
|
||||||
|
operator FT_Face() {return m_face;}
|
||||||
|
};
|
||||||
|
|
||||||
class FontHandle
|
class FontHandle
|
||||||
{
|
{
|
||||||
};
|
};
|
||||||
|
@ -24,8 +35,8 @@ class FontCache
|
||||||
{
|
{
|
||||||
const HECL::Runtime::FileStoreManager& m_fileMgr;
|
const HECL::Runtime::FileStoreManager& m_fileMgr;
|
||||||
FT_Library m_fontLib;
|
FT_Library m_fontLib;
|
||||||
FT_Face m_regFace;
|
FreeTypeGZipMemFace m_regFace;
|
||||||
FT_Face m_monoFace;
|
FreeTypeGZipMemFace m_monoFace;
|
||||||
public:
|
public:
|
||||||
FontCache(const HECL::Runtime::FileStoreManager& fileMgr);
|
FontCache(const HECL::Runtime::FileStoreManager& fileMgr);
|
||||||
~FontCache();
|
~FontCache();
|
||||||
|
|
|
@ -2,30 +2,68 @@
|
||||||
#include <LogVisor/LogVisor.hpp>
|
#include <LogVisor/LogVisor.hpp>
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
extern "C" uint8_t* DROIDSANS_PERMISSIVE;
|
#include FT_GZIP_H
|
||||||
|
#include FT_SYSTEM_H
|
||||||
|
#include <freetype/internal/internal.h>
|
||||||
|
#include <freetype/internal/ftstream.h>
|
||||||
|
|
||||||
|
extern "C" const uint8_t DROIDSANS_PERMISSIVE[];
|
||||||
extern "C" size_t DROIDSANS_PERMISSIVE_SZ;
|
extern "C" size_t DROIDSANS_PERMISSIVE_SZ;
|
||||||
|
|
||||||
extern "C" uint8_t* BMONOFONT;
|
extern "C" const uint8_t BMONOFONT[];
|
||||||
extern "C" size_t BMONOFONT_SZ;
|
extern "C" size_t BMONOFONT_SZ;
|
||||||
|
|
||||||
namespace Specter
|
namespace Specter
|
||||||
{
|
{
|
||||||
static LogVisor::LogModule Log("Specter::FontCache");
|
static LogVisor::LogModule Log("Specter::FontCache");
|
||||||
|
|
||||||
FontCache::FontCache(const HECL::Runtime::FileStoreManager& fileMgr)
|
FreeTypeGZipMemFace::FreeTypeGZipMemFace(FT_Library lib, const uint8_t* data, size_t sz)
|
||||||
: m_fileMgr(fileMgr)
|
|
||||||
{
|
{
|
||||||
FT_Error err = FT_Init_FreeType(&m_fontLib);
|
m_comp.base = (unsigned char*)data;
|
||||||
|
m_comp.size = sz;
|
||||||
|
m_comp.memory = lib->memory;
|
||||||
|
if (FT_Stream_OpenGzip(&m_decomp, &m_comp))
|
||||||
|
Log.report(LogVisor::FatalError, "unable to open FreeType gzip stream");
|
||||||
|
|
||||||
|
FT_Open_Args args =
|
||||||
|
{
|
||||||
|
FT_OPEN_STREAM,
|
||||||
|
nullptr,
|
||||||
|
0,
|
||||||
|
nullptr,
|
||||||
|
&m_decomp
|
||||||
|
};
|
||||||
|
|
||||||
|
if (FT_Open_Face(lib, &args, 0, &m_face))
|
||||||
|
Log.report(LogVisor::FatalError, "unable to open FreeType gzip face");
|
||||||
|
|
||||||
|
FT_Done_Face(m_face);
|
||||||
|
if (m_decomp.close)
|
||||||
|
m_decomp.close(&m_decomp);
|
||||||
|
}
|
||||||
|
|
||||||
|
FreeTypeGZipMemFace::~FreeTypeGZipMemFace()
|
||||||
|
{
|
||||||
|
FT_Done_Face(m_face);
|
||||||
|
if (m_decomp.close)
|
||||||
|
m_decomp.close(&m_decomp);
|
||||||
|
}
|
||||||
|
|
||||||
|
static FT_Library InitLib()
|
||||||
|
{
|
||||||
|
FT_Library ret;
|
||||||
|
FT_Error err = FT_Init_FreeType(&ret);
|
||||||
if (err)
|
if (err)
|
||||||
Log.report(LogVisor::FatalError, "unable to FT_Init_FreeType");
|
Log.report(LogVisor::FatalError, "unable to FT_Init_FreeType");
|
||||||
err = FT_New_Memory_Face(m_fontLib, DROIDSANS_PERMISSIVE, DROIDSANS_PERMISSIVE_SZ, 0, &m_regFace);
|
return ret;
|
||||||
if (err)
|
|
||||||
Log.report(LogVisor::FatalError, "unable to FT_New_Memory_Face for main UI font");
|
|
||||||
err = FT_New_Memory_Face(m_fontLib, BMONOFONT, BMONOFONT_SZ, 0, &m_monoFace);
|
|
||||||
if (err)
|
|
||||||
Log.report(LogVisor::FatalError, "unable to FT_New_Memory_Face for mono UI font");
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
FontCache::FontCache(const HECL::Runtime::FileStoreManager& fileMgr)
|
||||||
|
: m_fileMgr(fileMgr),
|
||||||
|
m_fontLib(InitLib()),
|
||||||
|
m_regFace(m_fontLib, DROIDSANS_PERMISSIVE, DROIDSANS_PERMISSIVE_SZ),
|
||||||
|
m_monoFace(m_fontLib, BMONOFONT, BMONOFONT_SZ) {}
|
||||||
|
|
||||||
FontCache::~FontCache()
|
FontCache::~FontCache()
|
||||||
{
|
{
|
||||||
FT_Done_FreeType(m_fontLib);
|
FT_Done_FreeType(m_fontLib);
|
||||||
|
|
Loading…
Reference in New Issue