Fixed FreeType being freed before the destruction of all fonts

Former-commit-id: a7b2653c94698671d7912675ee810be3b7ac10df
This commit is contained in:
Lynix 2015-01-19 00:02:06 +01:00
parent ffe101ff02
commit f518311223
1 changed files with 24 additions and 4 deletions

View File

@ -19,7 +19,10 @@
namespace
{
FT_Library s_library = nullptr;
class FreeTypeLibrary;
FT_Library s_library;
std::shared_ptr<FreeTypeLibrary> s_libraryOwner;
float s_invScaleFactor = 1.f / (1 << 6); // 1/64
extern "C"
@ -55,11 +58,26 @@ namespace
NazaraUnused(stream);
}
class FreeTypeLibrary
{
// Cette classe ne sert qu'à être utilisée avec un std::shared_ptr
// pour ne libérer FreeType que lorsque plus personne ne l'utilise
public:
FreeTypeLibrary() = default;
~FreeTypeLibrary()
{
FT_Done_FreeType(s_library);
s_library = nullptr;
}
};
class FreeTypeStream : public NzFontData
{
public:
FreeTypeStream() :
m_face(nullptr),
m_library(s_libraryOwner),
m_characterSize(0)
{
}
@ -312,6 +330,7 @@ namespace
FT_Open_Args m_args;
FT_Face m_face;
FT_StreamRec m_stream;
std::shared_ptr<FreeTypeLibrary> m_library;
std::unique_ptr<NzInputStream> m_ownedStream;
mutable unsigned int m_characterSize;
};
@ -414,7 +433,10 @@ namespace
void NzLoaders_FreeType_Register()
{
if (FT_Init_FreeType(&s_library) == 0)
{
s_libraryOwner.reset(new FreeTypeLibrary);
NzFontLoader::RegisterLoader(IsSupported, Check, LoadStream, LoadFile, LoadMemory);
}
else
{
s_library = nullptr; // On s'assure que le pointeur ne pointe pas sur n'importe quoi
@ -427,8 +449,6 @@ void NzLoaders_FreeType_Unregister()
if (s_library)
{
NzFontLoader::UnregisterLoader(IsSupported, Check, LoadStream, LoadFile, LoadMemory);
FT_Done_FreeType(s_library);
s_library = nullptr;
s_libraryOwner.reset();
}
}