/*
- * Copyright (c) 2017 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.
#include <dali-toolkit/internal/text/logical-model-impl.h>
#include <dali-toolkit/internal/text/multi-language-helper-functions.h>
#include <dali-toolkit/internal/text/multi-language-support.h>
+#include <dali-toolkit/internal/text/multi-language-support-impl.h>
#include <dali-toolkit/internal/text/segmentation.h>
#include <dali-toolkit/internal/text/text-run-container.h>
#include <dali-toolkit-test-suite-utils.h>
using namespace Toolkit;
using namespace Text;
+
// Tests the following functions with different scripts.
//
-// void MergeFontDescriptions( const Vector<FontDescriptionRun>& fontDescriptions,
-// const TextAbstraction::FontDescription& defaultFontDescription,
-// TextAbstraction::PointSize26Dot6 defaultPointSize,
-// CharacterIndex characterIndex,
-// TextAbstraction::FontDescription& fontDescription,
-// TextAbstraction::PointSize26Dot6& fontPointSize,
-// bool& isDefaultFont );
+// void MergeFontDescriptions(const Vector<FontDescriptionRun>& fontDescriptions,
+// const TextAbstraction::FontDescription& defaultFontDescription,
+// TextAbstraction::PointSize26Dot6 defaultPointSize,
+// float fontSizeScale,
+// CharacterIndex characterIndex,
+// TextAbstraction::FontDescription& fontDescription,
+// TextAbstraction::PointSize26Dot6& fontPointSize,
+// bool& isDefaultFont);
//
-// Script GetScript( Length index,
-// Vector<ScriptRun>::ConstIterator& scriptRunIt,
-// const Vector<ScriptRun>::ConstIterator& scriptRunEndIt );
+// Script GetScript(Length index,
+// Vector<ScriptRun>::ConstIterator& scriptRunIt,
+// const Vector<ScriptRun>::ConstIterator& scriptRunEndIt);
//
// Constructor, destructor and MultilanguageSupport::Get()
//
-// void MultilanguageSupport::SetScripts( const Vector<Character>& text,
-// CharacterIndex startIndex,
-// Length numberOfCharacters,
-// Vector<ScriptRun>& scripts );
+// void MultilanguageSupport::SetScripts(const Vector<Character>& text,
+// CharacterIndex startIndex,
+// Length numberOfCharacters,
+// Vector<ScriptRun>& scripts);
//
-// void MultilanguageSupport::ValidateFonts( const Vector<Character>& text,
-// const Vector<ScriptRun>& scripts,
-// const Vector<FontDescriptionRun>& fontDescriptions,
-// const TextAbstraction::FontDescription& defaultFontDescription,
-// TextAbstraction::PointSize26Dot6 defaultFontPointSize,
-// CharacterIndex startIndex,
-// Length numberOfCharacters,
-// Vector<FontRun>& fonts );
+// void MultilanguageSupport::ValidateFonts(const Vector<Character>& text,
+// const Vector<ScriptRun>& scripts,
+// const Vector<FontDescriptionRun>& fontDescriptions,
+// const TextAbstraction::FontDescription& defaultFontDescription,
+// TextAbstraction::PointSize26Dot6 defaultFontPointSize,
+// float fontSizeScale,
+// CharacterIndex startIndex,
+// Length numberOfCharacters,
+// Vector<FontRun>& fonts);
//////////////////////////////////////////////////////////
Vector<FontDescriptionRun> fontDescriptionRuns; ///< The font description runs.
TextAbstraction::FontDescription defaultFontDescription; ///< The default font description.
TextAbstraction::PointSize26Dot6 defaultPointSize; ///< The default point size.
+ float fontSizeScale; ///< The font's size scale.
unsigned int startIndex; ///< The start index.
unsigned int numberOfCharacters; ///< The number of characters.
Vector<FontId> expectedFontIds; ///< The expected font ids.
std::string text; ///< Input text.
std::string defaultFont; ///< The default font.
unsigned int defaultFontSize; ///< The default font size.
+ float fontSizeScale; ///< The font's size scale.
unsigned int index; ///< The index of the first character to update the script.
unsigned int numberOfCharacters; ///< The numbers of characters to update the script.
Vector<FontDescriptionRun> fontDescriptionRuns; ///< The font description runs.
MergeFontDescriptions( data.fontDescriptionRuns,
data.defaultFontDescription,
data.defaultPointSize,
+ data.fontSizeScale,
index,
fontDescription,
fontPointSize,
Vector<Character> utf32;
utf32.Resize( data.text.size() );
- const uint32_t numberOfCharacters = Utf8ToUtf32( reinterpret_cast<const uint8_t* const>( data.text.c_str() ),
- data.text.size(),
- &utf32[0u] );
+ const uint32_t numberOfCharacters = ( data.text.size() == 0 ) ? 0 :
+ Utf8ToUtf32( reinterpret_cast<const uint8_t* const>( data.text.c_str() ),
+ data.text.size(),
+ &utf32[0u] );
+
utf32.Resize( numberOfCharacters );
// 2) Set the script info.
if( scriptRun1.script != scriptRun2.script )
{
- tet_printf("ScriptsTest FAIL: different script. %s, should be %s\n", TextAbstraction::ScriptName[scriptRun1.script], TextAbstraction::ScriptName[scriptRun2.script] );
+ tet_printf("ScriptsTest FAIL: script index: %u, different script. %s, should be %s\n", index, TextAbstraction::ScriptName[scriptRun1.script], TextAbstraction::ScriptName[scriptRun2.script] );
return false;
}
}
Vector<Character> utf32;
utf32.Resize( data.text.size() );
- const uint32_t numberOfCharacters = Utf8ToUtf32( reinterpret_cast<const uint8_t* const>( data.text.c_str() ),
+ const uint32_t numberOfCharacters = (data.text.size() == 0 ) ? 0 :
+ Utf8ToUtf32( reinterpret_cast<const uint8_t* const>( data.text.c_str() ),
data.text.size(),
&utf32[0u] );
utf32.Resize( numberOfCharacters );
data.fontDescriptionRuns,
defaultFontDescription,
defaultPointSize,
+ data.fontSizeScale,
0u,
numberOfCharacters,
fontRuns );
data.fontDescriptionRuns,
defaultFontDescription,
defaultPointSize,
+ data.fontSizeScale,
data.index,
data.numberOfCharacters,
fontRuns );
fontDescriptionRuns01,
defaultFontDescription01,
TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+ 1.0f,
0u,
0u,
expectedFontIds01,
fontDescriptionRuns02,
defaultFontDescription02,
TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+ 1.0f,
0u,
2u,
expectedFontIds02,
fontDescriptionRuns03,
defaultFontDescription03,
TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+ 1.0f,
0u,
10u,
expectedFontIds03,
0u,
3u,
},
- TextAbstraction::LATIN
+ TextAbstraction::UNKNOWN
};
ScriptRun scriptRun1101 =
{
3u,
3u,
},
- TextAbstraction::LATIN
+ TextAbstraction::UNKNOWN
};
ScriptRun scriptRun1102 =
{
25u,
3u,
},
- TextAbstraction::LATIN
+ TextAbstraction::UNKNOWN
};
ScriptRun scriptRun1104 =
{
28u,
3u,
},
- TextAbstraction::LATIN
+ TextAbstraction::UNKNOWN
};
ScriptRun scriptRun1105 =
{
46u,
2u,
},
- TextAbstraction::LATIN
+ TextAbstraction::UNKNOWN
};
ScriptRun scriptRun1107 =
{
48u,
2u,
},
- TextAbstraction::LATIN
+ TextAbstraction::UNKNOWN
};
ScriptRun scriptRun1108 =
{
50u,
2u,
},
- TextAbstraction::LATIN
+ TextAbstraction::UNKNOWN
};
scriptRuns11.PushBack( scriptRun1100 );
scriptRuns11.PushBack( scriptRun1101 );
0u,
3u,
},
- TextAbstraction::LATIN
+ TextAbstraction::UNKNOWN
};
ScriptRun scriptRun1201 =
{
3u,
3u,
},
- TextAbstraction::LATIN
+ TextAbstraction::UNKNOWN
};
ScriptRun scriptRun1202 =
{
6u,
3u,
},
- TextAbstraction::LATIN
+ TextAbstraction::UNKNOWN
};
ScriptRun scriptRun1203 =
{
9u,
2u,
},
- TextAbstraction::LATIN
+ TextAbstraction::UNKNOWN
};
scriptRuns12.PushBack( scriptRun1200 );
scriptRuns12.PushBack( scriptRun1201 );
0u,
4u,
},
- TextAbstraction::LATIN // An unknown script is transformed to LATIN
+ TextAbstraction::UNKNOWN
};
scriptRuns13.PushBack( scriptRun1301 );
Vector<FontDescriptionRun> fontDescriptions11;
fontDescriptions11.PushBack( fontDescription1101 );
+ FontRun fontRun1201 =
+ {
+ {
+ 0u,
+ 6u
+ },
+ 8u
+ };
+ FontRun fontRun1202 =
+ {
+ {
+ 6u,
+ 1u
+ },
+ 9u
+ };
+ FontRun fontRun1203 =
+ {
+ {
+ 7u,
+ 5u
+ },
+ 8u
+ };
+ Vector<FontRun> fontRuns12;
+ fontRuns12.PushBack( fontRun1201 );
+ fontRuns12.PushBack( fontRun1202 );
+ fontRuns12.PushBack( fontRun1203 );
+
+ FontDescriptionRun fontDescription1201 =
+ {
+ {
+ 0u,
+ 6u
+ },
+ const_cast<char*>( "TizenSans" ),
+ 9u,
+ TextAbstraction::FontWeight::NORMAL,
+ TextAbstraction::FontWidth::NORMAL,
+ TextAbstraction::FontSlant::NORMAL,
+ 0u,
+ true,
+ false,
+ false,
+ false,
+ false
+ };
+ FontDescriptionRun fontDescription1202 =
+ {
+ {
+ 6u,
+ 1u
+ },
+ const_cast<char*>( "TizenSans" ),
+ 9u,
+ TextAbstraction::FontWeight::NORMAL,
+ TextAbstraction::FontWidth::NORMAL,
+ TextAbstraction::FontSlant::NORMAL,
+ 0u,
+ true,
+ false,
+ false,
+ false,
+ false
+ };
+ FontDescriptionRun fontDescription1203 =
+ {
+ {
+ 7u,
+ 5u
+ },
+ const_cast<char*>( "TizenSans" ),
+ 9u,
+ TextAbstraction::FontWeight::NORMAL,
+ TextAbstraction::FontWidth::NORMAL,
+ TextAbstraction::FontSlant::NORMAL,
+ 0u,
+ true,
+ false,
+ false,
+ false,
+ false
+ };
+ Vector<FontDescriptionRun> fontDescriptions12;
+ fontDescriptions12.PushBack( fontDescription1201 );
+ fontDescriptions12.PushBack( fontDescription1202 );
+ fontDescriptions12.PushBack( fontDescription1203 );
+
const ValidateFontsData data[] =
{
{
"",
"/tizen/TizenSansRegular.ttf",
TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+ 1.0f,
0u,
0u,
fontDescriptions01,
"Hello world",
"/tizen/TizenSansRegular.ttf",
TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+ 1.0f,
0u,
11u,
fontDescriptions02,
"Hello world\nhello world\ndemo",
"/tizen/TizenSansRegular.ttf",
TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+ 1.0f,
0u,
28u,
fontDescriptions03,
"Hello world\nhello world\ndemo",
"/tizen/TizenSansRegular.ttf",
TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+ 1.0f,
0u,
12u,
fontDescriptions03,
"Hello world\nhello world\ndemo",
"/tizen/TizenSansRegular.ttf",
TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+ 1.0f,
12u,
12u,
fontDescriptions03,
"Hello world\nhello world\ndemo",
"/tizen/TizenSansRegular.ttf",
TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+ 1.0f,
24u,
4u,
fontDescriptions03,
"שלום עולם",
"/tizen/TizenSansRegular.ttf",
TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+ 1.0f,
0u,
9u,
fontDescriptions07,
"שלום עולם",
"/tizen/TizenSansHebrewRegular.ttf",
TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+ 1.0f,
0u,
9u,
fontDescriptions08,
"\xF0\x9F\x98\x81\xF0\x9F\x98\x82\xF0\x9F\x98\x83\xF0\x9F\x98\x84",
"/tizen/BreezeColorEmoji.ttf",
EMOJI_FONT_SIZE,
+ 1.0f,
0u,
4u,
fontDescriptions09,
"Hello world, שלום עולם, hello world, שלום עולם",
"/tizen/TizenSansRegular.ttf",
TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+ 1.0f,
0u,
46u,
fontDescriptions10,
"WRC – The Official App",
"/tizen/TizenSansRegular.ttf",
TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+ 1.0f,
0u,
22u,
fontDescriptions11,
fontRuns11
},
+ {
+ "Common script.",
+ "Hello \tworld",
+ "/tizen/TizenSansRegular.ttf",
+ TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
+ 1.0f,
+ 0u,
+ 12u,
+ fontDescriptions12,
+ fontRuns12
+ },
};
- const unsigned int numberOfTests = 11u;
+ const unsigned int numberOfTests = 12u;
for( unsigned int index = 0u; index < numberOfTests; ++index )
{
tet_result(TET_PASS);
END_TEST;
}
+
+int UtcDaliTextMultiLanguageValidateFontsPerScriptCache(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline(" UtcDaliTextMultiLanguageValidateFontsPerScriptCache");
+
+ std::size_t MAX_VALIDATE_FONTS_PER_SCRIPT_CACHE_SIZE = 63u;
+ std::size_t VALIDATE_FONTS_PER_SCRIPT_REMAIN_COUNT = 8u;
+
+ Dali::Toolkit::Text::Internal::ValidateFontsPerScript* validateFontsPerScript = new Dali::Toolkit::Text::Internal::ValidateFontsPerScript();
+
+ for(std::size_t i = 0u; i < MAX_VALIDATE_FONTS_PER_SCRIPT_CACHE_SIZE; i ++)
+ {
+ FontId fontId = i;
+ validateFontsPerScript->Cache(fontId);
+ }
+
+ DALI_TEST_EQUALS(MAX_VALIDATE_FONTS_PER_SCRIPT_CACHE_SIZE, validateFontsPerScript->mValidFonts.Count(), TEST_LOCATION);
+
+ FontId fontId = MAX_VALIDATE_FONTS_PER_SCRIPT_CACHE_SIZE;
+ validateFontsPerScript->Cache(fontId);
+
+ DALI_TEST_EQUALS(VALIDATE_FONTS_PER_SCRIPT_REMAIN_COUNT, validateFontsPerScript->mValidFonts.Count(), TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliTextMultiLanguageDefaultFontsCache(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline(" UtcDaliTextMultiLanguageDefaultFontsCache");
+
+ std::size_t MAX_DEFAULT_FONTS_CACHE_SIZE = 15;
+ std::size_t DEFAULT_FONTS_REMAIN_COUNT = 2;
+
+ Dali::Toolkit::Text::Internal::DefaultFonts* defaultFontsPerScript = new Dali::Toolkit::Text::Internal::DefaultFonts();
+
+ for(std::size_t i = 0u; i < MAX_DEFAULT_FONTS_CACHE_SIZE; i ++)
+ {
+ TextAbstraction::FontDescription fontDescription;
+ FontId fontId = i;
+ defaultFontsPerScript->Cache(fontDescription, fontId);
+ }
+
+ DALI_TEST_EQUALS(MAX_DEFAULT_FONTS_CACHE_SIZE, defaultFontsPerScript->mFonts.size(), TEST_LOCATION);
+
+ TextAbstraction::FontDescription fontDescription;
+ FontId fontId = MAX_DEFAULT_FONTS_CACHE_SIZE;
+ defaultFontsPerScript->Cache(fontDescription, fontId);
+
+ DALI_TEST_EQUALS(DEFAULT_FONTS_REMAIN_COUNT, defaultFontsPerScript->mFonts.size(), TEST_LOCATION);
+
+ END_TEST;
+}
+
+int UtcDaliTextMultiLanguageLocaleChange(void)
+{
+ ToolkitTestApplication application;
+ tet_infoline(" UtcDaliTextMultiLanguageLocaleChange");
+
+ Adaptor &adaptor = application.GetAdaptor();
+ MultilanguageSupport multilanguageSupport = MultilanguageSupport::Get();
+
+ std::string newLocale = "multi_TEST";
+ adaptor.LocaleChangedSignal().Emit(newLocale);
+
+ application.SendNotification();
+ application.Render();
+
+ DALI_TEST_EQUALS(newLocale.data(), GetImplementation(multilanguageSupport).GetLocale(), TEST_LOCATION);
+
+ END_TEST;
+}
\ No newline at end of file