// EXTERNAL INCLUDES
#include <dali/devel-api/common/singleton-service.h>
#include <dali/devel-api/text-abstraction/font-client.h>
+#include <dali/integration-api/adaptor-framework/adaptor.h>
#include <dali/integration-api/debug.h>
#include <dali/integration-api/trace.h>
MultilanguageSupport::MultilanguageSupport()
: mDefaultFontPerScriptCache(),
- mValidFontsPerScriptCache()
+ mValidFontsPerScriptCache(),
+ mLocale(std::string())
{
// Initializes the default font cache to zero (invalid font).
// Reserves space to cache the default fonts and access them with the script as an index.
// Initializes the valid fonts cache to NULL (no valid fonts).
// Reserves space to cache the valid fonts and access them with the script as an index.
mValidFontsPerScriptCache.Resize(TextAbstraction::GetNumberOfScripts(), NULL);
+
+ if(Dali::Adaptor::IsAvailable())
+ {
+ Dali::Adaptor::Get().LocaleChangedSignal().Connect(this, &MultilanguageSupport::OnLocaleChanged);
+ }
}
MultilanguageSupport::~MultilanguageSupport()
}
}
+void MultilanguageSupport::OnLocaleChanged(std::string locale)
+{
+ if(mLocale != locale)
+ {
+ mLocale = locale;
+ ClearCache();
+ }
+}
+
+void MultilanguageSupport::ClearCache()
+{
+ mDefaultFontPerScriptCache.Clear();
+ mValidFontsPerScriptCache.Clear();
+
+ mDefaultFontPerScriptCache.Resize(TextAbstraction::GetNumberOfScripts(), NULL);
+ mValidFontsPerScriptCache.Resize(TextAbstraction::GetNumberOfScripts(), NULL);
+}
+
+std::string MultilanguageSupport::GetLocale()
+{
+ return mLocale;
+}
+
Text::MultilanguageSupport MultilanguageSupport::Get()
{
Text::MultilanguageSupport multilanguageSupportHandle;
Vector<ScriptRun>::ConstIterator scriptRunEndIt = scripts.End();
bool isNewParagraphCharacter = false;
- FontId previousEmojiFontId = 0u;
FontId currentFontId = 0u;
FontId previousFontId = 0u;
TextAbstraction::Script previousScript = TextAbstraction::UNKNOWN;
isValidFont = fontClient.IsCharacterSupportedByFont(fontId, character);
}
- bool isCommonScript = false;
- bool isEmojiScript = TextAbstraction::IsOneOfEmojiScripts(script);
+ bool isEmojiScript = IsEmojiColorScript(script) || IsEmojiTextScript(script);
+ bool isZWJ = TextAbstraction::IsZeroWidthJoiner(character);
- if(isEmojiScript && (previousScript == script))
+ if((previousScript == script) &&
+ (isEmojiScript || isZWJ))
{
- // Emoji sequence should use the previous emoji font.
- if(0u != previousEmojiFontId)
+ // This sequence should use the previous font.
+ if(0u != previousFontId)
{
- fontId = previousEmojiFontId;
+ fontId = previousFontId;
isValidFont = true;
}
}
isValidFont = true;
}
+ // This is valid after CheckFontSupportsCharacter();
+ bool isCommonScript = false;
+
// 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,
}
}
- // Store the font id when the first character is an emoji.
- if(isEmojiScript)
- {
- if(0u != fontId && previousScript != script)
- {
- previousEmojiFontId = fontId;
- }
- }
- else
- {
- previousEmojiFontId = 0u;
- }
-
#ifdef DEBUG_ENABLED
if(gLogFilter->IsEnabledFor(Debug::Verbose))
{
// Whether the current character is a new paragraph character.
isNewParagraphCharacter = TextAbstraction::IsNewParagraph(character);
previousScript = script;
+ currentFontId = fontId;
previousFontId = currentFontId;
} // end traverse characters.