diff --git a/modules/juce_graphics/fonts/juce_Font.cpp b/modules/juce_graphics/fonts/juce_Font.cpp index 3d5d14eba6..7ab54495be 100644 --- a/modules/juce_graphics/fonts/juce_Font.cpp +++ b/modules/juce_graphics/fonts/juce_Font.cpp @@ -155,9 +155,19 @@ void Typeface::setTypefaceCacheSize (int numFontsToCache) TypefaceCache::getInstance()->setSize (numFontsToCache); } +#if JUCE_MODULE_AVAILABLE_juce_opengl +extern void clearOpenGLGlyphCache(); +#endif + void Typeface::clearTypefaceCache() { TypefaceCache::getInstance()->clear(); + + RenderingHelpers::SoftwareRendererSavedState::clearGlyphCache(); + + #if JUCE_MODULE_AVAILABLE_juce_opengl + clearOpenGLGlyphCache(); + #endif } //============================================================================== diff --git a/modules/juce_graphics/native/juce_RenderingHelpers.h b/modules/juce_graphics/native/juce_RenderingHelpers.h index 1f48f427d0..6c9bde3b0b 100644 --- a/modules/juce_graphics/native/juce_RenderingHelpers.h +++ b/modules/juce_graphics/native/juce_RenderingHelpers.h @@ -142,7 +142,7 @@ class GlyphCache : private DeletedAtShutdown public: GlyphCache() { - addNewGlyphSlots (120); + reset(); } ~GlyphCache() @@ -207,6 +207,15 @@ public: glyph->draw (target, pos); } + void reset() + { + const ScopedWriteLock swl (lock); + glyphs.clear(); + addNewGlyphSlots (120); + hits.set (0); + misses.set (0); + } + private: friend struct ContainerDeletePolicy; OwnedArray glyphs; @@ -215,6 +224,8 @@ private: void addNewGlyphSlots (int num) { + glyphs.ensureStorageAllocated (glyphs.size() + num); + while (--num >= 0) glyphs.add (new CachedGlyphType()); } @@ -2419,6 +2430,13 @@ public: } } + typedef GlyphCache, SoftwareRendererSavedState> GlyphCacheType; + + static void clearGlyphCache() + { + GlyphCacheType::getInstance().reset(); + } + //============================================================================== void drawGlyph (int glyphNumber, const AffineTransform& trans) { @@ -2426,8 +2444,6 @@ public: { if (trans.isOnlyTranslation() && ! transform.isRotated) { - typedef GlyphCache , SoftwareRendererSavedState> GlyphCacheType; - GlyphCacheType& cache = GlyphCacheType::getInstance(); Point pos (trans.getTranslationX(), trans.getTranslationY()); diff --git a/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp b/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp index 8a9ae9ba31..4532d459d5 100644 --- a/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp +++ b/modules/juce_opengl/opengl/juce_OpenGLGraphicsContext.cpp @@ -1365,14 +1365,14 @@ public: } } + typedef RenderingHelpers::GlyphCache , SavedState> GlyphCacheType; + void drawGlyph (int glyphNumber, const AffineTransform& trans) { if (clip != nullptr) { if (trans.isOnlyTranslation() && ! transform.isRotated) { - typedef RenderingHelpers::GlyphCache , SavedState> GlyphCacheType; - GlyphCacheType& cache = GlyphCacheType::getInstance(); Point pos (trans.getTranslationX(), trans.getTranslationY()); @@ -1559,3 +1559,9 @@ LowLevelGraphicsContext* createOpenGLGraphicsContext (OpenGLContext& context, un using namespace OpenGLRendering; return OpenGLRendering::createOpenGLContext (OpenGLRendering::Target (context, frameBufferID, width, height)); } + +void clearOpenGLGlyphCache(); +void clearOpenGLGlyphCache() +{ + OpenGLRendering::SavedState::GlyphCacheType::getInstance().reset(); +}