Change Adaptor implementation API in toolkit for multiple windows.
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-Text-Shaping.cpp
1 /*
2  * Copyright (c) 2019 Samsung Electronics Co., Ltd.
3  *
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
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
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.
15  *
16  */
17
18 #include <iostream>
19 #include <stdlib.h>
20
21 #include <dali-toolkit/internal/text/shaper.h>
22 #include <dali-toolkit-test-suite-utils.h>
23 #include <dali-toolkit/dali-toolkit.h>
24 #include <toolkit-text-utils.h>
25
26 using namespace Dali;
27 using namespace Toolkit;
28 using namespace Text;
29
30 // Tests the following function.
31 // void ShapeText( const Vector<Character>& text,
32 //                 const Vector<LineBreakInfo>& lineBreakInfo,
33 //                 const Vector<ScriptRun>& scripts,
34 //                 const Vector<FontRun>& fonts,
35 //                 CharacterIndex startCharacterIndex,
36 //                 GlyphIndex startGlyphIndex,
37 //                 Length numberOfCharacters,
38 //                 Vector<GlyphInfo>& glyphs,
39 //                 Vector<CharacterIndex>& glyphToCharacterMap,
40 //                 Vector<Length>& charactersPerGlyph,
41 //                 Vector<GlyphIndex>& newParagraphGlyphs );
42
43 //////////////////////////////////////////////////////////
44
45 namespace
46 {
47
48 struct GlyphInfoData
49 {
50   FontId fontId;     ///< Identifies the font containing the glyph
51   GlyphIndex index;  ///< Uniquely identifies a glyph for a given FontId
52   float width;       ///< The width of the glyph
53   float height;      ///< The height of the glyph
54   float xBearing;    ///< The distance from the cursor position to the leftmost border of the glyph
55   float yBearing;    ///< The distance from the baseline to the topmost border of the glyph
56   float advance;     ///< The distance to move the cursor for this glyph
57   float scaleFactor; ///< The scaling applied (fixed-size fonts only)
58   bool isItalicRequired; ///< Whether the italic style is required.
59   bool isBoldRequired;   ///< Whether the bold style is required.
60 };
61
62 bool IsEqualGlyph ( const GlyphInfoData& glyphData, const GlyphInfo& glyph )
63 {
64   if( glyphData.fontId != glyph.fontId )
65   {
66     return false;
67   }
68   if( glyphData.index != glyph.index )
69   {
70     return false;
71   }
72   if( fabsf( glyphData.width - glyph.width ) > Math::MACHINE_EPSILON_1000 )
73   {
74     return false;
75   }
76   if( fabsf( glyphData.height - glyph.height ) > Math::MACHINE_EPSILON_1000 )
77   {
78     return false;
79   }
80   if( fabsf( glyphData.xBearing - glyph.xBearing ) > Math::MACHINE_EPSILON_1000 )
81   {
82     return false;
83   }
84   if( fabsf( glyphData.yBearing - glyph.yBearing ) > Math::MACHINE_EPSILON_1000 )
85   {
86     return false;
87   }
88   if( fabsf( glyphData.advance - glyph.advance ) > Math::MACHINE_EPSILON_1000 )
89   {
90     return false;
91   }
92   if( fabsf( glyphData.scaleFactor - glyph.scaleFactor ) > Math::MACHINE_EPSILON_1000 )
93   {
94     return false;
95   }
96   if( glyphData.isItalicRequired != glyph.isItalicRequired )
97   {
98     return false;
99   }
100   if( glyphData.isBoldRequired != glyph.isBoldRequired )
101   {
102     return false;
103   }
104
105   return true;
106 }
107
108 struct ShapeInfoData
109 {
110   std::string     description;                        ///< Description of the test.
111   std::string     text;                               ///< input text.
112   uint32_t        index;                              ///< The index from where to start to query the break info.
113   uint32_t        numberOfCharacters;                 ///< The requested number of characters.
114   uint32_t        expectedNumberOfGlyphs;             ///< The expected number of glyphs.
115   GlyphInfoData*  glyphs;                             ///< The glyphs.
116   CharacterIndex* characterIndices;                   ///< The character index for each glyph.
117   Length*         charactersPerGlyph;                 ///< The characters per glyph.
118   uint32_t        expectedNumberOfNewParagraphGlyphs; ///< The expected number of glyphs.
119   GlyphIndex*     newParagraphGlyphs;                 ///< Indices to the new paragraphs glyphs.
120   Vector<FontDescriptionRun> fontDescriptions;        ///< Fonts which is used for text.
121 };
122
123 bool ShapeInfoTest( const ShapeInfoData& data )
124 {
125   // 1) Create the model.
126   LogicalModelPtr logicalModel;
127   VisualModelPtr visualModel;
128   MetricsPtr metrics;
129   Size textArea(100.f, 60.f);
130   Size layoutSize;
131
132   const Vector<FontDescriptionRun> fontDescriptions;
133   const LayoutOptions options;
134   CreateTextModel( data.text,
135                    textArea,
136                    data.fontDescriptions,
137                    options,
138                    layoutSize,
139                    logicalModel,
140                    visualModel,
141                    metrics,
142                    false );
143
144   // 2) Clear the model.
145
146   Vector<GlyphInfo>& glyphs = visualModel->mGlyphs;
147   Vector<CharacterIndex>& glyphToCharacter = visualModel->mGlyphsToCharacters;
148   Vector<Length>& charactersPerGlyph = visualModel->mCharactersPerGlyph;
149   Vector<GlyphIndex>& charactersToGlyph = visualModel->mCharactersToGlyph;
150   Vector<Length>& glyphsPerCharacter = visualModel->mGlyphsPerCharacter;
151
152   // Get the glyph index.
153   GlyphIndex glyphIndex = 0u;
154   if( 0u != visualModel->mCharactersToGlyph.Count() )
155   {
156     glyphIndex = *( visualModel->mCharactersToGlyph.Begin() + data.index );
157
158     const CharacterIndex lastCharacterIndex = data.index + data.numberOfCharacters - 1u;
159     const Length numberOfGlyphs = *( visualModel->mCharactersToGlyph.Begin() + lastCharacterIndex ) + *( visualModel->mGlyphsPerCharacter.Begin() + lastCharacterIndex ) - glyphIndex;
160
161     // Erase the glyph info from the text model.
162     // Got from the ShapeText() function.
163     glyphs.Erase( glyphs.Begin() + glyphIndex, glyphs.Begin() + glyphIndex + numberOfGlyphs );
164     glyphToCharacter.Erase( glyphToCharacter.Begin() + glyphIndex, glyphToCharacter.Begin() + glyphIndex + numberOfGlyphs );
165     charactersPerGlyph.Erase( charactersPerGlyph.Begin() + glyphIndex, charactersPerGlyph.Begin() + glyphIndex + numberOfGlyphs );
166
167     // Got from the VisualModel::CreateCharacterToGlyphTable() and the VisualModel::CreateGlyphsPerCharacterTable() methods.
168     charactersToGlyph.Erase( charactersToGlyph.Begin() + data.index,
169                              charactersToGlyph.Begin() + data.index + data.numberOfCharacters );
170     glyphsPerCharacter.Erase( glyphsPerCharacter.Begin() + data.index,
171                               glyphsPerCharacter.Begin() + data.index + data.numberOfCharacters );
172
173     // Update the glyph to character indices.
174     for( Vector<CharacterIndex>::Iterator it = glyphToCharacter.Begin() + glyphIndex,
175            endIt = glyphToCharacter.End();
176          it != endIt;
177          ++it )
178     {
179       CharacterIndex& index = *it;
180       index -= data.numberOfCharacters;
181     }
182
183   }
184
185   // Reset the metrics got from the model as the ShapeText() function doesn't retrieve them.
186   for( Vector<GlyphInfo>::Iterator it = glyphs.Begin(),
187          endIt = glyphs.End();
188        it != endIt;
189        ++it )
190   {
191     GlyphInfo& info = *it;
192     info.width = 0.f;
193     info.height = 0.f;
194     info.xBearing = 0.f;
195     info.yBearing = 0.f;
196     info.scaleFactor = 0.f;
197   }
198
199   // 3) Call the ShapeText() function.
200
201   Vector<GlyphIndex> newParagraphGlyphs;
202
203   ShapeText( logicalModel->mText,
204              logicalModel->mLineBreakInfo,
205              logicalModel->mScriptRuns,
206              logicalModel->mFontRuns,
207              data.index,
208              glyphIndex,
209              data.numberOfCharacters,
210              glyphs,
211              glyphToCharacter,
212              charactersPerGlyph,
213              newParagraphGlyphs );
214
215   // Clear the advance of the new paragraph glyphs.
216   for( Vector<GlyphIndex>::Iterator it = newParagraphGlyphs.Begin(),
217          endIt = newParagraphGlyphs.End();
218        it != endIt;
219        ++it )
220   {
221     GlyphInfo& info = *( glyphs.Begin() + *it );
222     info.advance = 0.f;
223   }
224
225   // 4) Compare the results.
226
227   if( data.expectedNumberOfGlyphs != glyphs.Count() )
228   {
229     std::cout << "  Different number of glyphs : " << glyphs.Count() << ", expected : " << data.expectedNumberOfGlyphs << std::endl;
230     return false;
231   }
232
233   for( unsigned int index = 0u; index < data.expectedNumberOfGlyphs; ++index )
234   {
235     if( !IsEqualGlyph( data.glyphs[index], glyphs[index] ) )
236     {
237       std::cout << "  different glyph info, index : " << index << std::endl;
238       return false;
239     }
240   }
241
242   for( unsigned int index = 0u; index < data.expectedNumberOfGlyphs; ++index )
243   {
244     if( data.characterIndices[index] != glyphToCharacter[index] )
245     {
246       std::cout << "  different character index, index : " << index << std::endl;
247       return false;
248     }
249   }
250
251   for( unsigned int index = 0u; index < data.expectedNumberOfGlyphs; ++index )
252   {
253     if( data.charactersPerGlyph[index] != charactersPerGlyph[index] )
254     {
255       std::cout << "  different character per glyph, index : " << index << std::endl;
256       return false;
257     }
258   }
259
260   if( data.expectedNumberOfNewParagraphGlyphs != newParagraphGlyphs.Count() )
261   {
262     std::cout << "  Different number of new paragraph glyphs : " << newParagraphGlyphs.Count() << ", expected : " << data.expectedNumberOfNewParagraphGlyphs << std::endl;
263     return false;
264   }
265
266   for( unsigned int index = 0u; index < data.expectedNumberOfNewParagraphGlyphs; ++index )
267   {
268     if( data.newParagraphGlyphs[index] != newParagraphGlyphs[index] )
269     {
270       std::cout << "  different new paragraph glyph, index : " << index << std::endl;
271       return false;
272     }
273   }
274
275   return true;
276 }
277
278 } // namespace
279
280 //////////////////////////////////////////////////////////
281
282 int UtcDaliTextShape(void)
283 {
284   tet_infoline(" UtcDaliTextShape");
285
286   struct GlyphInfoData glyphs02[] =
287   {
288     { 1u, 43u, 0.f, 0.f, 0.f, 0.f, 12.f, 0.f },
289     { 1u, 72u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
290     { 1u, 79u, 0.f, 0.f, 0.f, 0.f,  4.f, 0.f },
291     { 1u, 79u, 0.f, 0.f, 0.f, 0.f,  4.f, 0.f },
292     { 1u, 82u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
293     { 1u,  3u, 0.f, 0.f, 0.f, 0.f,  5.f, 0.f },
294     { 1u, 90u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f },
295     { 1u, 82u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
296     { 1u, 85u, 0.f, 0.f, 0.f, 0.f,  6.f, 0.f },
297     { 1u, 79u, 0.f, 0.f, 0.f, 0.f,  4.f, 0.f },
298     { 1u, 71u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
299   };
300
301   CharacterIndex characterIndices02[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u };
302   Length charactersPerGlyph02[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u };
303
304   struct GlyphInfoData glyphs03[] =
305   {
306     { 1u, 43u, 0.f, 0.f, 0.f, 0.f, 12.f, 0.f },
307     { 1u, 72u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
308     { 1u, 79u, 0.f, 0.f, 0.f, 0.f,  4.f, 0.f },
309     { 1u, 79u, 0.f, 0.f, 0.f, 0.f,  4.f, 0.f },
310     { 1u, 82u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
311     { 1u,  3u, 0.f, 0.f, 0.f, 0.f,  5.f, 0.f },
312     { 1u, 90u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f },
313     { 1u, 82u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
314     { 1u, 85u, 0.f, 0.f, 0.f, 0.f,  6.f, 0.f },
315     { 1u, 79u, 0.f, 0.f, 0.f, 0.f,  4.f, 0.f },
316     { 1u, 71u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
317     { 1u,  0u, 0.f, 0.f, 0.f, 0.f,  0.f, 0.f },
318     { 1u, 71u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
319     { 1u, 72u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
320     { 1u, 80u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f },
321     { 1u, 82u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
322     { 1u,  0u, 0.f, 0.f, 0.f, 0.f,  0.f, 0.f },
323   };
324
325   CharacterIndex characterIndices03[] = { 0u, 1u, 2u, 3u, 4u, 5u, 6u, 7u, 8u, 9u, 10u, 11u, 12u, 13u, 14u, 15u, 16u };
326   Length charactersPerGlyph03[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u };
327   CharacterIndex newParagraphGlyphs03[] = { 11u, 16u };
328
329   struct GlyphInfoData glyphs04[] =
330   {
331     { 2u, 1733u, 0.f, 0.f, 0.f, 0.f,  8.f, 0.f },
332     { 2u, 1693u, 0.f, 0.f, 0.f, 0.f, 13.f, 0.f },
333     { 2u, 1725u, 0.f, 0.f, 0.f, 0.f,  8.f, 0.f },
334     { 2u, 1733u, 0.f, 0.f, 0.f, 0.f,  8.f, 0.f },
335     { 2u, 1721u, 0.f, 0.f, 0.f, 0.f, 20.f, 0.f },
336     { 2u, 1725u, 0.f, 0.f, 0.f, 0.f,  8.f, 0.f },
337     { 2u, 1733u, 0.f, 0.f, 0.f, 0.f,  8.f, 0.f },
338     { 2u, 1722u, 0.f, 0.f, 0.f, 0.f, 18.f, 0.f },
339     { 2u, 1725u, 0.f, 0.f, 0.f, 0.f,  8.f, 0.f },
340     { 2u, 1733u, 0.f, 0.f, 0.f, 0.f,  8.f, 0.f },
341     { 2u, 1718u, 0.f, 0.f, 0.f, 0.f, 14.f, 0.f },
342     { 2u, 1725u, 0.f, 0.f, 0.f, 0.f,  8.f, 0.f },
343   };
344
345   CharacterIndex characterIndices04[] = { 0u, 0u, 0u, 2u, 2u, 2u, 4u, 4u, 4u, 6u, 6u, 6u };
346   Length charactersPerGlyph04[] = { 0u, 0u, 2u, 0u, 0u, 2u, 0u, 0u, 2u, 0u, 0u, 2u };
347
348   struct GlyphInfoData glyphs05[] =
349   {
350     { 1u, 47u, 0.f, 0.f, 0.f, 0.f,  8.f, 0.f },
351     { 1u, 82u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
352     { 1u, 85u, 0.f, 0.f, 0.f, 0.f,  6.f, 0.f },
353     { 1u, 72u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
354     { 1u, 80u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f },
355     { 1u,  3u, 0.f, 0.f, 0.f, 0.f,  5.f, 0.f },
356     { 1u, 76u, 0.f, 0.f, 0.f, 0.f,  4.f, 0.f },
357     { 1u, 83u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
358     { 1u, 86u, 0.f, 0.f, 0.f, 0.f,  8.f, 0.f },
359     { 1u, 88u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
360     { 1u, 80u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f },
361     { 1u,  3u, 0.f, 0.f, 0.f, 0.f,  5.f, 0.f },
362     { 1u, 71u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
363     { 1u, 82u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
364     { 1u, 79u, 0.f, 0.f, 0.f, 0.f,  4.f, 0.f },
365     { 1u, 82u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
366     { 1u, 85u, 0.f, 0.f, 0.f, 0.f,  6.f, 0.f },
367     { 1u,  3u, 0.f, 0.f, 0.f, 0.f,  5.f, 0.f },
368     { 1u, 86u, 0.f, 0.f, 0.f, 0.f,  8.f, 0.f },
369     { 1u, 76u, 0.f, 0.f, 0.f, 0.f,  4.f, 0.f },
370     { 1u, 87u, 0.f, 0.f, 0.f, 0.f,  6.f, 0.f },
371     { 1u,  3u, 0.f, 0.f, 0.f, 0.f,  5.f, 0.f },
372     { 1u, 68u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
373     { 1u, 80u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f },
374     { 1u, 72u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
375     { 1u, 87u, 0.f, 0.f, 0.f, 0.f,  6.f, 0.f },
376     { 1u,  0u, 0.f, 0.f, 0.f, 0.f,  0.f, 0.f },
377     { 1u, 68u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
378     { 1u, 72u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
379     { 1u, 84u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
380     { 1u, 88u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
381     { 1u, 72u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
382     { 1u,  3u, 0.f, 0.f, 0.f, 0.f,  5.f, 0.f },
383     { 1u, 71u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
384     { 1u, 72u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
385     { 1u, 5039u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
386     { 1u, 81u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
387     { 1u, 76u, 0.f, 0.f, 0.f, 0.f,  4.f, 0.f },
388     { 1u, 72u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
389     { 1u, 69u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
390     { 1u, 68u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
391     { 1u, 86u, 0.f, 0.f, 0.f, 0.f,  8.f, 0.f },
392     { 1u,  3u, 0.f, 0.f, 0.f, 0.f,  5.f, 0.f },
393     { 1u, 72u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
394     { 1u, 68u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
395     { 1u,  3u, 0.f, 0.f, 0.f, 0.f,  5.f, 0.f },
396     { 1u, 80u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f },
397     { 1u, 72u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
398     { 1u, 76u, 0.f, 0.f, 0.f, 0.f,  4.f, 0.f },
399     { 1u,  0u, 0.f, 0.f, 0.f, 0.f,  0.f, 0.f },
400     { 1u, 83u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
401     { 1u, 82u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
402     { 1u, 86u, 0.f, 0.f, 0.f, 0.f,  8.f, 0.f },
403     { 1u, 86u, 0.f, 0.f, 0.f, 0.f,  8.f, 0.f },
404     { 1u, 72u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
405     { 1u,  3u, 0.f, 0.f, 0.f, 0.f,  5.f, 0.f },
406     { 1u, 76u, 0.f, 0.f, 0.f, 0.f,  4.f, 0.f },
407     { 1u, 85u, 0.f, 0.f, 0.f, 0.f,  6.f, 0.f },
408     { 1u, 68u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
409     { 1u, 70u, 0.f, 0.f, 0.f, 0.f,  8.f, 0.f },
410     { 1u, 88u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
411     { 1u, 81u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
412     { 1u, 71u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
413     { 1u, 76u, 0.f, 0.f, 0.f, 0.f,  4.f, 0.f },
414     { 1u, 68u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
415     { 1u,  3u, 0.f, 0.f, 0.f, 0.f,  5.f, 0.f },
416     { 1u, 81u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
417     { 1u, 72u, 0.f, 0.f, 0.f, 0.f,  9.f, 0.f },
418     { 1u,  3u, 0.f, 0.f, 0.f, 0.f,  5.f, 0.f },
419     { 1u, 70u, 0.f, 0.f, 0.f, 0.f,  8.f, 0.f },
420     { 1u, 88u, 0.f, 0.f, 0.f, 0.f, 10.f, 0.f },
421     { 1u, 80u, 0.f, 0.f, 0.f, 0.f, 15.f, 0.f },
422     { 1u, 17u, 0.f, 0.f, 0.f, 0.f,  5.f, 0.f },
423     { 1u,  0u, 0.f, 0.f, 0.f, 0.f,  0.f, 0.f },
424   };
425
426   CharacterIndex characterIndices05[] = {  0u,  1u,  2u,  3u,  4u,  5u,  6u,  7u,  8u,  9u,
427                                           10u, 11u, 12u, 13u, 14u, 15u, 16u, 17u, 18u, 19u,
428                                           20u, 21u, 22u, 23u, 24u, 25u, 26u, 27u, 28u, 29u,
429                                           30u, 31u, 32u, 33u, 34u, 35u, 37u, 38u, 39u, 40u,
430                                           41u, 42u, 43u, 44u, 45u, 46u, 47u, 48u, 49u, 50u,
431                                           51u, 52u, 53u, 54u, 55u, 56u, 57u, 58u, 59u, 60u,
432                                           61u, 62u, 63u, 64u, 65u, 66u, 67u, 68u, 69u, 70u,
433                                           71u, 72u, 73u, 74u };
434   Length charactersPerGlyph05[] = { 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
435                                     1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
436                                     1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
437                                     1u, 1u, 1u, 1u, 1u, 2u, 1u, 1u, 1u, 1u,
438                                     1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
439                                     1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
440                                     1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u, 1u,
441                                     1u, 1u, 1u, 1u };
442   CharacterIndex newParagraphGlyphs05[] = { 26u };
443   CharacterIndex newParagraphGlyphs06[] = { 49u };
444   CharacterIndex newParagraphGlyphs07[] = { 73u };
445
446   struct ShapeInfoData data[] =
447   {
448     {
449       "Zero characters",
450       "",
451       0u,
452       0u,
453       0u,
454       NULL,
455       NULL,
456       NULL,
457       0u,
458       NULL
459     },
460     {
461       "Latin script",
462       "Hello world",
463       0u,
464       11u,
465       11u,
466       glyphs02,
467       characterIndices02,
468       charactersPerGlyph02,
469       0u,
470       NULL
471     },
472     {
473       "Latin script. Some paragraphs.",
474       "Hello world\ndemo\n",
475       0u,
476       17u,
477       17u,
478       glyphs03,
479       characterIndices03,
480       charactersPerGlyph03,
481       2u,
482       newParagraphGlyphs03
483     },
484     {
485       "Malayalam script. More glyphs than characters.",
486       "ജോസോഹോവോ",
487       0u,
488       8u,
489       12u,
490       glyphs04,
491       characterIndices04,
492       charactersPerGlyph04,
493       0u,
494       NULL
495     },
496     {
497       "Latin script with some paragraphs. Update initial paragraph.",
498       "Lorem ipsum dolor sit amet\naeque definiebas ea mei\nposse iracundia ne cum.\n",
499       0u,
500       27u,
501       74u,
502       glyphs05,
503       characterIndices05,
504       charactersPerGlyph05,
505       1u,
506       newParagraphGlyphs05
507     },
508     {
509       "Latin script with some paragraphs. Update mid paragraph.",
510       "Lorem ipsum dolor sit amet\naeque definiebas ea mei\nposse iracundia ne cum.\n",
511       27u,
512       24u,
513       74u,
514       glyphs05,
515       characterIndices05,
516       charactersPerGlyph05,
517       1u,
518       newParagraphGlyphs06
519     },
520     {
521       "Latin script with some paragraphs. Update final paragraph.",
522       "Lorem ipsum dolor sit amet\naeque definiebas ea mei\nposse iracundia ne cum.\n",
523       51u,
524       24u,
525       74u,
526       glyphs05,
527       characterIndices05,
528       charactersPerGlyph05,
529       1u,
530       newParagraphGlyphs07
531     },
532   };
533   const unsigned int numberOfTests = 7u;
534
535   for( unsigned int index = 0u; index < numberOfTests; ++index )
536   {
537     ToolkitTestApplication application;
538     if( !ShapeInfoTest( data[index] ) )
539     {
540       tet_result(TET_FAIL);
541     }
542   }
543
544   tet_result(TET_PASS);
545   END_TEST;
546 }
547
548 int UtcDaliTextSoftwareStyling(void)
549 {
550   tet_infoline(" UtcDaliTextSoftwareStyling");
551
552   struct GlyphInfoData glyphs01[] =
553   {
554     { 2u, 21154u, 0.f, 0.f, 0.f, 0.f, 16.f, 0.f, true, true },
555     { 2u, 12298, 0.f, 0.f, 0.f, 0.f, 16.f, 0.f, true, true },
556     { 2u, 17828u, 0.f, 0.f, 0.f, 0.f, 16.f, 0.f, true, true },
557   };
558   struct GlyphInfoData glyphs02[] =
559   {
560     { 2u, 21154u, 0.f, 0.f, 0.f, 0.f, 16.f, 0.f, false, false },
561     { 2u, 12298, 0.f, 0.f, 0.f, 0.f, 16.f, 0.f, false, true },
562     { 2u, 17828u, 0.f, 0.f, 0.f, 0.f, 16.f, 0.f, true,  false },
563   };
564
565   CharacterIndex characterIndices[] = { 0u, 1u, 2u };
566   Length charactersPerGlyph[] = { 1u, 1u, 1u };
567
568   Vector<FontDescriptionRun> fontDescriptions01;
569   Vector<FontDescriptionRun> fontDescriptions02;
570
571   FontDescriptionRun fontDescriptionRun01 =
572   {
573     {
574       0u,
575       3u
576     },
577     NULL,
578     0u,
579     TextAbstraction::FontWeight::BOLD,
580     TextAbstraction::FontWidth::NONE,
581     TextAbstraction::FontSlant::ITALIC,
582     TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
583     false,
584     true,
585     false,
586     true,
587     false
588   };
589   fontDescriptions01.PushBack(fontDescriptionRun01);
590
591   FontDescriptionRun fontDescriptionRun02 =
592   {
593     {
594       0u,
595       1u
596     },
597     NULL,
598     0u,
599     TextAbstraction::FontWeight::NONE,
600     TextAbstraction::FontWidth::NONE,
601     TextAbstraction::FontSlant::NONE,
602     TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
603     false,
604     false,
605     false,
606     false,
607     false
608   };
609   FontDescriptionRun fontDescriptionRun03 =
610   {
611     {
612       1u,
613       1u
614     },
615     NULL,
616     0u,
617     TextAbstraction::FontWeight::BOLD,
618     TextAbstraction::FontWidth::NONE,
619     TextAbstraction::FontSlant::NONE,
620     TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
621     false,
622     true,
623     false,
624     false,
625     false
626   };
627   FontDescriptionRun fontDescriptionRun04 =
628   {
629     {
630       2u,
631       1u
632     },
633     NULL,
634     0u,
635     TextAbstraction::FontWeight::NONE,
636     TextAbstraction::FontWidth::NONE,
637     TextAbstraction::FontSlant::ITALIC,
638     TextAbstraction::FontClient::DEFAULT_POINT_SIZE,
639     false,
640     false,
641     false,
642     true,
643     false
644   };
645
646   fontDescriptions02.PushBack(fontDescriptionRun02);
647   fontDescriptions02.PushBack(fontDescriptionRun03);
648   fontDescriptions02.PushBack(fontDescriptionRun04);
649
650
651   struct ShapeInfoData data[] =
652   {
653     {
654       "Chiness script. Characters have same font description",
655       "未取得",
656       0u,
657       3u,
658       3u,
659       glyphs01,
660       characterIndices,
661       charactersPerGlyph,
662       0u,
663       NULL,
664       fontDescriptions01
665     },
666     {
667       "Chiness script. Each character has different font description.",
668       "未取得",
669       0u,
670       3u,
671       3u,
672       glyphs02,
673       characterIndices,
674       charactersPerGlyph,
675       0u,
676       NULL,
677       fontDescriptions02
678     }
679   };
680
681   const unsigned int numberOfTests = 2u;
682
683   for( unsigned int index = 0u; index < numberOfTests; ++index )
684   {
685     ToolkitTestApplication application;
686     if( !ShapeInfoTest( data[index] ) )
687     {
688       tet_result(TET_FAIL);
689     }
690   }
691
692   tet_result(TET_PASS);
693   END_TEST;
694 }