2 * Copyright (c) 2016 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.
68 LogicalModelPtr logicalModel;
69 VisualModelPtr visualModel;
71 Size textArea(100.f, 60.f);
74 const Vector<FontDescriptionRun> fontDescriptions;
75 const LayoutOptions options;
76 CreateTextModel( data.text,
86 Vector<GlyphIndex>& charactersToGlyph = visualModel->mCharactersToGlyph;
87 Vector<Length>& glyphsPerCharacter = visualModel->mGlyphsPerCharacter;
89 // 2) Clear the model.
91 GlyphIndex startGlyphIndex = 0u;
92 if( 0u != charactersToGlyph.Count() )
94 // The number of glyphs to be removed.
95 const Length numberOfGlyphs = charactersToGlyph[data.startIndex + data.numberOfCharacters - 1u] + glyphsPerCharacter[data.startIndex + data.numberOfCharacters - 1u] - charactersToGlyph[data.startIndex];
96 startGlyphIndex = charactersToGlyph[data.startIndex];
98 charactersToGlyph.Erase( charactersToGlyph.Begin() + data.startIndex,
99 charactersToGlyph.Begin() + data.startIndex + data.numberOfCharacters );
100 glyphsPerCharacter.Erase( glyphsPerCharacter.Begin() + data.startIndex,
101 glyphsPerCharacter.Begin() + data.startIndex + data.numberOfCharacters );
103 // Update the character to glyph indices.
104 for( Vector<GlyphIndex>::Iterator it = charactersToGlyph.Begin() + data.startIndex,
105 endIt = charactersToGlyph.End();
109 *it -= numberOfGlyphs;
113 // 3) Call the CreateGlyphsPerCharacterTable() function
114 visualModel->CreateGlyphsPerCharacterTable( data.startIndex,
116 data.numberOfCharacters );
118 // 4) Compare the results.
119 if( data.totalNumberOfCharacters != glyphsPerCharacter.Count() )
121 std::cout << " Different number of characters : " << glyphsPerCharacter.Count() << ", expected : " << data.totalNumberOfCharacters << std::endl;
125 for( unsigned int i = 0u; i < data.totalNumberOfCharacters; ++i )
127 if( data.glyphsPerCharacter[i] != glyphsPerCharacter[i] )
129 std::cout << " Different number of glyphs for index " << i << std::endl;
130 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
132 std::cout << glyphsPerCharacter[j] << " ";
134 std::cout << std::endl;
135 std::cout << " expected" << std::endl;
136 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
138 std::cout << data.glyphsPerCharacter[j] << " ";
140 std::cout << std::endl;
148 bool SetCharacterToGlyphTest( const SetCharacterToGlyphData& data )
150 // 1) Create the model.
151 LogicalModelPtr logicalModel;
152 VisualModelPtr visualModel;
154 Size textArea(100.f, 60.f);
157 const Vector<FontDescriptionRun> fontDescriptions;
158 const LayoutOptions options;
159 CreateTextModel( data.text,
169 Vector<GlyphIndex>& charactersToGlyph = visualModel->mCharactersToGlyph;
170 Vector<Length>& glyphsPerCharacter = visualModel->mGlyphsPerCharacter;
172 // 2) Clear the model.
174 GlyphIndex startGlyphIndex = 0u;
175 if( 0u != charactersToGlyph.Count() )
177 // The number of glyphs to be removed.
178 const Length numberOfGlyphs = charactersToGlyph[data.startIndex + data.numberOfCharacters - 1u] + glyphsPerCharacter[data.startIndex + data.numberOfCharacters - 1u] - charactersToGlyph[data.startIndex];
179 startGlyphIndex = charactersToGlyph[data.startIndex];
181 charactersToGlyph.Erase( charactersToGlyph.Begin() + data.startIndex,
182 charactersToGlyph.Begin() + data.startIndex + data.numberOfCharacters );
184 // Update the character to glyph indices.
185 for( Vector<GlyphIndex>::Iterator it = charactersToGlyph.Begin() + data.startIndex,
186 endIt = charactersToGlyph.End();
190 *it -= numberOfGlyphs;
194 // 3) Call the CreateCharacterToGlyphTable() function
195 visualModel->CreateCharacterToGlyphTable( data.startIndex,
197 data.numberOfCharacters );
199 // 4) Compare the results.
200 if( data.totalNumberOfCharacters != charactersToGlyph.Count() )
202 std::cout << " Different number of character : " << charactersToGlyph.Count() << ", expected : " << data.totalNumberOfCharacters << std::endl;
206 for( unsigned int i = 0u; i < data.totalNumberOfCharacters; ++i )
208 if( data.glyphsIndices[i] != charactersToGlyph[i] )
210 std::cout << " Different number of character to glyph index " << i << std::endl;
211 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
213 std::cout << charactersToGlyph[j] << " ";
215 std::cout << std::endl;
216 std::cout << " expected" << std::endl;
217 for( unsigned int j = 0; j < data.totalNumberOfCharacters; ++j )
219 std::cout << data.glyphsIndices[j] << " ";
221 std::cout << std::endl;
231 //////////////////////////////////////////////////////////
233 int UtcDaliSetGlyphsPerCharacter(void)
235 tet_infoline(" UtcDaliSetGlyphsPerCharacter");
237 Length glyphsPerCharacter02[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u };
238 Length glyphsPerCharacter03[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 0u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u };
239 Length glyphsPerCharacter04[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 0u, 1u,
240 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
241 1u, 1u, 1u, 1u, 0u, 1u, 0u, 2u, 1u, 0u,
242 2u, 0u, 2u, 0u, 2u, 1u, 1u, 0u, 0u, 0u,
243 2u, 1u, 1u, 1u, 1u, 1u, 0u, 0u, 2u, 1u,
246 struct SetGlyphsPerCharacterData data[] =
249 "Zero characters text",
257 "Simple 1 to 1 text",
262 glyphsPerCharacter02,
265 "Text with different number of glyphs and characters.",
266 "Hello different world",
270 glyphsPerCharacter03,
273 "Text paragraphs with different number of glyphs and characters. Update initial paragraphs.",
274 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
278 glyphsPerCharacter04,
281 "Text paragraphs with different number of glyphs and characters. Update mid paragraphs.",
282 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
286 glyphsPerCharacter04,
289 "Text paragraphs with different number of glyphs and characters. Update final paragraphs.",
290 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
294 glyphsPerCharacter04,
297 const unsigned int numberOfTests = 6u;
299 for( unsigned int index = 0u; index < numberOfTests; ++index )
301 ToolkitTestApplication application;
302 if( !SetGlyphsPerCharacterTest( data[index] ) )
304 tet_result(TET_FAIL);
308 tet_result(TET_PASS);
312 int UtcDaliSetCharacterToGlyph(void)
314 tet_infoline(" UtcDaliSetGlyphsPerCharacter");
316 GlyphIndex glyphIndices02[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u };
317 GlyphIndex glyphIndices03[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u };
318 GlyphIndex glyphIndices04[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u, 20u,
319 21u, 22u, 23u, 23u, 24u, 24u, 26u, 27u, 27u, 29u, 29u, 31u, 31u, 33u,
320 34u, 35u, 35u, 35u, 35u, 37u, 38u, 39u, 40u, 41u, 42u, 42u, 42u, 44u, 45u, 45u, 47u, 48u };
322 struct SetCharacterToGlyphData data[] =
325 "Zero characters text",
333 "Simple 1 to 1 text",
341 "Text with different number of glyphs and characters.",
342 "Hello different world",
349 "Text paragraphs with different number of glyphs and characters. Update initial paragraphs.",
350 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
357 "Text paragraphs with different number of glyphs and characters. Update mid paragraphs.",
358 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
365 "Text paragraphs with different number of glyphs and characters. Update final paragraphs.",
366 "Hello different world\nनमस्ते दुनिया\nမင်္ဂလာပါကမ္ဘာလောက",
374 const unsigned int numberOfTests = 6u;
376 for( unsigned int index = 0u; index < numberOfTests; ++index )
378 ToolkitTestApplication application;
379 if( !SetCharacterToGlyphTest( data[index] ) )
381 tet_result(TET_FAIL);
385 tet_result(TET_PASS);