X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Fmulti-language-support-impl.cpp;h=79de1e1b8d061924441ea2a82124f78a1a53b6aa;hb=56fe73b3b5a7482d10bb9c271f494b5a09c2c75f;hp=dbd110ba863f6f8489fb49b0c04c786740ddad55;hpb=fc353f1e92ac1e2d699011889d615409ad0bd303;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/text/multi-language-support-impl.cpp b/dali-toolkit/internal/text/multi-language-support-impl.cpp index dbd110b..79de1e1 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) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 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. @@ -22,6 +22,7 @@ #include #include #include +#include // INTERNAL INCLUDES #include @@ -37,6 +38,8 @@ namespace Debug::Filter* gLogFilter = Debug::Filter::New(Debug::NoLogging, true, "LOG_MULTI_LANGUAGE_SUPPORT"); #endif +DALI_INIT_TRACE_FILTER(gTraceFilter, DALI_TRACE_FONT_PERFORMANCE_MARKER, false); + const Dali::Toolkit::Text::Character UTF32_A = 0x0041; } // namespace @@ -205,9 +208,9 @@ void MultilanguageSupport::SetScripts(const Vector& text, currentScriptRun.isRightToLeft = false; // Traverse all characters and set the scripts. - const Length lastCharacter = startIndex + numberOfCharacters; + const Length lastCharacter = startIndex + numberOfCharacters - 1u; - for(Length index = startIndex; index < lastCharacter; ++index) + for(Length index = startIndex; index <= lastCharacter; ++index) { Character character = *(textBuffer + index); @@ -223,7 +226,7 @@ void MultilanguageSupport::SetScripts(const Vector& text, // script of the first character of the paragraph with a defined script. // Skip those characters valid for many scripts like white spaces or '\n'. - bool endOfText = index == lastCharacter; + bool endOfText = index > lastCharacter; //Handle all Emoji Sequence cases if(IsNewSequence(textBuffer, currentScriptRun.script, index, lastCharacter, script)) @@ -280,7 +283,7 @@ void MultilanguageSupport::SetScripts(const Vector& text, // Get the next character. ++index; - endOfText = index == lastCharacter; + endOfText = index > lastCharacter; if(!endOfText) { character = *(textBuffer + index); @@ -423,6 +426,8 @@ void MultilanguageSupport::ValidateFonts(const Vector& return; } + DALI_TRACE_SCOPE(gTraceFilter, "DALI_TEXT_FONTS_VALIDATE"); + // Find the first index where to insert the font run. FontRunIndex fontIndex = 0u; if(0u != startIndex) @@ -468,11 +473,13 @@ void MultilanguageSupport::ValidateFonts(const Vector& Vector::ConstIterator scriptRunEndIt = scripts.End(); bool isNewParagraphCharacter = false; - FontId previousEmojiFontId = 0u; - TextAbstraction::Script previousScript = TextAbstraction::UNKNOWN; + FontId previousEmojiFontId = 0u; + FontId currentFontId = 0u; + FontId previousFontId = 0u; + TextAbstraction::Script previousScript = TextAbstraction::UNKNOWN; - CharacterIndex lastCharacter = startIndex + numberOfCharacters; - for(Length index = startIndex; index < lastCharacter; ++index) + CharacterIndex lastCharacter = startIndex + numberOfCharacters - 1u; + for(Length index = startIndex; index <= lastCharacter; ++index) { // Get the current character. const Character character = *(textBuffer + index); @@ -493,6 +500,7 @@ void MultilanguageSupport::ValidateFonts(const Vector& // Get the font for the current character. FontId fontId = fontClient.GetFontId(currentFontDescription, currentFontPointSize); + currentFontId = fontId; // Get the script for the current character. Script script = GetScript(index, @@ -500,6 +508,7 @@ void MultilanguageSupport::ValidateFonts(const Vector& scriptRunEndIt); #ifdef DEBUG_ENABLED + if(gLogFilter->IsEnabledFor(Debug::Verbose)) { Dali::TextAbstraction::FontDescription description; fontClient.GetDescription(fontId, description); @@ -541,7 +550,7 @@ void MultilanguageSupport::ValidateFonts(const Vector& } bool isCommonScript = false; - bool isEmojiScript = TextAbstraction::IsEmojiScript(script) || TextAbstraction::IsEmojiColorScript(script) || TextAbstraction::IsEmojiTextScript(script); + bool isEmojiScript = TextAbstraction::IsOneOfEmojiScripts(script); if(isEmojiScript && (previousScript == script)) { @@ -553,6 +562,15 @@ void MultilanguageSupport::ValidateFonts(const Vector& } } + if(TextAbstraction::IsSpace(character) && + TextAbstraction::HasLigatureMustBreak(script) && + isValidCachedDefaultFont && + (isDefaultFont || (currentFontId == previousFontId))) + { + fontId = cachedDefaultFontId; + isValidFont = true; + } + // If the given font is not valid, it means either: // - there is no cached font for the current script yet or, // - the user has set a different font than the default one for the current script or, @@ -627,6 +645,7 @@ void MultilanguageSupport::ValidateFonts(const Vector& { // Use the cached default font for the script if there is one. fontId = cachedDefaultFontId; + isValidFont = true; } else { @@ -659,6 +678,7 @@ void MultilanguageSupport::ValidateFonts(const Vector& } } defaultFontsPerScript->Cache(currentFontDescription, fontId); + isValidFont = true; } } } // !isValidFont (3) @@ -716,6 +736,7 @@ void MultilanguageSupport::ValidateFonts(const Vector& } #ifdef DEBUG_ENABLED + if(gLogFilter->IsEnabledFor(Debug::Verbose)) { Dali::TextAbstraction::FontDescription description; fontClient.GetDescription(fontId, description); @@ -727,6 +748,15 @@ void MultilanguageSupport::ValidateFonts(const Vector& description.path.c_str()); } #endif + if(!isValidFont && !isCommonScript) + { + Dali::TextAbstraction::FontDescription descriptionForLog; + fontClient.GetDescription(fontId, descriptionForLog); + DALI_LOG_RELEASE_INFO("Validated font set fail : Character : %x, Script : %s, Font : %s \n", + character, + Dali::TextAbstraction::ScriptName[script], + descriptionForLog.path.c_str()); + } // Whether bols style is required. isBoldRequired = (currentFontDescription.weight >= TextAbstraction::FontWeight::BOLD); @@ -763,6 +793,7 @@ void MultilanguageSupport::ValidateFonts(const Vector& // Whether the current character is a new paragraph character. isNewParagraphCharacter = TextAbstraction::IsNewParagraph(character); previousScript = script; + previousFontId = currentFontId; } // end traverse characters. if(0u != currentFontRun.characterRun.numberOfCharacters)