From 393ff83956897c4938511ade92087b7ad8e0281e Mon Sep 17 00:00:00 2001 From: "minho.sun" Date: Mon, 12 Feb 2018 20:30:15 +0900 Subject: [PATCH] clear cache when locale is changed When locale is change, font configuration might provide a different font list. In this case, original cached font might not be valid for same script. Therefore, we need to clear caches. Change-Id: Ia1d9dbc7a4b7a346cd5818811afc05374a0d9045 --- dali/devel-api/text-abstraction/font-client.cpp | 5 +++ dali/devel-api/text-abstraction/font-client.h | 6 +++ .../text/text-abstraction/font-client-impl.cpp | 9 ++++ .../text/text-abstraction/font-client-impl.h | 5 +++ .../text-abstraction/font-client-plugin-impl.cpp | 50 +++++++++++++++++++--- .../text-abstraction/font-client-plugin-impl.h | 5 +++ 6 files changed, 75 insertions(+), 5 deletions(-) diff --git a/dali/devel-api/text-abstraction/font-client.cpp b/dali/devel-api/text-abstraction/font-client.cpp index 653d11c..30acb9e 100755 --- a/dali/devel-api/text-abstraction/font-client.cpp +++ b/dali/devel-api/text-abstraction/font-client.cpp @@ -66,6 +66,11 @@ FontClient& FontClient::operator=( const FontClient& handle ) return *this; } +void FontClient::ClearCache() +{ + GetImplementation(*this).ClearCache(); +} + void FontClient::SetDpi( unsigned int horizontalDpi, unsigned int verticalDpi ) { GetImplementation(*this).SetDpi( horizontalDpi, verticalDpi ); diff --git a/dali/devel-api/text-abstraction/font-client.h b/dali/devel-api/text-abstraction/font-client.h index 4dbb5f5..6197656 100755 --- a/dali/devel-api/text-abstraction/font-client.h +++ b/dali/devel-api/text-abstraction/font-client.h @@ -142,6 +142,12 @@ public: //////////////////////////////////////// /** + * @brief Clear all caches in FontClient + * + */ + void ClearCache(); + + /** * @brief Set the DPI of the target window. * * @note Multiple windows are not currently supported. diff --git a/dali/internal/text/text-abstraction/font-client-impl.cpp b/dali/internal/text/text-abstraction/font-client-impl.cpp index cb9d9fc..c952506 100755 --- a/dali/internal/text/text-abstraction/font-client-impl.cpp +++ b/dali/internal/text/text-abstraction/font-client-impl.cpp @@ -73,6 +73,15 @@ Dali::TextAbstraction::FontClient FontClient::Get() return fontClientHandle; } +void FontClient::ClearCache() +{ + if( mPlugin ) + { + mPlugin->ClearCache(); + } +} + + void FontClient::SetDpi( unsigned int horizontalDpi, unsigned int verticalDpi ) { mDpiHorizontal = horizontalDpi; diff --git a/dali/internal/text/text-abstraction/font-client-impl.h b/dali/internal/text/text-abstraction/font-client-impl.h index 37596b4..62cd300 100755 --- a/dali/internal/text/text-abstraction/font-client-impl.h +++ b/dali/internal/text/text-abstraction/font-client-impl.h @@ -59,6 +59,11 @@ public: static Dali::TextAbstraction::FontClient Get(); /** + * @copydoc Dali::TextAbstraction::FontClient::ClearCache() + */ + void ClearCache(); + + /** * @copydoc Dali::TextAbstraction::FontClient::SetDpi() */ void SetDpi( unsigned int horizontalDpi, unsigned int verticalDpi ); diff --git a/dali/internal/text/text-abstraction/font-client-plugin-impl.cpp b/dali/internal/text/text-abstraction/font-client-plugin-impl.cpp index 453dc04..fdbb279 100755 --- a/dali/internal/text/text-abstraction/font-client-plugin-impl.cpp +++ b/dali/internal/text/text-abstraction/font-client-plugin-impl.cpp @@ -20,6 +20,7 @@ // INTERNAL INCLUDES #include + #include #include #include @@ -92,6 +93,8 @@ const unsigned int NUM_FONT_SLANT_TYPE = sizeof( FONT_SLANT_TYPE_TO_INT ) / size } // namespace + + using Dali::Vector; namespace Dali @@ -258,6 +261,7 @@ FontClient::Plugin::Plugin( unsigned int horizontalDpi, #ifdef ENABLE_VECTOR_BASED_TEXT_RENDERING mVectorFontCache = new VectorFontCache( mFreeTypeLibrary ); #endif + } FontClient::Plugin::~Plugin() @@ -275,6 +279,42 @@ FontClient::Plugin::~Plugin() FT_Done_FreeType( mFreeTypeLibrary ); } +void FontClient::Plugin::ClearCache() +{ + mDefaultFontDescription = FontDescription(); + + mSystemFonts.clear(); + mDefaultFonts.clear(); + + DestroyCharacterSets( mDefaultFontCharacterSets ); + mDefaultFontCharacterSets.Clear(); + + ClearFallbackCache( mFallbackCache ); + mFallbackCache.clear(); + + mFontIdCache.Clear(); + + ClearCharacterSetFromFontFaceCache(); + mFontFaceCache.clear(); + + mValidatedFontCache.clear(); + mFontDescriptionCache.clear(); + mFontDescriptionCache.resize( 1u ); + + DestroyCharacterSets( mCharacterSetCache ); + mCharacterSetCache.Clear(); + mCharacterSetCache.Resize( 1u ); + + mFontDescriptionSizeCache.clear(); + + mEllipsisCache.Clear(); + mPixelBufferCache.clear(); + mEmbeddedItemCache.Clear(); + mBitmapFontCache.clear(); + + mDefaultFontDescriptionCached = false; +} + void FontClient::Plugin::SetDpi( unsigned int horizontalDpi, unsigned int verticalDpi ) { @@ -914,7 +954,7 @@ FontId FontClient::Plugin::GetFontId( const FontDescription& fontDescription, false ); fontFaceId = mFontIdCache[fontId-1u].id; - mFontFaceCache[fontFaceId].mCharacterSet = mCharacterSetCache[validatedFontId]; + mFontFaceCache[fontFaceId].mCharacterSet = FcCharSetCopy( mCharacterSetCache[validatedFontId] ); // Cache the pair 'validatedFontId, requestedPointSize' to improve the following queries. mFontDescriptionSizeCache.push_back( FontDescriptionSizeCacheItem( validatedFontId, @@ -1658,8 +1698,8 @@ FontDescription::Type FontClient::Plugin::GetFontType( FontId fontId ) bool FontClient::Plugin::AddCustomFontDirectory( const FontPath& path ) { - // NULL as first parameter means the current configuration is used. - return FcConfigAppFontAddDir( NULL, reinterpret_cast( path.c_str() ) ); + // nullptr as first parameter means the current configuration is used. + return FcConfigAppFontAddDir( nullptr, reinterpret_cast( path.c_str() ) ); } GlyphIndex FontClient::Plugin::CreateEmbeddedItem( const TextAbstraction::FontClient::EmbeddedItemDescription& description, Pixel::Format& pixelFormat ) @@ -1860,8 +1900,8 @@ FcPattern* FontClient::Plugin::CreateFontFamilyPattern( const FontDescription& f FcPatternAddString( fontFamilyPattern, FC_FAMILY, reinterpret_cast( fontDescription.family.c_str() ) ); // add a property to the pattern for local setting. - const char* locale = setlocale( LC_MESSAGES, NULL ); - if( locale != NULL) + const char* locale = setlocale( LC_MESSAGES, nullptr ); + if( locale != nullptr) { FcPatternAddString( fontFamilyPattern, FC_LANG, reinterpret_cast( locale ) ); } diff --git a/dali/internal/text/text-abstraction/font-client-plugin-impl.h b/dali/internal/text/text-abstraction/font-client-plugin-impl.h index 5527794..a7ba3b1 100755 --- a/dali/internal/text/text-abstraction/font-client-plugin-impl.h +++ b/dali/internal/text/text-abstraction/font-client-plugin-impl.h @@ -209,6 +209,11 @@ struct FontClient::Plugin ~Plugin(); /** + * @copydoc Dali::TextAbstraction::FontClient::ClearCache() + */ + void ClearCache(); + + /** * @copydoc Dali::TextAbstraction::FontClient::SetDpi() */ void SetDpi( unsigned int horizontalDpi, unsigned int verticalDpi ); -- 2.7.4