Add trace log to check text performance
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / text / multi-language-support-impl.cpp
index dbd110b..79de1e1 100644 (file)
@@ -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 <dali/devel-api/common/singleton-service.h>
 #include <dali/devel-api/text-abstraction/font-client.h>
 #include <dali/integration-api/debug.h>
+#include <dali/integration-api/trace.h>
 
 // INTERNAL INCLUDES
 #include <dali-toolkit/internal/text/emoji-helper.h>
@@ -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<Character>& 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<Character>& 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<Character>& 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<Character>&
     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<Character>&
   Vector<ScriptRun>::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<Character>&
 
     // 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<Character>&
                               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<Character>&
     }
 
     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<Character>&
       }
     }
 
+    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<Character>&
           {
             // 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<Character>&
                 }
               }
               defaultFontsPerScript->Cache(currentFontDescription, fontId);
+              isValidFont = true;
             }
           }
         } // !isValidFont (3)
@@ -716,6 +736,7 @@ void MultilanguageSupport::ValidateFonts(const Vector<Character>&
     }
 
 #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<Character>&
                     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<Character>&
     // 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)