From: Eunki, Hong Date: Fri, 19 May 2023 02:49:09 +0000 (+0900) Subject: [Tizen] Clear cached font data if appended too much X-Git-Tag: accepted/tizen/unified/20230608.164403~4 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=af27120e57e2b6b6cc28d45fe5375a0450a9e5f9 [Tizen] Clear cached font data if appended too much Until found the reason of cache size appending, just keep this removal logic. Change-Id: I9a1e6c2db486af9c711c80ab65bb03435719c3f9 Signed-off-by: Eunki, Hong --- diff --git a/dali-toolkit/internal/text/multi-language-support-impl.cpp b/dali-toolkit/internal/text/multi-language-support-impl.cpp index 79de1e1..b2ad241 100644 --- a/dali-toolkit/internal/text/multi-language-support-impl.cpp +++ b/dali-toolkit/internal/text/multi-language-support-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2022 Samsung Electronics Co., Ltd. + * Copyright (c) 2023 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -41,6 +41,13 @@ Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, true, "LOG_MULT DALI_INIT_TRACE_FILTER(gTraceFilter, DALI_TRACE_FONT_PERFORMANCE_MARKER, false); const Dali::Toolkit::Text::Character UTF32_A = 0x0041; + +// TODO : Customization required for these values. +constexpr std::size_t MAX_VALIDATE_FONTS_PER_SCRIPT_CACHE_SIZE = 63; +constexpr std::size_t MAX_DEFAULT_FONTS_CACHE_SIZE = 15; + +constexpr int VALIDATE_FONTS_PER_SCRIPT_REMAIN_COUNT = 8; +constexpr int DEFAULT_FONTS_REMAIN_COUNT = 2; } // namespace namespace Text @@ -62,6 +69,20 @@ bool ValidateFontsPerScript::IsValidFont(FontId fontId) const return false; } +void ValidateFontsPerScript::Cache(FontId fontId) +{ + mValidFonts.PushBack(fontId); + if(MAX_VALIDATE_FONTS_PER_SCRIPT_CACHE_SIZE < mValidFonts.Count()) + { + // Clear cache but remaind some last items. + const auto offset = mValidFonts.Count() - VALIDATE_FONTS_PER_SCRIPT_REMAIN_COUNT; + for(int i = 0; i < VALIDATE_FONTS_PER_SCRIPT_REMAIN_COUNT; ++i) + { + mValidFonts[i] = std::move(mValidFonts[offset + i]); + } + mValidFonts.Resize(VALIDATE_FONTS_PER_SCRIPT_REMAIN_COUNT); + } +} FontId DefaultFonts::FindFont(TextAbstraction::FontClient& fontClient, const TextAbstraction::FontDescription& description, @@ -93,6 +114,16 @@ void DefaultFonts::Cache(const TextAbstraction::FontDescription& description, Fo item.description = description; item.fontId = fontId; mFonts.push_back(item); + if(MAX_DEFAULT_FONTS_CACHE_SIZE < mFonts.size()) + { + // Clear cache but remaind some last items. + const auto offset = mFonts.size() - DEFAULT_FONTS_REMAIN_COUNT; + for(int i = 0; i < DEFAULT_FONTS_REMAIN_COUNT; ++i) + { + mFonts[i] = std::move(mFonts[offset + i]); + } + mFonts.resize(DEFAULT_FONTS_REMAIN_COUNT); + } } MultilanguageSupport::MultilanguageSupport() @@ -473,10 +504,10 @@ void MultilanguageSupport::ValidateFonts(const Vector& Vector::ConstIterator scriptRunEndIt = scripts.End(); bool isNewParagraphCharacter = false; - FontId previousEmojiFontId = 0u; - FontId currentFontId = 0u; - FontId previousFontId = 0u; - TextAbstraction::Script previousScript = TextAbstraction::UNKNOWN; + FontId previousEmojiFontId = 0u; + FontId currentFontId = 0u; + FontId previousFontId = 0u; + TextAbstraction::Script previousScript = TextAbstraction::UNKNOWN; CharacterIndex lastCharacter = startIndex + numberOfCharacters - 1u; for(Length index = startIndex; index <= lastCharacter; ++index) @@ -627,7 +658,7 @@ void MultilanguageSupport::ValidateFonts(const Vector& *(validFontsPerScriptCacheBuffer + script) = validateFontsPerScript; } - validateFontsPerScript->mValidFonts.PushBack(fontId); + validateFontsPerScript->Cache(fontId); } if(!isValidFont && (fontId != cachedDefaultFontId) && (!TextAbstraction::IsNewParagraph(character))) // (3) @@ -644,7 +675,7 @@ void MultilanguageSupport::ValidateFonts(const Vector& if(isValidCachedFont) { // Use the cached default font for the script if there is one. - fontId = cachedDefaultFontId; + fontId = cachedDefaultFontId; isValidFont = true; } else diff --git a/dali-toolkit/internal/text/multi-language-support-impl.h b/dali-toolkit/internal/text/multi-language-support-impl.h index cda767a..25a1c1c 100644 --- a/dali-toolkit/internal/text/multi-language-support-impl.h +++ b/dali-toolkit/internal/text/multi-language-support-impl.h @@ -2,7 +2,7 @@ #define DALI_TOOLKIT_TEXT_MULTI_LANGUAGE_SUPPORT_IMPL_H /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2023 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -67,6 +67,14 @@ struct ValidateFontsPerScript */ bool IsValidFont(FontId fontId) const; + /** + * @brief Cache the given @p fontId in the vector of valid fonts. + * @note If cache size is big enough, we might remove some caches. + * + * @param[in] fontId The font id. + */ + void Cache(FontId fontId); + Vector mValidFonts; }; @@ -109,6 +117,13 @@ struct DefaultFonts const TextAbstraction::FontDescription& description, PointSize26Dot6 size) const; + /** + * @brief Cache a default font for the given @p size. + * @note If cache size is big enough, we might remove some caches. + * + * @param[in] description The font's description. + * @param[in] fontId The font id. + */ void Cache(const TextAbstraction::FontDescription& description, FontId fontId); std::vector mFonts;