48c4476435231cc39e477f97a915adde13b04b21
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-Text-Layout.cpp
1 /*
2  * Copyright (c) 2017 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 #include <unistd.h>
21
22 #include <dali-toolkit/internal/text/layouts/layout-engine.h>
23 #include <dali-toolkit/internal/text/layouts/layout-parameters.h>
24 #include <dali-toolkit/internal/text/text-run-container.h>
25 #include <dali-toolkit-test-suite-utils.h>
26 #include <dali-toolkit/dali-toolkit.h>
27 #include <toolkit-text-utils.h>
28
29 using namespace Dali;
30 using namespace Toolkit;
31 using namespace Text;
32
33 // Tests the LayoutEngine methods.
34
35 //////////////////////////////////////////////////////////
36
37 namespace
38 {
39
40 const std::string DEFAULT_FONT_DIR( "/resources/fonts" );
41
42 struct LayoutTextData
43 {
44   std::string          description;
45   std::string          text;
46   Size                 textArea;
47   unsigned int         numberOfFonts;
48   FontDescriptionRun*  fontDescriptions;
49   Size                 layoutSize;
50   unsigned int         totalNumberOfGlyphs;
51   float*               positions;
52   unsigned int         numberOfLines;
53   LineRun*             lines;
54   Layout::Engine::Type layout;
55   unsigned int         startIndex;
56   unsigned int         numberOfGlyphs;
57   bool                 ellipsis:1;
58   bool                 updated:1;
59 };
60
61 void Print( const LineRun& line )
62 {
63   std::cout << "        glyph run, index : " << line.glyphRun.glyphIndex << ", num glyphs : " << line.glyphRun.numberOfGlyphs << std::endl;
64   std::cout << "    character run, index : " << line.characterRun.characterIndex << ", num chars : " << line.characterRun.numberOfCharacters << std::endl;
65   std::cout << "                   width : " << line.width << std::endl;
66   std::cout << "                ascender : " << line.ascender << std::endl;
67   std::cout << "               descender : " << line.descender << std::endl;
68   std::cout << "             extraLength : " << line.extraLength << std::endl;
69   std::cout << "         alignmentOffset : " << line.alignmentOffset << std::endl;
70   std::cout << "               direction : " << line.direction << std::endl;
71   std::cout << "                ellipsis : " << line.ellipsis << std::endl;
72 }
73
74 bool LayoutTextTest( const LayoutTextData& data )
75 {
76   // Load some fonts.
77   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
78   fontClient.SetDpi( 96u, 96u );
79
80   char* pathNamePtr = get_current_dir_name();
81   const std::string pathName( pathNamePtr );
82   free( pathNamePtr );
83
84   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
85   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
86   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
87
88   // 1) Create the model.
89   LogicalModelPtr logicalModel;
90   VisualModelPtr visualModel;
91   MetricsPtr metrics;
92   Size layoutSize;
93
94   Vector<FontDescriptionRun> fontDescriptionRuns;
95   if( 0u != data.numberOfFonts )
96   {
97     fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
98                                 data.fontDescriptions,
99                                 data.fontDescriptions + data.numberOfFonts );
100   }
101
102   LayoutOptions options;
103   options.reorder = false;
104   options.align = false;
105   CreateTextModel( data.text,
106                    data.textArea,
107                    fontDescriptionRuns,
108                    options,
109                    layoutSize,
110                    logicalModel,
111                    visualModel,
112                    metrics );
113
114   // 2) Clear the layout.
115   Vector<LineRun>& lines = visualModel->mLines;
116
117   const Length numberOfCharacters = logicalModel->mText.Count();
118   const bool isLastNewParagraph = ( 0u == numberOfCharacters ) ? false : TextAbstraction::IsNewParagraph( *( logicalModel->mText.Begin() + ( numberOfCharacters - 1u ) ) );
119   const GlyphIndex lastGlyphIndex = data.startIndex + data.numberOfGlyphs - 1u;
120   const bool removeLastLine = isLastNewParagraph && ( lastGlyphIndex + 1u == visualModel->mGlyphs.Count() );
121
122   LineIndex startRemoveIndex = 0u;
123
124   if( 0u != lines.Count() )
125   {
126     startRemoveIndex = lines.Count();
127     LineIndex endRemoveIndex = startRemoveIndex;
128     ClearGlyphRuns( data.startIndex,
129                     lastGlyphIndex + ( removeLastLine ? 1u : 0u ),
130                     lines,
131                     startRemoveIndex,
132                     endRemoveIndex );
133
134     // Update the character runs of the lines.
135     const CharacterIndex* const glyphsToCharactersBuffer = visualModel->mGlyphsToCharacters.Begin();
136     const Length* const charactersPerGlyph = visualModel->mCharactersPerGlyph.Begin();
137     const CharacterIndex startCharacterIndex = *( glyphsToCharactersBuffer + data.startIndex );
138     const CharacterIndex lastCharacterIndex = *( glyphsToCharactersBuffer + lastGlyphIndex ) + *( charactersPerGlyph + lastGlyphIndex ) - 1u;
139     ClearCharacterRuns( startCharacterIndex,
140                         lastCharacterIndex + ( removeLastLine ? 1u : 0u ),
141                         lines,
142                         startRemoveIndex,
143                         endRemoveIndex );
144
145     lines.Erase( lines.Begin() + startRemoveIndex,
146                  lines.Begin() + endRemoveIndex );
147   }
148
149   Vector<Vector2>& glyphPositions = visualModel->mGlyphPositions;
150
151   glyphPositions.Erase( glyphPositions.Begin() + data.startIndex,
152                         glyphPositions.Begin() + data.startIndex + data.numberOfGlyphs );
153
154   // 3) Layout
155   Layout::Engine engine;
156   engine.SetMetrics( metrics );
157   engine.SetLayout( data.layout );
158
159   const Length totalNumberOfGlyphs = visualModel->mGlyphs.Count();
160   float outlineWidth = visualModel->GetOutlineWidth();
161
162   Layout::Parameters layoutParameters( data.textArea,
163                                        logicalModel->mText.Begin(),
164                                        logicalModel->mLineBreakInfo.Begin(),
165                                        logicalModel->mWordBreakInfo.Begin(),
166                                        ( 0u != logicalModel->mCharacterDirections.Count() ) ? logicalModel->mCharacterDirections.Begin() : NULL,
167                                        visualModel->mGlyphs.Begin(),
168                                        visualModel->mGlyphsToCharacters.Begin(),
169                                        visualModel->mCharactersPerGlyph.Begin(),
170                                        visualModel->mCharactersToGlyph.Begin(),
171                                        visualModel->mGlyphsPerCharacter.Begin(),
172                                        totalNumberOfGlyphs,
173                                        Text::HorizontalAlignment::BEGIN,
174                                        Text::LineWrap::WORD,
175                                        outlineWidth );
176
177   layoutParameters.isLastNewParagraph = isLastNewParagraph;
178
179   // The initial glyph and the number of glyphs to layout.
180   layoutParameters.startGlyphIndex = data.startIndex;
181   layoutParameters.numberOfGlyphs = data.numberOfGlyphs;
182   layoutParameters.startLineIndex = startRemoveIndex;
183   layoutParameters.estimatedNumberOfLines = logicalModel->mParagraphInfo.Count();
184
185   layoutSize = Vector2::ZERO;
186
187   const bool updated = engine.LayoutText( layoutParameters,
188                                           glyphPositions,
189                                           lines,
190                                           layoutSize,
191                                           data.ellipsis );
192
193   // 4) Compare the results.
194
195   if( updated != data.updated )
196   {
197     std::cout << "  Different updated bool : " << updated << ", expected : " << data.updated << std::endl;
198     return false;
199   }
200
201   if( layoutSize != data.layoutSize )
202   {
203     std::cout << "  Different layout size : " << layoutSize << ", expected : " << data.layoutSize << std::endl;
204     return false;
205   }
206
207   for( unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index )
208   {
209     const Vector2& position = *( glyphPositions.Begin() + index );
210
211     if( fabsf( position.x - *( data.positions + 2u * index ) ) > Math::MACHINE_EPSILON_1000 )
212     {
213       std::cout << "  Different position for glyph " << index << " x : " << position.x << ", expected : " << *( data.positions + 2u * index ) << std::endl;
214       return false;
215     }
216     if( fabsf( position.y - *( data.positions + 2u * index + 1u ) ) > Math::MACHINE_EPSILON_1000 )
217     {
218       std::cout << "  Different position for glyph " << index << " y : " << position.y << ", expected : " << *( data.positions + 2u * index + 1u ) << std::endl;
219       return false;
220     }
221   }
222
223   if( lines.Count() != data.numberOfLines )
224   {
225     std::cout << "  Different number of lines : " << lines.Count() << ", expected : " << data.numberOfLines << std::endl;
226     return false;
227   }
228
229   for( unsigned int index = 0u; index < data.numberOfLines; ++index )
230   {
231     const LineRun& line = *( lines.Begin() + index );
232     const LineRun& expectedLine = *( data.lines + index );
233
234     if( line.glyphRun.glyphIndex != expectedLine.glyphRun.glyphIndex )
235     {
236       std::cout << "  Different line info for line : " << index << std::endl;
237       Print( line );
238       std::cout << "  expected" << std::endl;
239       Print( expectedLine );
240       return false;
241     }
242     if( line.glyphRun.numberOfGlyphs != expectedLine.glyphRun.numberOfGlyphs )
243     {
244       std::cout << "  Different line info for line : " << index << std::endl;
245       Print( line );
246       std::cout << "  expected" << std::endl;
247       Print( expectedLine );
248       return false;
249     }
250
251     if( line.characterRun.characterIndex != expectedLine.characterRun.characterIndex )
252     {
253       std::cout << "  Different line info for line : " << index << std::endl;
254       Print( line );
255       std::cout << "  expected" << std::endl;
256       Print( expectedLine );
257       return false;
258     }
259     if( line.characterRun.numberOfCharacters != expectedLine.characterRun.numberOfCharacters )
260     {
261       std::cout << "  Different line info for line : " << index << std::endl;
262       Print( line );
263       std::cout << "  expected" << std::endl;
264       Print( expectedLine );
265       return false;
266     }
267
268     if( fabsf( line.width - expectedLine.width ) > Math::MACHINE_EPSILON_1 )
269     {
270       std::cout << "  Different line info for line : " << index << std::endl;
271       Print( line );
272       std::cout << "  expected" << std::endl;
273       Print( expectedLine );
274       return false;
275     }
276
277     if( fabsf( line.ascender - expectedLine.ascender ) > Math::MACHINE_EPSILON_1 )
278     {
279       std::cout << "  Different line info for line : " << index << std::endl;
280       Print( line );
281       std::cout << "  expected" << std::endl;
282       Print( expectedLine );
283       return false;
284     }
285
286     if( fabsf( line.descender - expectedLine.descender ) > Math::MACHINE_EPSILON_1 )
287     {
288       std::cout << "  Different line info for line : " << index << std::endl;
289       Print( line );
290       std::cout << "  expected" << std::endl;
291       Print( expectedLine );
292       return false;
293     }
294
295     if( fabsf( line.extraLength - expectedLine.extraLength ) > Math::MACHINE_EPSILON_1 )
296     {
297       std::cout << "  Different line info for line : " << index << std::endl;
298       Print( line );
299       std::cout << "  expected" << std::endl;
300       Print( expectedLine );
301       return false;
302     }
303
304     if( line.ellipsis != expectedLine.ellipsis )
305     {
306       std::cout << "  Different line info for line : " << index << std::endl;
307       Print( line );
308       std::cout << "  expected" << std::endl;
309       Print( expectedLine );
310       return false;
311     }
312
313     // Do not compare the alignment offset as it's not calculated in the layout.
314     // Do not compare the line direction as it's not set in the layout.
315   }
316
317   return true;
318 }
319
320 //////////////////////////////////////////////////////////
321
322 struct ReLayoutRightToLeftLinesData
323 {
324   std::string         description;
325   std::string         text;
326   Size                textArea;
327   unsigned int        numberOfFonts;
328   FontDescriptionRun* fontDescriptions;
329   unsigned int        totalNumberOfGlyphs;
330   float*              positions;
331   unsigned int        startIndex;
332   unsigned int        numberOfCharacters;
333 };
334
335 bool ReLayoutRightToLeftLinesTest( const ReLayoutRightToLeftLinesData& data )
336 {
337   // Load some fonts.
338   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
339   fontClient.SetDpi( 96u, 96u );
340
341   char* pathNamePtr = get_current_dir_name();
342   const std::string pathName( pathNamePtr );
343   free( pathNamePtr );
344
345   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
346   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
347   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
348
349   // 1) Create the model.
350   LogicalModelPtr logicalModel;
351   VisualModelPtr visualModel;
352   MetricsPtr metrics;
353   Size layoutSize;
354
355   Vector<FontDescriptionRun> fontDescriptionRuns;
356   if( 0u != data.numberOfFonts )
357   {
358     fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
359                                 data.fontDescriptions,
360                                 data.fontDescriptions + data.numberOfFonts );
361   }
362
363   LayoutOptions options;
364   options.reorder = false;
365   options.align = false;
366   CreateTextModel( data.text,
367                    data.textArea,
368                    fontDescriptionRuns,
369                    options,
370                    layoutSize,
371                    logicalModel,
372                    visualModel,
373                    metrics );
374
375   // 2) Call the ReLayoutRightToLeftLines() method.
376   Layout::Engine engine;
377   engine.SetMetrics( metrics );
378
379   float outlineWidth = visualModel->GetOutlineWidth();
380   Layout::Parameters layoutParameters( data.textArea,
381                                        logicalModel->mText.Begin(),
382                                        logicalModel->mLineBreakInfo.Begin(),
383                                        logicalModel->mWordBreakInfo.Begin(),
384                                        ( 0u != logicalModel->mCharacterDirections.Count() ) ? logicalModel->mCharacterDirections.Begin() : NULL,
385                                        visualModel->mGlyphs.Begin(),
386                                        visualModel->mGlyphsToCharacters.Begin(),
387                                        visualModel->mCharactersPerGlyph.Begin(),
388                                        visualModel->mCharactersToGlyph.Begin(),
389                                        visualModel->mGlyphsPerCharacter.Begin(),
390                                        visualModel->mGlyphs.Count(),
391                                        Text::HorizontalAlignment::BEGIN,
392                                        Text::LineWrap::WORD,
393                                        outlineWidth );
394
395   layoutParameters.numberOfBidirectionalInfoRuns = logicalModel->mBidirectionalLineInfo.Count();
396   layoutParameters.lineBidirectionalInfoRunsBuffer = logicalModel->mBidirectionalLineInfo.Begin();
397
398   engine.ReLayoutRightToLeftLines( layoutParameters,
399                                    data.startIndex,
400                                    data.numberOfCharacters,
401                                    visualModel->mGlyphPositions );
402
403   // 3) Compare the results.
404   Vector<Vector2>& glyphPositions = visualModel->mGlyphPositions;
405
406   if( data.totalNumberOfGlyphs != visualModel->mGlyphs.Count() )
407   {
408     std::cout << "  Different number of glyphs : " << visualModel->mGlyphs.Count() << ", expected : " << data.totalNumberOfGlyphs << std::endl;
409     return false;
410   }
411
412   for( unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index )
413   {
414     const Vector2& position = *( glyphPositions.Begin() + index );
415
416     if( fabsf( position.x - *( data.positions + 2u * index ) ) > Math::MACHINE_EPSILON_1000 )
417     {
418       std::cout << "  Different position for glyph " << index << " x : " << position.x << ", expected : " << *( data.positions + 2u * index ) << std::endl;
419       return false;
420     }
421     if( fabsf( position.y - *( data.positions + 2u * index + 1u ) ) > Math::MACHINE_EPSILON_1000 )
422     {
423       std::cout << "  Different position for glyph " << index << " y : " << position.y << ", expected : " << *( data.positions + 2u * index + 1u ) << std::endl;
424       return false;
425     }
426   }
427
428   return true;
429 }
430
431 //////////////////////////////////////////////////////////
432
433 struct AlignData
434 {
435   std::string                       description;
436   std::string                       text;
437   Size                              textArea;
438   unsigned int                      numberOfFonts;
439   FontDescriptionRun*               fontDescriptions;
440   Text::HorizontalAlignment::Type   horizontalAlignment;
441   Text::VerticalAlignment::Type     verticalAlignment;
442   unsigned int                      startIndex;
443   unsigned int                      numberOfCharacters;
444   unsigned int                      numberOfLines;
445   float*                            lineOffsets;
446 };
447
448 bool AlignTest( const AlignData& data )
449 {
450   // Load some fonts.
451   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
452   fontClient.SetDpi( 96u, 96u );
453
454   char* pathNamePtr = get_current_dir_name();
455   const std::string pathName( pathNamePtr );
456   free( pathNamePtr );
457
458   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
459   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
460   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
461
462   // 1) Create the model.
463   LogicalModelPtr logicalModel;
464   VisualModelPtr visualModel;
465   MetricsPtr metrics;
466   Size layoutSize;
467
468   Vector<FontDescriptionRun> fontDescriptionRuns;
469   if( 0u != data.numberOfFonts )
470   {
471     fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
472                                 data.fontDescriptions,
473                                 data.fontDescriptions + data.numberOfFonts );
474   }
475
476   LayoutOptions options;
477   options.align = false;
478   CreateTextModel( data.text,
479                    data.textArea,
480                    fontDescriptionRuns,
481                    options,
482                    layoutSize,
483                    logicalModel,
484                    visualModel,
485                    metrics );
486
487   // Call the Align method.
488   Layout::Engine engine;
489   engine.SetMetrics( metrics );
490
491   float alignmentOffset = 0.f;
492   engine.Align( data.textArea,
493                 data.startIndex,
494                 data.numberOfCharacters,
495                 data.horizontalAlignment,
496                 visualModel->mLines,
497                 alignmentOffset );
498
499   // Compare results.
500   if( data.numberOfLines != visualModel->mLines.Count() )
501   {
502     std::cout << "  Different number of lines : " << visualModel->mLines.Count() << ", expected : " << data.numberOfLines << std::endl;
503     return false;
504   }
505
506   const LineRun* const linesBuffer = visualModel->mLines.Begin();
507   for( unsigned int index = 0u; index < data.numberOfLines; ++index )
508   {
509     const LineRun& line = *( linesBuffer + index );
510
511     if( line.alignmentOffset != *( data.lineOffsets + index ) )
512     {
513       std::cout << "  different line offset for index " << index << " : " << line.alignmentOffset << ", expected : " << *( data.lineOffsets + index ) << std::endl;
514       return false;
515     }
516   }
517
518   return true;
519 }
520
521 } // namespace
522
523 //////////////////////////////////////////////////////////
524 //
525 // UtcDaliTextLayoutSetGetLayout
526 // UtcDaliTextLayoutSetGetTextEllipsisEnabled
527 // UtcDaliTextLayoutSetGetHorizontalAlignment
528 // UtcDaliTextLayoutSetGetVerticalAlignment
529 // UtcDaliTextLayoutSetGetCursorWidth
530 // UtcDaliTextLayoutNoText
531 // UtcDaliTextLayoutSmallTextArea01
532 // UtcDaliTextLayoutSmallTextArea02
533 // UtcDaliTextLayoutMultilineText01
534 // UtcDaliTextLayoutMultilineText02
535 // UtcDaliTextLayoutMultilineText03
536 // UtcDaliTextLayoutMultilineText04
537 // UtcDaliTextLayoutMultilineText05
538 // UtcDaliTextUpdateLayout01
539 // UtcDaliTextUpdateLayout02
540 // UtcDaliTextUpdateLayout03
541 // UtcDaliTextLayoutEllipsis01
542 // UtcDaliTextLayoutEllipsis02
543 // UtcDaliTextLayoutEllipsis03
544 // UtcDaliTextLayoutEllipsis04
545 // UtcDaliTextLayoutEllipsis04
546 // UtcDaliTextReorderLayout01
547 // UtcDaliTextReorderLayout02
548 // UtcDaliTextReorderLayout03
549 // UtcDaliTextReorderLayout04
550 // UtcDaliTextAlign01
551 // UtcDaliTextAlign02
552 // UtcDaliTextAlign03
553 // UtcDaliTextAlign04
554 // UtcDaliTextAlign05
555 // UtcDaliTextAlign06
556 // UtcDaliTextAlign07
557 // UtcDaliTextAlign08
558 // UtcDaliTextAlign09
559 //
560 //////////////////////////////////////////////////////////
561
562 int UtcDaliTextLayoutSetGetLayout(void)
563 {
564   ToolkitTestApplication application;
565   tet_infoline(" UtcDaliTextLayoutSetGetLayout");
566
567   Layout::Engine engine;
568
569   DALI_TEST_CHECK( Layout::Engine::SINGLE_LINE_BOX == engine.GetLayout() );
570
571   engine.SetLayout( Layout::Engine::MULTI_LINE_BOX );
572   DALI_TEST_CHECK( Layout::Engine::MULTI_LINE_BOX == engine.GetLayout() );
573
574   tet_result(TET_PASS);
575   END_TEST;
576 }
577
578 int UtcDaliTextLayoutSetGetCursorWidth(void)
579 {
580   ToolkitTestApplication application;
581   tet_infoline(" ");
582
583   Layout::Engine engine;
584
585   DALI_TEST_EQUALS( 1, engine.GetCursorWidth(), TEST_LOCATION );
586
587   engine.SetCursorWidth( 2 );
588   DALI_TEST_EQUALS( 2, engine.GetCursorWidth(), TEST_LOCATION );
589
590   tet_result(TET_PASS);
591   END_TEST;
592 }
593
594 int UtcDaliTextLayoutNoText(void)
595 {
596   ToolkitTestApplication application;
597   tet_infoline(" UtcDaliTextLayoutNoText");
598
599   Size textArea(100.f, 60.f);
600   Size layoutSize = Vector2::ZERO;
601   LayoutTextData data =
602   {
603     "No text",
604     "",
605     textArea,
606     0u,
607     NULL,
608     layoutSize,
609     0u,
610     NULL,
611     0u,
612     NULL,
613     Layout::Engine::MULTI_LINE_BOX,
614     0u,
615     0u,
616     false,
617     false
618   };
619
620   if( !LayoutTextTest( data ) )
621   {
622     tet_result(TET_FAIL);
623   }
624
625   tet_result(TET_PASS);
626   END_TEST;
627 }
628
629 int UtcDaliTextLayoutSmallTextArea01(void)
630 {
631   ToolkitTestApplication application;
632   tet_infoline(" UtcDaliTextLayoutSmallTextArea01");
633
634   // Won't layout the text in multi-line if the width is too small.
635
636   const std::string fontFamily( "TizenSans" );
637
638   // Set a known font description
639   FontDescriptionRun fontDescriptionRun;
640   fontDescriptionRun.characterRun.characterIndex = 0u;
641   fontDescriptionRun.characterRun.numberOfCharacters = 11u;
642   fontDescriptionRun.familyLength = fontFamily.size();
643   fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
644   memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
645   fontDescriptionRun.familyDefined = true;
646   fontDescriptionRun.weightDefined = false;
647   fontDescriptionRun.widthDefined = false;
648   fontDescriptionRun.slantDefined = false;
649   fontDescriptionRun.sizeDefined = false;
650
651   Vector<FontDescriptionRun> fontDescriptionRuns;
652   fontDescriptionRuns.PushBack( fontDescriptionRun );
653   Size textArea(1.f, 1.f);
654   Size layoutSize = Vector2::ZERO;
655   LayoutTextData data =
656   {
657     "Layout text in a small area",
658     "Hello world",
659     textArea,
660     1u,
661     fontDescriptionRuns.Begin(),
662     layoutSize,
663     0u,
664     NULL,
665     0u,
666     NULL,
667     Layout::Engine::MULTI_LINE_BOX,
668     0u,
669     11u,
670     false,
671     false
672   };
673
674   if( !LayoutTextTest( data ) )
675   {
676     tet_result(TET_FAIL);
677   }
678
679   tet_result(TET_PASS);
680   END_TEST;
681 }
682
683 int UtcDaliTextLayoutSmallTextArea02(void)
684 {
685   ToolkitTestApplication application;
686   tet_infoline(" UtcDaliTextLayoutSmallTextArea02");
687
688   // Will layout the text in single line as it can be scrolled.
689
690   const std::string fontFamily( "TizenSans" );
691
692   // Set a known font description
693   FontDescriptionRun fontDescriptionRun;
694   fontDescriptionRun.characterRun.characterIndex = 0u;
695   fontDescriptionRun.characterRun.numberOfCharacters = 11u;
696   fontDescriptionRun.familyLength = fontFamily.size();
697   fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
698   memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
699   fontDescriptionRun.familyDefined = true;
700   fontDescriptionRun.weightDefined = false;
701   fontDescriptionRun.widthDefined = false;
702   fontDescriptionRun.slantDefined = false;
703   fontDescriptionRun.sizeDefined = false;
704
705   Vector<FontDescriptionRun> fontDescriptionRuns;
706   fontDescriptionRuns.PushBack( fontDescriptionRun );
707   Size textArea(1.f, 1.f);
708   Size layoutSize(80.f, 20.f);
709   float positions[] = { 1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f };
710   struct LineRun line =
711   {
712     { 0u, 11u },
713     { 0u, 11u },
714     80.f,
715     15.f,
716     -5.f,
717     0.f,
718     0.f,
719     0.f,
720     false,
721     false
722   };
723   Vector<LineRun> lines;
724   lines.PushBack( line );
725
726   LayoutTextData data =
727   {
728     "Layout text in a small area",
729     "Hello world",
730     textArea,
731     1u,
732     fontDescriptionRuns.Begin(),
733     layoutSize,
734     11u,
735     positions,
736     1u,
737     lines.Begin(),
738     Layout::Engine::SINGLE_LINE_BOX,
739     0u,
740     11u,
741     false,
742     true
743   };
744
745   if( !LayoutTextTest( data ) )
746   {
747     tet_result(TET_FAIL);
748   }
749
750   tet_result(TET_PASS);
751   END_TEST;
752 }
753
754 int UtcDaliTextLayoutMultilineText01(void)
755 {
756   ToolkitTestApplication application;
757   tet_infoline(" UtcDaliTextLayoutMultilineText01");
758
759   // Layout some lines of left to right text.
760
761   const std::string fontFamily( "TizenSans" );
762
763   // Set a known font description
764   FontDescriptionRun fontDescriptionRun1;
765   fontDescriptionRun1.characterRun.characterIndex = 0u;
766   fontDescriptionRun1.characterRun.numberOfCharacters = 18u;
767   fontDescriptionRun1.familyLength = fontFamily.size();
768   fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
769   memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength );
770   fontDescriptionRun1.familyDefined = true;
771   fontDescriptionRun1.weightDefined = false;
772   fontDescriptionRun1.widthDefined = false;
773   fontDescriptionRun1.slantDefined = false;
774   fontDescriptionRun1.sizeDefined = false;
775
776   FontDescriptionRun fontDescriptionRun2;
777   fontDescriptionRun2.characterRun.characterIndex = 18u;
778   fontDescriptionRun2.characterRun.numberOfCharacters = 31u;
779   fontDescriptionRun2.familyLength = fontFamily.size();
780   fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
781   memcpy( fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength );
782   fontDescriptionRun2.familyDefined = true;
783   fontDescriptionRun2.weightDefined = false;
784   fontDescriptionRun2.widthDefined = false;
785   fontDescriptionRun2.slantDefined = false;
786   fontDescriptionRun2.sizeDefined = false;
787
788   Vector<FontDescriptionRun> fontDescriptionRuns;
789   fontDescriptionRuns.PushBack( fontDescriptionRun1 );
790   fontDescriptionRuns.PushBack( fontDescriptionRun2 );
791   Size textArea(100.f, 300.f);
792   Size layoutSize(95.f, 97.f);
793   float positions[] =
794   {
795     1.f, -12.f, 12.f,  -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f,  -0.f, 40.f, -9.f, 51.f,  -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
796     0.f, -13.f, 10.f,  -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -3.f, 42.f, -12.f,
797     1.f, -12.f,  9.f,  -9.f, 17.f,  -9.f, 27.f,  -9.f, 36.f, -9.f, 45.f, -11.f, 51.f, -0.f,
798     1.f, -12.f, 11.f, -12.f, 15.f, -12.f, 26.f,  -9.f, 35.f, -9.f, 41.f,  -9.f, 50.f, -9.f, 59.f, -11.f, 65.f, -0.f,
799     1.f, -12.f,  5.f, -12.f,  9.f,  -9.f, 19.f,  -9.f, 28.f, -9.f, 35.f,  -0.f, 41.f, -9.f, 50.f, -12.f, 54.f, -0.f, 59.f, -11.f, 66.f,  -9.f, 75.f, -9.f, 83.f, -11.f, 91.f, -2.f
800   };
801   struct LineRun line0 =
802   {
803     { 0u, 12u },
804     { 0u, 12u },
805     81.f,
806     15.f,
807     -5.f,
808     3.f,
809     0.f,
810     0.f,
811     false,
812     false
813   };
814   struct LineRun line1 =
815   {
816     { 12u, 6u },
817     { 12u, 6u },
818     43.f,
819     15.f,
820     -5.f,
821     0.f,
822     0.f,
823     0.f,
824     false,
825     false
826   };
827   struct LineRun line2 =
828   {
829     { 18u, 7u },
830     { 18u, 7u },
831     52.f,
832     15.f,
833     -4.f,
834     5.f,
835     0.f,
836     0.f,
837     false,
838     false
839   };
840   struct LineRun line3 =
841   {
842     { 25u, 9u },
843     { 25u, 10u },
844     66.f,
845     15.f,
846     -4.f,
847     5.f,
848     0.f,
849     0.f,
850     false,
851     false
852   };
853   struct LineRun line4 =
854   {
855     { 34u, 14u },
856     { 35u, 14u },
857     95.f,
858     15.f,
859     -4.f,
860     0.f,
861     0.f,
862     0.f,
863     false,
864     false
865   };
866   Vector<LineRun> lines;
867   lines.PushBack( line0 );
868   lines.PushBack( line1 );
869   lines.PushBack( line2 );
870   lines.PushBack( line3 );
871   lines.PushBack( line4 );
872
873   LayoutTextData data =
874   {
875     "Layout simple multi-line text",
876     "Hello world demo.\n"
877     "Layout different lines of text.",
878     textArea,
879     1u,
880     fontDescriptionRuns.Begin(),
881     layoutSize,
882     48u,
883     positions,
884     5u,
885     lines.Begin(),
886     Layout::Engine::MULTI_LINE_BOX,
887     0u,
888     48u,
889     false,
890     true
891   };
892
893   if( !LayoutTextTest( data ) )
894   {
895     tet_result(TET_FAIL);
896   }
897
898   tet_result(TET_PASS);
899   END_TEST;
900 }
901
902 int UtcDaliTextLayoutMultilineText02(void)
903 {
904   ToolkitTestApplication application;
905   tet_infoline(" UtcDaliTextLayoutMultilineText02");
906
907   // Layout some lines of bidirectional text.
908
909   const std::string fontFamily1( "TizenSans" );
910
911   // Set a known font description
912   FontDescriptionRun fontDescriptionRun1;
913   fontDescriptionRun1.characterRun.characterIndex = 0u;
914   fontDescriptionRun1.characterRun.numberOfCharacters = 17u;
915   fontDescriptionRun1.familyLength = fontFamily1.size();
916   fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
917   memcpy( fontDescriptionRun1.familyName, fontFamily1.c_str(), fontDescriptionRun1.familyLength );
918   fontDescriptionRun1.familyDefined = true;
919   fontDescriptionRun1.weightDefined = false;
920   fontDescriptionRun1.widthDefined = false;
921   fontDescriptionRun1.slantDefined = false;
922   fontDescriptionRun1.sizeDefined = false;
923
924   const std::string fontFamily2( "TizenSansHebrew" );
925
926   // Set a known font description
927   FontDescriptionRun fontDescriptionRun2;
928   fontDescriptionRun2.characterRun.characterIndex = 17u;
929   fontDescriptionRun2.characterRun.numberOfCharacters = 9u;
930   fontDescriptionRun2.familyLength = fontFamily2.size();
931   fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
932   memcpy( fontDescriptionRun2.familyName, fontFamily2.c_str(), fontDescriptionRun2.familyLength );
933   fontDescriptionRun2.familyDefined = true;
934   fontDescriptionRun2.weightDefined = false;
935   fontDescriptionRun2.widthDefined = false;
936   fontDescriptionRun2.slantDefined = false;
937   fontDescriptionRun2.sizeDefined = false;
938
939   const std::string fontFamily3( "TizenSans" );
940
941   // Set a known font description
942   FontDescriptionRun fontDescriptionRun3;
943   fontDescriptionRun3.characterRun.characterIndex = 26u;
944   fontDescriptionRun3.characterRun.numberOfCharacters = 2u;
945   fontDescriptionRun3.familyLength = fontFamily3.size();
946   fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength];
947   memcpy( fontDescriptionRun3.familyName, fontFamily3.c_str(), fontDescriptionRun3.familyLength );
948   fontDescriptionRun3.familyDefined = true;
949   fontDescriptionRun3.weightDefined = false;
950   fontDescriptionRun3.widthDefined = false;
951   fontDescriptionRun3.slantDefined = false;
952   fontDescriptionRun3.sizeDefined = false;
953
954   const std::string fontFamily4( "TizenSansHebrew" );
955
956   // Set a known font description
957   FontDescriptionRun fontDescriptionRun4;
958   fontDescriptionRun4.characterRun.characterIndex = 28u;
959   fontDescriptionRun4.characterRun.numberOfCharacters = 10u;
960   fontDescriptionRun4.familyLength = fontFamily4.size();
961   fontDescriptionRun4.familyName = new char[fontDescriptionRun4.familyLength];
962   memcpy( fontDescriptionRun4.familyName, fontFamily4.c_str(), fontDescriptionRun4.familyLength );
963   fontDescriptionRun4.familyDefined = true;
964   fontDescriptionRun4.weightDefined = false;
965   fontDescriptionRun4.widthDefined = false;
966   fontDescriptionRun4.slantDefined = false;
967   fontDescriptionRun4.sizeDefined = false;
968
969   const std::string fontFamily5( "TizenSans" );
970
971   // Set a known font description
972   FontDescriptionRun fontDescriptionRun5;
973   fontDescriptionRun5.characterRun.characterIndex = 38u;
974   fontDescriptionRun5.characterRun.numberOfCharacters = 17u;
975   fontDescriptionRun5.familyLength = fontFamily5.size();
976   fontDescriptionRun5.familyName = new char[fontDescriptionRun5.familyLength];
977   memcpy( fontDescriptionRun5.familyName, fontFamily5.c_str(), fontDescriptionRun5.familyLength );
978   fontDescriptionRun5.familyDefined = true;
979   fontDescriptionRun5.weightDefined = false;
980   fontDescriptionRun5.widthDefined = false;
981   fontDescriptionRun5.slantDefined = false;
982   fontDescriptionRun5.sizeDefined = false;
983
984   Vector<FontDescriptionRun> fontDescriptionRuns;
985   fontDescriptionRuns.PushBack( fontDescriptionRun1 );
986   fontDescriptionRuns.PushBack( fontDescriptionRun2 );
987   fontDescriptionRuns.PushBack( fontDescriptionRun3 );
988   fontDescriptionRuns.PushBack( fontDescriptionRun4 );
989   fontDescriptionRuns.PushBack( fontDescriptionRun5 );
990   Size textArea(100.f, 300.f);
991   Size layoutSize(81.f, 120.f);
992   float positions[] =
993   {
994     1.f, -12.f, 12.f,  -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f,  -0.f, 40.f,  -9.f, 51.f,  -9.f, 61.f,  -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
995     0.f, -13.f, 10.f,  -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f,  -0.f,
996     1.f, -10.f,  9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
997     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f,  -0.f,
998     1.f, -13.f, 10.f,  -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f,  -0.f, 38.f,  -9.f, 49.f,  -9.f, 59.f,  -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
999     0.f, -13.f, 10.f,  -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -3.f,
1000   };
1001   struct LineRun line0 =
1002   {
1003     { 0u, 12u },
1004     { 0u, 12u },
1005     81.f,
1006     15.f,
1007     -5.f,
1008     3.f,
1009     0.f,
1010     0.f,
1011     false,
1012     false
1013   };
1014   struct LineRun line1 =
1015   {
1016     { 12u, 10u },
1017     { 12u, 10u },
1018     76.f,
1019     15.f,
1020     -5.f,
1021     4.f,
1022     0.f,
1023     0.f,
1024     false,
1025     false
1026   };
1027   struct LineRun line2 =
1028   {
1029     { 22u, 6u },
1030     { 22u, 6u },
1031     34.f,
1032     15.f,
1033     -5.f,
1034     0.f,
1035     0.f,
1036     0.f,
1037     false,
1038     false
1039   };
1040   struct LineRun line3 =
1041   {
1042     { 28u, 10u },
1043     { 28u, 10u },
1044     67.f,
1045     15.f,
1046     -5.f,
1047     4.f,
1048     0.f,
1049     0.f,
1050     false,
1051     false
1052   };
1053   struct LineRun line4 =
1054   {
1055     { 38u, 12u },
1056     { 38u, 12u },
1057     79.f,
1058     15.f,
1059     -5.f,
1060     3.f,
1061     0.f,
1062     0.f,
1063     false,
1064     false
1065   };
1066   struct LineRun line5 =
1067   {
1068     { 50u, 5u },
1069     { 50u, 5u },
1070     43.f,
1071     15.f,
1072     -5.f,
1073     0.f,
1074     0.f,
1075     0.f,
1076     false,
1077     false
1078   };
1079   Vector<LineRun> lines;
1080   lines.PushBack( line0 );
1081   lines.PushBack( line1 );
1082   lines.PushBack( line2 );
1083   lines.PushBack( line3 );
1084   lines.PushBack( line4 );
1085   lines.PushBack( line5 );
1086
1087   LayoutTextData data =
1088   {
1089     "Layout bidirectional text.",
1090     "Hello world demo שלום עולם.\n"
1091     "שלום עולם hello world demo.",
1092     textArea,
1093     5u,
1094     fontDescriptionRuns.Begin(),
1095     layoutSize,
1096     55u,
1097     positions,
1098     6u,
1099     lines.Begin(),
1100     Layout::Engine::MULTI_LINE_BOX,
1101     0u,
1102     55u,
1103     false,
1104     true
1105   };
1106
1107   if( !LayoutTextTest( data ) )
1108   {
1109     tet_result(TET_FAIL);
1110   }
1111
1112   tet_result(TET_PASS);
1113   END_TEST;
1114 }
1115
1116 int UtcDaliTextLayoutMultilineText03(void)
1117 {
1118   ToolkitTestApplication application;
1119   tet_infoline(" UtcDaliTextLayoutMultilineText03");
1120
1121   // Layout a long word which doesn't fit in the width of the text area.
1122
1123   const std::string fontFamily( "TizenSans" );
1124
1125   // Set a known font description
1126   FontDescriptionRun fontDescriptionRun;
1127   fontDescriptionRun.characterRun.characterIndex = 0u;
1128   fontDescriptionRun.characterRun.numberOfCharacters = 29u;
1129   fontDescriptionRun.familyLength = fontFamily.size();
1130   fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1131   memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1132   fontDescriptionRun.familyDefined = true;
1133   fontDescriptionRun.weightDefined = false;
1134   fontDescriptionRun.widthDefined = false;
1135   fontDescriptionRun.slantDefined = false;
1136   fontDescriptionRun.sizeDefined = false;
1137
1138   Vector<FontDescriptionRun> fontDescriptionRuns;
1139   fontDescriptionRuns.PushBack( fontDescriptionRun );
1140   Size textArea(100.f, 300.f);
1141   Size layoutSize(96.f, 60.f);
1142   float positions[] =
1143   {
1144     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f,  -9.f, 36.f,  -9.f, 47.f, -9.f, 57.f, -9.f, 63.f, -13.f, 66.f, -13.f, 75.f, -13.f, 85.f,  -9.f,
1145     1.f,  -9.f, 13.f, -9.f, 23.f, -13.f, 32.f,  -9.f, 40.f, -13.f, 44.f, -13.f, 47.f, -9.f, 56.f, -9.f, 67.f,  -9.f, 77.f,  -9.f, 83.f, -13.f, 86.f, -13.f,
1146     0.f, -13.f, 10.f, -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f,  -3.f,
1147   };
1148   struct LineRun line0 =
1149   {
1150     { 0u, 12u },
1151     { 0u, 12u },
1152     94.f,
1153     15.f,
1154     -5.f,
1155     0.f,
1156     0.f,
1157     0.f,
1158     false,
1159     false
1160   };
1161   struct LineRun line1 =
1162   {
1163     { 12u, 12u },
1164     { 12u, 12u },
1165     96.f,
1166     15.f,
1167     -5.f,
1168     0.f,
1169     0.f,
1170     0.f,
1171     false,
1172     false
1173   };
1174   struct LineRun line2 =
1175   {
1176     { 24u, 5u },
1177     { 24u, 5u },
1178     43.f,
1179     15.f,
1180     -5.f,
1181     0.f,
1182     0.f,
1183     0.f,
1184     false,
1185     false
1186   };
1187   Vector<LineRun> lines;
1188   lines.PushBack( line0 );
1189   lines.PushBack( line1 );
1190   lines.PushBack( line2 );
1191
1192   LayoutTextData data =
1193   {
1194     "Layout a long word which doesn't fit in the width of the text area.",
1195     "Helloworlddemohelloworlddemo.",
1196     textArea,
1197     1u,
1198     fontDescriptionRuns.Begin(),
1199     layoutSize,
1200     29u,
1201     positions,
1202     3u,
1203     lines.Begin(),
1204     Layout::Engine::MULTI_LINE_BOX,
1205     0u,
1206     29u,
1207     false,
1208     true
1209   };
1210
1211   if( !LayoutTextTest( data ) )
1212   {
1213     tet_result(TET_FAIL);
1214   }
1215
1216   tet_result(TET_PASS);
1217   END_TEST;
1218 }
1219
1220 int UtcDaliTextLayoutMultilineText04(void)
1221 {
1222   ToolkitTestApplication application;
1223   tet_infoline(" UtcDaliTextLayoutMultilineText04");
1224
1225   // Layout simple text ending with a \n. It has to add a void line at the end.
1226
1227   const std::string fontFamily( "TizenSans" );
1228
1229   // Set a known font description
1230   FontDescriptionRun fontDescriptionRun;
1231   fontDescriptionRun.characterRun.characterIndex = 0u;
1232   fontDescriptionRun.characterRun.numberOfCharacters = 13u;
1233   fontDescriptionRun.familyLength = fontFamily.size();
1234   fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1235   memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1236   fontDescriptionRun.familyDefined = true;
1237   fontDescriptionRun.weightDefined = false;
1238   fontDescriptionRun.widthDefined = false;
1239   fontDescriptionRun.slantDefined = false;
1240   fontDescriptionRun.sizeDefined = false;
1241
1242   Vector<FontDescriptionRun> fontDescriptionRuns;
1243   fontDescriptionRuns.PushBack( fontDescriptionRun );
1244   Size textArea(100.f, 300.f);
1245   Size layoutSize(83.f, 40.f);
1246   float positions[] =
1247   {
1248     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -3.f, 82.f, -12.f
1249   };
1250   struct LineRun line0 =
1251   {
1252     { 0u, 13u },
1253     { 0u, 13u },
1254     83.f,
1255     15.f,
1256     -5.f,
1257     0.f,
1258     0.f,
1259     false,
1260     false
1261   };
1262   struct LineRun line1 =
1263   {
1264     { 13u, 0u },
1265     { 13u, 0u },
1266     0.f,
1267     15.f,
1268     -5.f,
1269     0.f,
1270     0.f,
1271     0.f,
1272     false,
1273     false
1274   };
1275   Vector<LineRun> lines;
1276   lines.PushBack( line0 );
1277   lines.PushBack( line1 );
1278
1279   LayoutTextData data =
1280   {
1281     "Layout simple text ending with a \n.",
1282     "Hello world.\n",
1283     textArea,
1284     1u,
1285     fontDescriptionRuns.Begin(),
1286     layoutSize,
1287     13u,
1288     positions,
1289     2u,
1290     lines.Begin(),
1291     Layout::Engine::MULTI_LINE_BOX,
1292     0u,
1293     13u,
1294     false,
1295     true
1296   };
1297
1298   if( !LayoutTextTest( data ) )
1299   {
1300     tet_result(TET_FAIL);
1301   }
1302
1303   tet_result(TET_PASS);
1304   END_TEST;
1305 }
1306
1307 int UtcDaliTextLayoutMultilineText05(void)
1308 {
1309   ToolkitTestApplication application;
1310   tet_infoline(" UtcDaliTextLayoutMultilineText05");
1311
1312   // Layout simple text with one character with a different font size.
1313
1314   const std::string fontFamily( "TizenSans" );
1315
1316   // Set a known font description
1317   FontDescriptionRun fontDescriptionRun1;
1318   fontDescriptionRun1.characterRun.characterIndex = 0u;
1319   fontDescriptionRun1.characterRun.numberOfCharacters = 6u;
1320   fontDescriptionRun1.familyLength = fontFamily.size();
1321   fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
1322   memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength );
1323   fontDescriptionRun1.familyDefined = true;
1324   fontDescriptionRun1.weightDefined = false;
1325   fontDescriptionRun1.widthDefined = false;
1326   fontDescriptionRun1.slantDefined = false;
1327   fontDescriptionRun1.sizeDefined = false;
1328
1329   FontDescriptionRun fontDescriptionRun2;
1330   fontDescriptionRun2.characterRun.characterIndex = 6u;
1331   fontDescriptionRun2.characterRun.numberOfCharacters = 1u;
1332   fontDescriptionRun2.familyLength = fontFamily.size();
1333   fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
1334   memcpy( fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength );
1335   fontDescriptionRun2.size = 1280u;
1336   fontDescriptionRun2.familyDefined = true;
1337   fontDescriptionRun2.weightDefined = false;
1338   fontDescriptionRun2.widthDefined = false;
1339   fontDescriptionRun2.slantDefined = false;
1340   fontDescriptionRun2.sizeDefined = true;
1341
1342   FontDescriptionRun fontDescriptionRun3;
1343   fontDescriptionRun3.characterRun.characterIndex = 7u;
1344   fontDescriptionRun3.characterRun.numberOfCharacters = 10u;
1345   fontDescriptionRun3.familyLength = fontFamily.size();
1346   fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength];
1347   memcpy( fontDescriptionRun3.familyName, fontFamily.c_str(), fontDescriptionRun3.familyLength );
1348   fontDescriptionRun3.familyDefined = true;
1349   fontDescriptionRun3.weightDefined = false;
1350   fontDescriptionRun3.widthDefined = false;
1351   fontDescriptionRun3.slantDefined = false;
1352   fontDescriptionRun3.sizeDefined = false;
1353
1354   Vector<FontDescriptionRun> fontDescriptionRuns;
1355   fontDescriptionRuns.PushBack( fontDescriptionRun1 );
1356   fontDescriptionRuns.PushBack( fontDescriptionRun2 );
1357   fontDescriptionRuns.PushBack( fontDescriptionRun3 );
1358   Size textArea(100.f, 300.f);
1359   Size layoutSize(88.f, 53.f);
1360   float positions[] =
1361   {
1362     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -14.f, 59.f, -9.f, 69.f, -9.f, 75.f, -13.f, 78.f, -13.f, 87.f, -0.f,
1363     0.f, -13.f, 10.f, -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -3.f
1364   };
1365   struct LineRun line0 =
1366   {
1367     { 0u, 12u },
1368     { 0u, 12u },
1369     88.f,
1370     25.f,
1371     -8.f,
1372     4.f,
1373     0.f,
1374     0.f,
1375     false,
1376     false
1377   };
1378   struct LineRun line1 =
1379   {
1380     { 12u, 5u },
1381     { 12u, 5u },
1382     43.f,
1383     15.f,
1384     -5.f,
1385     0.f,
1386     0.f,
1387     0.f,
1388     false,
1389     false
1390   };
1391   Vector<LineRun> lines;
1392   lines.PushBack( line0 );
1393   lines.PushBack( line1 );
1394
1395   LayoutTextData data =
1396   {
1397     "Layout simple text with one character with a different font size.",
1398     "Hello world demo.",
1399     textArea,
1400     3u,
1401     fontDescriptionRuns.Begin(),
1402     layoutSize,
1403     17u,
1404     positions,
1405     2u,
1406     lines.Begin(),
1407     Layout::Engine::MULTI_LINE_BOX,
1408     0u,
1409     17u,
1410     false,
1411     true
1412   };
1413
1414   if( !LayoutTextTest( data ) )
1415   {
1416     tet_result(TET_FAIL);
1417   }
1418
1419   tet_result(TET_PASS);
1420   END_TEST;
1421 }
1422
1423 int UtcDaliTextUpdateLayout01(void)
1424 {
1425   ToolkitTestApplication application;
1426   tet_infoline(" UtcDaliTextUpdateLayout01");
1427
1428   // Layout some lines of bidirectional text. Update the paragraphs at the beginning.
1429
1430   const std::string fontLatin( "TizenSans" );
1431   const std::string fontHebrew( "TizenSansHebrew" );
1432   const std::string fontArabic( "TizenSansArabic" );
1433
1434   // Set a known font description
1435   FontDescriptionRun fontDescriptionRun01;
1436   fontDescriptionRun01.characterRun.characterIndex = 0u;
1437   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
1438   fontDescriptionRun01.familyLength = fontLatin.size();
1439   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
1440   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
1441   fontDescriptionRun01.familyDefined = true;
1442   fontDescriptionRun01.weightDefined = false;
1443   fontDescriptionRun01.widthDefined = false;
1444   fontDescriptionRun01.slantDefined = false;
1445   fontDescriptionRun01.sizeDefined = false;
1446
1447   // Set a known font description
1448   FontDescriptionRun fontDescriptionRun02;
1449   fontDescriptionRun02.characterRun.characterIndex = 17u;
1450   fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
1451   fontDescriptionRun02.familyLength = fontHebrew.size();
1452   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
1453   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
1454   fontDescriptionRun02.familyDefined = true;
1455   fontDescriptionRun02.weightDefined = false;
1456   fontDescriptionRun02.widthDefined = false;
1457   fontDescriptionRun02.slantDefined = false;
1458   fontDescriptionRun02.sizeDefined = false;
1459
1460   // Set a known font description
1461   FontDescriptionRun fontDescriptionRun03;
1462   fontDescriptionRun03.characterRun.characterIndex = 26u;
1463   fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
1464   fontDescriptionRun03.familyLength = fontLatin.size();
1465   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
1466   memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
1467   fontDescriptionRun03.familyDefined = true;
1468   fontDescriptionRun03.weightDefined = false;
1469   fontDescriptionRun03.widthDefined = false;
1470   fontDescriptionRun03.slantDefined = false;
1471   fontDescriptionRun03.sizeDefined = false;
1472
1473   // Set a known font description
1474   FontDescriptionRun fontDescriptionRun04;
1475   fontDescriptionRun04.characterRun.characterIndex = 28u;
1476   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
1477   fontDescriptionRun04.familyLength = fontArabic.size();
1478   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
1479   memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
1480   fontDescriptionRun04.familyDefined = true;
1481   fontDescriptionRun04.weightDefined = false;
1482   fontDescriptionRun04.widthDefined = false;
1483   fontDescriptionRun04.slantDefined = false;
1484   fontDescriptionRun04.sizeDefined = false;
1485
1486   // Set a known font description
1487   FontDescriptionRun fontDescriptionRun05;
1488   fontDescriptionRun05.characterRun.characterIndex = 42u;
1489   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
1490   fontDescriptionRun05.familyLength = fontLatin.size();
1491   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
1492   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
1493   fontDescriptionRun05.familyDefined = true;
1494   fontDescriptionRun05.weightDefined = false;
1495   fontDescriptionRun05.widthDefined = false;
1496   fontDescriptionRun05.slantDefined = false;
1497   fontDescriptionRun05.sizeDefined = false;
1498
1499   // Set a known font description
1500   FontDescriptionRun fontDescriptionRun06;
1501   fontDescriptionRun06.characterRun.characterIndex = 54u;
1502   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
1503   fontDescriptionRun06.familyLength = fontHebrew.size();
1504   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
1505   memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
1506   fontDescriptionRun06.familyDefined = true;
1507   fontDescriptionRun06.weightDefined = false;
1508   fontDescriptionRun06.widthDefined = false;
1509   fontDescriptionRun06.slantDefined = false;
1510   fontDescriptionRun06.sizeDefined = false;
1511
1512   // Set a known font description
1513   FontDescriptionRun fontDescriptionRun07;
1514   fontDescriptionRun07.characterRun.characterIndex = 64u;
1515   fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
1516   fontDescriptionRun07.familyLength = fontHebrew.size();
1517   fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
1518   memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
1519   fontDescriptionRun07.familyDefined = true;
1520   fontDescriptionRun07.weightDefined = false;
1521   fontDescriptionRun07.widthDefined = false;
1522   fontDescriptionRun07.slantDefined = false;
1523   fontDescriptionRun07.sizeDefined = false;
1524
1525   // Set a known font description
1526   FontDescriptionRun fontDescriptionRun08;
1527   fontDescriptionRun08.characterRun.characterIndex = 74u;
1528   fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
1529   fontDescriptionRun08.familyLength = fontLatin.size();
1530   fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
1531   memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
1532   fontDescriptionRun08.familyDefined = true;
1533   fontDescriptionRun08.weightDefined = false;
1534   fontDescriptionRun08.widthDefined = false;
1535   fontDescriptionRun08.slantDefined = false;
1536   fontDescriptionRun08.sizeDefined = false;
1537
1538   // Set a known font description
1539   FontDescriptionRun fontDescriptionRun09;
1540   fontDescriptionRun09.characterRun.characterIndex = 92u;
1541   fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
1542   fontDescriptionRun09.familyLength = fontLatin.size();
1543   fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
1544   memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
1545   fontDescriptionRun09.familyDefined = true;
1546   fontDescriptionRun09.weightDefined = false;
1547   fontDescriptionRun09.widthDefined = false;
1548   fontDescriptionRun09.slantDefined = false;
1549   fontDescriptionRun09.sizeDefined = false;
1550
1551   // Set a known font description
1552   FontDescriptionRun fontDescriptionRun10;
1553   fontDescriptionRun10.characterRun.characterIndex = 104u;
1554   fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
1555   fontDescriptionRun10.familyLength = fontArabic.size();
1556   fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
1557   memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
1558   fontDescriptionRun10.familyDefined = true;
1559   fontDescriptionRun10.weightDefined = false;
1560   fontDescriptionRun10.widthDefined = false;
1561   fontDescriptionRun10.slantDefined = false;
1562   fontDescriptionRun10.sizeDefined = false;
1563
1564   // Set a known font description
1565   FontDescriptionRun fontDescriptionRun11;
1566   fontDescriptionRun11.characterRun.characterIndex = 118u;
1567   fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
1568   fontDescriptionRun11.familyLength = fontHebrew.size();
1569   fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
1570   memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
1571   fontDescriptionRun11.familyDefined = true;
1572   fontDescriptionRun11.weightDefined = false;
1573   fontDescriptionRun11.widthDefined = false;
1574   fontDescriptionRun11.slantDefined = false;
1575   fontDescriptionRun11.sizeDefined = false;
1576
1577   // Set a known font description
1578   FontDescriptionRun fontDescriptionRun12;
1579   fontDescriptionRun12.characterRun.characterIndex = 128u;
1580   fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
1581   fontDescriptionRun12.familyLength = fontLatin.size();
1582   fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
1583   memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
1584   fontDescriptionRun12.familyDefined = true;
1585   fontDescriptionRun12.weightDefined = false;
1586   fontDescriptionRun12.widthDefined = false;
1587   fontDescriptionRun12.slantDefined = false;
1588   fontDescriptionRun12.sizeDefined = false;
1589
1590   // Set a known font description
1591   FontDescriptionRun fontDescriptionRun13;
1592   fontDescriptionRun13.characterRun.characterIndex = 145u;
1593   fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
1594   fontDescriptionRun13.familyLength = fontHebrew.size();
1595   fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
1596   memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
1597   fontDescriptionRun13.familyDefined = true;
1598   fontDescriptionRun13.weightDefined = false;
1599   fontDescriptionRun13.widthDefined = false;
1600   fontDescriptionRun13.slantDefined = false;
1601   fontDescriptionRun13.sizeDefined = false;
1602
1603   // Set a known font description
1604   FontDescriptionRun fontDescriptionRun14;
1605   fontDescriptionRun14.characterRun.characterIndex = 154u;
1606   fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
1607   fontDescriptionRun14.familyLength = fontLatin.size();
1608   fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
1609   memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
1610   fontDescriptionRun14.familyDefined = true;
1611   fontDescriptionRun14.weightDefined = false;
1612   fontDescriptionRun14.widthDefined = false;
1613   fontDescriptionRun14.slantDefined = false;
1614   fontDescriptionRun14.sizeDefined = false;
1615
1616   // Set a known font description
1617   FontDescriptionRun fontDescriptionRun15;
1618   fontDescriptionRun15.characterRun.characterIndex = 156u;
1619   fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
1620   fontDescriptionRun15.familyLength = fontHebrew.size();
1621   fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
1622   memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
1623   fontDescriptionRun15.familyDefined = true;
1624   fontDescriptionRun15.weightDefined = false;
1625   fontDescriptionRun15.widthDefined = false;
1626   fontDescriptionRun15.slantDefined = false;
1627   fontDescriptionRun15.sizeDefined = false;
1628
1629   // Set a known font description
1630   FontDescriptionRun fontDescriptionRun16;
1631   fontDescriptionRun16.characterRun.characterIndex = 166u;
1632   fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
1633   fontDescriptionRun16.familyLength = fontLatin.size();
1634   fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
1635   memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
1636   fontDescriptionRun16.familyDefined = true;
1637   fontDescriptionRun16.weightDefined = false;
1638   fontDescriptionRun16.widthDefined = false;
1639   fontDescriptionRun16.slantDefined = false;
1640   fontDescriptionRun16.sizeDefined = false;
1641
1642   // Set a known font description
1643   FontDescriptionRun fontDescriptionRun17;
1644   fontDescriptionRun17.characterRun.characterIndex = 178u;
1645   fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
1646   fontDescriptionRun17.familyLength = fontArabic.size();
1647   fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
1648   memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
1649   fontDescriptionRun17.familyDefined = true;
1650   fontDescriptionRun17.weightDefined = false;
1651   fontDescriptionRun17.widthDefined = false;
1652   fontDescriptionRun17.slantDefined = false;
1653   fontDescriptionRun17.sizeDefined = false;
1654
1655   Vector<FontDescriptionRun> fontDescriptionRuns;
1656   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
1657   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
1658   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
1659   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
1660   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
1661   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
1662   fontDescriptionRuns.PushBack( fontDescriptionRun07 );
1663   fontDescriptionRuns.PushBack( fontDescriptionRun08 );
1664   fontDescriptionRuns.PushBack( fontDescriptionRun09 );
1665   fontDescriptionRuns.PushBack( fontDescriptionRun10 );
1666   fontDescriptionRuns.PushBack( fontDescriptionRun11 );
1667   fontDescriptionRuns.PushBack( fontDescriptionRun12 );
1668   fontDescriptionRuns.PushBack( fontDescriptionRun13 );
1669   fontDescriptionRuns.PushBack( fontDescriptionRun14 );
1670   fontDescriptionRuns.PushBack( fontDescriptionRun15 );
1671   fontDescriptionRuns.PushBack( fontDescriptionRun16 );
1672   fontDescriptionRuns.PushBack( fontDescriptionRun17 );
1673   Size textArea(100.f, 300.f);
1674   Size layoutSize(92.f, 380.f);
1675   float positions[] =
1676   {
1677     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
1678     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
1679     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
1680     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -13.f, 68.f, -9.f, 76.f, -13.f, 80.f, -13.f, 83.f, -9.f, 92.f, -0.f,
1681     0.f, -9.f, 11.f, -9.f, 21.f, -9.f, 27.f, -13.f, 30.f, -13.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
1682     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
1683     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
1684     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
1685     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
1686     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
1687     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
1688     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
1689     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
1690     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
1691     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
1692     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
1693     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
1694     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f,
1695   };
1696
1697   struct LineRun line01 =
1698   {
1699     { 0u, 12u },
1700     { 0u, 12u },
1701     81.f,
1702     15.f,
1703     -5.f,
1704     3.f,
1705     0.f,
1706     0.f,
1707     false,
1708     false
1709   };
1710   struct LineRun line02 =
1711   {
1712     { 12u, 10u },
1713     { 12u, 10u },
1714     76.f,
1715     15.f,
1716     -5.f,
1717     4.f,
1718     0.f,
1719     0.f,
1720     false,
1721     false
1722   };
1723   struct LineRun line03 =
1724   {
1725     { 22u, 6u },
1726     { 22u, 6u },
1727     34.f,
1728     15.f,
1729     -5.f,
1730     0.f,
1731     0.f,
1732     0.f,
1733     false,
1734     false
1735   };
1736   struct LineRun line04 =
1737   {
1738     { 28u, 20u },
1739     { 28u, 20u },
1740     92.f,
1741     15.f,
1742     -5.f,
1743     4.f,
1744     0.f,
1745     0.f,
1746     false,
1747     false
1748   };
1749   struct LineRun line05 =
1750   {
1751     { 48u, 11u },
1752     { 48u, 11u },
1753     76.f,
1754     15.f,
1755     -5.f,
1756     4.f,
1757     0.f,
1758     0.f,
1759     false,
1760     false
1761   };
1762   struct LineRun line06 =
1763   {
1764     { 59u, 5u },
1765     { 59u, 5u },
1766     31.f,
1767     15.f,
1768     -5.f,
1769     0.f,
1770     0.f,
1771     0.f,
1772     false,
1773     false
1774   };
1775   struct LineRun line07 =
1776   {
1777     { 64u, 10u },
1778     { 64u, 10u },
1779     67.f,
1780     15.f,
1781     -5.f,
1782     4.f,
1783     0.f,
1784     0.f,
1785     false,
1786     false
1787   };
1788   struct LineRun line08 =
1789   {
1790     { 74u, 12u },
1791     { 74u, 12u },
1792     79.f,
1793     15.f,
1794     -5.f,
1795     3.f,
1796     0.f,
1797     0.f,
1798     false,
1799     false
1800   };
1801   struct LineRun line09 =
1802   {
1803     { 86u, 6u },
1804     { 86u, 6u },
1805     43.f,
1806     15.f,
1807     -5.f,
1808     0.f,
1809     0.f,
1810     0.f,
1811     false,
1812     false
1813   };
1814   struct LineRun line10 =
1815   {
1816     { 92u, 12u },
1817     { 92u, 12u },
1818     78.f,
1819     15.f,
1820     -5.f,
1821     4.f,
1822     0.f,
1823     0.f,
1824     false,
1825     false
1826   };
1827   struct LineRun line11 =
1828   {
1829     { 104u, 19u },
1830     { 104u, 19u },
1831     90.f,
1832     15.f,
1833     -5.f,
1834     4.f,
1835     0.f,
1836     0.f,
1837     false,
1838     false
1839   };
1840   struct LineRun line12 =
1841   {
1842     { 123u, 5u },
1843     { 123u, 5u },
1844     31.f,
1845     15.f,
1846     -5.f,
1847     0.f,
1848     0.f,
1849     0.f,
1850     false,
1851     false
1852   };
1853   struct LineRun line13 =
1854   {
1855     { 128u, 12u },
1856     { 128u, 12u },
1857     81.f,
1858     15.f,
1859     -5.f,
1860     3.f,
1861     0.f,
1862     0.f,
1863     false,
1864     false
1865   };
1866   struct LineRun line14 =
1867   {
1868     { 140u, 10u },
1869     { 140u, 10u },
1870     76.f,
1871     15.f,
1872     -5.f,
1873     4.f,
1874     0.f,
1875     0.f,
1876     false,
1877     false
1878   };
1879   struct LineRun line15 =
1880   {
1881     { 150u, 6u },
1882     { 150u, 6u },
1883     34.f,
1884     15.f,
1885     -5.f,
1886     0.f,
1887     0.f,
1888     0.f,
1889     false,
1890     false
1891   };
1892   struct LineRun line16 =
1893   {
1894     { 156u, 10u },
1895     { 156u, 10u },
1896     67.f,
1897     15.f,
1898     -5.f,
1899     4.f,
1900     0.f,
1901     0.f,
1902     false,
1903     false
1904   };
1905   struct LineRun line17 =
1906   {
1907     { 166u, 12u },
1908     { 166u, 12u },
1909     79.f,
1910     15.f,
1911     -5.f,
1912     4.f,
1913     0.f,
1914     0.f,
1915     false,
1916     false
1917   };
1918   struct LineRun line18 =
1919   {
1920     { 178u, 14u },
1921     { 178u, 14u },
1922     55.f,
1923     15.f,
1924     -5.f,
1925     0.f,
1926     0.f,
1927     0.f,
1928     false,
1929     false
1930   };
1931   struct LineRun line19 =
1932   {
1933     { 192u, 0u },
1934     { 192u, 0u },
1935     0.f,
1936     15.f,
1937     -5.f,
1938     0.f,
1939     0.f,
1940     0.f,
1941     false,
1942     false
1943   };
1944   Vector<LineRun> lines;
1945   lines.PushBack( line01 );
1946   lines.PushBack( line02 );
1947   lines.PushBack( line03 );
1948   lines.PushBack( line04 );
1949   lines.PushBack( line05 );
1950   lines.PushBack( line06 );
1951   lines.PushBack( line07 );
1952   lines.PushBack( line08 );
1953   lines.PushBack( line09 );
1954   lines.PushBack( line10 );
1955   lines.PushBack( line11 );
1956   lines.PushBack( line12 );
1957   lines.PushBack( line13 );
1958   lines.PushBack( line14 );
1959   lines.PushBack( line15 );
1960   lines.PushBack( line16 );
1961   lines.PushBack( line17 );
1962   lines.PushBack( line18 );
1963   lines.PushBack( line19 );
1964
1965   LayoutTextData data =
1966   {
1967     "Layout bidirectional text.",
1968     "Hello world demo שלום עולם.\n"
1969     "مرحبا بالعالم hello world שלום עולם\n"
1970     "שלום עולם hello world demo.\n"
1971     "hello world مرحبا بالعالم שלום עולם\n"
1972     "Hello world demo שלום עולם.\n"
1973     "שלום עולם hello world مرحبا بالعالم\n",
1974     textArea,
1975     17u,
1976     fontDescriptionRuns.Begin(),
1977     layoutSize,
1978     192u,
1979     positions,
1980     19u,
1981     lines.Begin(),
1982     Layout::Engine::MULTI_LINE_BOX,
1983     0u,
1984     64u,
1985     false,
1986     true
1987   };
1988
1989   if( !LayoutTextTest( data ) )
1990   {
1991     tet_result(TET_FAIL);
1992   }
1993
1994   tet_result(TET_PASS);
1995   END_TEST;
1996 }
1997
1998 int UtcDaliTextUpdateLayout02(void)
1999 {
2000   ToolkitTestApplication application;
2001   tet_infoline(" UtcDaliTextUpdateLayout02");
2002
2003   // Layout some lines of bidirectional text. Update the paragraphs at the middle.
2004
2005   const std::string fontLatin( "TizenSans" );
2006   const std::string fontHebrew( "TizenSansHebrew" );
2007   const std::string fontArabic( "TizenSansArabic" );
2008
2009   // Set a known font description
2010   FontDescriptionRun fontDescriptionRun01;
2011   fontDescriptionRun01.characterRun.characterIndex = 0u;
2012   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
2013   fontDescriptionRun01.familyLength = fontLatin.size();
2014   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
2015   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
2016   fontDescriptionRun01.familyDefined = true;
2017   fontDescriptionRun01.weightDefined = false;
2018   fontDescriptionRun01.widthDefined = false;
2019   fontDescriptionRun01.slantDefined = false;
2020   fontDescriptionRun01.sizeDefined = false;
2021
2022   // Set a known font description
2023   FontDescriptionRun fontDescriptionRun02;
2024   fontDescriptionRun02.characterRun.characterIndex = 17u;
2025   fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
2026   fontDescriptionRun02.familyLength = fontHebrew.size();
2027   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
2028   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
2029   fontDescriptionRun02.familyDefined = true;
2030   fontDescriptionRun02.weightDefined = false;
2031   fontDescriptionRun02.widthDefined = false;
2032   fontDescriptionRun02.slantDefined = false;
2033   fontDescriptionRun02.sizeDefined = false;
2034
2035   // Set a known font description
2036   FontDescriptionRun fontDescriptionRun03;
2037   fontDescriptionRun03.characterRun.characterIndex = 26u;
2038   fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
2039   fontDescriptionRun03.familyLength = fontLatin.size();
2040   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
2041   memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
2042   fontDescriptionRun03.familyDefined = true;
2043   fontDescriptionRun03.weightDefined = false;
2044   fontDescriptionRun03.widthDefined = false;
2045   fontDescriptionRun03.slantDefined = false;
2046   fontDescriptionRun03.sizeDefined = false;
2047
2048   // Set a known font description
2049   FontDescriptionRun fontDescriptionRun04;
2050   fontDescriptionRun04.characterRun.characterIndex = 28u;
2051   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
2052   fontDescriptionRun04.familyLength = fontArabic.size();
2053   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
2054   memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
2055   fontDescriptionRun04.familyDefined = true;
2056   fontDescriptionRun04.weightDefined = false;
2057   fontDescriptionRun04.widthDefined = false;
2058   fontDescriptionRun04.slantDefined = false;
2059   fontDescriptionRun04.sizeDefined = false;
2060
2061   // Set a known font description
2062   FontDescriptionRun fontDescriptionRun05;
2063   fontDescriptionRun05.characterRun.characterIndex = 42u;
2064   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
2065   fontDescriptionRun05.familyLength = fontLatin.size();
2066   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
2067   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
2068   fontDescriptionRun05.familyDefined = true;
2069   fontDescriptionRun05.weightDefined = false;
2070   fontDescriptionRun05.widthDefined = false;
2071   fontDescriptionRun05.slantDefined = false;
2072   fontDescriptionRun05.sizeDefined = false;
2073
2074   // Set a known font description
2075   FontDescriptionRun fontDescriptionRun06;
2076   fontDescriptionRun06.characterRun.characterIndex = 54u;
2077   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2078   fontDescriptionRun06.familyLength = fontHebrew.size();
2079   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
2080   memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
2081   fontDescriptionRun06.familyDefined = true;
2082   fontDescriptionRun06.weightDefined = false;
2083   fontDescriptionRun06.widthDefined = false;
2084   fontDescriptionRun06.slantDefined = false;
2085   fontDescriptionRun06.sizeDefined = false;
2086
2087   // Set a known font description
2088   FontDescriptionRun fontDescriptionRun07;
2089   fontDescriptionRun07.characterRun.characterIndex = 64u;
2090   fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
2091   fontDescriptionRun07.familyLength = fontHebrew.size();
2092   fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
2093   memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
2094   fontDescriptionRun07.familyDefined = true;
2095   fontDescriptionRun07.weightDefined = false;
2096   fontDescriptionRun07.widthDefined = false;
2097   fontDescriptionRun07.slantDefined = false;
2098   fontDescriptionRun07.sizeDefined = false;
2099
2100   // Set a known font description
2101   FontDescriptionRun fontDescriptionRun08;
2102   fontDescriptionRun08.characterRun.characterIndex = 74u;
2103   fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
2104   fontDescriptionRun08.familyLength = fontLatin.size();
2105   fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
2106   memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
2107   fontDescriptionRun08.familyDefined = true;
2108   fontDescriptionRun08.weightDefined = false;
2109   fontDescriptionRun08.widthDefined = false;
2110   fontDescriptionRun08.slantDefined = false;
2111   fontDescriptionRun08.sizeDefined = false;
2112
2113   // Set a known font description
2114   FontDescriptionRun fontDescriptionRun09;
2115   fontDescriptionRun09.characterRun.characterIndex = 92u;
2116   fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
2117   fontDescriptionRun09.familyLength = fontLatin.size();
2118   fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
2119   memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
2120   fontDescriptionRun09.familyDefined = true;
2121   fontDescriptionRun09.weightDefined = false;
2122   fontDescriptionRun09.widthDefined = false;
2123   fontDescriptionRun09.slantDefined = false;
2124   fontDescriptionRun09.sizeDefined = false;
2125
2126   // Set a known font description
2127   FontDescriptionRun fontDescriptionRun10;
2128   fontDescriptionRun10.characterRun.characterIndex = 104u;
2129   fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
2130   fontDescriptionRun10.familyLength = fontArabic.size();
2131   fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
2132   memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
2133   fontDescriptionRun10.familyDefined = true;
2134   fontDescriptionRun10.weightDefined = false;
2135   fontDescriptionRun10.widthDefined = false;
2136   fontDescriptionRun10.slantDefined = false;
2137   fontDescriptionRun10.sizeDefined = false;
2138
2139   // Set a known font description
2140   FontDescriptionRun fontDescriptionRun11;
2141   fontDescriptionRun11.characterRun.characterIndex = 118u;
2142   fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
2143   fontDescriptionRun11.familyLength = fontHebrew.size();
2144   fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
2145   memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
2146   fontDescriptionRun11.familyDefined = true;
2147   fontDescriptionRun11.weightDefined = false;
2148   fontDescriptionRun11.widthDefined = false;
2149   fontDescriptionRun11.slantDefined = false;
2150   fontDescriptionRun11.sizeDefined = false;
2151
2152   // Set a known font description
2153   FontDescriptionRun fontDescriptionRun12;
2154   fontDescriptionRun12.characterRun.characterIndex = 128u;
2155   fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
2156   fontDescriptionRun12.familyLength = fontLatin.size();
2157   fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
2158   memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
2159   fontDescriptionRun12.familyDefined = true;
2160   fontDescriptionRun12.weightDefined = false;
2161   fontDescriptionRun12.widthDefined = false;
2162   fontDescriptionRun12.slantDefined = false;
2163   fontDescriptionRun12.sizeDefined = false;
2164
2165   // Set a known font description
2166   FontDescriptionRun fontDescriptionRun13;
2167   fontDescriptionRun13.characterRun.characterIndex = 145u;
2168   fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
2169   fontDescriptionRun13.familyLength = fontHebrew.size();
2170   fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
2171   memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
2172   fontDescriptionRun13.familyDefined = true;
2173   fontDescriptionRun13.weightDefined = false;
2174   fontDescriptionRun13.widthDefined = false;
2175   fontDescriptionRun13.slantDefined = false;
2176   fontDescriptionRun13.sizeDefined = false;
2177
2178   // Set a known font description
2179   FontDescriptionRun fontDescriptionRun14;
2180   fontDescriptionRun14.characterRun.characterIndex = 154u;
2181   fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
2182   fontDescriptionRun14.familyLength = fontLatin.size();
2183   fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
2184   memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
2185   fontDescriptionRun14.familyDefined = true;
2186   fontDescriptionRun14.weightDefined = false;
2187   fontDescriptionRun14.widthDefined = false;
2188   fontDescriptionRun14.slantDefined = false;
2189   fontDescriptionRun14.sizeDefined = false;
2190
2191   // Set a known font description
2192   FontDescriptionRun fontDescriptionRun15;
2193   fontDescriptionRun15.characterRun.characterIndex = 156u;
2194   fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
2195   fontDescriptionRun15.familyLength = fontHebrew.size();
2196   fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
2197   memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
2198   fontDescriptionRun15.familyDefined = true;
2199   fontDescriptionRun15.weightDefined = false;
2200   fontDescriptionRun15.widthDefined = false;
2201   fontDescriptionRun15.slantDefined = false;
2202   fontDescriptionRun15.sizeDefined = false;
2203
2204   // Set a known font description
2205   FontDescriptionRun fontDescriptionRun16;
2206   fontDescriptionRun16.characterRun.characterIndex = 166u;
2207   fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
2208   fontDescriptionRun16.familyLength = fontLatin.size();
2209   fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
2210   memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
2211   fontDescriptionRun16.familyDefined = true;
2212   fontDescriptionRun16.weightDefined = false;
2213   fontDescriptionRun16.widthDefined = false;
2214   fontDescriptionRun16.slantDefined = false;
2215   fontDescriptionRun16.sizeDefined = false;
2216
2217   // Set a known font description
2218   FontDescriptionRun fontDescriptionRun17;
2219   fontDescriptionRun17.characterRun.characterIndex = 178u;
2220   fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
2221   fontDescriptionRun17.familyLength = fontArabic.size();
2222   fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
2223   memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
2224   fontDescriptionRun17.familyDefined = true;
2225   fontDescriptionRun17.weightDefined = false;
2226   fontDescriptionRun17.widthDefined = false;
2227   fontDescriptionRun17.slantDefined = false;
2228   fontDescriptionRun17.sizeDefined = false;
2229
2230   Vector<FontDescriptionRun> fontDescriptionRuns;
2231   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
2232   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
2233   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
2234   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
2235   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
2236   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
2237   fontDescriptionRuns.PushBack( fontDescriptionRun07 );
2238   fontDescriptionRuns.PushBack( fontDescriptionRun08 );
2239   fontDescriptionRuns.PushBack( fontDescriptionRun09 );
2240   fontDescriptionRuns.PushBack( fontDescriptionRun10 );
2241   fontDescriptionRuns.PushBack( fontDescriptionRun11 );
2242   fontDescriptionRuns.PushBack( fontDescriptionRun12 );
2243   fontDescriptionRuns.PushBack( fontDescriptionRun13 );
2244   fontDescriptionRuns.PushBack( fontDescriptionRun14 );
2245   fontDescriptionRuns.PushBack( fontDescriptionRun15 );
2246   fontDescriptionRuns.PushBack( fontDescriptionRun16 );
2247   fontDescriptionRuns.PushBack( fontDescriptionRun17 );
2248   Size textArea(100.f, 300.f);
2249   Size layoutSize(92.f, 380.f);
2250   float positions[] =
2251   {
2252     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
2253     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2254     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2255     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -13.f, 68.f, -9.f, 76.f, -13.f, 80.f, -13.f, 83.f, -9.f, 92.f, -0.f,
2256     0.f, -9.f, 11.f, -9.f, 21.f, -9.f, 27.f, -13.f, 30.f, -13.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2257     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2258     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
2259     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2260     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
2261     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2262     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
2263     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2264     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
2265     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2266     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2267     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
2268     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2269     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f,
2270   };
2271
2272   struct LineRun line01 =
2273   {
2274     { 0u, 12u },
2275     { 0u, 12u },
2276     81.f,
2277     15.f,
2278     -5.f,
2279     3.f,
2280     0.f,
2281     0.f,
2282     false,
2283     false
2284   };
2285   struct LineRun line02 =
2286   {
2287     { 12u, 10u },
2288     { 12u, 10u },
2289     76.f,
2290     15.f,
2291     -5.f,
2292     4.f,
2293     0.f,
2294     0.f,
2295     false,
2296     false
2297   };
2298   struct LineRun line03 =
2299   {
2300     { 22u, 6u },
2301     { 22u, 6u },
2302     34.f,
2303     15.f,
2304     -5.f,
2305     0.f,
2306     0.f,
2307     0.f,
2308     false,
2309     false
2310   };
2311   struct LineRun line04 =
2312   {
2313     { 28u, 20u },
2314     { 28u, 20u },
2315     92.f,
2316     15.f,
2317     -5.f,
2318     4.f,
2319     0.f,
2320     0.f,
2321     false,
2322     false
2323   };
2324   struct LineRun line05 =
2325   {
2326     { 48u, 11u },
2327     { 48u, 11u },
2328     76.f,
2329     15.f,
2330     -5.f,
2331     4.f,
2332     0.f,
2333     0.f,
2334     false,
2335     false
2336   };
2337   struct LineRun line06 =
2338   {
2339     { 59u, 5u },
2340     { 59u, 5u },
2341     31.f,
2342     15.f,
2343     -5.f,
2344     0.f,
2345     0.f,
2346     0.f,
2347     false,
2348     false
2349   };
2350   struct LineRun line07 =
2351   {
2352     { 64u, 10u },
2353     { 64u, 10u },
2354     67.f,
2355     15.f,
2356     -5.f,
2357     4.f,
2358     0.f,
2359     0.f,
2360     false,
2361     false
2362   };
2363   struct LineRun line08 =
2364   {
2365     { 74u, 12u },
2366     { 74u, 12u },
2367     79.f,
2368     15.f,
2369     -5.f,
2370     3.f,
2371     0.f,
2372     0.f,
2373     false,
2374     false
2375   };
2376   struct LineRun line09 =
2377   {
2378     { 86u, 6u },
2379     { 86u, 6u },
2380     43.f,
2381     15.f,
2382     -5.f,
2383     0.f,
2384     0.f,
2385     0.f,
2386     false,
2387     false
2388   };
2389   struct LineRun line10 =
2390   {
2391     { 92u, 12u },
2392     { 92u, 12u },
2393     78.f,
2394     15.f,
2395     -5.f,
2396     4.f,
2397     0.f,
2398     0.f,
2399     false,
2400     false
2401   };
2402   struct LineRun line11 =
2403   {
2404     { 104u, 19u },
2405     { 104u, 19u },
2406     90.f,
2407     15.f,
2408     -5.f,
2409     4.f,
2410     0.f,
2411     0.f,
2412     false,
2413     false
2414   };
2415   struct LineRun line12 =
2416   {
2417     { 123u, 5u },
2418     { 123u, 5u },
2419     31.f,
2420     15.f,
2421     -5.f,
2422     0.f,
2423     0.f,
2424     0.f,
2425     false,
2426     false
2427   };
2428   struct LineRun line13 =
2429   {
2430     { 128u, 12u },
2431     { 128u, 12u },
2432     81.f,
2433     15.f,
2434     -5.f,
2435     3.f,
2436     0.f,
2437     0.f,
2438     false,
2439     false
2440   };
2441   struct LineRun line14 =
2442   {
2443     { 140u, 10u },
2444     { 140u, 10u },
2445     76.f,
2446     15.f,
2447     -5.f,
2448     4.f,
2449     0.f,
2450     0.f,
2451     false,
2452     false
2453   };
2454   struct LineRun line15 =
2455   {
2456     { 150u, 6u },
2457     { 150u, 6u },
2458     34.f,
2459     15.f,
2460     -5.f,
2461     0.f,
2462     0.f,
2463     0.f,
2464     false,
2465     false
2466   };
2467   struct LineRun line16 =
2468   {
2469     { 156u, 10u },
2470     { 156u, 10u },
2471     67.f,
2472     15.f,
2473     -5.f,
2474     4.f,
2475     0.f,
2476     0.f,
2477     false,
2478     false
2479   };
2480   struct LineRun line17 =
2481   {
2482     { 166u, 12u },
2483     { 166u, 12u },
2484     79.f,
2485     15.f,
2486     -5.f,
2487     4.f,
2488     0.f,
2489     0.f,
2490     false,
2491     false
2492   };
2493   struct LineRun line18 =
2494   {
2495     { 178u, 14u },
2496     { 178u, 14u },
2497     55.f,
2498     15.f,
2499     -5.f,
2500     0.f,
2501     0.f,
2502     0.f,
2503     false,
2504     false
2505   };
2506   struct LineRun line19 =
2507   {
2508     { 192u, 0u },
2509     { 192u, 0u },
2510     0.f,
2511     15.f,
2512     -5.f,
2513     0.f,
2514     0.f,
2515     0.f,
2516     false,
2517     false
2518   };
2519   Vector<LineRun> lines;
2520   lines.PushBack( line01 );
2521   lines.PushBack( line02 );
2522   lines.PushBack( line03 );
2523   lines.PushBack( line04 );
2524   lines.PushBack( line05 );
2525   lines.PushBack( line06 );
2526   lines.PushBack( line07 );
2527   lines.PushBack( line08 );
2528   lines.PushBack( line09 );
2529   lines.PushBack( line10 );
2530   lines.PushBack( line11 );
2531   lines.PushBack( line12 );
2532   lines.PushBack( line13 );
2533   lines.PushBack( line14 );
2534   lines.PushBack( line15 );
2535   lines.PushBack( line16 );
2536   lines.PushBack( line17 );
2537   lines.PushBack( line18 );
2538   lines.PushBack( line19 );
2539
2540   LayoutTextData data =
2541   {
2542     "Layout bidirectional text.",
2543     "Hello world demo שלום עולם.\n"
2544     "مرحبا بالعالم hello world שלום עולם\n"
2545     "שלום עולם hello world demo.\n"
2546     "hello world مرحبا بالعالم שלום עולם\n"
2547     "Hello world demo שלום עולם.\n"
2548     "שלום עולם hello world مرحبا بالعالم\n",
2549     textArea,
2550     17u,
2551     fontDescriptionRuns.Begin(),
2552     layoutSize,
2553     192u,
2554     positions,
2555     19u,
2556     lines.Begin(),
2557     Layout::Engine::MULTI_LINE_BOX,
2558     64u,
2559     64u,
2560     false,
2561     true
2562   };
2563
2564   if( !LayoutTextTest( data ) )
2565   {
2566     tet_result(TET_FAIL);
2567   }
2568
2569   tet_result(TET_PASS);
2570   END_TEST;
2571 }
2572
2573 int UtcDaliTextUpdateLayout03(void)
2574 {
2575   ToolkitTestApplication application;
2576   tet_infoline(" UtcDaliTextUpdateLayout03");
2577
2578   // Layout some lines of bidirectional text. Update the paragraphs at the middle.
2579
2580   const std::string fontLatin( "TizenSans" );
2581   const std::string fontHebrew( "TizenSansHebrew" );
2582   const std::string fontArabic( "TizenSansArabic" );
2583
2584   // Set a known font description
2585   FontDescriptionRun fontDescriptionRun01;
2586   fontDescriptionRun01.characterRun.characterIndex = 0u;
2587   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
2588   fontDescriptionRun01.familyLength = fontLatin.size();
2589   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
2590   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
2591   fontDescriptionRun01.familyDefined = true;
2592   fontDescriptionRun01.weightDefined = false;
2593   fontDescriptionRun01.widthDefined = false;
2594   fontDescriptionRun01.slantDefined = false;
2595   fontDescriptionRun01.sizeDefined = false;
2596
2597   // Set a known font description
2598   FontDescriptionRun fontDescriptionRun02;
2599   fontDescriptionRun02.characterRun.characterIndex = 17u;
2600   fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
2601   fontDescriptionRun02.familyLength = fontHebrew.size();
2602   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
2603   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
2604   fontDescriptionRun02.familyDefined = true;
2605   fontDescriptionRun02.weightDefined = false;
2606   fontDescriptionRun02.widthDefined = false;
2607   fontDescriptionRun02.slantDefined = false;
2608   fontDescriptionRun02.sizeDefined = false;
2609
2610   // Set a known font description
2611   FontDescriptionRun fontDescriptionRun03;
2612   fontDescriptionRun03.characterRun.characterIndex = 26u;
2613   fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
2614   fontDescriptionRun03.familyLength = fontLatin.size();
2615   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
2616   memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
2617   fontDescriptionRun03.familyDefined = true;
2618   fontDescriptionRun03.weightDefined = false;
2619   fontDescriptionRun03.widthDefined = false;
2620   fontDescriptionRun03.slantDefined = false;
2621   fontDescriptionRun03.sizeDefined = false;
2622
2623   // Set a known font description
2624   FontDescriptionRun fontDescriptionRun04;
2625   fontDescriptionRun04.characterRun.characterIndex = 28u;
2626   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
2627   fontDescriptionRun04.familyLength = fontArabic.size();
2628   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
2629   memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
2630   fontDescriptionRun04.familyDefined = true;
2631   fontDescriptionRun04.weightDefined = false;
2632   fontDescriptionRun04.widthDefined = false;
2633   fontDescriptionRun04.slantDefined = false;
2634   fontDescriptionRun04.sizeDefined = false;
2635
2636   // Set a known font description
2637   FontDescriptionRun fontDescriptionRun05;
2638   fontDescriptionRun05.characterRun.characterIndex = 42u;
2639   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
2640   fontDescriptionRun05.familyLength = fontLatin.size();
2641   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
2642   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
2643   fontDescriptionRun05.familyDefined = true;
2644   fontDescriptionRun05.weightDefined = false;
2645   fontDescriptionRun05.widthDefined = false;
2646   fontDescriptionRun05.slantDefined = false;
2647   fontDescriptionRun05.sizeDefined = false;
2648
2649   // Set a known font description
2650   FontDescriptionRun fontDescriptionRun06;
2651   fontDescriptionRun06.characterRun.characterIndex = 54u;
2652   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2653   fontDescriptionRun06.familyLength = fontHebrew.size();
2654   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
2655   memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
2656   fontDescriptionRun06.familyDefined = true;
2657   fontDescriptionRun06.weightDefined = false;
2658   fontDescriptionRun06.widthDefined = false;
2659   fontDescriptionRun06.slantDefined = false;
2660   fontDescriptionRun06.sizeDefined = false;
2661
2662   // Set a known font description
2663   FontDescriptionRun fontDescriptionRun07;
2664   fontDescriptionRun07.characterRun.characterIndex = 64u;
2665   fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
2666   fontDescriptionRun07.familyLength = fontHebrew.size();
2667   fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
2668   memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
2669   fontDescriptionRun07.familyDefined = true;
2670   fontDescriptionRun07.weightDefined = false;
2671   fontDescriptionRun07.widthDefined = false;
2672   fontDescriptionRun07.slantDefined = false;
2673   fontDescriptionRun07.sizeDefined = false;
2674
2675   // Set a known font description
2676   FontDescriptionRun fontDescriptionRun08;
2677   fontDescriptionRun08.characterRun.characterIndex = 74u;
2678   fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
2679   fontDescriptionRun08.familyLength = fontLatin.size();
2680   fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
2681   memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
2682   fontDescriptionRun08.familyDefined = true;
2683   fontDescriptionRun08.weightDefined = false;
2684   fontDescriptionRun08.widthDefined = false;
2685   fontDescriptionRun08.slantDefined = false;
2686   fontDescriptionRun08.sizeDefined = false;
2687
2688   // Set a known font description
2689   FontDescriptionRun fontDescriptionRun09;
2690   fontDescriptionRun09.characterRun.characterIndex = 92u;
2691   fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
2692   fontDescriptionRun09.familyLength = fontLatin.size();
2693   fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
2694   memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
2695   fontDescriptionRun09.familyDefined = true;
2696   fontDescriptionRun09.weightDefined = false;
2697   fontDescriptionRun09.widthDefined = false;
2698   fontDescriptionRun09.slantDefined = false;
2699   fontDescriptionRun09.sizeDefined = false;
2700
2701   // Set a known font description
2702   FontDescriptionRun fontDescriptionRun10;
2703   fontDescriptionRun10.characterRun.characterIndex = 104u;
2704   fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
2705   fontDescriptionRun10.familyLength = fontArabic.size();
2706   fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
2707   memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
2708   fontDescriptionRun10.familyDefined = true;
2709   fontDescriptionRun10.weightDefined = false;
2710   fontDescriptionRun10.widthDefined = false;
2711   fontDescriptionRun10.slantDefined = false;
2712   fontDescriptionRun10.sizeDefined = false;
2713
2714   // Set a known font description
2715   FontDescriptionRun fontDescriptionRun11;
2716   fontDescriptionRun11.characterRun.characterIndex = 118u;
2717   fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
2718   fontDescriptionRun11.familyLength = fontHebrew.size();
2719   fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
2720   memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
2721   fontDescriptionRun11.familyDefined = true;
2722   fontDescriptionRun11.weightDefined = false;
2723   fontDescriptionRun11.widthDefined = false;
2724   fontDescriptionRun11.slantDefined = false;
2725   fontDescriptionRun11.sizeDefined = false;
2726
2727   // Set a known font description
2728   FontDescriptionRun fontDescriptionRun12;
2729   fontDescriptionRun12.characterRun.characterIndex = 128u;
2730   fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
2731   fontDescriptionRun12.familyLength = fontLatin.size();
2732   fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
2733   memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
2734   fontDescriptionRun12.familyDefined = true;
2735   fontDescriptionRun12.weightDefined = false;
2736   fontDescriptionRun12.widthDefined = false;
2737   fontDescriptionRun12.slantDefined = false;
2738   fontDescriptionRun12.sizeDefined = false;
2739
2740   // Set a known font description
2741   FontDescriptionRun fontDescriptionRun13;
2742   fontDescriptionRun13.characterRun.characterIndex = 145u;
2743   fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
2744   fontDescriptionRun13.familyLength = fontHebrew.size();
2745   fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
2746   memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
2747   fontDescriptionRun13.familyDefined = true;
2748   fontDescriptionRun13.weightDefined = false;
2749   fontDescriptionRun13.widthDefined = false;
2750   fontDescriptionRun13.slantDefined = false;
2751   fontDescriptionRun13.sizeDefined = false;
2752
2753   // Set a known font description
2754   FontDescriptionRun fontDescriptionRun14;
2755   fontDescriptionRun14.characterRun.characterIndex = 154u;
2756   fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
2757   fontDescriptionRun14.familyLength = fontLatin.size();
2758   fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
2759   memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
2760   fontDescriptionRun14.familyDefined = true;
2761   fontDescriptionRun14.weightDefined = false;
2762   fontDescriptionRun14.widthDefined = false;
2763   fontDescriptionRun14.slantDefined = false;
2764   fontDescriptionRun14.sizeDefined = false;
2765
2766   // Set a known font description
2767   FontDescriptionRun fontDescriptionRun15;
2768   fontDescriptionRun15.characterRun.characterIndex = 156u;
2769   fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
2770   fontDescriptionRun15.familyLength = fontHebrew.size();
2771   fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
2772   memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
2773   fontDescriptionRun15.familyDefined = true;
2774   fontDescriptionRun15.weightDefined = false;
2775   fontDescriptionRun15.widthDefined = false;
2776   fontDescriptionRun15.slantDefined = false;
2777   fontDescriptionRun15.sizeDefined = false;
2778
2779   // Set a known font description
2780   FontDescriptionRun fontDescriptionRun16;
2781   fontDescriptionRun16.characterRun.characterIndex = 166u;
2782   fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
2783   fontDescriptionRun16.familyLength = fontLatin.size();
2784   fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
2785   memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
2786   fontDescriptionRun16.familyDefined = true;
2787   fontDescriptionRun16.weightDefined = false;
2788   fontDescriptionRun16.widthDefined = false;
2789   fontDescriptionRun16.slantDefined = false;
2790   fontDescriptionRun16.sizeDefined = false;
2791
2792   // Set a known font description
2793   FontDescriptionRun fontDescriptionRun17;
2794   fontDescriptionRun17.characterRun.characterIndex = 178u;
2795   fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
2796   fontDescriptionRun17.familyLength = fontArabic.size();
2797   fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
2798   memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
2799   fontDescriptionRun17.familyDefined = true;
2800   fontDescriptionRun17.weightDefined = false;
2801   fontDescriptionRun17.widthDefined = false;
2802   fontDescriptionRun17.slantDefined = false;
2803   fontDescriptionRun17.sizeDefined = false;
2804
2805   Vector<FontDescriptionRun> fontDescriptionRuns;
2806   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
2807   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
2808   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
2809   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
2810   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
2811   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
2812   fontDescriptionRuns.PushBack( fontDescriptionRun07 );
2813   fontDescriptionRuns.PushBack( fontDescriptionRun08 );
2814   fontDescriptionRuns.PushBack( fontDescriptionRun09 );
2815   fontDescriptionRuns.PushBack( fontDescriptionRun10 );
2816   fontDescriptionRuns.PushBack( fontDescriptionRun11 );
2817   fontDescriptionRuns.PushBack( fontDescriptionRun12 );
2818   fontDescriptionRuns.PushBack( fontDescriptionRun13 );
2819   fontDescriptionRuns.PushBack( fontDescriptionRun14 );
2820   fontDescriptionRuns.PushBack( fontDescriptionRun15 );
2821   fontDescriptionRuns.PushBack( fontDescriptionRun16 );
2822   fontDescriptionRuns.PushBack( fontDescriptionRun17 );
2823   Size textArea(100.f, 300.f);
2824   Size layoutSize(92.f, 380.f);
2825   float positions[] =
2826   {
2827     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
2828     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2829     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2830     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -13.f, 68.f, -9.f, 76.f, -13.f, 80.f, -13.f, 83.f, -9.f, 92.f, -0.f,
2831     0.f, -9.f, 11.f, -9.f, 21.f, -9.f, 27.f, -13.f, 30.f, -13.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2832     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2833     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
2834     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2835     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
2836     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2837     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
2838     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2839     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
2840     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2841     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2842     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
2843     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2844     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f,
2845   };
2846
2847   struct LineRun line01 =
2848   {
2849     { 0u, 12u },
2850     { 0u, 12u },
2851     81.f,
2852     15.f,
2853     -5.f,
2854     3.f,
2855     0.f,
2856     0.f,
2857     false,
2858     false
2859   };
2860   struct LineRun line02 =
2861   {
2862     { 12u, 10u },
2863     { 12u, 10u },
2864     76.f,
2865     15.f,
2866     -5.f,
2867     4.f,
2868     0.f,
2869     0.f,
2870     false,
2871     false
2872   };
2873   struct LineRun line03 =
2874   {
2875     { 22u, 6u },
2876     { 22u, 6u },
2877     34.f,
2878     15.f,
2879     -5.f,
2880     0.f,
2881     0.f,
2882     0.f,
2883     false,
2884     false
2885   };
2886   struct LineRun line04 =
2887   {
2888     { 28u, 20u },
2889     { 28u, 20u },
2890     92.f,
2891     15.f,
2892     -5.f,
2893     4.f,
2894     0.f,
2895     0.f,
2896     false,
2897     false
2898   };
2899   struct LineRun line05 =
2900   {
2901     { 48u, 11u },
2902     { 48u, 11u },
2903     76.f,
2904     15.f,
2905     -5.f,
2906     4.f,
2907     0.f,
2908     0.f,
2909     false,
2910     false
2911   };
2912   struct LineRun line06 =
2913   {
2914     { 59u, 5u },
2915     { 59u, 5u },
2916     31.f,
2917     15.f,
2918     -5.f,
2919     0.f,
2920     0.f,
2921     0.f,
2922     false,
2923     false
2924   };
2925   struct LineRun line07 =
2926   {
2927     { 64u, 10u },
2928     { 64u, 10u },
2929     67.f,
2930     15.f,
2931     -5.f,
2932     4.f,
2933     0.f,
2934     0.f,
2935     false,
2936     false
2937   };
2938   struct LineRun line08 =
2939   {
2940     { 74u, 12u },
2941     { 74u, 12u },
2942     79.f,
2943     15.f,
2944     -5.f,
2945     3.f,
2946     0.f,
2947     0.f,
2948     false,
2949     false
2950   };
2951   struct LineRun line09 =
2952   {
2953     { 86u, 6u },
2954     { 86u, 6u },
2955     43.f,
2956     15.f,
2957     -5.f,
2958     0.f,
2959     0.f,
2960     0.f,
2961     false,
2962     false
2963   };
2964   struct LineRun line10 =
2965   {
2966     { 92u, 12u },
2967     { 92u, 12u },
2968     78.f,
2969     15.f,
2970     -5.f,
2971     4.f,
2972     0.f,
2973     0.f,
2974     false,
2975     false
2976   };
2977   struct LineRun line11 =
2978   {
2979     { 104u, 19u },
2980     { 104u, 19u },
2981     90.f,
2982     15.f,
2983     -5.f,
2984     4.f,
2985     0.f,
2986     0.f,
2987     false,
2988     false
2989   };
2990   struct LineRun line12 =
2991   {
2992     { 123u, 5u },
2993     { 123u, 5u },
2994     31.f,
2995     15.f,
2996     -5.f,
2997     0.f,
2998     0.f,
2999     0.f,
3000     false,
3001     false
3002   };
3003   struct LineRun line13 =
3004   {
3005     { 128u, 12u },
3006     { 128u, 12u },
3007     81.f,
3008     15.f,
3009     -5.f,
3010     3.f,
3011     0.f,
3012     0.f,
3013     false,
3014     false
3015   };
3016   struct LineRun line14 =
3017   {
3018     { 140u, 10u },
3019     { 140u, 10u },
3020     76.f,
3021     15.f,
3022     -5.f,
3023     4.f,
3024     0.f,
3025     0.f,
3026     false,
3027     false
3028   };
3029   struct LineRun line15 =
3030   {
3031     { 150u, 6u },
3032     { 150u, 6u },
3033     34.f,
3034     15.f,
3035     -5.f,
3036     0.f,
3037     0.f,
3038     0.f,
3039     false,
3040     false
3041   };
3042   struct LineRun line16 =
3043   {
3044     { 156u, 10u },
3045     { 156u, 10u },
3046     67.f,
3047     15.f,
3048     -5.f,
3049     4.f,
3050     0.f,
3051     0.f,
3052     false,
3053     false
3054   };
3055   struct LineRun line17 =
3056   {
3057     { 166u, 12u },
3058     { 166u, 12u },
3059     79.f,
3060     15.f,
3061     -5.f,
3062     4.f,
3063     0.f,
3064     0.f,
3065     false,