2 * Copyright (c) 2021 Samsung Electronics Co., Ltd.
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
22 #include <dali-toolkit-test-suite-utils.h>
23 #include <dali-toolkit/dali-toolkit.h>
24 #include <toolkit-text-utils.h>
28 using namespace Toolkit;
31 // Tests the following functions.
33 // void CreateCharacterToGlyphTable( CharacterIndex startIndex,
34 // Length numberOfCharacters )
36 // void CreateGlyphsPerCharacterTable( CharacterIndex startIndex,
37 // Length numberOfCharacters )
40 //////////////////////////////////////////////////////////
45 struct SetGlyphsPerCharacterData
47 std::string description; ///< Description of the test.
48 std::string text; ///< Input text.
49 unsigned int startIndex; ///< The start index from where the glyphs per character table is set.
50 unsigned int numberOfCharacters; ///< The number of characters to set.
51 unsigned int totalNumberOfCharacters; ///< The total number of characters.
52 unsigned int* glyphsPerCharacter; ///< The number of glyphs per character.
55 struct SetCharacterToGlyphData
57 std::string description; ///< Description of the test.
58 std::string text; ///< Input text.
59 unsigned int startIndex; ///< The start index from where the character to glyph table is set.
60 unsigned int numberOfCharacters; ///< The number of characters to set.
61 unsigned int totalNumberOfCharacters; ///< The total number of characters.
62 unsigned int* glyphsIndices; ///< The glyph indices.
65 bool SetGlyphsPerCharacterTest( const SetGlyphsPerCharacterData& data )
67 // 1) Create the model.
70 Size textArea(100.f, 60.f);
73 const Vector<FontDescriptionRun> fontDescriptions;
74 const LayoutOptions options;
75 CreateTextModel( data.text,
85 Toolkit::DevelText::EllipsisPosition::END );
87 LogicalModelPtr logicalModel = textModel->mLogicalModel;
88 VisualModelPtr visualModel = textModel->mVisualModel;
90 Vector<GlyphIndex>& charactersToGlyph = visualModel->mCharactersToGlyph;
91 Vector<Length>& glyphsPerCharacter = visualModel->mGlyphsPerCharacter;
93 // 2) Clear the model.
95 GlyphIndex startGlyphIndex = 0u;
96 if( 0u != charactersToGlyph.Count() )
98 // The number of glyphs to be removed.
99 const Length numberOfGlyphs = charactersToGlyph[data.startIndex + data.numberOfCharacters - 1u] + glyphsPerCharacter[data.startIndex + data.numberOfCharacters - 1u] - charactersToGlyph[data.startIndex];
100 startGlyphIndex = charactersToGlyph[data.startIndex];
102 charactersToGlyph.Erase( charactersToGlyph.Begin() + data.startIndex,
103 charactersToGlyph.Begin() + data.startIndex + data.numberOfCharacters );
104 glyphsPerCharacter.Erase( glyphsPerCharacter.Begin() + data.startIndex,
105 glyphsPerCharacter.Begin() + data.startIndex + data.numberOfCharacters );
107 // Update the character to glyph indices.
108 for( Vector<GlyphIndex>::Iterator it = charactersToGlyph.Begin() + data.startIndex,
109 endIt = charactersToGlyph.End();
113 *it -= numberOfGlyphs;
117 // 3) Call the CreateGlyphsPerCharacterTable() function
118 visualModel->CreateGlyphsPerCharacterTable( data.startIndex,
120 data.numberOfCharacters );
122 // 4) Compare the results.
123 if( data.totalNumberOfCharacters != glyphsPerCharacter.Count() )
125 std::cout << " Different number of characters : " << glyphsPerCharacter.Count() << ", expected : " << data.totalNumberOfCharacters << std::endl;
129 for( unsigned int i = 0u; i < data.totalNumberOfCharacters; ++i )
131 if( data.glyphsPerCharacter[i] != glyphsPerCharacter[i] )
133 std::cout << " Different number of glyphs for index " << i << std::endl;
134 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
136 std::cout << glyphsPerCharacter[j] << " ";
138 std::cout << std::endl;
139 std::cout << " expected" << std::endl;
140 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
142 std::cout << data.glyphsPerCharacter[j] << " ";
144 std::cout << std::endl;
152 bool SetCharacterToGlyphTest( const SetCharacterToGlyphData& data )
154 // 1) Create the model.
157 Size textArea(100.f, 60.f);
160 const Vector<FontDescriptionRun> fontDescriptions;
161 const LayoutOptions options;
162 CreateTextModel( data.text,
172 Toolkit::DevelText::EllipsisPosition::END );
174 LogicalModelPtr logicalModel = textModel->mLogicalModel;
175 VisualModelPtr visualModel = textModel->mVisualModel;
177 Vector<GlyphIndex>& charactersToGlyph = visualModel->mCharactersToGlyph;
178 Vector<Length>& glyphsPerCharacter = visualModel->mGlyphsPerCharacter;
180 // 2) Clear the model.
182 GlyphIndex startGlyphIndex = 0u;
183 if( 0u != charactersToGlyph.Count() )
185 // The number of glyphs to be removed.
186 const Length numberOfGlyphs = charactersToGlyph[data.startIndex + data.numberOfCharacters - 1u] + glyphsPerCharacter[data.startIndex + data.numberOfCharacters - 1u] - charactersToGlyph[data.startIndex];
187 startGlyphIndex = charactersToGlyph[data.startIndex];
189 charactersToGlyph.Erase( charactersToGlyph.Begin() + data.startIndex,
190 charactersToGlyph.Begin() + data.startIndex + data.numberOfCharacters );
192 // Update the character to glyph indices.
193 for( Vector<GlyphIndex>::Iterator it = charactersToGlyph.Begin() + data.startIndex,
194 endIt = charactersToGlyph.End();
198 *it -= numberOfGlyphs;
202 // 3) Call the CreateCharacterToGlyphTable() function
203 visualModel->CreateCharacterToGlyphTable( data.startIndex,
205 data.numberOfCharacters );
207 // 4) Compare the results.
208 if( data.totalNumberOfCharacters != charactersToGlyph.Count() )
210 std::cout << " Different number of character : " << charactersToGlyph.Count() << ", expected : " << data.totalNumberOfCharacters << std::endl;
214 for( unsigned int i = 0u; i < data.totalNumberOfCharacters; ++i )
216 if( data.glyphsIndices[i] != charactersToGlyph[i] )
218 std::cout << " Different number of character to glyph index " << i << std::endl;
219 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
221 std::cout << charactersToGlyph[j] << " ";
223 std::cout << std::endl;
224 std::cout << " expected" << std::endl;
225 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
227 std::cout << data.glyphsIndices[j] << " ";
229 std::cout << std::endl;
239 //////////////////////////////////////////////////////////
241 int UtcDaliSetGlyphsPerCharacter(void)
243 tet_infoline(" UtcDaliSetGlyphsPerCharacter");
245 Length glyphsPerCharacter02[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u };
246 Length glyphsPerCharacter03[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 0u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u };
247 Length glyphsPerCharacter04[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 0u, 1u,
248 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
249 1u, 1u, 1u, 1u, 0u, 1u, 0u, 2u, 1u, 0u,
250 2u, 0u, 2u, 0u, 2u, 1u, 1u, 0u, 0u, 0u,
251 2u, 1u, 1u, 1u, 1u, 1u, 0u, 0u, 2u, 1u,
254 struct SetGlyphsPerCharacterData data[] =
257 "Zero characters text",
265 "Simple 1 to 1 text",
270 glyphsPerCharacter02,
273 "Text with different number of glyphs and characters.",
274 "Hello different world",
278 glyphsPerCharacter03,
281 "Text paragraphs with different number of glyphs and characters. Update initial paragraphs.",
282 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
286 glyphsPerCharacter04,
289 "Text paragraphs with different number of glyphs and characters. Update mid paragraphs.",
290 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
294 glyphsPerCharacter04,
297 "Text paragraphs with different number of glyphs and characters. Update final paragraphs.",
298 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
302 glyphsPerCharacter04,
305 const unsigned int numberOfTests = 6u;
307 for( unsigned int index = 0u; index < numberOfTests; ++index )
309 ToolkitTestApplication application;
310 if( !SetGlyphsPerCharacterTest( data[index] ) )
312 tet_result(TET_FAIL);
316 tet_result(TET_PASS);
320 int UtcDaliSetCharacterToGlyph(void)
322 tet_infoline(" UtcDaliSetGlyphsPerCharacter");
324 GlyphIndex glyphIndices02[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u };
325 GlyphIndex glyphIndices03[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u };
326 GlyphIndex glyphIndices04[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u, 20u,
327 21u, 22u, 23u, 23u, 24u, 24u, 26u, 27u, 27u, 29u, 29u, 31u, 31u, 33u,
328 34u, 35u, 35u, 35u, 35u, 37u, 38u, 39u, 40u, 41u, 42u, 42u, 42u, 44u, 45u, 45u, 47u, 48u };
330 struct SetCharacterToGlyphData data[] =
333 "Zero characters text",
341 "Simple 1 to 1 text",
349 "Text with different number of glyphs and characters.",
350 "Hello different world",
357 "Text paragraphs with different number of glyphs and characters. Update initial paragraphs.",
358 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
365 "Text paragraphs with different number of glyphs and characters. Update mid paragraphs.",
366 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
373 "Text paragraphs with different number of glyphs and characters. Update final paragraphs.",
374 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
382 const unsigned int numberOfTests = 6u;
384 for( unsigned int index = 0u; index < numberOfTests; ++index )
386 ToolkitTestApplication application;
387 if( !SetCharacterToGlyphTest( data[index] ) )
389 tet_result(TET_FAIL);
393 tet_result(TET_PASS);