71649728a97265f664c2457c235b3aa34eb36df4
[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, 39.f,  -9.f, 50.f,  -9.f, 60.f,  -9.f, 66.f, -13.f, 69.f, -13.f, 78.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     80.f,
1073     15.f,
1074     -5.f,
1075     4.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, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.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, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.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, 41.f, -9.f, 52.f, -9.f, 62.f, -9.f, 68.f, -13.f, 71.f, -13.f, 80.f, -0.f,
1669     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 45.f, -10.f, 56.f, -13.f, 63.f, -10.f, 68.f, -10.f, 76.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, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.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   struct LineRun line01 =
1676   {
1677     { 0u, 12u },
1678     { 0u, 12u },
1679     81.f,
1680     15.f,
1681     -5.f,
1682     3.f,
1683     0.f,
1684     false,
1685     false
1686   };
1687   struct LineRun line02 =
1688   {
1689     { 12u, 10u },
1690     { 12u, 10u },
1691     76.f,
1692     15.f,
1693     -5.f,
1694     4.f,
1695     0.f,
1696     false,
1697     false
1698   };
1699   struct LineRun line03 =
1700   {
1701     { 22u, 6u },
1702     { 22u, 6u },
1703     36.f,
1704     15.f,
1705     -5.f,
1706     0.f,
1707     0.f,
1708     false,
1709     false
1710   };
1711   struct LineRun line04 =
1712   {
1713     { 28u, 20u },
1714     { 28u, 20u },
1715     92.f,
1716     15.f,
1717     -5.f,
1718     5.f,
1719     0.f,
1720     false,
1721     false
1722   };
1723   struct LineRun line05 =
1724   {
1725     { 48u, 11u },
1726     { 48u, 11u },
1727     76.f,
1728     15.f,
1729     -5.f,
1730     4.f,
1731     0.f,
1732     false,
1733     false
1734   };
1735   struct LineRun line06 =
1736   {
1737     { 59u, 5u },
1738     { 59u, 5u },
1739     31.f,
1740     15.f,
1741     -5.f,
1742     0.f,
1743     0.f,
1744     false,
1745     false
1746   };
1747   struct LineRun line07 =
1748   {
1749     { 64u, 10u },
1750     { 64u, 10u },
1751     67.f,
1752     15.f,
1753     -5.f,
1754     4.f,
1755     0.f,
1756     false,
1757     false
1758   };
1759   struct LineRun line08 =
1760   {
1761     { 74u, 12u },
1762     { 74u, 12u },
1763     80.f,
1764     15.f,
1765     -5.f,
1766     4.f,
1767     0.f,
1768     false,
1769     false
1770   };
1771   struct LineRun line09 =
1772   {
1773     { 86u, 6u },
1774     { 86u, 6u },
1775     43.f,
1776     15.f,
1777     -5.f,
1778     0.f,
1779     0.f,
1780     false,
1781     false
1782   };
1783   struct LineRun line10 =
1784   {
1785     { 92u, 12u },
1786     { 92u, 12u },
1787     79.f,
1788     15.f,
1789     -5.f,
1790     5.f,
1791     0.f,
1792     false,
1793     false
1794   };
1795   struct LineRun line11 =
1796   {
1797     { 104u, 19u },
1798     { 104u, 19u },
1799     90.f,
1800     15.f,
1801     -5.f,
1802     4.f,
1803     0.f,
1804     false,
1805     false
1806   };
1807   struct LineRun line12 =
1808   {
1809     { 123u, 5u },
1810     { 123u, 5u },
1811     31.f,
1812     15.f,
1813     -5.f,
1814     0.f,
1815     0.f,
1816     false,
1817     false
1818   };
1819   struct LineRun line13 =
1820   {
1821     { 128u, 12u },
1822     { 128u, 12u },
1823     82.f,
1824     15.f,
1825     -5.f,
1826     4.f,
1827     0.f,
1828     false,
1829     false
1830   };
1831   struct LineRun line14 =
1832   {
1833     { 140u, 10u },
1834     { 140u, 10u },
1835     77.f,
1836     15.f,
1837     -5.f,
1838     4.f,
1839     0.f,
1840     false,
1841     false
1842   };
1843   struct LineRun line15 =
1844   {
1845     { 150u, 6u },
1846     { 150u, 6u },
1847     36.f,
1848     15.f,
1849     -5.f,
1850     0.f,
1851     0.f,
1852     false,
1853     false
1854   };
1855   struct LineRun line16 =
1856   {
1857     { 156u, 10u },
1858     { 156u, 10u },
1859     67.f,
1860     15.f,
1861     -5.f,
1862     4.f,
1863     0.f,
1864     false,
1865     false
1866   };
1867   struct LineRun line17 =
1868   {
1869     { 166u, 12u },
1870     { 166u, 12u },
1871     80.f,
1872     15.f,
1873     -5.f,
1874     4.f,
1875     0.f,
1876     false,
1877     false
1878   };
1879   struct LineRun line18 =
1880   {
1881     { 178u, 14u },
1882     { 178u, 14u },
1883     55.f,
1884     15.f,
1885     -5.f,
1886     0.f,
1887     0.f,
1888     false,
1889     false
1890   };
1891   struct LineRun line19 =
1892   {
1893     { 192u, 0u },
1894     { 192u, 0u },
1895     0.f,
1896     15.f,
1897     -5.f,
1898     0.f,
1899     0.f,
1900     false,
1901     false
1902   };
1903   Vector<LineRun> lines;
1904   lines.PushBack( line01 );
1905   lines.PushBack( line02 );
1906   lines.PushBack( line03 );
1907   lines.PushBack( line04 );
1908   lines.PushBack( line05 );
1909   lines.PushBack( line06 );
1910   lines.PushBack( line07 );
1911   lines.PushBack( line08 );
1912   lines.PushBack( line09 );
1913   lines.PushBack( line10 );
1914   lines.PushBack( line11 );
1915   lines.PushBack( line12 );
1916   lines.PushBack( line13 );
1917   lines.PushBack( line14 );
1918   lines.PushBack( line15 );
1919   lines.PushBack( line16 );
1920   lines.PushBack( line17 );
1921   lines.PushBack( line18 );
1922   lines.PushBack( line19 );
1923
1924   LayoutTextData data =
1925   {
1926     "Layout bidirectional text.",
1927     "Hello world demo שלום עולם.\n"
1928     "مرحبا بالعالم hello world שלום עולם\n"
1929     "שלום עולם hello world demo.\n"
1930     "hello world مرحبا بالعالم שלום עולם\n"
1931     "Hello world demo שלום עולם.\n"
1932     "שלום עולם hello world مرحبا بالعالم\n",
1933     textArea,
1934     15u,
1935     fontDescriptionRuns.Begin(),
1936     layoutSize,
1937     192u,
1938     positions,
1939     19u,
1940     lines.Begin(),
1941     LayoutEngine::MULTI_LINE_BOX,
1942     0u,
1943     64u,
1944     false,
1945     true
1946   };
1947
1948   if( !LayoutTextTest( data ) )
1949   {
1950     tet_result(TET_FAIL);
1951   }
1952
1953   tet_result(TET_PASS);
1954   END_TEST;
1955 }
1956
1957 int UtcDaliTextUpdateLayout02(void)
1958 {
1959   ToolkitTestApplication application;
1960   tet_infoline(" UtcDaliTextUpdateLayout02");
1961
1962   // Layout some lines of bidirectional text. Update the paragraphs at the middle.
1963
1964   const std::string fontLatin( "TizenSans" );
1965   const std::string fontHebrew( "TizenSansHebrew" );
1966   const std::string fontArabic( "TizenSansArabic" );
1967
1968   // Set a known font description
1969   FontDescriptionRun fontDescriptionRun01;
1970   fontDescriptionRun01.characterRun.characterIndex = 0u;
1971   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
1972   fontDescriptionRun01.familyLength = fontLatin.size();
1973   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
1974   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
1975   fontDescriptionRun01.familyDefined = true;
1976   fontDescriptionRun01.weightDefined = false;
1977   fontDescriptionRun01.widthDefined = false;
1978   fontDescriptionRun01.slantDefined = false;
1979   fontDescriptionRun01.sizeDefined = false;
1980
1981   // Set a known font description
1982   FontDescriptionRun fontDescriptionRun02;
1983   fontDescriptionRun02.characterRun.characterIndex = 17u;
1984   fontDescriptionRun02.characterRun.numberOfCharacters = 11u;
1985   fontDescriptionRun02.familyLength = fontHebrew.size();
1986   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
1987   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
1988   fontDescriptionRun02.familyDefined = true;
1989   fontDescriptionRun02.weightDefined = false;
1990   fontDescriptionRun02.widthDefined = false;
1991   fontDescriptionRun02.slantDefined = false;
1992   fontDescriptionRun02.sizeDefined = false;
1993
1994   // Set a known font description
1995   FontDescriptionRun fontDescriptionRun03;
1996   fontDescriptionRun03.characterRun.characterIndex = 28u;
1997   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
1998   fontDescriptionRun03.familyLength = fontArabic.size();
1999   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
2000   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
2001   fontDescriptionRun03.familyDefined = true;
2002   fontDescriptionRun03.weightDefined = false;
2003   fontDescriptionRun03.widthDefined = false;
2004   fontDescriptionRun03.slantDefined = false;
2005   fontDescriptionRun03.sizeDefined = false;
2006
2007   // Set a known font description
2008   FontDescriptionRun fontDescriptionRun04;
2009   fontDescriptionRun04.characterRun.characterIndex = 42u;
2010   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
2011   fontDescriptionRun04.familyLength = fontLatin.size();
2012   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
2013   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
2014   fontDescriptionRun04.familyDefined = true;
2015   fontDescriptionRun04.weightDefined = false;
2016   fontDescriptionRun04.widthDefined = false;
2017   fontDescriptionRun04.slantDefined = false;
2018   fontDescriptionRun04.sizeDefined = false;
2019
2020   // Set a known font description
2021   FontDescriptionRun fontDescriptionRun05;
2022   fontDescriptionRun05.characterRun.characterIndex = 54u;
2023   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
2024   fontDescriptionRun05.familyLength = fontHebrew.size();
2025   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
2026   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
2027   fontDescriptionRun05.familyDefined = true;
2028   fontDescriptionRun05.weightDefined = false;
2029   fontDescriptionRun05.widthDefined = false;
2030   fontDescriptionRun05.slantDefined = false;
2031   fontDescriptionRun05.sizeDefined = false;
2032
2033   // Set a known font description
2034   FontDescriptionRun fontDescriptionRun06;
2035   fontDescriptionRun06.characterRun.characterIndex = 64u;
2036   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2037   fontDescriptionRun06.familyLength = fontHebrew.size();
2038   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
2039   memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
2040   fontDescriptionRun06.familyDefined = true;
2041   fontDescriptionRun06.weightDefined = false;
2042   fontDescriptionRun06.widthDefined = false;
2043   fontDescriptionRun06.slantDefined = false;
2044   fontDescriptionRun06.sizeDefined = false;
2045
2046   // Set a known font description
2047   FontDescriptionRun fontDescriptionRun07;
2048   fontDescriptionRun07.characterRun.characterIndex = 74u;
2049   fontDescriptionRun07.characterRun.numberOfCharacters = 18u;
2050   fontDescriptionRun07.familyLength = fontLatin.size();
2051   fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
2052   memcpy( fontDescriptionRun07.familyName, fontLatin.c_str(), fontDescriptionRun07.familyLength );
2053   fontDescriptionRun07.familyDefined = true;
2054   fontDescriptionRun07.weightDefined = false;
2055   fontDescriptionRun07.widthDefined = false;
2056   fontDescriptionRun07.slantDefined = false;
2057   fontDescriptionRun07.sizeDefined = false;
2058
2059   // Set a known font description
2060   FontDescriptionRun fontDescriptionRun08;
2061   fontDescriptionRun08.characterRun.characterIndex = 92u;
2062   fontDescriptionRun08.characterRun.numberOfCharacters = 12u;
2063   fontDescriptionRun08.familyLength = fontLatin.size();
2064   fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
2065   memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
2066   fontDescriptionRun08.familyDefined = true;
2067   fontDescriptionRun08.weightDefined = false;
2068   fontDescriptionRun08.widthDefined = false;
2069   fontDescriptionRun08.slantDefined = false;
2070   fontDescriptionRun08.sizeDefined = false;
2071
2072   // Set a known font description
2073   FontDescriptionRun fontDescriptionRun09;
2074   fontDescriptionRun09.characterRun.characterIndex = 104u;
2075   fontDescriptionRun09.characterRun.numberOfCharacters = 14u;
2076   fontDescriptionRun09.familyLength = fontArabic.size();
2077   fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
2078   memcpy( fontDescriptionRun09.familyName, fontArabic.c_str(), fontDescriptionRun09.familyLength );
2079   fontDescriptionRun09.familyDefined = true;
2080   fontDescriptionRun09.weightDefined = false;
2081   fontDescriptionRun09.widthDefined = false;
2082   fontDescriptionRun09.slantDefined = false;
2083   fontDescriptionRun09.sizeDefined = false;
2084
2085   // Set a known font description
2086   FontDescriptionRun fontDescriptionRun10;
2087   fontDescriptionRun10.characterRun.characterIndex = 118u;
2088   fontDescriptionRun10.characterRun.numberOfCharacters = 10u;
2089   fontDescriptionRun10.familyLength = fontHebrew.size();
2090   fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
2091   memcpy( fontDescriptionRun10.familyName, fontHebrew.c_str(), fontDescriptionRun10.familyLength );
2092   fontDescriptionRun10.familyDefined = true;
2093   fontDescriptionRun10.weightDefined = false;
2094   fontDescriptionRun10.widthDefined = false;
2095   fontDescriptionRun10.slantDefined = false;
2096   fontDescriptionRun10.sizeDefined = false;
2097
2098   // Set a known font description
2099   FontDescriptionRun fontDescriptionRun11;
2100   fontDescriptionRun11.characterRun.characterIndex = 128u;
2101   fontDescriptionRun11.characterRun.numberOfCharacters = 17u;
2102   fontDescriptionRun11.familyLength = fontLatin.size();
2103   fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
2104   memcpy( fontDescriptionRun11.familyName, fontLatin.c_str(), fontDescriptionRun11.familyLength );
2105   fontDescriptionRun11.familyDefined = true;
2106   fontDescriptionRun11.weightDefined = false;
2107   fontDescriptionRun11.widthDefined = false;
2108   fontDescriptionRun11.slantDefined = false;
2109   fontDescriptionRun11.sizeDefined = false;
2110
2111   // Set a known font description
2112   FontDescriptionRun fontDescriptionRun12;
2113   fontDescriptionRun12.characterRun.characterIndex = 145u;
2114   fontDescriptionRun12.characterRun.numberOfCharacters = 11u;
2115   fontDescriptionRun12.familyLength = fontHebrew.size();
2116   fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
2117   memcpy( fontDescriptionRun12.familyName, fontHebrew.c_str(), fontDescriptionRun12.familyLength );
2118   fontDescriptionRun12.familyDefined = true;
2119   fontDescriptionRun12.weightDefined = false;
2120   fontDescriptionRun12.widthDefined = false;
2121   fontDescriptionRun12.slantDefined = false;
2122   fontDescriptionRun12.sizeDefined = false;
2123
2124   // Set a known font description
2125   FontDescriptionRun fontDescriptionRun13;
2126   fontDescriptionRun13.characterRun.characterIndex = 156u;
2127   fontDescriptionRun13.characterRun.numberOfCharacters = 10u;
2128   fontDescriptionRun13.familyLength = fontHebrew.size();
2129   fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
2130   memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
2131   fontDescriptionRun13.familyDefined = true;
2132   fontDescriptionRun13.weightDefined = false;
2133   fontDescriptionRun13.widthDefined = false;
2134   fontDescriptionRun13.slantDefined = false;
2135   fontDescriptionRun13.sizeDefined = false;
2136
2137   // Set a known font description
2138   FontDescriptionRun fontDescriptionRun14;
2139   fontDescriptionRun14.characterRun.characterIndex = 166u;
2140   fontDescriptionRun14.characterRun.numberOfCharacters = 12u;
2141   fontDescriptionRun14.familyLength = fontLatin.size();
2142   fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
2143   memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
2144   fontDescriptionRun14.familyDefined = true;
2145   fontDescriptionRun14.weightDefined = false;
2146   fontDescriptionRun14.widthDefined = false;
2147   fontDescriptionRun14.slantDefined = false;
2148   fontDescriptionRun14.sizeDefined = false;
2149
2150   // Set a known font description
2151   FontDescriptionRun fontDescriptionRun15;
2152   fontDescriptionRun15.characterRun.characterIndex = 178u;
2153   fontDescriptionRun15.characterRun.numberOfCharacters = 14u;
2154   fontDescriptionRun15.familyLength = fontArabic.size();
2155   fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
2156   memcpy( fontDescriptionRun15.familyName, fontArabic.c_str(), fontDescriptionRun15.familyLength );
2157   fontDescriptionRun15.familyDefined = true;
2158   fontDescriptionRun15.weightDefined = false;
2159   fontDescriptionRun15.widthDefined = false;
2160   fontDescriptionRun15.slantDefined = false;
2161   fontDescriptionRun15.sizeDefined = false;
2162
2163   Vector<FontDescriptionRun> fontDescriptionRuns;
2164   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
2165   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
2166   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
2167   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
2168   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
2169   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
2170   fontDescriptionRuns.PushBack( fontDescriptionRun07 );
2171   fontDescriptionRuns.PushBack( fontDescriptionRun08 );
2172   fontDescriptionRuns.PushBack( fontDescriptionRun09 );
2173   fontDescriptionRuns.PushBack( fontDescriptionRun10 );
2174   fontDescriptionRuns.PushBack( fontDescriptionRun11 );
2175   fontDescriptionRuns.PushBack( fontDescriptionRun12 );
2176   fontDescriptionRuns.PushBack( fontDescriptionRun13 );
2177   fontDescriptionRuns.PushBack( fontDescriptionRun14 );
2178   fontDescriptionRuns.PushBack( fontDescriptionRun15 );
2179   Size textArea(100.f, 300.f);
2180   Size layoutSize(92.f, 380.f);
2181   float positions[] =
2182   {
2183     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,
2184     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,
2185     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 32.f, -2.f, 35.f, -11.f,
2186     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,
2187     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,
2188     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2189     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,
2190     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.f, -0.f,
2191     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -11.f,
2192     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.f, -0.f,
2193     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,
2194     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2195     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 41.f, -9.f, 52.f, -9.f, 62.f, -9.f, 68.f, -13.f, 71.f, -13.f, 80.f, -0.f,
2196     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 45.f, -10.f, 56.f, -13.f, 63.f, -10.f, 68.f, -10.f, 76.f, -0.f,
2197     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 32.f, -2.f, 35.f, -11.f,
2198     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,
2199     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.f, -0.f,
2200     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,
2201   };
2202   struct LineRun line01 =
2203   {
2204     { 0u, 12u },
2205     { 0u, 12u },
2206     81.f,
2207     15.f,
2208     -5.f,
2209     3.f,
2210     0.f,
2211     false,
2212     false
2213   };
2214   struct LineRun line02 =
2215   {
2216     { 12u, 10u },
2217     { 12u, 10u },
2218     76.f,
2219     15.f,
2220     -5.f,
2221     4.f,
2222     0.f,
2223     false,
2224     false
2225   };
2226   struct LineRun line03 =
2227   {
2228     { 22u, 6u },
2229     { 22u, 6u },
2230     36.f,
2231     15.f,
2232     -5.f,
2233     0.f,
2234     0.f,
2235     false,
2236     false
2237   };
2238   struct LineRun line04 =
2239   {
2240     { 28u, 20u },
2241     { 28u, 20u },
2242     92.f,
2243     15.f,
2244     -5.f,
2245     5.f,
2246     0.f,
2247     false,
2248     false
2249   };
2250   struct LineRun line05 =
2251   {
2252     { 48u, 11u },
2253     { 48u, 11u },
2254     76.f,
2255     15.f,
2256     -5.f,
2257     4.f,
2258     0.f,
2259     false,
2260     false
2261   };
2262   struct LineRun line06 =
2263   {
2264     { 59u, 5u },
2265     { 59u, 5u },
2266     31.f,
2267     15.f,
2268     -5.f,
2269     0.f,
2270     0.f,
2271     false,
2272     false
2273   };
2274   struct LineRun line07 =
2275   {
2276     { 64u, 10u },
2277     { 64u, 10u },
2278     67.f,
2279     15.f,
2280     -5.f,
2281     4.f,
2282     0.f,
2283     false,
2284     false
2285   };
2286   struct LineRun line08 =
2287   {
2288     { 74u, 12u },
2289     { 74u, 12u },
2290     80.f,
2291     15.f,
2292     -5.f,
2293     4.f,
2294     0.f,
2295     false,
2296     false
2297   };
2298   struct LineRun line09 =
2299   {
2300     { 86u, 6u },
2301     { 86u, 6u },
2302     43.f,
2303     15.f,
2304     -5.f,
2305     0.f,
2306     0.f,
2307     false,
2308     false
2309   };
2310   struct LineRun line10 =
2311   {
2312     { 92u, 12u },
2313     { 92u, 12u },
2314     79.f,
2315     15.f,
2316     -5.f,
2317     5.f,
2318     0.f,
2319     false,
2320     false
2321   };
2322   struct LineRun line11 =
2323   {
2324     { 104u, 19u },
2325     { 104u, 19u },
2326     90.f,
2327     15.f,
2328     -5.f,
2329     4.f,
2330     0.f,
2331     false,
2332     false
2333   };
2334   struct LineRun line12 =
2335   {
2336     { 123u, 5u },
2337     { 123u, 5u },
2338     31.f,
2339     15.f,
2340     -5.f,
2341     0.f,
2342     0.f,
2343     false,
2344     false
2345   };
2346   struct LineRun line13 =
2347   {
2348     { 128u, 12u },
2349     { 128u, 12u },
2350     82.f,
2351     15.f,
2352     -5.f,
2353     4.f,
2354     0.f,
2355     false,
2356     false
2357   };
2358   struct LineRun line14 =
2359   {
2360     { 140u, 10u },
2361     { 140u, 10u },
2362     77.f,
2363     15.f,
2364     -5.f,
2365     4.f,
2366     0.f,
2367     false,
2368     false
2369   };
2370   struct LineRun line15 =
2371   {
2372     { 150u, 6u },
2373     { 150u, 6u },
2374     36.f,
2375     15.f,
2376     -5.f,
2377     0.f,
2378     0.f,
2379     false,
2380     false
2381   };
2382   struct LineRun line16 =
2383   {
2384     { 156u, 10u },
2385     { 156u, 10u },
2386     67.f,
2387     15.f,
2388     -5.f,
2389     4.f,
2390     0.f,
2391     false,
2392     false
2393   };
2394   struct LineRun line17 =
2395   {
2396     { 166u, 12u },
2397     { 166u, 12u },
2398     80.f,
2399     15.f,
2400     -5.f,
2401     4.f,
2402     0.f,
2403     false,
2404     false
2405   };
2406   struct LineRun line18 =
2407   {
2408     { 178u, 14u },
2409     { 178u, 14u },
2410     55.f,
2411     15.f,
2412     -5.f,
2413     0.f,
2414     0.f,
2415     false,
2416     false
2417   };
2418   struct LineRun line19 =
2419   {
2420     { 192u, 0u },
2421     { 192u, 0u },
2422     0.f,
2423     15.f,
2424     -5.f,
2425     0.f,
2426     0.f,
2427     false,
2428     false
2429   };
2430   Vector<LineRun> lines;
2431   lines.PushBack( line01 );
2432   lines.PushBack( line02 );
2433   lines.PushBack( line03 );
2434   lines.PushBack( line04 );
2435   lines.PushBack( line05 );
2436   lines.PushBack( line06 );
2437   lines.PushBack( line07 );
2438   lines.PushBack( line08 );
2439   lines.PushBack( line09 );
2440   lines.PushBack( line10 );
2441   lines.PushBack( line11 );
2442   lines.PushBack( line12 );
2443   lines.PushBack( line13 );
2444   lines.PushBack( line14 );
2445   lines.PushBack( line15 );
2446   lines.PushBack( line16 );
2447   lines.PushBack( line17 );
2448   lines.PushBack( line18 );
2449   lines.PushBack( line19 );
2450
2451   LayoutTextData data =
2452   {
2453     "Layout bidirectional text.",
2454     "Hello world demo שלום עולם.\n"
2455     "مرحبا بالعالم hello world שלום עולם\n"
2456     "שלום עולם hello world demo.\n"
2457     "hello world مرحبا بالعالم שלום עולם\n"
2458     "Hello world demo שלום עולם.\n"
2459     "שלום עולם hello world مرحبا بالعالم\n",
2460     textArea,
2461     15u,
2462     fontDescriptionRuns.Begin(),
2463     layoutSize,
2464     192u,
2465     positions,
2466     19u,
2467     lines.Begin(),
2468     LayoutEngine::MULTI_LINE_BOX,
2469     64u,
2470     64u,
2471     false,
2472     true
2473   };
2474
2475   if( !LayoutTextTest( data ) )
2476   {
2477     tet_result(TET_FAIL);
2478   }
2479
2480   tet_result(TET_PASS);
2481   END_TEST;
2482 }
2483
2484 int UtcDaliTextUpdateLayout03(void)
2485 {
2486   ToolkitTestApplication application;
2487   tet_infoline(" UtcDaliTextUpdateLayout03");
2488
2489   // Layout some lines of bidirectional text. Update the paragraphs at the middle.
2490
2491   const std::string fontLatin( "TizenSans" );
2492   const std::string fontHebrew( "TizenSansHebrew" );
2493   const std::string fontArabic( "TizenSansArabic" );
2494
2495   // Set a known font description
2496   FontDescriptionRun fontDescriptionRun01;
2497   fontDescriptionRun01.characterRun.characterIndex = 0u;
2498   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
2499   fontDescriptionRun01.familyLength = fontLatin.size();
2500   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
2501   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
2502   fontDescriptionRun01.familyDefined = true;
2503   fontDescriptionRun01.weightDefined = false;
2504   fontDescriptionRun01.widthDefined = false;
2505   fontDescriptionRun01.slantDefined = false;
2506   fontDescriptionRun01.sizeDefined = false;
2507
2508   // Set a known font description
2509   FontDescriptionRun fontDescriptionRun02;
2510   fontDescriptionRun02.characterRun.characterIndex = 17u;
2511   fontDescriptionRun02.characterRun.numberOfCharacters = 11u;
2512   fontDescriptionRun02.familyLength = fontHebrew.size();
2513   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
2514   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
2515   fontDescriptionRun02.familyDefined = true;
2516   fontDescriptionRun02.weightDefined = false;
2517   fontDescriptionRun02.widthDefined = false;
2518   fontDescriptionRun02.slantDefined = false;
2519   fontDescriptionRun02.sizeDefined = false;
2520
2521   // Set a known font description
2522   FontDescriptionRun fontDescriptionRun03;
2523   fontDescriptionRun03.characterRun.characterIndex = 28u;
2524   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
2525   fontDescriptionRun03.familyLength = fontArabic.size();
2526   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
2527   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
2528   fontDescriptionRun03.familyDefined = true;
2529   fontDescriptionRun03.weightDefined = false;
2530   fontDescriptionRun03.widthDefined = false;
2531   fontDescriptionRun03.slantDefined = false;
2532   fontDescriptionRun03.sizeDefined = false;
2533
2534   // Set a known font description
2535   FontDescriptionRun fontDescriptionRun04;
2536   fontDescriptionRun04.characterRun.characterIndex = 42u;
2537   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
2538   fontDescriptionRun04.familyLength = fontLatin.size();
2539   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
2540   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
2541   fontDescriptionRun04.familyDefined = true;
2542   fontDescriptionRun04.weightDefined = false;
2543   fontDescriptionRun04.widthDefined = false;
2544   fontDescriptionRun04.slantDefined = false;
2545   fontDescriptionRun04.sizeDefined = false;
2546
2547   // Set a known font description
2548   FontDescriptionRun fontDescriptionRun05;
2549   fontDescriptionRun05.characterRun.characterIndex = 54u;
2550   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
2551   fontDescriptionRun05.familyLength = fontHebrew.size();
2552   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
2553   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
2554   fontDescriptionRun05.familyDefined = true;
2555   fontDescriptionRun05.weightDefined = false;
2556   fontDescriptionRun05.widthDefined = false;
2557   fontDescriptionRun05.slantDefined = false;
2558   fontDescriptionRun05.sizeDefined = false;
2559
2560   // Set a known font description
2561   FontDescriptionRun fontDescriptionRun06;
2562   fontDescriptionRun06.characterRun.characterIndex = 64u;
2563   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2564   fontDescriptionRun06.familyLength = fontHebrew.size();
2565   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
2566   memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
2567   fontDescriptionRun06.familyDefined = true;
2568   fontDescriptionRun06.weightDefined = false;
2569   fontDescriptionRun06.widthDefined = false;
2570   fontDescriptionRun06.slantDefined = false;
2571   fontDescriptionRun06.sizeDefined = false;
2572
2573   // Set a known font description
2574   FontDescriptionRun fontDescriptionRun07;
2575   fontDescriptionRun07.characterRun.characterIndex = 74u;
2576   fontDescriptionRun07.characterRun.numberOfCharacters = 18u;
2577   fontDescriptionRun07.familyLength = fontLatin.size();
2578   fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
2579   memcpy( fontDescriptionRun07.familyName, fontLatin.c_str(), fontDescriptionRun07.familyLength );
2580   fontDescriptionRun07.familyDefined = true;
2581   fontDescriptionRun07.weightDefined = false;
2582   fontDescriptionRun07.widthDefined = false;
2583   fontDescriptionRun07.slantDefined = false;
2584   fontDescriptionRun07.sizeDefined = false;
2585
2586   // Set a known font description
2587   FontDescriptionRun fontDescriptionRun08;
2588   fontDescriptionRun08.characterRun.characterIndex = 92u;
2589   fontDescriptionRun08.characterRun.numberOfCharacters = 12u;
2590   fontDescriptionRun08.familyLength = fontLatin.size();
2591   fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
2592   memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
2593   fontDescriptionRun08.familyDefined = true;
2594   fontDescriptionRun08.weightDefined = false;
2595   fontDescriptionRun08.widthDefined = false;
2596   fontDescriptionRun08.slantDefined = false;
2597   fontDescriptionRun08.sizeDefined = false;
2598
2599   // Set a known font description
2600   FontDescriptionRun fontDescriptionRun09;
2601   fontDescriptionRun09.characterRun.characterIndex = 104u;
2602   fontDescriptionRun09.characterRun.numberOfCharacters = 14u;
2603   fontDescriptionRun09.familyLength = fontArabic.size();
2604   fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
2605   memcpy( fontDescriptionRun09.familyName, fontArabic.c_str(), fontDescriptionRun09.familyLength );
2606   fontDescriptionRun09.familyDefined = true;
2607   fontDescriptionRun09.weightDefined = false;
2608   fontDescriptionRun09.widthDefined = false;
2609   fontDescriptionRun09.slantDefined = false;
2610   fontDescriptionRun09.sizeDefined = false;
2611
2612   // Set a known font description
2613   FontDescriptionRun fontDescriptionRun10;
2614   fontDescriptionRun10.characterRun.characterIndex = 118u;
2615   fontDescriptionRun10.characterRun.numberOfCharacters = 10u;
2616   fontDescriptionRun10.familyLength = fontHebrew.size();
2617   fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
2618   memcpy( fontDescriptionRun10.familyName, fontHebrew.c_str(), fontDescriptionRun10.familyLength );
2619   fontDescriptionRun10.familyDefined = true;
2620   fontDescriptionRun10.weightDefined = false;
2621   fontDescriptionRun10.widthDefined = false;
2622   fontDescriptionRun10.slantDefined = false;
2623   fontDescriptionRun10.sizeDefined = false;
2624
2625   // Set a known font description
2626   FontDescriptionRun fontDescriptionRun11;
2627   fontDescriptionRun11.characterRun.characterIndex = 128u;
2628   fontDescriptionRun11.characterRun.numberOfCharacters = 17u;
2629   fontDescriptionRun11.familyLength = fontLatin.size();
2630   fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
2631   memcpy( fontDescriptionRun11.familyName, fontLatin.c_str(), fontDescriptionRun11.familyLength );
2632   fontDescriptionRun11.familyDefined = true;
2633   fontDescriptionRun11.weightDefined = false;
2634   fontDescriptionRun11.widthDefined = false;
2635   fontDescriptionRun11.slantDefined = false;
2636   fontDescriptionRun11.sizeDefined = false;
2637
2638   // Set a known font description
2639   FontDescriptionRun fontDescriptionRun12;
2640   fontDescriptionRun12.characterRun.characterIndex = 145u;
2641   fontDescriptionRun12.characterRun.numberOfCharacters = 11u;
2642   fontDescriptionRun12.familyLength = fontHebrew.size();
2643   fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
2644   memcpy( fontDescriptionRun12.familyName, fontHebrew.c_str(), fontDescriptionRun12.familyLength );
2645   fontDescriptionRun12.familyDefined = true;
2646   fontDescriptionRun12.weightDefined = false;
2647   fontDescriptionRun12.widthDefined = false;
2648   fontDescriptionRun12.slantDefined = false;
2649   fontDescriptionRun12.sizeDefined = false;
2650
2651   // Set a known font description
2652   FontDescriptionRun fontDescriptionRun13;
2653   fontDescriptionRun13.characterRun.characterIndex = 156u;
2654   fontDescriptionRun13.characterRun.numberOfCharacters = 10u;
2655   fontDescriptionRun13.familyLength = fontHebrew.size();
2656   fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
2657   memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
2658   fontDescriptionRun13.familyDefined = true;
2659   fontDescriptionRun13.weightDefined = false;
2660   fontDescriptionRun13.widthDefined = false;
2661   fontDescriptionRun13.slantDefined = false;
2662   fontDescriptionRun13.sizeDefined = false;
2663
2664   // Set a known font description
2665   FontDescriptionRun fontDescriptionRun14;
2666   fontDescriptionRun14.characterRun.characterIndex = 166u;
2667   fontDescriptionRun14.characterRun.numberOfCharacters = 12u;
2668   fontDescriptionRun14.familyLength = fontLatin.size();
2669   fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
2670   memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
2671   fontDescriptionRun14.familyDefined = true;
2672   fontDescriptionRun14.weightDefined = false;
2673   fontDescriptionRun14.widthDefined = false;
2674   fontDescriptionRun14.slantDefined = false;
2675   fontDescriptionRun14.sizeDefined = false;
2676
2677   // Set a known font description
2678   FontDescriptionRun fontDescriptionRun15;
2679   fontDescriptionRun15.characterRun.characterIndex = 178u;
2680   fontDescriptionRun15.characterRun.numberOfCharacters = 14u;
2681   fontDescriptionRun15.familyLength = fontArabic.size();
2682   fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
2683   memcpy( fontDescriptionRun15.familyName, fontArabic.c_str(), fontDescriptionRun15.familyLength );
2684   fontDescriptionRun15.familyDefined = true;
2685   fontDescriptionRun15.weightDefined = false;
2686   fontDescriptionRun15.widthDefined = false;
2687   fontDescriptionRun15.slantDefined = false;
2688   fontDescriptionRun15.sizeDefined = false;
2689
2690   Vector<FontDescriptionRun> fontDescriptionRuns;
2691   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
2692   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
2693   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
2694   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
2695   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
2696   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
2697   fontDescriptionRuns.PushBack( fontDescriptionRun07 );
2698   fontDescriptionRuns.PushBack( fontDescriptionRun08 );
2699   fontDescriptionRuns.PushBack( fontDescriptionRun09 );
2700   fontDescriptionRuns.PushBack( fontDescriptionRun10 );
2701   fontDescriptionRuns.PushBack( fontDescriptionRun11 );
2702   fontDescriptionRuns.PushBack( fontDescriptionRun12 );
2703   fontDescriptionRuns.PushBack( fontDescriptionRun13 );
2704   fontDescriptionRuns.PushBack( fontDescriptionRun14 );
2705   fontDescriptionRuns.PushBack( fontDescriptionRun15 );
2706   Size textArea(100.f, 300.f);
2707   Size layoutSize(92.f, 380.f);
2708   float positions[] =
2709   {
2710     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,
2711     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,
2712     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 32.f, -2.f, 35.f, -11.f,
2713     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,
2714     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,
2715     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2716     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,
2717     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.f, -0.f,
2718     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -11.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, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.f, -0.f,
2720     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,
2721     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2722     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 41.f, -9.f, 52.f, -9.f, 62.f, -9.f, 68.f, -13.f, 71.f, -13.f, 80.f, -0.f,
2723     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 45.f, -10.f, 56.f, -13.f, 63.f, -10.f, 68.f, -10.f, 76.f, -0.f,
2724     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 32.f, -2.f, 35.f, -11.f,
2725     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,
2726     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.f, -0.f,
2727     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,
2728   };
2729   struct LineRun line01 =
2730   {
2731     { 0u, 12u },
2732     { 0u, 12u },
2733     81.f,
2734     15.f,
2735     -5.f,
2736     3.f,
2737     0.f,
2738     false,
2739     false
2740   };
2741   struct LineRun line02 =
2742   {
2743     { 12u, 10u },
2744     { 12u, 10u },
2745     76.f,
2746     15.f,
2747     -5.f,
2748     4.f,
2749     0.f,
2750     false,
2751     false
2752   };
2753   struct LineRun line03 =
2754   {
2755     { 22u, 6u },
2756     { 22u, 6u },
2757     36.f,
2758     15.f,
2759     -5.f,
2760     0.f,
2761     0.f,
2762     false,
2763     false
2764   };
2765   struct LineRun line04 =
2766   {
2767     { 28u, 20u },
2768     { 28u, 20u },
2769     92.f,
2770     15.f,
2771     -5.f,
2772     5.f,
2773     0.f,
2774     false,
2775     false
2776   };
2777   struct LineRun line05 =
2778   {
2779     { 48u, 11u },
2780     { 48u, 11u },
2781     76.f,
2782     15.f,
2783     -5.f,
2784     4.f,
2785     0.f,
2786     false,
2787     false
2788   };
2789   struct LineRun line06 =
2790   {
2791     { 59u, 5u },
2792     { 59u, 5u },
2793     31.f,
2794     15.f,
2795     -5.f,
2796     0.f,
2797     0.f,
2798     false,
2799     false
2800   };
2801   struct LineRun line07 =
2802   {
2803     { 64u, 10u },
2804     { 64u, 10u },
2805     67.f,
2806     15.f,
2807     -5.f,
2808     4.f,
2809     0.f,
2810     false,
2811     false
2812   };
2813   struct LineRun line08 =
2814   {
2815     { 74u, 12u },
2816     { 74u, 12u },
2817     80.f,
2818     15.f,
2819     -5.f,
2820     4.f,
2821     0.f,
2822     false,
2823     false
2824   };
2825   struct LineRun line09 =
2826   {
2827     { 86u, 6u },
2828     { 86u, 6u },
2829     43.f,
2830     15.f,
2831     -5.f,
2832     0.f,
2833     0.f,
2834     false,
2835     false
2836   };
2837   struct LineRun line10 =
2838   {
2839     { 92u, 12u },
2840     { 92u, 12u },
2841     79.f,
2842     15.f,
2843     -5.f,
2844     5.f,
2845     0.f,
2846     false,
2847     false
2848   };
2849   struct LineRun line11 =
2850   {
2851     { 104u, 19u },
2852     { 104u, 19u },
2853     90.f,
2854     15.f,
2855     -5.f,
2856     4.f,
2857     0.f,
2858     false,
2859     false
2860   };
2861   struct LineRun line12 =
2862   {
2863     { 123u, 5u },
2864     { 123u, 5u },
2865     31.f,
2866     15.f,
2867     -5.f,
2868     0.f,
2869     0.f,
2870     false,
2871     false
2872   };
2873   struct LineRun line13 =
2874   {
2875     { 128u, 12u },
2876     { 128u, 12u },
2877     82.f,
2878     15.f,
2879     -5.f,
2880     4.f,
2881     0.f,
2882     false,
2883     false
2884   };
2885   struct LineRun line14 =
2886   {
2887     { 140u, 10u },
2888     { 140u, 10u },
2889     77.f,
2890     15.f,
2891     -5.f,
2892     4.f,
2893     0.f,
2894     false,
2895     false
2896   };
2897   struct LineRun line15 =
2898   {
2899     { 150u, 6u },
2900     { 150u, 6u },
2901     36.f,
2902     15.f,
2903     -5.f,
2904     0.f,
2905     0.f,
2906     false,
2907     false
2908   };
2909   struct LineRun line16 =
2910   {
2911     { 156u, 10u },
2912     { 156u, 10u },
2913     67.f,
2914     15.f,
2915     -5.f,
2916     4.f,
2917     0.f,
2918     false,
2919     false
2920   };
2921   struct LineRun line17 =
2922   {
2923     { 166u, 12u },
2924     { 166u, 12u },
2925     80.f,
2926     15.f,
2927     -5.f,
2928     4.f,
2929     0.f,
2930     false,
2931     false
2932   };
2933   struct LineRun line18 =
2934   {
2935     { 178u, 14u },
2936     { 178u, 14u },
2937     55.f,
2938     15.f,
2939     -5.f,
2940     0.f,
2941     0.f,
2942     false,
2943     false
2944   };
2945   struct LineRun line19 =
2946   {
2947     { 192u, 0u },
2948     { 192u, 0u },
2949     0.f,
2950     15.f,
2951     -5.f,
2952     0.f,
2953     0.f,
2954     false,
2955     false
2956   };
2957
2958   Vector<LineRun> lines;
2959   lines.PushBack( line01 );
2960   lines.PushBack( line02 );
2961   lines.PushBack( line03 );
2962   lines.PushBack( line04 );
2963   lines.PushBack( line05 );
2964   lines.PushBack( line06 );
2965   lines.PushBack( line07 );
2966   lines.PushBack( line08 );
2967   lines.PushBack( line09 );
2968   lines.PushBack( line10 );
2969   lines.PushBack( line11 );
2970   lines.PushBack( line12 );
2971   lines.PushBack( line13 );
2972   lines.PushBack( line14 );
2973   lines.PushBack( line15 );
2974   lines.PushBack( line16 );
2975   lines.PushBack( line17 );
2976   lines.PushBack( line18 );
2977   lines.PushBack( line19 );
2978
2979   LayoutTextData data =
2980   {
2981     "Layout bidirectional text.",
2982     "Hello world demo שלום עולם.\n"
2983     "مرحبا بالعالم hello world שלום עולם\n"
2984     "שלום עולם hello world demo.\n"
2985     "hello world مرحبا بالعالم שלום עולם\n"
2986     "Hello world demo שלום עולם.\n"
2987     "שלום עולם hello world مرحبا بالعالم\n",
2988     textArea,
2989     15u,
2990     fontDescriptionRuns.Begin(),
2991     layoutSize,
2992     192u,
2993     positions,
2994     19u,
2995     lines.Begin(),
2996     LayoutEngine::MULTI_LINE_BOX,
2997     128u,
2998     64u,
2999     false,
3000     true
3001   };
3002
3003   if( !LayoutTextTest( data ) )
3004   {
3005     tet_result(TET_FAIL);
3006   }
3007
3008   tet_result(TET_PASS);
3009   END_TEST;
3010 }
3011
3012 int UtcDaliTextLayoutEllipsis01(void)
3013 {
3014   ToolkitTestApplication application;
3015   tet_infoline(" UtcDaliTextLayoutEllipsis01");
3016
3017   // Layout single-line LTR text with ellipsis.
3018
3019   const std::string fontLatin( "TizenSans" );
3020
3021   // Set a known font description
3022   FontDescriptionRun fontDescriptionRun01;
3023   fontDescriptionRun01.characterRun.characterIndex = 0u;
3024   fontDescriptionRun01.characterRun.numberOfCharacters = 51u;
3025   fontDescriptionRun01.familyLength = fontLatin.size();
3026   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3027   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
3028   fontDescriptionRun01.familyDefined = true;
3029   fontDescriptionRun01.weightDefined = false;
3030   fontDescriptionRun01.widthDefined = false;
3031   fontDescriptionRun01.slantDefined = false;
3032   fontDescriptionRun01.sizeDefined = false;
3033
3034   Vector<FontDescriptionRun> fontDescriptionRuns;
3035   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3036
3037   struct LineRun line01 =
3038   {
3039     { 0u, 13u },
3040     { 0u, 13u },
3041     93.f,
3042     15.f,
3043     -5.f,
3044     0.f,
3045     0.f,
3046     false,
3047     true
3048   };
3049   Vector<LineRun> lines;
3050   lines.PushBack( line01 );
3051
3052   float positions[] =
3053   {
3054     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,
3055   };
3056
3057   Size textArea( 100.f, 50.f );
3058   Size layoutSize( 100.f, 20.f );
3059
3060   LayoutTextData data =
3061   {
3062     "Layout single-line LTR text with ellipsis.",
3063     "Hello world demo hello world demo hello world demo.",
3064     textArea,
3065     1u,
3066     fontDescriptionRuns.Begin(),
3067     layoutSize,
3068     13u,
3069     positions,
3070     1u,
3071     lines.Begin(),
3072     LayoutEngine::SINGLE_LINE_BOX,
3073     0u,
3074     51u,
3075     true,
3076     true
3077   };
3078
3079   if( !LayoutTextTest( data ) )
3080   {
3081     tet_result(TET_FAIL);
3082   }
3083
3084   tet_result(TET_PASS);
3085   END_TEST;
3086 }
3087
3088 int UtcDaliTextLayoutEllipsis02(void)
3089 {
3090   ToolkitTestApplication application;
3091   tet_infoline(" UtcDaliTextLayoutEllipsis02");
3092
3093   // Layout multi-line LTR text with ellipsis.
3094
3095   const std::string fontLatin( "TizenSans" );
3096
3097   // Set a known font description
3098   FontDescriptionRun fontDescriptionRun01;
3099   fontDescriptionRun01.characterRun.characterIndex = 0u;
3100   fontDescriptionRun01.characterRun.numberOfCharacters = 51u;
3101   fontDescriptionRun01.familyLength = fontLatin.size();
3102   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3103   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
3104   fontDescriptionRun01.familyDefined = true;
3105   fontDescriptionRun01.weightDefined = false;
3106   fontDescriptionRun01.widthDefined = false;
3107   fontDescriptionRun01.slantDefined = false;
3108   fontDescriptionRun01.sizeDefined = false;
3109
3110   Vector<FontDescriptionRun> fontDescriptionRuns;
3111   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3112
3113   struct LineRun line01 =
3114   {
3115     { 0u, 12u },
3116     { 0u, 12u },
3117     81.f,
3118     15.f,
3119     -5.f,
3120     3.f,
3121     0.f,
3122     false,
3123     false
3124   };
3125   struct LineRun line02 =
3126   {
3127     { 12u, 12u },
3128     { 12u, 12u },
3129     93.f,
3130     15.f,
3131     -5.f,
3132     0.f,
3133     0.f,
3134     false,
3135     true
3136   };
3137   Vector<LineRun> lines;
3138   lines.PushBack( line01 );
3139   lines.PushBack( line02 );
3140
3141   float positions[] =
3142   {
3143     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,
3144     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -13.f, 53.f, -9.f, 61.f, -13.f, 65.f, -13.f, 68.f, -9.f, 77.f, -0.f, 81.f, -9.f,
3145   };
3146
3147   Size textArea( 100.f, 50.f );
3148   Size layoutSize( 100.f, 60.f );
3149
3150   LayoutTextData data =
3151   {
3152     "Layout multi-line LTR text with ellipsis.",
3153     "Hello world demo hello world demo hello world demo.",
3154     textArea,
3155     1u,
3156     fontDescriptionRuns.Begin(),
3157     layoutSize,
3158     24u,
3159     positions,
3160     2u,
3161     lines.Begin(),
3162     LayoutEngine::MULTI_LINE_BOX,
3163     0u,
3164     51u,
3165     true,
3166     true
3167   };
3168
3169   if( !LayoutTextTest( data ) )
3170   {
3171     tet_result(TET_FAIL);
3172   }
3173
3174   tet_result(TET_PASS);
3175   END_TEST;
3176 }
3177
3178 int UtcDaliTextLayoutEllipsis03(void)
3179 {
3180   ToolkitTestApplication application;
3181   tet_infoline(" UtcDaliTextLayoutEllipsis03");
3182
3183   // Layout single-line RTL text with ellipsis.
3184
3185   const std::string fontHebrew( "TizenSansHebrew" );
3186   const std::string fontArabic( "TizenSansArabic" );
3187
3188   // Set a known font description
3189   FontDescriptionRun fontDescriptionRun01;
3190   fontDescriptionRun01.characterRun.characterIndex = 0u;
3191   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
3192   fontDescriptionRun01.familyLength = fontHebrew.size();
3193   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3194   memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength );
3195   fontDescriptionRun01.familyDefined = true;
3196   fontDescriptionRun01.weightDefined = false;
3197   fontDescriptionRun01.widthDefined = false;
3198   fontDescriptionRun01.slantDefined = false;
3199   fontDescriptionRun01.sizeDefined = false;
3200
3201   FontDescriptionRun fontDescriptionRun02;
3202   fontDescriptionRun02.characterRun.characterIndex = 10u;
3203   fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
3204   fontDescriptionRun02.familyLength = fontArabic.size();
3205   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
3206   memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength );
3207   fontDescriptionRun02.familyDefined = true;
3208   fontDescriptionRun02.weightDefined = false;
3209   fontDescriptionRun02.widthDefined = false;
3210   fontDescriptionRun02.slantDefined = false;
3211   fontDescriptionRun02.sizeDefined = false;
3212
3213   FontDescriptionRun fontDescriptionRun03;
3214   fontDescriptionRun03.characterRun.characterIndex = 24u;
3215   fontDescriptionRun03.characterRun.numberOfCharacters = 10u;
3216   fontDescriptionRun03.familyLength = fontHebrew.size();
3217   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
3218   memcpy( fontDescriptionRun03.familyName, fontHebrew.c_str(), fontDescriptionRun03.familyLength );
3219   fontDescriptionRun03.familyDefined = true;
3220   fontDescriptionRun03.weightDefined = false;
3221   fontDescriptionRun03.widthDefined = false;
3222   fontDescriptionRun03.slantDefined = false;
3223   fontDescriptionRun03.sizeDefined = false;
3224
3225   FontDescriptionRun fontDescriptionRun04;
3226   fontDescriptionRun04.characterRun.characterIndex = 34u;
3227   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
3228   fontDescriptionRun04.familyLength = fontArabic.size();
3229   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
3230   memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
3231   fontDescriptionRun04.familyDefined = true;
3232   fontDescriptionRun04.weightDefined = false;
3233   fontDescriptionRun04.widthDefined = false;
3234   fontDescriptionRun04.slantDefined = false;
3235   fontDescriptionRun04.sizeDefined = false;
3236
3237   FontDescriptionRun fontDescriptionRun05;
3238   fontDescriptionRun05.characterRun.characterIndex = 48u;
3239   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
3240   fontDescriptionRun05.familyLength = fontHebrew.size();
3241   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
3242   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
3243   fontDescriptionRun05.familyDefined = true;
3244   fontDescriptionRun05.weightDefined = false;
3245   fontDescriptionRun05.widthDefined = false;
3246   fontDescriptionRun05.slantDefined = false;
3247   fontDescriptionRun05.sizeDefined = false;
3248
3249   FontDescriptionRun fontDescriptionRun06;
3250   fontDescriptionRun06.characterRun.characterIndex = 58u;
3251   fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
3252   fontDescriptionRun06.familyLength = fontArabic.size();
3253   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
3254   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
3255   fontDescriptionRun06.familyDefined = true;
3256   fontDescriptionRun06.weightDefined = false;
3257   fontDescriptionRun06.widthDefined = false;
3258   fontDescriptionRun06.slantDefined = false;
3259   fontDescriptionRun06.sizeDefined = false;
3260
3261   Vector<FontDescriptionRun> fontDescriptionRuns;
3262   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3263   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
3264   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
3265   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
3266   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
3267   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
3268
3269   struct LineRun line01 =
3270   {
3271     { 0u, 16u },
3272     { 0u, 16u },
3273     95.f,
3274     15.f,
3275     -5.f,
3276     0.f,
3277     0.f,
3278     false,
3279     true
3280   };
3281   Vector<LineRun> lines;
3282   lines.PushBack( line01 );
3283
3284   float positions[] =
3285   {
3286     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, 69.f, -8.f, 76.f, -6.f, 81.f, -7.f, 87.f, -7.f, 92.f, -11.f, 94.f, -0.f,
3287   };
3288
3289   Size textArea( 100.f, 50.f );
3290   Size layoutSize( 100.f, 20.f );
3291
3292   LayoutTextData data =
3293   {
3294     "Layout single-line RTL text with ellipsis.",
3295     "שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم.",
3296     textArea,
3297     6u,
3298     fontDescriptionRuns.Begin(),
3299     layoutSize,
3300     16u,
3301     positions,
3302     1u,
3303     lines.Begin(),
3304     LayoutEngine::SINGLE_LINE_BOX,
3305     0u,
3306     72u,
3307     true,
3308     true
3309   };
3310
3311   if( !LayoutTextTest( data ) )
3312   {
3313     tet_result(TET_FAIL);
3314   }
3315
3316   tet_result(TET_PASS);
3317   END_TEST;
3318 }
3319
3320 int UtcDaliTextLayoutEllipsis04(void)
3321 {
3322   ToolkitTestApplication application;
3323   tet_infoline(" UtcDaliTextLayoutEllipsis04");
3324
3325   // Layout multi-line RTL text with ellipsis.
3326
3327   const std::string fontHebrew( "TizenSansHebrew" );
3328   const std::string fontArabic( "TizenSansArabic" );
3329
3330   // Set a known font description
3331   FontDescriptionRun fontDescriptionRun01;
3332   fontDescriptionRun01.characterRun.characterIndex = 0u;
3333   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
3334   fontDescriptionRun01.familyLength = fontHebrew.size();
3335   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3336   memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength );
3337   fontDescriptionRun01.familyDefined = true;
3338   fontDescriptionRun01.weightDefined = false;
3339   fontDescriptionRun01.widthDefined = false;
3340   fontDescriptionRun01.slantDefined = false;
3341   fontDescriptionRun01.sizeDefined = false;
3342
3343   FontDescriptionRun fontDescriptionRun02;
3344   fontDescriptionRun02.characterRun.characterIndex = 10u;
3345   fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
3346   fontDescriptionRun02.familyLength = fontArabic.size();
3347   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
3348   memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength );
3349   fontDescriptionRun02.familyDefined = true;
3350   fontDescriptionRun02.weightDefined = false;
3351   fontDescriptionRun02.widthDefined = false;
3352   fontDescriptionRun02.slantDefined = false;
3353   fontDescriptionRun02.sizeDefined = false;
3354
3355   FontDescriptionRun fontDescriptionRun03;
3356   fontDescriptionRun03.characterRun.characterIndex = 24u;
3357   fontDescriptionRun03.characterRun.numberOfCharacters = 10u;
3358   fontDescriptionRun03.familyLength = fontHebrew.size();
3359   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
3360   memcpy( fontDescriptionRun03.familyName, fontHebrew.c_str(), fontDescriptionRun03.familyLength );
3361   fontDescriptionRun03.familyDefined = true;
3362   fontDescriptionRun03.weightDefined = false;
3363   fontDescriptionRun03.widthDefined = false;
3364   fontDescriptionRun03.slantDefined = false;
3365   fontDescriptionRun03.sizeDefined = false;
3366
3367   FontDescriptionRun fontDescriptionRun04;
3368   fontDescriptionRun04.characterRun.characterIndex = 34u;
3369   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
3370   fontDescriptionRun04.familyLength = fontArabic.size();
3371   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
3372   memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
3373   fontDescriptionRun04.familyDefined = true;
3374   fontDescriptionRun04.weightDefined = false;
3375   fontDescriptionRun04.widthDefined = false;
3376   fontDescriptionRun04.slantDefined = false;
3377   fontDescriptionRun04.sizeDefined = false;
3378
3379   FontDescriptionRun fontDescriptionRun05;
3380   fontDescriptionRun05.characterRun.characterIndex = 48u;
3381   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
3382   fontDescriptionRun05.familyLength = fontHebrew.size();
3383   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
3384   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
3385   fontDescriptionRun05.familyDefined = true;
3386   fontDescriptionRun05.weightDefined = false;
3387   fontDescriptionRun05.widthDefined = false;
3388   fontDescriptionRun05.slantDefined = false;
3389   fontDescriptionRun05.sizeDefined = false;
3390
3391   FontDescriptionRun fontDescriptionRun06;
3392   fontDescriptionRun06.characterRun.characterIndex = 58u;
3393   fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
3394   fontDescriptionRun06.familyLength = fontArabic.size();
3395   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
3396   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
3397   fontDescriptionRun06.familyDefined = true;
3398   fontDescriptionRun06.weightDefined = false;
3399   fontDescriptionRun06.widthDefined = false;
3400   fontDescriptionRun06.slantDefined = false;
3401   fontDescriptionRun06.sizeDefined = false;
3402
3403   Vector<FontDescriptionRun> fontDescriptionRuns;
3404   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3405   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
3406   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
3407   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
3408   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
3409   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
3410
3411   struct LineRun line01 =
3412   {
3413     { 0u, 16u },
3414     { 0u, 16u },
3415     96.f,
3416     15.f,
3417     -5.f,
3418     3.f,
3419     0.f,
3420     false,
3421     false
3422   };
3423   struct LineRun line02 =
3424   {
3425     { 16u, 18u },
3426     { 16u, 18u },
3427     97.f,
3428     15.f,
3429     -5.f,
3430     4.f,
3431     0.f,
3432     false,
3433     true
3434   };
3435   Vector<LineRun> lines;
3436   lines.PushBack( line01 );
3437   lines.PushBack( line02 );
3438
3439   float positions[] =
3440   {
3441     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, 69.f, -8.f, 76.f, -6.f, 81.f, -7.f, 87.f, -7.f, 92.f, -11.f, 94.f, -0.f,
3442     0.f, -7.f, 5.f, -11.f, 6.f, -11.f, 10.f, -8.f, 17.f, -11.f, 18.f, -11.f, 22.f, -8.f, 28.f, -0.f, 32.f, -10.f, 43.f, -13.f, 50.f, -10.f, 55.f, -10.f, 63.f, -0.f, 68.f, -10.f, 76.f, -10.f, 81.f, -13.f, 89.f, -10.f, 97.f, -0.f,
3443   };
3444
3445   Size textArea( 100.f, 50.f );
3446   Size layoutSize( 100.f, 60.f );
3447
3448   LayoutTextData data =
3449   {
3450     "Layout single-line RTL text with ellipsis.",
3451     "שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم.",
3452     textArea,
3453     6u,
3454     fontDescriptionRuns.Begin(),
3455     layoutSize,
3456     34u,
3457     positions,
3458     2u,
3459     lines.Begin(),
3460     LayoutEngine::MULTI_LINE_BOX,
3461     0u,
3462     72u,
3463     true,
3464     true
3465   };
3466
3467   if( !LayoutTextTest( data ) )
3468   {
3469     tet_result(TET_FAIL);
3470   }
3471
3472   tet_result(TET_PASS);
3473   END_TEST;
3474 }
3475
3476 int UtcDaliTextReorderLayout01(void)
3477 {
3478   ToolkitTestApplication application;
3479   tet_infoline(" UtcDaliTextReorderLayout01");
3480
3481   // Reorder lines. No right to left characters.
3482
3483   const std::string fontLatin( "TizenSans" );
3484
3485   // Set a known font description
3486   FontDescriptionRun fontDescriptionRun01;
3487   fontDescriptionRun01.characterRun.characterIndex = 0u;
3488   fontDescriptionRun01.characterRun.numberOfCharacters = 11u;
3489   fontDescriptionRun01.familyLength = fontLatin.size();
3490   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3491   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
3492   fontDescriptionRun01.familyDefined = true;
3493   fontDescriptionRun01.weightDefined = false;
3494   fontDescriptionRun01.widthDefined = false;
3495   fontDescriptionRun01.slantDefined = false;
3496   fontDescriptionRun01.sizeDefined = false;
3497
3498   Vector<FontDescriptionRun> fontDescriptionRuns;
3499   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3500
3501   float positions[] =
3502   {
3503     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,
3504   };
3505
3506   Size textArea( 100.f, 300.f );
3507
3508   ReLayoutRightToLeftLinesData data =
3509   {
3510     "Text with no right to left text.",
3511     "Hello world",
3512     textArea,
3513     1u,
3514     fontDescriptionRuns.Begin(),
3515     11u,
3516     positions,
3517     0u,
3518     11u
3519   };
3520
3521   if( !ReLayoutRightToLeftLinesTest( data ) )
3522   {
3523     tet_result(TET_FAIL);
3524   }
3525
3526   tet_result(TET_PASS);
3527   END_TEST;
3528 }
3529
3530 int UtcDaliTextReorderLayout02(void)
3531 {
3532   ToolkitTestApplication application;
3533   tet_infoline(" UtcDaliTextReorderLayout02");
3534
3535   // Reorder lines of the first paragraph.
3536
3537   const std::string fontHebrew( "TizenSansHebrew" );
3538   const std::string fontArabic( "TizenSansArabic" );
3539
3540   // Set a known font description
3541   FontDescriptionRun fontDescriptionRun01;
3542   fontDescriptionRun01.characterRun.characterIndex = 0u;
3543   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
3544   fontDescriptionRun01.familyLengt