diff --git a/include/eepp/graphics/font.hpp b/include/eepp/graphics/font.hpp index 772f2d909..e4f248d4d 100644 --- a/include/eepp/graphics/font.hpp +++ b/include/eepp/graphics/font.hpp @@ -48,7 +48,7 @@ enum class FontAntialiasing { None, Grayscale, Subpixel }; /** @brief Font interface class. */ class EE_API Font { public: - enum Event { Load, Unload }; + enum Event { Load, Unload, CacheClear }; typedef std::function FontEventCallback; diff --git a/include/eepp/graphics/text.hpp b/include/eepp/graphics/text.hpp index 85723c0c9..a99cbd13a 100644 --- a/include/eepp/graphics/text.hpp +++ b/include/eepp/graphics/text.hpp @@ -410,7 +410,7 @@ class EE_API Text { Float mCachedWidth{ 0 }; Uint32 mAlign{ TEXT_ALIGN_LEFT }; Uint32 mTabWidth{ 4 }; - Uint32 mInvalidationId{ 0 }; + Uint32 mInvalidationId{ GlobalInvalidationId }; Uint32 mTextHints{ 0 }; Float mMaxWrapWidth{ 0 }; LineWrapMode mLineWrapMode{ LineWrapMode::NoWrap }; diff --git a/src/eepp/graphics/fonttruetype.cpp b/src/eepp/graphics/fonttruetype.cpp index f813a1235..a402433b0 100644 --- a/src/eepp/graphics/fonttruetype.cpp +++ b/src/eepp/graphics/fonttruetype.cpp @@ -2064,6 +2064,7 @@ FontTrueType::Page::~Page() { } void FontTrueType::clearCache() { + sendEvent( Event::CacheClear ); mPages.clear(); mClosestCharacterSize.clear(); mCodePointIndexCache.clear(); diff --git a/src/eepp/ui/uiicon.cpp b/src/eepp/ui/uiicon.cpp index f11cd410a..40b863435 100644 --- a/src/eepp/ui/uiicon.cpp +++ b/src/eepp/ui/uiicon.cpp @@ -65,7 +65,9 @@ UIGlyphIcon::UIGlyphIcon( const std::string& name, FontTrueType* font, const Uin UIIcon( name ), mFont( font ), mCodePoint( codePoint ) { eeASSERT( mFont ); mCloseCb = mFont->pushFontEventCallback( [this]( Uint32, Font::Event event, Font* ) { - if ( event == Font::Event::Unload ) + if ( event == Font::Event::CacheClear ) + mSizes.clear(); + else if ( event == Font::Event::Unload ) mFont = nullptr; } ); } diff --git a/src/tests/unit_tests/fontrendering_tests.cpp b/src/tests/unit_tests/fontrendering_tests.cpp index c69cecfb5..523af25c8 100644 --- a/src/tests/unit_tests/fontrendering_tests.cpp +++ b/src/tests/unit_tests/fontrendering_tests.cpp @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -87,10 +88,20 @@ UTEST( FontRendering, subpixelCoverageCompositesPerChannel ) { const Float grayscaleLAdvance = font->getGlyphAdvance( 'l', 28 ); const Float grayscaleDAdvance = font->getGlyphAdvance( 'd', 28 ); const Float grayscaleKerning = font->getKerning( 'i', 'd', 28, false, false ); + UIIconPtr icon = UIGlyphIcon::New( "glyph-cache-test", font.get(), 'S' ); + const DrawablePtr grayscaleIcon = icon->getSource( 28 ); + ASSERT_TRUE( grayscaleIcon ); + ASSERT_EQ( GlyphRenderMode::Mask, + static_cast( grayscaleIcon.get() )->getGlyphRenderMode() ); font->setAntialiasing( FontAntialiasing::Subpixel ); EXPECT_EQ( grayscaleLAdvance, font->getGlyphAdvance( 'l', 28 ) ); EXPECT_EQ( grayscaleDAdvance, font->getGlyphAdvance( 'd', 28 ) ); EXPECT_EQ( grayscaleKerning, font->getKerning( 'i', 'd', 28, false, false ) ); + const DrawablePtr subpixelIcon = icon->getSource( 28 ); + ASSERT_TRUE( subpixelIcon ); + EXPECT_NE( grayscaleIcon.get(), subpixelIcon.get() ); + EXPECT_EQ( GlyphRenderMode::Subpixel, + static_cast( subpixelIcon.get() )->getGlyphRenderMode() ); GlyphDrawable* drawable = font->getGlyphDrawable( 'S', 28 ); ASSERT_TRUE( drawable );