From 48ecb058f0b9d4e79871b55896a489404ae96c69 Mon Sep 17 00:00:00 2001 From: Lynix Date: Fri, 16 Jan 2015 23:34:56 +0100 Subject: [PATCH] (Font) Added notification on atlas layer change Fixed irrelevant error message when a font destroy an atlas Former-commit-id: ddbd04e9172f2d35a8e0cf8a37fe48724aeb5c64 --- include/Nazara/Utility/Font.hpp | 2 ++ src/Nazara/Utility/Font.cpp | 23 +++++++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/include/Nazara/Utility/Font.hpp b/include/Nazara/Utility/Font.hpp index 30b5e385c..80b175f5f 100644 --- a/include/Nazara/Utility/Font.hpp +++ b/include/Nazara/Utility/Font.hpp @@ -80,6 +80,7 @@ class NAZARA_API NzFont : public NzResource, NzAbstractAtlas::Listener, NzNonCop enum ModicationCode { ModificationCode_AtlasChanged, + ModificationCode_AtlasLayerChanged, ModificationCode_GlyphCacheCleared, ModificationCode_KerningCacheCleared, ModificationCode_SizeInfoCacheCleared @@ -110,6 +111,7 @@ class NAZARA_API NzFont : public NzResource, NzAbstractAtlas::Listener, NzNonCop nzUInt64 ComputeKey(unsigned int characterSize, nzUInt32 style) const; bool OnAtlasCleared(const NzAbstractAtlas* atlas, void* userdata) override; + bool OnAtlasLayerChange(const NzAbstractAtlas* atlas, NzAbstractImage* oldLayer, NzAbstractImage* newLayer, void* userdata) override; void OnAtlasReleased(const NzAbstractAtlas* atlas, void* userdata) override; const Glyph& PrecacheGlyph(GlyphMap& glyphMap, unsigned int characterSize, nzUInt32 style, char32_t character) const; diff --git a/src/Nazara/Utility/Font.cpp b/src/Nazara/Utility/Font.cpp index e164d57c3..79ce37878 100644 --- a/src/Nazara/Utility/Font.cpp +++ b/src/Nazara/Utility/Font.cpp @@ -22,6 +22,7 @@ m_minimumSizeStep(1) NzFont::~NzFont() { Destroy(); + SetAtlas(nullptr); // On libère l'atlas par la même occasion } void NzFont::ClearGlyphCache() @@ -355,6 +356,28 @@ bool NzFont::OnAtlasCleared(const NzAbstractAtlas* atlas, void* userdata) return true; } +bool NzFont::OnAtlasLayerChange(const NzAbstractAtlas* atlas, NzAbstractImage* oldLayer, NzAbstractImage* newLayer, void* userdata) +{ + NazaraUnused(atlas); + NazaraUnused(oldLayer); + NazaraUnused(newLayer); + NazaraUnused(userdata); + + #ifdef NAZARA_DEBUG + // Est-ce qu'il s'agit bien de notre atlas ? + if (m_atlas.get() != atlas) + { + NazaraInternalError("Notified by a non-listening-to resource"); + return false; // On ne veut plus être notifié par cette ressource, évidemment + } + #endif + + // Pour faciliter le travail des ressources qui nous écoutent + NotifyModified(ModificationCode_AtlasLayerChanged); + + return true; +} + void NzFont::OnAtlasReleased(const NzAbstractAtlas* atlas, void* userdata) { NazaraUnused(atlas);