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 LogicalModelPtr logicalModel = textModel->mLogicalModel;
86 VisualModelPtr visualModel = textModel->mVisualModel;
88 Vector<GlyphIndex>& charactersToGlyph = visualModel->mCharactersToGlyph;
89 Vector<Length>& glyphsPerCharacter = visualModel->mGlyphsPerCharacter;
91 // 2) Clear the model.
93 GlyphIndex startGlyphIndex = 0u;
94 if( 0u != charactersToGlyph.Count() )
96 // The number of glyphs to be removed.
97 const Length numberOfGlyphs = charactersToGlyph[data.startIndex + data.numberOfCharacters - 1u] + glyphsPerCharacter[data.startIndex + data.numberOfCharacters - 1u] - charactersToGlyph[data.startIndex];
98 startGlyphIndex = charactersToGlyph[data.startIndex];
100 charactersToGlyph.Erase( charactersToGlyph.Begin() + data.startIndex,
101 charactersToGlyph.Begin() + data.startIndex + data.numberOfCharacters );
102 glyphsPerCharacter.Erase( glyphsPerCharacter.Begin() + data.startIndex,
103 glyphsPerCharacter.Begin() + data.startIndex + data.numberOfCharacters );
105 // Update the character to glyph indices.
106 for( Vector<GlyphIndex>::Iterator it = charactersToGlyph.Begin() + data.startIndex,
107 endIt = charactersToGlyph.End();
111 *it -= numberOfGlyphs;
115 // 3) Call the CreateGlyphsPerCharacterTable() function
116 visualModel->CreateGlyphsPerCharacterTable( data.startIndex,
118 data.numberOfCharacters );
120 // 4) Compare the results.
121 if( data.totalNumberOfCharacters != glyphsPerCharacter.Count() )
123 std::cout << " Different number of characters : " << glyphsPerCharacter.Count() << ", expected : " << data.totalNumberOfCharacters << std::endl;
127 for( unsigned int i = 0u; i < data.totalNumberOfCharacters; ++i )
129 if( data.glyphsPerCharacter[i] != glyphsPerCharacter[i] )
131 std::cout << " Different number of glyphs for index " << i << std::endl;
132 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
134 std::cout << glyphsPerCharacter[j] << " ";
136 std::cout << std::endl;
137 std::cout << " expected" << std::endl;
138 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
140 std::cout << data.glyphsPerCharacter[j] << " ";
142 std::cout << std::endl;
150 bool SetCharacterToGlyphTest( const SetCharacterToGlyphData& data )
152 // 1) Create the model.
155 Size textArea(100.f, 60.f);
158 const Vector<FontDescriptionRun> fontDescriptions;
159 const LayoutOptions options;
160 CreateTextModel( data.text,
170 LogicalModelPtr logicalModel = textModel->mLogicalModel;
171 VisualModelPtr visualModel = textModel->mVisualModel;
173 Vector<GlyphIndex>& charactersToGlyph = visualModel->mCharactersToGlyph;
174 Vector<Length>& glyphsPerCharacter = visualModel->mGlyphsPerCharacter;
176 // 2) Clear the model.
178 GlyphIndex startGlyphIndex = 0u;
179 if( 0u != charactersToGlyph.Count() )
181 // The number of glyphs to be removed.
182 const Length numberOfGlyphs = charactersToGlyph[data.startIndex + data.numberOfCharacters - 1u] + glyphsPerCharacter[data.startIndex + data.numberOfCharacters - 1u] - charactersToGlyph[data.startIndex];
183 startGlyphIndex = charactersToGlyph[data.startIndex];
185 charactersToGlyph.Erase( charactersToGlyph.Begin() + data.startIndex,
186 charactersToGlyph.Begin() + data.startIndex + data.numberOfCharacters );
188 // Update the character to glyph indices.
189 for( Vector<GlyphIndex>::Iterator it = charactersToGlyph.Begin() + data.startIndex,
190 endIt = charactersToGlyph.End();
194 *it -= numberOfGlyphs;
198 // 3) Call the CreateCharacterToGlyphTable() function
199 visualModel->CreateCharacterToGlyphTable( data.startIndex,
201 data.numberOfCharacters );
203 // 4) Compare the results.
204 if( data.totalNumberOfCharacters != charactersToGlyph.Count() )
206 std::cout << " Different number of character : " << charactersToGlyph.Count() << ", expected : " << data.totalNumberOfCharacters << std::endl;
210 for( unsigned int i = 0u; i < data.totalNumberOfCharacters; ++i )
212 if( data.glyphsIndices[i] != charactersToGlyph[i] )
214 std::cout << " Different number of character to glyph index " << i << std::endl;
215 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
217 std::cout << charactersToGlyph[j] << " ";
219 std::cout << std::endl;
220 std::cout << " expected" << std::endl;
221 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
223 std::cout << data.glyphsIndices[j] << " ";
225 std::cout << std::endl;
235 //////////////////////////////////////////////////////////
237 int UtcDaliSetGlyphsPerCharacter(void)
239 tet_infoline(" UtcDaliSetGlyphsPerCharacter");
241 Length glyphsPerCharacter02[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u };
242 Length glyphsPerCharacter03[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 0u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u };
243 Length glyphsPerCharacter04[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 0u, 1u,
244 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
245 1u, 1u, 1u, 1u, 0u, 1u, 0u, 2u, 1u, 0u,
246 2u, 0u, 2u, 0u, 2u, 1u, 1u, 0u, 0u, 0u,
247 2u, 1u, 1u, 1u, 1u, 1u, 0u, 0u, 2u, 1u,
250 struct SetGlyphsPerCharacterData data[] =
253 "Zero characters text",
261 "Simple 1 to 1 text",
266 glyphsPerCharacter02,
269 "Text with different number of glyphs and characters.",
270 "Hello different world",
274 glyphsPerCharacter03,
277 "Text paragraphs with different number of glyphs and characters. Update initial paragraphs.",
278 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
282 glyphsPerCharacter04,
285 "Text paragraphs with different number of glyphs and characters. Update mid paragraphs.",
286 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
290 glyphsPerCharacter04,
293 "Text paragraphs with different number of glyphs and characters. Update final paragraphs.",
294 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
298 glyphsPerCharacter04,
301 const unsigned int numberOfTests = 6u;
303 for( unsigned int index = 0u; index < numberOfTests; ++index )
305 ToolkitTestApplication application;
306 if( !SetGlyphsPerCharacterTest( data[index] ) )
308 tet_result(TET_FAIL);
312 tet_result(TET_PASS);
316 int UtcDaliSetCharacterToGlyph(void)
318 tet_infoline(" UtcDaliSetGlyphsPerCharacter");
320 GlyphIndex glyphIndices02[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u };
321 GlyphIndex glyphIndices03[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u };
322 GlyphIndex glyphIndices04[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u, 20u,
323 21u, 22u, 23u, 23u, 24u, 24u, 26u, 27u, 27u, 29u, 29u, 31u, 31u, 33u,
324 34u, 35u, 35u, 35u, 35u, 37u, 38u, 39u, 40u, 41u, 42u, 42u, 42u, 44u, 45u, 45u, 47u, 48u };
326 struct SetCharacterToGlyphData data[] =
329 "Zero characters text",
337 "Simple 1 to 1 text",
345 "Text with different number of glyphs and characters.",
346 "Hello different world",
353 "Text paragraphs with different number of glyphs and characters. Update initial paragraphs.",
354 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
361 "Text paragraphs with different number of glyphs and characters. Update mid paragraphs.",
362 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
369 "Text paragraphs with different number of glyphs and characters. Update final paragraphs.",
370 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
378 const unsigned int numberOfTests = 6u;
380 for( unsigned int index = 0u; index < numberOfTests; ++index )
382 ToolkitTestApplication application;
383 if( !SetCharacterToGlyphTest( data[index] ) )
385 tet_result(TET_FAIL);
389 tet_result(TET_PASS);