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