From de7c1965fb41205a09f638b752176c1c419a09f7 Mon Sep 17 00:00:00 2001 From: "minho.sun" Date: Thu, 17 May 2018 20:39:53 +0900 Subject: [PATCH] Caching FcPattern object when using FcCharSetHasChar The result of FcCharSetHasChar can be destroyed when destroying FcPattern object. Caching FcPattern object when using FcCharSetHasChar function and destroying it later. Change-Id: Ie2399a40749350ad410345912513ace26dfe273c Signed-off-by: minho.sun --- .../text/text-abstraction/font-client-plugin-impl.cpp | 16 ++++++++++++---- .../text/text-abstraction/font-client-plugin-impl.h | 14 ++++++++++---- 2 files changed, 22 insertions(+), 8 deletions(-) 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 faa61f0..14efb7b 100644 --- a/dali/internal/text/text-abstraction/font-client-plugin-impl.cpp +++ b/dali/internal/text/text-abstraction/font-client-plugin-impl.cpp @@ -252,7 +252,7 @@ FontClient::Plugin::~Plugin() #ifdef ENABLE_VECTOR_BASED_TEXT_RENDERING delete mVectorFontCache; #endif - + DestroyMatchedPatterns(); FT_Done_FreeType( mFreeTypeLibrary ); } @@ -1955,9 +1955,9 @@ void FontClient::Plugin::CacheFontPath( FT_Face ftFace, FontId id, PointSize26Do FcCharSet* characterSet = NULL; FcPatternGetCharSet( match, FC_CHARSET, 0u, &characterSet ); - FcPatternDestroy( match ); FcPatternDestroy( pattern ); + mMatchedFcPatternCache.PushBack( match ); mFontCache[id-1u].mCharacterSet = characterSet; // Add the path to the cache. @@ -1977,7 +1977,7 @@ void FontClient::Plugin::CacheFontPath( FT_Face ftFace, FontId id, PointSize26Do } } -FcCharSet* FontClient::Plugin::CreateCharacterSetFromDescription( const FontDescription& description ) const +FcCharSet* FontClient::Plugin::CreateCharacterSetFromDescription( const FontDescription& description ) { FcCharSet* characterSet = NULL; @@ -1989,14 +1989,22 @@ FcCharSet* FontClient::Plugin::CreateCharacterSetFromDescription( const FontDesc FcPattern* match = FcFontMatch( NULL, pattern, &result ); FcPatternGetCharSet( match, FC_CHARSET, 0u, &characterSet ); + mMatchedFcPatternCache.PushBack( match ); - FcPatternDestroy( match ); FcPatternDestroy( pattern ); } return characterSet; } +void FontClient::Plugin::DestroyMatchedPatterns() +{ + for (auto & object : mMatchedFcPatternCache) { + FcPatternDestroy(reinterpret_cast(object)); + } + mMatchedFcPatternCache.Clear(); +} + } // namespace Internal } // namespace TextAbstraction 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 969f160..3ada20c 100644 --- a/dali/internal/text/text-abstraction/font-client-plugin-impl.h +++ b/dali/internal/text/text-abstraction/font-client-plugin-impl.h @@ -485,7 +485,13 @@ private: * * @return A character set. */ - _FcCharSet* CreateCharacterSetFromDescription( const FontDescription& description ) const; + _FcCharSet* CreateCharacterSetFromDescription( const FontDescription& description ); + + /** + * @brief Destroy all matched Patterns. + * + */ + void DestroyMatchedPatterns(); private: @@ -515,9 +521,9 @@ private: CharacterSetList mCharacterSetCache; ///< Caches character set lists for the validated font. std::vector mFontIdCache; ///< Caches font identifiers for the pairs of font point size and the index to the vector with font descriptions of the validated fonts. - VectorFontCache* mVectorFontCache; ///< Separate cache for vector data blobs etc. - - Vector mEllipsisCache; ///< Caches ellipsis glyphs for a particular point size. + VectorFontCache* mVectorFontCache; ///< Separate cache for vector data blobs etc. + Vector mEllipsisCache; ///< Caches ellipsis glyphs for a particular point size. + Vector<_FcPattern*> mMatchedFcPatternCache; ///< Contain matched FcPattern pointer. bool mDefaultFontDescriptionCached : 1; ///< Whether the default font is cached or not }; -- 2.7.4