Fixed FreeType being freed before the destruction of all fonts
Former-commit-id: a7b2653c94698671d7912675ee810be3b7ac10df
This commit is contained in:
parent
ffe101ff02
commit
f518311223
|
|
@ -19,7 +19,10 @@
|
||||||
|
|
||||||
namespace
|
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
|
float s_invScaleFactor = 1.f / (1 << 6); // 1/64
|
||||||
|
|
||||||
extern "C"
|
extern "C"
|
||||||
|
|
@ -55,11 +58,26 @@ namespace
|
||||||
NazaraUnused(stream);
|
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
|
class FreeTypeStream : public NzFontData
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
FreeTypeStream() :
|
FreeTypeStream() :
|
||||||
m_face(nullptr),
|
m_face(nullptr),
|
||||||
|
m_library(s_libraryOwner),
|
||||||
m_characterSize(0)
|
m_characterSize(0)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
@ -312,6 +330,7 @@ namespace
|
||||||
FT_Open_Args m_args;
|
FT_Open_Args m_args;
|
||||||
FT_Face m_face;
|
FT_Face m_face;
|
||||||
FT_StreamRec m_stream;
|
FT_StreamRec m_stream;
|
||||||
|
std::shared_ptr<FreeTypeLibrary> m_library;
|
||||||
std::unique_ptr<NzInputStream> m_ownedStream;
|
std::unique_ptr<NzInputStream> m_ownedStream;
|
||||||
mutable unsigned int m_characterSize;
|
mutable unsigned int m_characterSize;
|
||||||
};
|
};
|
||||||
|
|
@ -414,7 +433,10 @@ namespace
|
||||||
void NzLoaders_FreeType_Register()
|
void NzLoaders_FreeType_Register()
|
||||||
{
|
{
|
||||||
if (FT_Init_FreeType(&s_library) == 0)
|
if (FT_Init_FreeType(&s_library) == 0)
|
||||||
|
{
|
||||||
|
s_libraryOwner.reset(new FreeTypeLibrary);
|
||||||
NzFontLoader::RegisterLoader(IsSupported, Check, LoadStream, LoadFile, LoadMemory);
|
NzFontLoader::RegisterLoader(IsSupported, Check, LoadStream, LoadFile, LoadMemory);
|
||||||
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
s_library = nullptr; // On s'assure que le pointeur ne pointe pas sur n'importe quoi
|
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)
|
if (s_library)
|
||||||
{
|
{
|
||||||
NzFontLoader::UnregisterLoader(IsSupported, Check, LoadStream, LoadFile, LoadMemory);
|
NzFontLoader::UnregisterLoader(IsSupported, Check, LoadStream, LoadFile, LoadMemory);
|
||||||
|
s_libraryOwner.reset();
|
||||||
FT_Done_FreeType(s_library);
|
|
||||||
s_library = nullptr;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue