From f5183112236236c5dcfc1af6a0bf14200aefabdb Mon Sep 17 00:00:00 2001 From: Lynix Date: Mon, 19 Jan 2015 00:02:06 +0100 Subject: [PATCH] Fixed FreeType being freed before the destruction of all fonts Former-commit-id: a7b2653c94698671d7912675ee810be3b7ac10df --- .../Utility/Loaders/FreeType/Loader.cpp | 28 ++++++++++++++++--- 1 file changed, 24 insertions(+), 4 deletions(-) diff --git a/src/Nazara/Utility/Loaders/FreeType/Loader.cpp b/src/Nazara/Utility/Loaders/FreeType/Loader.cpp index 435ec0023..28a32b4b1 100644 --- a/src/Nazara/Utility/Loaders/FreeType/Loader.cpp +++ b/src/Nazara/Utility/Loaders/FreeType/Loader.cpp @@ -19,7 +19,10 @@ namespace { - FT_Library s_library = nullptr; + class FreeTypeLibrary; + + FT_Library s_library; + std::shared_ptr 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 m_library; std::unique_ptr 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(); } }