Merge changes I88ded17f,I3960a370 into devel/master
[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 = 9u;
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( "TizenSans" );
975
976   // Set a known font description
977   FontDescriptionRun fontDescriptionRun3;
978   fontDescriptionRun3.characterRun.characterIndex = 26u;
979   fontDescriptionRun3.characterRun.numberOfCharacters = 2u;
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( "TizenSansHebrew" );
990
991   // Set a known font description
992   FontDescriptionRun fontDescriptionRun4;
993   fontDescriptionRun4.characterRun.characterIndex = 28u;
994   fontDescriptionRun4.characterRun.numberOfCharacters = 10u;
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   const std::string fontFamily5( "TizenSans" );
1005
1006   // Set a known font description
1007   FontDescriptionRun fontDescriptionRun5;
1008   fontDescriptionRun5.characterRun.characterIndex = 38u;
1009   fontDescriptionRun5.characterRun.numberOfCharacters = 17u;
1010   fontDescriptionRun5.familyLength = fontFamily5.size();
1011   fontDescriptionRun5.familyName = new char[fontDescriptionRun5.familyLength];
1012   memcpy( fontDescriptionRun5.familyName, fontFamily5.c_str(), fontDescriptionRun5.familyLength );
1013   fontDescriptionRun5.familyDefined = true;
1014   fontDescriptionRun5.weightDefined = false;
1015   fontDescriptionRun5.widthDefined = false;
1016   fontDescriptionRun5.slantDefined = false;
1017   fontDescriptionRun5.sizeDefined = false;
1018
1019   Vector<FontDescriptionRun> fontDescriptionRuns;
1020   fontDescriptionRuns.PushBack( fontDescriptionRun1 );
1021   fontDescriptionRuns.PushBack( fontDescriptionRun2 );
1022   fontDescriptionRuns.PushBack( fontDescriptionRun3 );
1023   fontDescriptionRuns.PushBack( fontDescriptionRun4 );
1024   fontDescriptionRuns.PushBack( fontDescriptionRun5 );
1025   Size textArea(100.f, 300.f);
1026   Size layoutSize(81.f, 120.f);
1027   float positions[] =
1028   {
1029     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,
1030     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,
1031     1.f, -10.f,  9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
1032     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,
1033     1.f, -13.f, 10.f,  -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f,  -0.f, 38.f,  -9.f, 49.f,  -9.f, 59.f,  -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
1034     0.f, -13.f, 10.f,  -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -3.f,
1035   };
1036   struct LineRun line0 =
1037   {
1038     { 0u, 12u },
1039     { 0u, 12u },
1040     81.f,
1041     15.f,
1042     -5.f,
1043     3.f,
1044     0.f,
1045     false,
1046     false
1047   };
1048   struct LineRun line1 =
1049   {
1050     { 12u, 10u },
1051     { 12u, 10u },
1052     76.f,
1053     15.f,
1054     -5.f,
1055     4.f,
1056     0.f,
1057     false,
1058     false
1059   };
1060   struct LineRun line2 =
1061   {
1062     { 22u, 6u },
1063     { 22u, 6u },
1064     34.f,
1065     15.f,
1066     -5.f,
1067     0.f,
1068     0.f,
1069     false,
1070     false
1071   };
1072   struct LineRun line3 =
1073   {
1074     { 28u, 10u },
1075     { 28u, 10u },
1076     67.f,
1077     15.f,
1078     -5.f,
1079     4.f,
1080     0.f,
1081     false,
1082     false
1083   };
1084   struct LineRun line4 =
1085   {
1086     { 38u, 12u },
1087     { 38u, 12u },
1088     79.f,
1089     15.f,
1090     -5.f,
1091     3.f,
1092     0.f,
1093     false,
1094     false
1095   };
1096   struct LineRun line5 =
1097   {
1098     { 50u, 5u },
1099     { 50u, 5u },
1100     43.f,
1101     15.f,
1102     -5.f,
1103     0.f,
1104     0.f,
1105     false,
1106     false
1107   };
1108   Vector<LineRun> lines;
1109   lines.PushBack( line0 );
1110   lines.PushBack( line1 );
1111   lines.PushBack( line2 );
1112   lines.PushBack( line3 );
1113   lines.PushBack( line4 );
1114   lines.PushBack( line5 );
1115
1116   LayoutTextData data =
1117   {
1118     "Layout bidirectional text.",
1119     "Hello world demo שלום עולם.\n"
1120     "שלום עולם hello world demo.",
1121     textArea,
1122     5u,
1123     fontDescriptionRuns.Begin(),
1124     layoutSize,
1125     55u,
1126     positions,
1127     6u,
1128     lines.Begin(),
1129     LayoutEngine::MULTI_LINE_BOX,
1130     0u,
1131     55u,
1132     false,
1133     true
1134   };
1135
1136   if( !LayoutTextTest( data ) )
1137   {
1138     tet_result(TET_FAIL);
1139   }
1140
1141   tet_result(TET_PASS);
1142   END_TEST;
1143 }
1144
1145 int UtcDaliTextLayoutMultilineText03(void)
1146 {
1147   ToolkitTestApplication application;
1148   tet_infoline(" UtcDaliTextLayoutMultilineText03");
1149
1150   // Layout a long word which doesn't fit in the width of the text area.
1151
1152   const std::string fontFamily( "TizenSans" );
1153
1154   // Set a known font description
1155   FontDescriptionRun fontDescriptionRun;
1156   fontDescriptionRun.characterRun.characterIndex = 0u;
1157   fontDescriptionRun.characterRun.numberOfCharacters = 29u;
1158   fontDescriptionRun.familyLength = fontFamily.size();
1159   fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1160   memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1161   fontDescriptionRun.familyDefined = true;
1162   fontDescriptionRun.weightDefined = false;
1163   fontDescriptionRun.widthDefined = false;
1164   fontDescriptionRun.slantDefined = false;
1165   fontDescriptionRun.sizeDefined = false;
1166
1167   Vector<FontDescriptionRun> fontDescriptionRuns;
1168   fontDescriptionRuns.PushBack( fontDescriptionRun );
1169   Size textArea(100.f, 300.f);
1170   Size layoutSize(96.f, 60.f);
1171   float positions[] =
1172   {
1173     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,
1174     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,
1175     0.f, -13.f, 10.f, -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f,  -3.f,
1176   };
1177   struct LineRun line0 =
1178   {
1179     { 0u, 12u },
1180     { 0u, 12u },
1181     94.f,
1182     15.f,
1183     -5.f,
1184     0.f,
1185     0.f,
1186     false,
1187     false
1188   };
1189   struct LineRun line1 =
1190   {
1191     { 12u, 12u },
1192     { 12u, 12u },
1193     96.f,
1194     15.f,
1195     -5.f,
1196     0.f,
1197     0.f,
1198     false,
1199     false
1200   };
1201   struct LineRun line2 =
1202   {
1203     { 24u, 5u },
1204     { 24u, 5u },
1205     43.f,
1206     15.f,
1207     -5.f,
1208     0.f,
1209     0.f,
1210     false,
1211     false
1212   };
1213   Vector<LineRun> lines;
1214   lines.PushBack( line0 );
1215   lines.PushBack( line1 );
1216   lines.PushBack( line2 );
1217
1218   LayoutTextData data =
1219   {
1220     "Layout a long word which doesn't fit in the width of the text area.",
1221     "Helloworlddemohelloworlddemo.",
1222     textArea,
1223     1u,
1224     fontDescriptionRuns.Begin(),
1225     layoutSize,
1226     29u,
1227     positions,
1228     3u,
1229     lines.Begin(),
1230     LayoutEngine::MULTI_LINE_BOX,
1231     0u,
1232     29u,
1233     false,
1234     true
1235   };
1236
1237   if( !LayoutTextTest( data ) )
1238   {
1239     tet_result(TET_FAIL);
1240   }
1241
1242   tet_result(TET_PASS);
1243   END_TEST;
1244 }
1245
1246 int UtcDaliTextLayoutMultilineText04(void)
1247 {
1248   ToolkitTestApplication application;
1249   tet_infoline(" UtcDaliTextLayoutMultilineText04");
1250
1251   // Layout simple text ending with a \n. It has to add a void line at the end.
1252
1253   const std::string fontFamily( "TizenSans" );
1254
1255   // Set a known font description
1256   FontDescriptionRun fontDescriptionRun;
1257   fontDescriptionRun.characterRun.characterIndex = 0u;
1258   fontDescriptionRun.characterRun.numberOfCharacters = 13u;
1259   fontDescriptionRun.familyLength = fontFamily.size();
1260   fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1261   memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1262   fontDescriptionRun.familyDefined = true;
1263   fontDescriptionRun.weightDefined = false;
1264   fontDescriptionRun.widthDefined = false;
1265   fontDescriptionRun.slantDefined = false;
1266   fontDescriptionRun.sizeDefined = false;
1267
1268   Vector<FontDescriptionRun> fontDescriptionRuns;
1269   fontDescriptionRuns.PushBack( fontDescriptionRun );
1270   Size textArea(100.f, 300.f);
1271   Size layoutSize(83.f, 40.f);
1272   float positions[] =
1273   {
1274     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
1275   };
1276   struct LineRun line0 =
1277   {
1278     { 0u, 13u },
1279     { 0u, 13u },
1280     83.f,
1281     15.f,
1282     -5.f,
1283     0.f,
1284     0.f,
1285     false,
1286     false
1287   };
1288   struct LineRun line1 =
1289   {
1290     { 13u, 0u },
1291     { 13u, 0u },
1292     0.f,
1293     15.f,
1294     -5.f,
1295     0.f,
1296     0.f,
1297     false,
1298     false
1299   };
1300   Vector<LineRun> lines;
1301   lines.PushBack( line0 );
1302   lines.PushBack( line1 );
1303
1304   LayoutTextData data =
1305   {
1306     "Layout simple text ending with a \n.",
1307     "Hello world.\n",
1308     textArea,
1309     1u,
1310     fontDescriptionRuns.Begin(),
1311     layoutSize,
1312     13u,
1313     positions,
1314     2u,
1315     lines.Begin(),
1316     LayoutEngine::MULTI_LINE_BOX,
1317     0u,
1318     13u,
1319     false,
1320     true
1321   };
1322
1323   if( !LayoutTextTest( data ) )
1324   {
1325     tet_result(TET_FAIL);
1326   }
1327
1328   tet_result(TET_PASS);
1329   END_TEST;
1330 }
1331
1332 int UtcDaliTextLayoutMultilineText05(void)
1333 {
1334   ToolkitTestApplication application;
1335   tet_infoline(" UtcDaliTextLayoutMultilineText05");
1336
1337   // Layout simple text with one character with a different font size.
1338
1339   const std::string fontFamily( "TizenSans" );
1340
1341   // Set a known font description
1342   FontDescriptionRun fontDescriptionRun1;
1343   fontDescriptionRun1.characterRun.characterIndex = 0u;
1344   fontDescriptionRun1.characterRun.numberOfCharacters = 6u;
1345   fontDescriptionRun1.familyLength = fontFamily.size();
1346   fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
1347   memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength );
1348   fontDescriptionRun1.familyDefined = true;
1349   fontDescriptionRun1.weightDefined = false;
1350   fontDescriptionRun1.widthDefined = false;
1351   fontDescriptionRun1.slantDefined = false;
1352   fontDescriptionRun1.sizeDefined = false;
1353
1354   FontDescriptionRun fontDescriptionRun2;
1355   fontDescriptionRun2.characterRun.characterIndex = 6u;
1356   fontDescriptionRun2.characterRun.numberOfCharacters = 1u;
1357   fontDescriptionRun2.familyLength = fontFamily.size();
1358   fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
1359   memcpy( fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength );
1360   fontDescriptionRun2.size = 1280u;
1361   fontDescriptionRun2.familyDefined = true;
1362   fontDescriptionRun2.weightDefined = false;
1363   fontDescriptionRun2.widthDefined = false;
1364   fontDescriptionRun2.slantDefined = false;
1365   fontDescriptionRun2.sizeDefined = true;
1366
1367   FontDescriptionRun fontDescriptionRun3;
1368   fontDescriptionRun3.characterRun.characterIndex = 7u;
1369   fontDescriptionRun3.characterRun.numberOfCharacters = 10u;
1370   fontDescriptionRun3.familyLength = fontFamily.size();
1371   fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength];
1372   memcpy( fontDescriptionRun3.familyName, fontFamily.c_str(), fontDescriptionRun3.familyLength );
1373   fontDescriptionRun3.familyDefined = true;
1374   fontDescriptionRun3.weightDefined = false;
1375   fontDescriptionRun3.widthDefined = false;
1376   fontDescriptionRun3.slantDefined = false;
1377   fontDescriptionRun3.sizeDefined = false;
1378
1379   Vector<FontDescriptionRun> fontDescriptionRuns;
1380   fontDescriptionRuns.PushBack( fontDescriptionRun1 );
1381   fontDescriptionRuns.PushBack( fontDescriptionRun2 );
1382   fontDescriptionRuns.PushBack( fontDescriptionRun3 );
1383   Size textArea(100.f, 300.f);
1384   Size layoutSize(88.f, 53.f);
1385   float positions[] =
1386   {
1387     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,
1388     0.f, -13.f, 10.f, -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -3.f
1389   };
1390   struct LineRun line0 =
1391   {
1392     { 0u, 12u },
1393     { 0u, 12u },
1394     88.f,
1395     25.f,
1396     -8.f,
1397     4.f,
1398     0.f,
1399     false,
1400     false
1401   };
1402   struct LineRun line1 =
1403   {
1404     { 12u, 5u },
1405     { 12u, 5u },
1406     43.f,
1407     15.f,
1408     -5.f,
1409     0.f,
1410     0.f,
1411     false,
1412     false
1413   };
1414   Vector<LineRun> lines;
1415   lines.PushBack( line0 );
1416   lines.PushBack( line1 );
1417
1418   LayoutTextData data =
1419   {
1420     "Layout simple text with one character with a different font size.",
1421     "Hello world demo.",
1422     textArea,
1423     3u,
1424     fontDescriptionRuns.Begin(),
1425     layoutSize,
1426     17u,
1427     positions,
1428     2u,
1429     lines.Begin(),
1430     LayoutEngine::MULTI_LINE_BOX,
1431     0u,
1432     17u,
1433     false,
1434     true
1435   };
1436
1437   if( !LayoutTextTest( data ) )
1438   {
1439     tet_result(TET_FAIL);
1440   }
1441
1442   tet_result(TET_PASS);
1443   END_TEST;
1444 }
1445
1446 int UtcDaliTextUpdateLayout01(void)
1447 {
1448   ToolkitTestApplication application;
1449   tet_infoline(" UtcDaliTextUpdateLayout01");
1450
1451   // Layout some lines of bidirectional text. Update the paragraphs at the beginning.
1452
1453   const std::string fontLatin( "TizenSans" );
1454   const std::string fontHebrew( "TizenSansHebrew" );
1455   const std::string fontArabic( "TizenSansArabic" );
1456
1457   // Set a known font description
1458   FontDescriptionRun fontDescriptionRun01;
1459   fontDescriptionRun01.characterRun.characterIndex = 0u;
1460   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
1461   fontDescriptionRun01.familyLength = fontLatin.size();
1462   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
1463   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
1464   fontDescriptionRun01.familyDefined = true;
1465   fontDescriptionRun01.weightDefined = false;
1466   fontDescriptionRun01.widthDefined = false;
1467   fontDescriptionRun01.slantDefined = false;
1468   fontDescriptionRun01.sizeDefined = false;
1469
1470   // Set a known font description
1471   FontDescriptionRun fontDescriptionRun02;
1472   fontDescriptionRun02.characterRun.characterIndex = 17u;
1473   fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
1474   fontDescriptionRun02.familyLength = fontHebrew.size();
1475   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
1476   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
1477   fontDescriptionRun02.familyDefined = true;
1478   fontDescriptionRun02.weightDefined = false;
1479   fontDescriptionRun02.widthDefined = false;
1480   fontDescriptionRun02.slantDefined = false;
1481   fontDescriptionRun02.sizeDefined = false;
1482
1483   // Set a known font description
1484   FontDescriptionRun fontDescriptionRun03;
1485   fontDescriptionRun03.characterRun.characterIndex = 26u;
1486   fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
1487   fontDescriptionRun03.familyLength = fontLatin.size();
1488   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
1489   memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
1490   fontDescriptionRun03.familyDefined = true;
1491   fontDescriptionRun03.weightDefined = false;
1492   fontDescriptionRun03.widthDefined = false;
1493   fontDescriptionRun03.slantDefined = false;
1494   fontDescriptionRun03.sizeDefined = false;
1495
1496   // Set a known font description
1497   FontDescriptionRun fontDescriptionRun04;
1498   fontDescriptionRun04.characterRun.characterIndex = 28u;
1499   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
1500   fontDescriptionRun04.familyLength = fontArabic.size();
1501   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
1502   memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
1503   fontDescriptionRun04.familyDefined = true;
1504   fontDescriptionRun04.weightDefined = false;
1505   fontDescriptionRun04.widthDefined = false;
1506   fontDescriptionRun04.slantDefined = false;
1507   fontDescriptionRun04.sizeDefined = false;
1508
1509   // Set a known font description
1510   FontDescriptionRun fontDescriptionRun05;
1511   fontDescriptionRun05.characterRun.characterIndex = 42u;
1512   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
1513   fontDescriptionRun05.familyLength = fontLatin.size();
1514   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
1515   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
1516   fontDescriptionRun05.familyDefined = true;
1517   fontDescriptionRun05.weightDefined = false;
1518   fontDescriptionRun05.widthDefined = false;
1519   fontDescriptionRun05.slantDefined = false;
1520   fontDescriptionRun05.sizeDefined = false;
1521
1522   // Set a known font description
1523   FontDescriptionRun fontDescriptionRun06;
1524   fontDescriptionRun06.characterRun.characterIndex = 54u;
1525   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
1526   fontDescriptionRun06.familyLength = fontHebrew.size();
1527   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
1528   memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
1529   fontDescriptionRun06.familyDefined = true;
1530   fontDescriptionRun06.weightDefined = false;
1531   fontDescriptionRun06.widthDefined = false;
1532   fontDescriptionRun06.slantDefined = false;
1533   fontDescriptionRun06.sizeDefined = false;
1534
1535   // Set a known font description
1536   FontDescriptionRun fontDescriptionRun07;
1537   fontDescriptionRun07.characterRun.characterIndex = 64u;
1538   fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
1539   fontDescriptionRun07.familyLength = fontHebrew.size();
1540   fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
1541   memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
1542   fontDescriptionRun07.familyDefined = true;
1543   fontDescriptionRun07.weightDefined = false;
1544   fontDescriptionRun07.widthDefined = false;
1545   fontDescriptionRun07.slantDefined = false;
1546   fontDescriptionRun07.sizeDefined = false;
1547
1548   // Set a known font description
1549   FontDescriptionRun fontDescriptionRun08;
1550   fontDescriptionRun08.characterRun.characterIndex = 74u;
1551   fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
1552   fontDescriptionRun08.familyLength = fontLatin.size();
1553   fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
1554   memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
1555   fontDescriptionRun08.familyDefined = true;
1556   fontDescriptionRun08.weightDefined = false;
1557   fontDescriptionRun08.widthDefined = false;
1558   fontDescriptionRun08.slantDefined = false;
1559   fontDescriptionRun08.sizeDefined = false;
1560
1561   // Set a known font description
1562   FontDescriptionRun fontDescriptionRun09;
1563   fontDescriptionRun09.characterRun.characterIndex = 92u;
1564   fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
1565   fontDescriptionRun09.familyLength = fontLatin.size();
1566   fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
1567   memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
1568   fontDescriptionRun09.familyDefined = true;
1569   fontDescriptionRun09.weightDefined = false;
1570   fontDescriptionRun09.widthDefined = false;
1571   fontDescriptionRun09.slantDefined = false;
1572   fontDescriptionRun09.sizeDefined = false;
1573
1574   // Set a known font description
1575   FontDescriptionRun fontDescriptionRun10;
1576   fontDescriptionRun10.characterRun.characterIndex = 104u;
1577   fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
1578   fontDescriptionRun10.familyLength = fontArabic.size();
1579   fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
1580   memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
1581   fontDescriptionRun10.familyDefined = true;
1582   fontDescriptionRun10.weightDefined = false;
1583   fontDescriptionRun10.widthDefined = false;
1584   fontDescriptionRun10.slantDefined = false;
1585   fontDescriptionRun10.sizeDefined = false;
1586
1587   // Set a known font description
1588   FontDescriptionRun fontDescriptionRun11;
1589   fontDescriptionRun11.characterRun.characterIndex = 118u;
1590   fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
1591   fontDescriptionRun11.familyLength = fontHebrew.size();
1592   fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
1593   memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
1594   fontDescriptionRun11.familyDefined = true;
1595   fontDescriptionRun11.weightDefined = false;
1596   fontDescriptionRun11.widthDefined = false;
1597   fontDescriptionRun11.slantDefined = false;
1598   fontDescriptionRun11.sizeDefined = false;
1599
1600   // Set a known font description
1601   FontDescriptionRun fontDescriptionRun12;
1602   fontDescriptionRun12.characterRun.characterIndex = 128u;
1603   fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
1604   fontDescriptionRun12.familyLength = fontLatin.size();
1605   fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
1606   memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
1607   fontDescriptionRun12.familyDefined = true;
1608   fontDescriptionRun12.weightDefined = false;
1609   fontDescriptionRun12.widthDefined = false;
1610   fontDescriptionRun12.slantDefined = false;
1611   fontDescriptionRun12.sizeDefined = false;
1612
1613   // Set a known font description
1614   FontDescriptionRun fontDescriptionRun13;
1615   fontDescriptionRun13.characterRun.characterIndex = 145u;
1616   fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
1617   fontDescriptionRun13.familyLength = fontHebrew.size();
1618   fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
1619   memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
1620   fontDescriptionRun13.familyDefined = true;
1621   fontDescriptionRun13.weightDefined = false;
1622   fontDescriptionRun13.widthDefined = false;
1623   fontDescriptionRun13.slantDefined = false;
1624   fontDescriptionRun13.sizeDefined = false;
1625
1626   // Set a known font description
1627   FontDescriptionRun fontDescriptionRun14;
1628   fontDescriptionRun14.characterRun.characterIndex = 154u;
1629   fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
1630   fontDescriptionRun14.familyLength = fontLatin.size();
1631   fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
1632   memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
1633   fontDescriptionRun14.familyDefined = true;
1634   fontDescriptionRun14.weightDefined = false;
1635   fontDescriptionRun14.widthDefined = false;
1636   fontDescriptionRun14.slantDefined = false;
1637   fontDescriptionRun14.sizeDefined = false;
1638
1639   // Set a known font description
1640   FontDescriptionRun fontDescriptionRun15;
1641   fontDescriptionRun15.characterRun.characterIndex = 156u;
1642   fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
1643   fontDescriptionRun15.familyLength = fontHebrew.size();
1644   fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
1645   memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
1646   fontDescriptionRun15.familyDefined = true;
1647   fontDescriptionRun15.weightDefined = false;
1648   fontDescriptionRun15.widthDefined = false;
1649   fontDescriptionRun15.slantDefined = false;
1650   fontDescriptionRun15.sizeDefined = false;
1651
1652   // Set a known font description
1653   FontDescriptionRun fontDescriptionRun16;
1654   fontDescriptionRun16.characterRun.characterIndex = 166u;
1655   fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
1656   fontDescriptionRun16.familyLength = fontLatin.size();
1657   fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
1658   memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
1659   fontDescriptionRun16.familyDefined = true;
1660   fontDescriptionRun16.weightDefined = false;
1661   fontDescriptionRun16.widthDefined = false;
1662   fontDescriptionRun16.slantDefined = false;
1663   fontDescriptionRun16.sizeDefined = false;
1664
1665   // Set a known font description
1666   FontDescriptionRun fontDescriptionRun17;
1667   fontDescriptionRun17.characterRun.characterIndex = 178u;
1668   fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
1669   fontDescriptionRun17.familyLength = fontArabic.size();
1670   fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
1671   memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
1672   fontDescriptionRun17.familyDefined = true;
1673   fontDescriptionRun17.weightDefined = false;
1674   fontDescriptionRun17.widthDefined = false;
1675   fontDescriptionRun17.slantDefined = false;
1676   fontDescriptionRun17.sizeDefined = false;
1677
1678   Vector<FontDescriptionRun> fontDescriptionRuns;
1679   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
1680   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
1681   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
1682   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
1683   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
1684   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
1685   fontDescriptionRuns.PushBack( fontDescriptionRun07 );
1686   fontDescriptionRuns.PushBack( fontDescriptionRun08 );
1687   fontDescriptionRuns.PushBack( fontDescriptionRun09 );
1688   fontDescriptionRuns.PushBack( fontDescriptionRun10 );
1689   fontDescriptionRuns.PushBack( fontDescriptionRun11 );
1690   fontDescriptionRuns.PushBack( fontDescriptionRun12 );
1691   fontDescriptionRuns.PushBack( fontDescriptionRun13 );
1692   fontDescriptionRuns.PushBack( fontDescriptionRun14 );
1693   fontDescriptionRuns.PushBack( fontDescriptionRun15 );
1694   fontDescriptionRuns.PushBack( fontDescriptionRun16 );
1695   fontDescriptionRuns.PushBack( fontDescriptionRun17 );
1696   Size textArea(100.f, 300.f);
1697   Size layoutSize(92.f, 380.f);
1698   float positions[] =
1699   {
1700     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,
1701     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,
1702     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
1703     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,
1704     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,
1705     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
1706     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,
1707     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
1708     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
1709     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
1710     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,
1711     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
1712     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,
1713     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,
1714     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
1715     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,
1716     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
1717     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,
1718   };
1719
1720   struct LineRun line01 =
1721   {
1722     { 0u, 12u },
1723     { 0u, 12u },
1724     81.f,
1725     15.f,
1726     -5.f,
1727     3.f,
1728     0.f,
1729     false,
1730     false
1731   };
1732   struct LineRun line02 =
1733   {
1734     { 12u, 10u },
1735     { 12u, 10u },
1736     76.f,
1737     15.f,
1738     -5.f,
1739     4.f,
1740     0.f,
1741     false,
1742     false
1743   };
1744   struct LineRun line03 =
1745   {
1746     { 22u, 6u },
1747     { 22u, 6u },
1748     34.f,
1749     15.f,
1750     -5.f,
1751     0.f,
1752     0.f,
1753     false,
1754     false
1755   };
1756   struct LineRun line04 =
1757   {
1758     { 28u, 20u },
1759     { 28u, 20u },
1760     92.f,
1761     15.f,
1762     -5.f,
1763     4.f,
1764     0.f,
1765     false,
1766     false
1767   };
1768   struct LineRun line05 =
1769   {
1770     { 48u, 11u },
1771     { 48u, 11u },
1772     76.f,
1773     15.f,
1774     -5.f,
1775     4.f,
1776     0.f,
1777     false,
1778     false
1779   };
1780   struct LineRun line06 =
1781   {
1782     { 59u, 5u },
1783     { 59u, 5u },
1784     31.f,
1785     15.f,
1786     -5.f,
1787     0.f,
1788     0.f,
1789     false,
1790     false
1791   };
1792   struct LineRun line07 =
1793   {
1794     { 64u, 10u },
1795     { 64u, 10u },
1796     67.f,
1797     15.f,
1798     -5.f,
1799     4.f,
1800     0.f,
1801     false,
1802     false
1803   };
1804   struct LineRun line08 =
1805   {
1806     { 74u, 12u },
1807     { 74u, 12u },
1808     79.f,
1809     15.f,
1810     -5.f,
1811     3.f,
1812     0.f,
1813     false,
1814     false
1815   };
1816   struct LineRun line09 =
1817   {
1818     { 86u, 6u },
1819     { 86u, 6u },
1820     43.f,
1821     15.f,
1822     -5.f,
1823     0.f,
1824     0.f,
1825     false,
1826     false
1827   };
1828   struct LineRun line10 =
1829   {
1830     { 92u, 12u },
1831     { 92u, 12u },
1832     78.f,
1833     15.f,
1834     -5.f,
1835     4.f,
1836     0.f,
1837     false,
1838     false
1839   };
1840   struct LineRun line11 =
1841   {
1842     { 104u, 19u },
1843     { 104u, 19u },
1844     90.f,
1845     15.f,
1846     -5.f,
1847     4.f,
1848     0.f,
1849     false,
1850     false
1851   };
1852   struct LineRun line12 =
1853   {
1854     { 123u, 5u },
1855     { 123u, 5u },
1856     31.f,
1857     15.f,
1858     -5.f,
1859     0.f,
1860     0.f,
1861     false,
1862     false
1863   };
1864   struct LineRun line13 =
1865   {
1866     { 128u, 12u },
1867     { 128u, 12u },
1868     81.f,
1869     15.f,
1870     -5.f,
1871     3.f,
1872     0.f,
1873     false,
1874     false
1875   };
1876   struct LineRun line14 =
1877   {
1878     { 140u, 10u },
1879     { 140u, 10u },
1880     76.f,
1881     15.f,
1882     -5.f,
1883     4.f,
1884     0.f,
1885     false,
1886     false
1887   };
1888   struct LineRun line15 =
1889   {
1890     { 150u, 6u },
1891     { 150u, 6u },
1892     34.f,
1893     15.f,
1894     -5.f,
1895     0.f,
1896     0.f,
1897     false,
1898     false
1899   };
1900   struct LineRun line16 =
1901   {
1902     { 156u, 10u },
1903     { 156u, 10u },
1904     67.f,
1905     15.f,
1906     -5.f,
1907     4.f,
1908     0.f,
1909     false,
1910     false
1911   };
1912   struct LineRun line17 =
1913   {
1914     { 166u, 12u },
1915     { 166u, 12u },
1916     79.f,
1917     15.f,
1918     -5.f,
1919     4.f,
1920     0.f,
1921     false,
1922     false
1923   };
1924   struct LineRun line18 =
1925   {
1926     { 178u, 14u },
1927     { 178u, 14u },
1928     55.f,
1929     15.f,
1930     -5.f,
1931     0.f,
1932     0.f,
1933     false,
1934     false
1935   };
1936   struct LineRun line19 =
1937   {
1938     { 192u, 0u },
1939     { 192u, 0u },
1940     0.f,
1941     15.f,
1942     -5.f,
1943     0.f,
1944     0.f,
1945     false,
1946     false
1947   };
1948   Vector<LineRun> lines;
1949   lines.PushBack( line01 );
1950   lines.PushBack( line02 );
1951   lines.PushBack( line03 );
1952   lines.PushBack( line04 );
1953   lines.PushBack( line05 );
1954   lines.PushBack( line06 );
1955   lines.PushBack( line07 );
1956   lines.PushBack( line08 );
1957   lines.PushBack( line09 );
1958   lines.PushBack( line10 );
1959   lines.PushBack( line11 );
1960   lines.PushBack( line12 );
1961   lines.PushBack( line13 );
1962   lines.PushBack( line14 );
1963   lines.PushBack( line15 );
1964   lines.PushBack( line16 );
1965   lines.PushBack( line17 );
1966   lines.PushBack( line18 );
1967   lines.PushBack( line19 );
1968
1969   LayoutTextData data =
1970   {
1971     "Layout bidirectional text.",
1972     "Hello world demo שלום עולם.\n"
1973     "مرحبا بالعالم hello world שלום עולם\n"
1974     "שלום עולם hello world demo.\n"
1975     "hello world مرحبا بالعالم שלום עולם\n"
1976     "Hello world demo שלום עולם.\n"
1977     "שלום עולם hello world مرحبا بالعالم\n",
1978     textArea,
1979     17u,
1980     fontDescriptionRuns.Begin(),
1981     layoutSize,
1982     192u,
1983     positions,
1984     19u,
1985     lines.Begin(),
1986     LayoutEngine::MULTI_LINE_BOX,
1987     0u,
1988     64u,
1989     false,
1990     true
1991   };
1992
1993   if( !LayoutTextTest( data ) )
1994   {
1995     tet_result(TET_FAIL);
1996   }
1997
1998   tet_result(TET_PASS);
1999   END_TEST;
2000 }
2001
2002 int UtcDaliTextUpdateLayout02(void)
2003 {
2004   ToolkitTestApplication application;
2005   tet_infoline(" UtcDaliTextUpdateLayout02");
2006
2007   // Layout some lines of bidirectional text. Update the paragraphs at the middle.
2008
2009   const std::string fontLatin( "TizenSans" );
2010   const std::string fontHebrew( "TizenSansHebrew" );
2011   const std::string fontArabic( "TizenSansArabic" );
2012
2013   // Set a known font description
2014   FontDescriptionRun fontDescriptionRun01;
2015   fontDescriptionRun01.characterRun.characterIndex = 0u;
2016   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
2017   fontDescriptionRun01.familyLength = fontLatin.size();
2018   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
2019   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
2020   fontDescriptionRun01.familyDefined = true;
2021   fontDescriptionRun01.weightDefined = false;
2022   fontDescriptionRun01.widthDefined = false;
2023   fontDescriptionRun01.slantDefined = false;
2024   fontDescriptionRun01.sizeDefined = false;
2025
2026   // Set a known font description
2027   FontDescriptionRun fontDescriptionRun02;
2028   fontDescriptionRun02.characterRun.characterIndex = 17u;
2029   fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
2030   fontDescriptionRun02.familyLength = fontHebrew.size();
2031   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
2032   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
2033   fontDescriptionRun02.familyDefined = true;
2034   fontDescriptionRun02.weightDefined = false;
2035   fontDescriptionRun02.widthDefined = false;
2036   fontDescriptionRun02.slantDefined = false;
2037   fontDescriptionRun02.sizeDefined = false;
2038
2039   // Set a known font description
2040   FontDescriptionRun fontDescriptionRun03;
2041   fontDescriptionRun03.characterRun.characterIndex = 26u;
2042   fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
2043   fontDescriptionRun03.familyLength = fontLatin.size();
2044   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
2045   memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
2046   fontDescriptionRun03.familyDefined = true;
2047   fontDescriptionRun03.weightDefined = false;
2048   fontDescriptionRun03.widthDefined = false;
2049   fontDescriptionRun03.slantDefined = false;
2050   fontDescriptionRun03.sizeDefined = false;
2051
2052   // Set a known font description
2053   FontDescriptionRun fontDescriptionRun04;
2054   fontDescriptionRun04.characterRun.characterIndex = 28u;
2055   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
2056   fontDescriptionRun04.familyLength = fontArabic.size();
2057   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
2058   memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
2059   fontDescriptionRun04.familyDefined = true;
2060   fontDescriptionRun04.weightDefined = false;
2061   fontDescriptionRun04.widthDefined = false;
2062   fontDescriptionRun04.slantDefined = false;
2063   fontDescriptionRun04.sizeDefined = false;
2064
2065   // Set a known font description
2066   FontDescriptionRun fontDescriptionRun05;
2067   fontDescriptionRun05.characterRun.characterIndex = 42u;
2068   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
2069   fontDescriptionRun05.familyLength = fontLatin.size();
2070   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
2071   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
2072   fontDescriptionRun05.familyDefined = true;
2073   fontDescriptionRun05.weightDefined = false;
2074   fontDescriptionRun05.widthDefined = false;
2075   fontDescriptionRun05.slantDefined = false;
2076   fontDescriptionRun05.sizeDefined = false;
2077
2078   // Set a known font description
2079   FontDescriptionRun fontDescriptionRun06;
2080   fontDescriptionRun06.characterRun.characterIndex = 54u;
2081   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2082   fontDescriptionRun06.familyLength = fontHebrew.size();
2083   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
2084   memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
2085   fontDescriptionRun06.familyDefined = true;
2086   fontDescriptionRun06.weightDefined = false;
2087   fontDescriptionRun06.widthDefined = false;
2088   fontDescriptionRun06.slantDefined = false;
2089   fontDescriptionRun06.sizeDefined = false;
2090
2091   // Set a known font description
2092   FontDescriptionRun fontDescriptionRun07;
2093   fontDescriptionRun07.characterRun.characterIndex = 64u;
2094   fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
2095   fontDescriptionRun07.familyLength = fontHebrew.size();
2096   fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
2097   memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
2098   fontDescriptionRun07.familyDefined = true;
2099   fontDescriptionRun07.weightDefined = false;
2100   fontDescriptionRun07.widthDefined = false;
2101   fontDescriptionRun07.slantDefined = false;
2102   fontDescriptionRun07.sizeDefined = false;
2103
2104   // Set a known font description
2105   FontDescriptionRun fontDescriptionRun08;
2106   fontDescriptionRun08.characterRun.characterIndex = 74u;
2107   fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
2108   fontDescriptionRun08.familyLength = fontLatin.size();
2109   fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
2110   memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
2111   fontDescriptionRun08.familyDefined = true;
2112   fontDescriptionRun08.weightDefined = false;
2113   fontDescriptionRun08.widthDefined = false;
2114   fontDescriptionRun08.slantDefined = false;
2115   fontDescriptionRun08.sizeDefined = false;
2116
2117   // Set a known font description
2118   FontDescriptionRun fontDescriptionRun09;
2119   fontDescriptionRun09.characterRun.characterIndex = 92u;
2120   fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
2121   fontDescriptionRun09.familyLength = fontLatin.size();
2122   fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
2123   memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
2124   fontDescriptionRun09.familyDefined = true;
2125   fontDescriptionRun09.weightDefined = false;
2126   fontDescriptionRun09.widthDefined = false;
2127   fontDescriptionRun09.slantDefined = false;
2128   fontDescriptionRun09.sizeDefined = false;
2129
2130   // Set a known font description
2131   FontDescriptionRun fontDescriptionRun10;
2132   fontDescriptionRun10.characterRun.characterIndex = 104u;
2133   fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
2134   fontDescriptionRun10.familyLength = fontArabic.size();
2135   fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
2136   memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
2137   fontDescriptionRun10.familyDefined = true;
2138   fontDescriptionRun10.weightDefined = false;
2139   fontDescriptionRun10.widthDefined = false;
2140   fontDescriptionRun10.slantDefined = false;
2141   fontDescriptionRun10.sizeDefined = false;
2142
2143   // Set a known font description
2144   FontDescriptionRun fontDescriptionRun11;
2145   fontDescriptionRun11.characterRun.characterIndex = 118u;
2146   fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
2147   fontDescriptionRun11.familyLength = fontHebrew.size();
2148   fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
2149   memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
2150   fontDescriptionRun11.familyDefined = true;
2151   fontDescriptionRun11.weightDefined = false;
2152   fontDescriptionRun11.widthDefined = false;
2153   fontDescriptionRun11.slantDefined = false;
2154   fontDescriptionRun11.sizeDefined = false;
2155
2156   // Set a known font description
2157   FontDescriptionRun fontDescriptionRun12;
2158   fontDescriptionRun12.characterRun.characterIndex = 128u;
2159   fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
2160   fontDescriptionRun12.familyLength = fontLatin.size();
2161   fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
2162   memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
2163   fontDescriptionRun12.familyDefined = true;
2164   fontDescriptionRun12.weightDefined = false;
2165   fontDescriptionRun12.widthDefined = false;
2166   fontDescriptionRun12.slantDefined = false;
2167   fontDescriptionRun12.sizeDefined = false;
2168
2169   // Set a known font description
2170   FontDescriptionRun fontDescriptionRun13;
2171   fontDescriptionRun13.characterRun.characterIndex = 145u;
2172   fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
2173   fontDescriptionRun13.familyLength = fontHebrew.size();
2174   fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
2175   memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
2176   fontDescriptionRun13.familyDefined = true;
2177   fontDescriptionRun13.weightDefined = false;
2178   fontDescriptionRun13.widthDefined = false;
2179   fontDescriptionRun13.slantDefined = false;
2180   fontDescriptionRun13.sizeDefined = false;
2181
2182   // Set a known font description
2183   FontDescriptionRun fontDescriptionRun14;
2184   fontDescriptionRun14.characterRun.characterIndex = 154u;
2185   fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
2186   fontDescriptionRun14.familyLength = fontLatin.size();
2187   fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
2188   memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
2189   fontDescriptionRun14.familyDefined = true;
2190   fontDescriptionRun14.weightDefined = false;
2191   fontDescriptionRun14.widthDefined = false;
2192   fontDescriptionRun14.slantDefined = false;
2193   fontDescriptionRun14.sizeDefined = false;
2194
2195   // Set a known font description
2196   FontDescriptionRun fontDescriptionRun15;
2197   fontDescriptionRun15.characterRun.characterIndex = 156u;
2198   fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
2199   fontDescriptionRun15.familyLength = fontHebrew.size();
2200   fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
2201   memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
2202   fontDescriptionRun15.familyDefined = true;
2203   fontDescriptionRun15.weightDefined = false;
2204   fontDescriptionRun15.widthDefined = false;
2205   fontDescriptionRun15.slantDefined = false;
2206   fontDescriptionRun15.sizeDefined = false;
2207
2208   // Set a known font description
2209   FontDescriptionRun fontDescriptionRun16;
2210   fontDescriptionRun16.characterRun.characterIndex = 166u;
2211   fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
2212   fontDescriptionRun16.familyLength = fontLatin.size();
2213   fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
2214   memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
2215   fontDescriptionRun16.familyDefined = true;
2216   fontDescriptionRun16.weightDefined = false;
2217   fontDescriptionRun16.widthDefined = false;
2218   fontDescriptionRun16.slantDefined = false;
2219   fontDescriptionRun16.sizeDefined = false;
2220
2221   // Set a known font description
2222   FontDescriptionRun fontDescriptionRun17;
2223   fontDescriptionRun17.characterRun.characterIndex = 178u;
2224   fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
2225   fontDescriptionRun17.familyLength = fontArabic.size();
2226   fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
2227   memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
2228   fontDescriptionRun17.familyDefined = true;
2229   fontDescriptionRun17.weightDefined = false;
2230   fontDescriptionRun17.widthDefined = false;
2231   fontDescriptionRun17.slantDefined = false;
2232   fontDescriptionRun17.sizeDefined = false;
2233
2234   Vector<FontDescriptionRun> fontDescriptionRuns;
2235   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
2236   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
2237   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
2238   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
2239   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
2240   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
2241   fontDescriptionRuns.PushBack( fontDescriptionRun07 );
2242   fontDescriptionRuns.PushBack( fontDescriptionRun08 );
2243   fontDescriptionRuns.PushBack( fontDescriptionRun09 );
2244   fontDescriptionRuns.PushBack( fontDescriptionRun10 );
2245   fontDescriptionRuns.PushBack( fontDescriptionRun11 );
2246   fontDescriptionRuns.PushBack( fontDescriptionRun12 );
2247   fontDescriptionRuns.PushBack( fontDescriptionRun13 );
2248   fontDescriptionRuns.PushBack( fontDescriptionRun14 );
2249   fontDescriptionRuns.PushBack( fontDescriptionRun15 );
2250   fontDescriptionRuns.PushBack( fontDescriptionRun16 );
2251   fontDescriptionRuns.PushBack( fontDescriptionRun17 );
2252   Size textArea(100.f, 300.f);
2253   Size layoutSize(92.f, 380.f);
2254   float positions[] =
2255   {
2256     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,
2257     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,
2258     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2259     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,
2260     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,
2261     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2262     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,
2263     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2264     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
2265     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2266     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,
2267     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2268     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,
2269     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,
2270     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2271     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,
2272     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2273     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,
2274   };
2275
2276   struct LineRun line01 =
2277   {
2278     { 0u, 12u },
2279     { 0u, 12u },
2280     81.f,
2281     15.f,
2282     -5.f,
2283     3.f,
2284     0.f,
2285     false,
2286     false
2287   };
2288   struct LineRun line02 =
2289   {
2290     { 12u, 10u },
2291     { 12u, 10u },
2292     76.f,
2293     15.f,
2294     -5.f,
2295     4.f,
2296     0.f,
2297     false,
2298     false
2299   };
2300   struct LineRun line03 =
2301   {
2302     { 22u, 6u },
2303     { 22u, 6u },
2304     34.f,
2305     15.f,
2306     -5.f,
2307     0.f,
2308     0.f,
2309     false,
2310     false
2311   };
2312   struct LineRun line04 =
2313   {
2314     { 28u, 20u },
2315     { 28u, 20u },
2316     92.f,
2317     15.f,
2318     -5.f,
2319     4.f,
2320     0.f,
2321     false,
2322     false
2323   };
2324   struct LineRun line05 =
2325   {
2326     { 48u, 11u },
2327     { 48u, 11u },
2328     76.f,
2329     15.f,
2330     -5.f,
2331     4.f,
2332     0.f,
2333     false,
2334     false
2335   };
2336   struct LineRun line06 =
2337   {
2338     { 59u, 5u },
2339     { 59u, 5u },
2340     31.f,
2341     15.f,
2342     -5.f,
2343     0.f,
2344     0.f,
2345     false,
2346     false
2347   };
2348   struct LineRun line07 =
2349   {
2350     { 64u, 10u },
2351     { 64u, 10u },
2352     67.f,
2353     15.f,
2354     -5.f,
2355     4.f,
2356     0.f,
2357     false,
2358     false
2359   };
2360   struct LineRun line08 =
2361   {
2362     { 74u, 12u },
2363     { 74u, 12u },
2364     79.f,
2365     15.f,
2366     -5.f,
2367     3.f,
2368     0.f,
2369     false,
2370     false
2371   };
2372   struct LineRun line09 =
2373   {
2374     { 86u, 6u },
2375     { 86u, 6u },
2376     43.f,
2377     15.f,
2378     -5.f,
2379     0.f,
2380     0.f,
2381     false,
2382     false
2383   };
2384   struct LineRun line10 =
2385   {
2386     { 92u, 12u },
2387     { 92u, 12u },
2388     78.f,
2389     15.f,
2390     -5.f,
2391     4.f,
2392     0.f,
2393     false,
2394     false
2395   };
2396   struct LineRun line11 =
2397   {
2398     { 104u, 19u },
2399     { 104u, 19u },
2400     90.f,
2401     15.f,
2402     -5.f,
2403     4.f,
2404     0.f,
2405     false,
2406     false
2407   };
2408   struct LineRun line12 =
2409   {
2410     { 123u, 5u },
2411     { 123u, 5u },
2412     31.f,
2413     15.f,
2414     -5.f,
2415     0.f,
2416     0.f,
2417     false,
2418     false
2419   };
2420   struct LineRun line13 =
2421   {
2422     { 128u, 12u },
2423     { 128u, 12u },
2424     81.f,
2425     15.f,
2426     -5.f,
2427     3.f,
2428     0.f,
2429     false,
2430     false
2431   };
2432   struct LineRun line14 =
2433   {
2434     { 140u, 10u },
2435     { 140u, 10u },
2436     76.f,
2437     15.f,
2438     -5.f,
2439     4.f,
2440     0.f,
2441     false,
2442     false
2443   };
2444   struct LineRun line15 =
2445   {
2446     { 150u, 6u },
2447     { 150u, 6u },
2448     34.f,
2449     15.f,
2450     -5.f,
2451     0.f,
2452     0.f,
2453     false,
2454     false
2455   };
2456   struct LineRun line16 =
2457   {
2458     { 156u, 10u },
2459     { 156u, 10u },
2460     67.f,
2461     15.f,
2462     -5.f,
2463     4.f,
2464     0.f,
2465     false,
2466     false
2467   };
2468   struct LineRun line17 =
2469   {
2470     { 166u, 12u },
2471     { 166u, 12u },
2472     79.f,
2473     15.f,
2474     -5.f,
2475     4.f,
2476     0.f,
2477     false,
2478     false
2479   };
2480   struct LineRun line18 =
2481   {
2482     { 178u, 14u },
2483     { 178u, 14u },
2484     55.f,
2485     15.f,
2486     -5.f,
2487     0.f,
2488     0.f,
2489     false,
2490     false
2491   };
2492   struct LineRun line19 =
2493   {
2494     { 192u, 0u },
2495     { 192u, 0u },
2496     0.f,
2497     15.f,
2498     -5.f,
2499     0.f,
2500     0.f,
2501     false,
2502     false
2503   };
2504   Vector<LineRun> lines;
2505   lines.PushBack( line01 );
2506   lines.PushBack( line02 );
2507   lines.PushBack( line03 );
2508   lines.PushBack( line04 );
2509   lines.PushBack( line05 );
2510   lines.PushBack( line06 );
2511   lines.PushBack( line07 );
2512   lines.PushBack( line08 );
2513   lines.PushBack( line09 );
2514   lines.PushBack( line10 );
2515   lines.PushBack( line11 );
2516   lines.PushBack( line12 );
2517   lines.PushBack( line13 );
2518   lines.PushBack( line14 );
2519   lines.PushBack( line15 );
2520   lines.PushBack( line16 );
2521   lines.PushBack( line17 );
2522   lines.PushBack( line18 );
2523   lines.PushBack( line19 );
2524
2525   LayoutTextData data =
2526   {
2527     "Layout bidirectional text.",
2528     "Hello world demo שלום עולם.\n"
2529     "مرحبا بالعالم hello world שלום עולם\n"
2530     "שלום עולם hello world demo.\n"
2531     "hello world مرحبا بالعالم שלום עולם\n"
2532     "Hello world demo שלום עולם.\n"
2533     "שלום עולם hello world مرحبا بالعالم\n",
2534     textArea,
2535     17u,
2536     fontDescriptionRuns.Begin(),
2537     layoutSize,
2538     192u,
2539     positions,
2540     19u,
2541     lines.Begin(),
2542     LayoutEngine::MULTI_LINE_BOX,
2543     64u,
2544     64u,
2545     false,
2546     true
2547   };
2548
2549   if( !LayoutTextTest( data ) )
2550   {
2551     tet_result(TET_FAIL);
2552   }
2553
2554   tet_result(TET_PASS);
2555   END_TEST;
2556 }
2557
2558 int UtcDaliTextUpdateLayout03(void)
2559 {
2560   ToolkitTestApplication application;
2561   tet_infoline(" UtcDaliTextUpdateLayout03");
2562
2563   // Layout some lines of bidirectional text. Update the paragraphs at the middle.
2564
2565   const std::string fontLatin( "TizenSans" );
2566   const std::string fontHebrew( "TizenSansHebrew" );
2567   const std::string fontArabic( "TizenSansArabic" );
2568
2569   // Set a known font description
2570   FontDescriptionRun fontDescriptionRun01;
2571   fontDescriptionRun01.characterRun.characterIndex = 0u;
2572   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
2573   fontDescriptionRun01.familyLength = fontLatin.size();
2574   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
2575   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
2576   fontDescriptionRun01.familyDefined = true;
2577   fontDescriptionRun01.weightDefined = false;
2578   fontDescriptionRun01.widthDefined = false;
2579   fontDescriptionRun01.slantDefined = false;
2580   fontDescriptionRun01.sizeDefined = false;
2581
2582   // Set a known font description
2583   FontDescriptionRun fontDescriptionRun02;
2584   fontDescriptionRun02.characterRun.characterIndex = 17u;
2585   fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
2586   fontDescriptionRun02.familyLength = fontHebrew.size();
2587   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
2588   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
2589   fontDescriptionRun02.familyDefined = true;
2590   fontDescriptionRun02.weightDefined = false;
2591   fontDescriptionRun02.widthDefined = false;
2592   fontDescriptionRun02.slantDefined = false;
2593   fontDescriptionRun02.sizeDefined = false;
2594
2595   // Set a known font description
2596   FontDescriptionRun fontDescriptionRun03;
2597   fontDescriptionRun03.characterRun.characterIndex = 26u;
2598   fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
2599   fontDescriptionRun03.familyLength = fontLatin.size();
2600   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
2601   memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
2602   fontDescriptionRun03.familyDefined = true;
2603   fontDescriptionRun03.weightDefined = false;
2604   fontDescriptionRun03.widthDefined = false;
2605   fontDescriptionRun03.slantDefined = false;
2606   fontDescriptionRun03.sizeDefined = false;
2607
2608   // Set a known font description
2609   FontDescriptionRun fontDescriptionRun04;
2610   fontDescriptionRun04.characterRun.characterIndex = 28u;
2611   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
2612   fontDescriptionRun04.familyLength = fontArabic.size();
2613   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
2614   memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
2615   fontDescriptionRun04.familyDefined = true;
2616   fontDescriptionRun04.weightDefined = false;
2617   fontDescriptionRun04.widthDefined = false;
2618   fontDescriptionRun04.slantDefined = false;
2619   fontDescriptionRun04.sizeDefined = false;
2620
2621   // Set a known font description
2622   FontDescriptionRun fontDescriptionRun05;
2623   fontDescriptionRun05.characterRun.characterIndex = 42u;
2624   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
2625   fontDescriptionRun05.familyLength = fontLatin.size();
2626   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
2627   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
2628   fontDescriptionRun05.familyDefined = true;
2629   fontDescriptionRun05.weightDefined = false;
2630   fontDescriptionRun05.widthDefined = false;
2631   fontDescriptionRun05.slantDefined = false;
2632   fontDescriptionRun05.sizeDefined = false;
2633
2634   // Set a known font description
2635   FontDescriptionRun fontDescriptionRun06;
2636   fontDescriptionRun06.characterRun.characterIndex = 54u;
2637   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2638   fontDescriptionRun06.familyLength = fontHebrew.size();
2639   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
2640   memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
2641   fontDescriptionRun06.familyDefined = true;
2642   fontDescriptionRun06.weightDefined = false;
2643   fontDescriptionRun06.widthDefined = false;
2644   fontDescriptionRun06.slantDefined = false;
2645   fontDescriptionRun06.sizeDefined = false;
2646
2647   // Set a known font description
2648   FontDescriptionRun fontDescriptionRun07;
2649   fontDescriptionRun07.characterRun.characterIndex = 64u;
2650   fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
2651   fontDescriptionRun07.familyLength = fontHebrew.size();
2652   fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
2653   memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
2654   fontDescriptionRun07.familyDefined = true;
2655   fontDescriptionRun07.weightDefined = false;
2656   fontDescriptionRun07.widthDefined = false;
2657   fontDescriptionRun07.slantDefined = false;
2658   fontDescriptionRun07.sizeDefined = false;
2659
2660   // Set a known font description
2661   FontDescriptionRun fontDescriptionRun08;
2662   fontDescriptionRun08.characterRun.characterIndex = 74u;
2663   fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
2664   fontDescriptionRun08.familyLength = fontLatin.size();
2665   fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
2666   memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
2667   fontDescriptionRun08.familyDefined = true;
2668   fontDescriptionRun08.weightDefined = false;
2669   fontDescriptionRun08.widthDefined = false;
2670   fontDescriptionRun08.slantDefined = false;
2671   fontDescriptionRun08.sizeDefined = false;
2672
2673   // Set a known font description
2674   FontDescriptionRun fontDescriptionRun09;
2675   fontDescriptionRun09.characterRun.characterIndex = 92u;
2676   fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
2677   fontDescriptionRun09.familyLength = fontLatin.size();
2678   fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
2679   memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
2680   fontDescriptionRun09.familyDefined = true;
2681   fontDescriptionRun09.weightDefined = false;
2682   fontDescriptionRun09.widthDefined = false;
2683   fontDescriptionRun09.slantDefined = false;
2684   fontDescriptionRun09.sizeDefined = false;
2685
2686   // Set a known font description
2687   FontDescriptionRun fontDescriptionRun10;
2688   fontDescriptionRun10.characterRun.characterIndex = 104u;
2689   fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
2690   fontDescriptionRun10.familyLength = fontArabic.size();
2691   fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
2692   memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
2693   fontDescriptionRun10.familyDefined = true;
2694   fontDescriptionRun10.weightDefined = false;
2695   fontDescriptionRun10.widthDefined = false;
2696   fontDescriptionRun10.slantDefined = false;
2697   fontDescriptionRun10.sizeDefined = false;
2698
2699   // Set a known font description
2700   FontDescriptionRun fontDescriptionRun11;
2701   fontDescriptionRun11.characterRun.characterIndex = 118u;
2702   fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
2703   fontDescriptionRun11.familyLength = fontHebrew.size();
2704   fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
2705   memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
2706   fontDescriptionRun11.familyDefined = true;
2707   fontDescriptionRun11.weightDefined = false;
2708   fontDescriptionRun11.widthDefined = false;
2709   fontDescriptionRun11.slantDefined = false;
2710   fontDescriptionRun11.sizeDefined = false;
2711
2712   // Set a known font description
2713   FontDescriptionRun fontDescriptionRun12;
2714   fontDescriptionRun12.characterRun.characterIndex = 128u;
2715   fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
2716   fontDescriptionRun12.familyLength = fontLatin.size();
2717   fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
2718   memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
2719   fontDescriptionRun12.familyDefined = true;
2720   fontDescriptionRun12.weightDefined = false;
2721   fontDescriptionRun12.widthDefined = false;
2722   fontDescriptionRun12.slantDefined = false;
2723   fontDescriptionRun12.sizeDefined = false;
2724
2725   // Set a known font description
2726   FontDescriptionRun fontDescriptionRun13;
2727   fontDescriptionRun13.characterRun.characterIndex = 145u;
2728   fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
2729   fontDescriptionRun13.familyLength = fontHebrew.size();
2730   fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
2731   memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
2732   fontDescriptionRun13.familyDefined = true;
2733   fontDescriptionRun13.weightDefined = false;
2734   fontDescriptionRun13.widthDefined = false;
2735   fontDescriptionRun13.slantDefined = false;
2736   fontDescriptionRun13.sizeDefined = false;
2737
2738   // Set a known font description
2739   FontDescriptionRun fontDescriptionRun14;
2740   fontDescriptionRun14.characterRun.characterIndex = 154u;
2741   fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
2742   fontDescriptionRun14.familyLength = fontLatin.size();
2743   fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
2744   memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
2745   fontDescriptionRun14.familyDefined = true;
2746   fontDescriptionRun14.weightDefined = false;
2747   fontDescriptionRun14.widthDefined = false;
2748   fontDescriptionRun14.slantDefined = false;
2749   fontDescriptionRun14.sizeDefined = false;
2750
2751   // Set a known font description
2752   FontDescriptionRun fontDescriptionRun15;
2753   fontDescriptionRun15.characterRun.characterIndex = 156u;
2754   fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
2755   fontDescriptionRun15.familyLength = fontHebrew.size();
2756   fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
2757   memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
2758   fontDescriptionRun15.familyDefined = true;
2759   fontDescriptionRun15.weightDefined = false;
2760   fontDescriptionRun15.widthDefined = false;
2761   fontDescriptionRun15.slantDefined = false;
2762   fontDescriptionRun15.sizeDefined = false;
2763
2764   // Set a known font description
2765   FontDescriptionRun fontDescriptionRun16;
2766   fontDescriptionRun16.characterRun.characterIndex = 166u;
2767   fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
2768   fontDescriptionRun16.familyLength = fontLatin.size();
2769   fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
2770   memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
2771   fontDescriptionRun16.familyDefined = true;
2772   fontDescriptionRun16.weightDefined = false;
2773   fontDescriptionRun16.widthDefined = false;
2774   fontDescriptionRun16.slantDefined = false;
2775   fontDescriptionRun16.sizeDefined = false;
2776
2777   // Set a known font description
2778   FontDescriptionRun fontDescriptionRun17;
2779   fontDescriptionRun17.characterRun.characterIndex = 178u;
2780   fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
2781   fontDescriptionRun17.familyLength = fontArabic.size();
2782   fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
2783   memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
2784   fontDescriptionRun17.familyDefined = true;
2785   fontDescriptionRun17.weightDefined = false;
2786   fontDescriptionRun17.widthDefined = false;
2787   fontDescriptionRun17.slantDefined = false;
2788   fontDescriptionRun17.sizeDefined = false;
2789
2790   Vector<FontDescriptionRun> fontDescriptionRuns;
2791   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
2792   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
2793   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
2794   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
2795   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
2796   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
2797   fontDescriptionRuns.PushBack( fontDescriptionRun07 );
2798   fontDescriptionRuns.PushBack( fontDescriptionRun08 );
2799   fontDescriptionRuns.PushBack( fontDescriptionRun09 );
2800   fontDescriptionRuns.PushBack( fontDescriptionRun10 );
2801   fontDescriptionRuns.PushBack( fontDescriptionRun11 );
2802   fontDescriptionRuns.PushBack( fontDescriptionRun12 );
2803   fontDescriptionRuns.PushBack( fontDescriptionRun13 );
2804   fontDescriptionRuns.PushBack( fontDescriptionRun14 );
2805   fontDescriptionRuns.PushBack( fontDescriptionRun15 );
2806   fontDescriptionRuns.PushBack( fontDescriptionRun16 );
2807   fontDescriptionRuns.PushBack( fontDescriptionRun17 );
2808   Size textArea(100.f, 300.f);
2809   Size layoutSize(92.f, 380.f);
2810   float positions[] =
2811   {
2812     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,
2813     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,
2814     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2815     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,
2816     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,
2817     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2818     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,
2819     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2820     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
2821     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2822     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,
2823     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2824     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,
2825     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,
2826     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2827     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,
2828     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2829     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,
2830   };
2831
2832   struct LineRun line01 =
2833   {
2834     { 0u, 12u },
2835     { 0u, 12u },
2836     81.f,
2837     15.f,
2838     -5.f,
2839     3.f,
2840     0.f,
2841     false,
2842     false
2843   };
2844   struct LineRun line02 =
2845   {
2846     { 12u, 10u },
2847     { 12u, 10u },
2848     76.f,
2849     15.f,
2850     -5.f,
2851     4.f,
2852     0.f,
2853     false,
2854     false
2855   };
2856   struct LineRun line03 =
2857   {
2858     { 22u, 6u },
2859     { 22u, 6u },
2860     34.f,
2861     15.f,
2862     -5.f,
2863     0.f,
2864     0.f,
2865     false,
2866     false
2867   };
2868   struct LineRun line04 =
2869   {
2870     { 28u, 20u },
2871     { 28u, 20u },
2872     92.f,
2873     15.f,
2874     -5.f,
2875     4.f,
2876     0.f,
2877     false,
2878     false
2879   };
2880   struct LineRun line05 =
2881   {
2882     { 48u, 11u },
2883     { 48u, 11u },
2884     76.f,
2885     15.f,
2886     -5.f,
2887     4.f,
2888     0.f,
2889     false,
2890     false
2891   };
2892   struct LineRun line06 =
2893   {
2894     { 59u, 5u },
2895     { 59u, 5u },
2896     31.f,
2897     15.f,
2898     -5.f,
2899     0.f,
2900     0.f,
2901     false,
2902     false
2903   };
2904   struct LineRun line07 =
2905   {
2906     { 64u, 10u },
2907     { 64u, 10u },
2908     67.f,
2909     15.f,
2910     -5.f,
2911     4.f,
2912     0.f,
2913     false,
2914     false
2915   };
2916   struct LineRun line08 =
2917   {
2918     { 74u, 12u },
2919     { 74u, 12u },
2920     79.f,
2921     15.f,
2922     -5.f,
2923     3.f,
2924     0.f,
2925     false,
2926     false
2927   };
2928   struct LineRun line09 =
2929   {
2930     { 86u, 6u },
2931     { 86u, 6u },
2932     43.f,
2933     15.f,
2934     -5.f,
2935     0.f,
2936     0.f,
2937     false,
2938     false
2939   };
2940   struct LineRun line10 =
2941   {
2942     { 92u, 12u },
2943     { 92u, 12u },
2944     78.f,
2945     15.f,
2946     -5.f,
2947     4.f,
2948     0.f,
2949     false,
2950     false
2951   };
2952   struct LineRun line11 =
2953   {
2954     { 104u, 19u },
2955     { 104u, 19u },
2956     90.f,
2957     15.f,
2958     -5.f,
2959     4.f,
2960     0.f,
2961     false,
2962     false
2963   };
2964   struct LineRun line12 =
2965   {
2966     { 123u, 5u },
2967     { 123u, 5u },
2968     31.f,
2969     15.f,
2970     -5.f,
2971     0.f,
2972     0.f,
2973     false,
2974     false
2975   };
2976   struct LineRun line13 =
2977   {
2978     { 128u, 12u },
2979     { 128u, 12u },
2980     81.f,
2981     15.f,
2982     -5.f,
2983     3.f,
2984     0.f,
2985     false,
2986     false
2987   };
2988   struct LineRun line14 =
2989   {
2990     { 140u, 10u },
2991     { 140u, 10u },
2992     76.f,
2993     15.f,
2994     -5.f,
2995     4.f,
2996     0.f,
2997     false,
2998     false
2999   };
3000   struct LineRun line15 =
3001   {
3002     { 150u, 6u },
3003     { 150u, 6u },
3004     34.f,
3005     15.f,
3006     -5.f,
3007     0.f,
3008     0.f,
3009     false,
3010     false
3011   };
3012   struct LineRun line16 =
3013   {
3014     { 156u, 10u },
3015     { 156u, 10u },
3016     67.f,
3017     15.f,
3018     -5.f,
3019     4.f,
3020     0.f,
3021     false,
3022     false
3023   };
3024   struct LineRun line17 =
3025   {
3026     { 166u, 12u },
3027     { 166u, 12u },
3028     79.f,
3029     15.f,
3030     -5.f,
3031     4.f,
3032     0.f,
3033     false,
3034     false
3035   };
3036   struct LineRun line18 =
3037   {
3038     { 178u, 14u },
3039     { 178u, 14u },
3040     55.f,
3041     15.f,
3042     -5.f,
3043     0.f,
3044     0.f,
3045     false,
3046     false
3047   };
3048   struct LineRun line19 =
3049   {
3050     { 192u, 0u },
3051     { 192u, 0u },
3052     0.f,
3053     15.f,
3054     -5.f,
3055     0.f,
3056     0.f,
3057     false,
3058     false
3059   };
3060   Vector<LineRun> lines;
3061   lines.PushBack( line01 );
3062   lines.PushBack( line02 );
3063   lines.PushBack( line03 );
3064   lines.PushBack( line04 );
3065   lines.PushBack( line05 );
3066   lines.PushBack( line06 );
3067   lines.PushBack( line07 );
3068   lines.PushBack( line08 );
3069   lines.PushBack( line09 );
3070   lines.PushBack( line10 );
3071   lines.PushBack( line11 );
3072   lines.PushBack( line12 );
3073   lines.PushBack( line13 );
3074   lines.PushBack( line14 );
3075   lines.PushBack( line15 );
3076   lines.PushBack( line16 );
3077   lines.PushBack( line17 );
3078   lines.PushBack( line18 );
3079   lines.PushBack( line19 );
3080
3081   LayoutTextData data =
3082   {
3083     "Layout bidirectional text.",
3084     "Hello world demo שלום עולם.\n"
3085     "مرحبا بالعالم hello world שלום עולם\n"
3086     "שלום עולם hello world demo.\n"
3087     "hello world مرحبا بالعالم שלום עולם\n"
3088     "Hello world demo שלום עולם.\n"
3089     "שלום עולם hello world مرحبا بالعالم\n",
3090     textArea,
3091     17u,
3092     fontDescriptionRuns.Begin(),
3093     layoutSize,
3094     192u,
3095     positions,
3096     19u,
3097     lines.Begin(),
3098     LayoutEngine::MULTI_LINE_BOX,
3099     128u,
3100     64u,
3101     false,
3102     true
3103   };
3104
3105   if( !LayoutTextTest( data ) )
3106   {
3107     tet_result(TET_FAIL);
3108   }
3109
3110   tet_result(TET_PASS);
3111   END_TEST;
3112 }
3113
3114 int UtcDaliTextLayoutEllipsis01(void)
3115 {
3116   ToolkitTestApplication application;
3117   tet_infoline(" UtcDaliTextLayoutEllipsis01");
3118
3119   // Layout single-line LTR text with ellipsis.
3120
3121   const std::string fontLatin( "TizenSans" );
3122
3123   // Set a known font description
3124   FontDescriptionRun fontDescriptionRun01;
3125   fontDescriptionRun01.characterRun.characterIndex = 0u;
3126   fontDescriptionRun01.characterRun.numberOfCharacters = 51u;
3127   fontDescriptionRun01.familyLength = fontLatin.size();
3128   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3129   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
3130   fontDescriptionRun01.familyDefined = true;
3131   fontDescriptionRun01.weightDefined = false;
3132   fontDescriptionRun01.widthDefined = false;
3133   fontDescriptionRun01.slantDefined = false;
3134   fontDescriptionRun01.sizeDefined = false;
3135
3136   Vector<FontDescriptionRun> fontDescriptionRuns;
3137   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3138
3139   struct LineRun line01 =
3140   {
3141     { 0u, 13u },
3142     { 0u, 13u },
3143     93.f,
3144     15.f,
3145     -5.f,
3146     0.f,
3147     0.f,
3148     false,
3149     true
3150   };
3151   Vector<LineRun> lines;
3152   lines.PushBack( line01 );
3153
3154   float positions[] =
3155   {
3156     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,
3157   };
3158
3159   Size textArea( 100.f, 50.f );
3160   Size layoutSize( 100.f, 20.f );
3161
3162   LayoutTextData data =
3163   {
3164     "Layout single-line LTR text with ellipsis.",
3165     "Hello world demo hello world demo hello world demo.",
3166     textArea,
3167     1u,
3168     fontDescriptionRuns.Begin(),
3169     layoutSize,
3170     13u,
3171     positions,
3172     1u,
3173     lines.Begin(),
3174     LayoutEngine::SINGLE_LINE_BOX,
3175     0u,
3176     51u,
3177     true,
3178     true
3179   };
3180
3181   if( !LayoutTextTest( data ) )
3182   {
3183     tet_result(TET_FAIL);
3184   }
3185
3186   tet_result(TET_PASS);
3187   END_TEST;
3188 }
3189
3190 int UtcDaliTextLayoutEllipsis02(void)
3191 {
3192   ToolkitTestApplication application;
3193   tet_infoline(" UtcDaliTextLayoutEllipsis02");
3194
3195   // Layout multi-line LTR text with ellipsis.
3196
3197   const std::string fontLatin( "TizenSans" );
3198
3199   // Set a known font description
3200   FontDescriptionRun fontDescriptionRun01;
3201   fontDescriptionRun01.characterRun.characterIndex = 0u;
3202   fontDescriptionRun01.characterRun.numberOfCharacters = 51u;
3203   fontDescriptionRun01.familyLength = fontLatin.size();
3204   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3205   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
3206   fontDescriptionRun01.familyDefined = true;
3207   fontDescriptionRun01.weightDefined = false;
3208   fontDescriptionRun01.widthDefined = false;
3209   fontDescriptionRun01.slantDefined = false;
3210   fontDescriptionRun01.sizeDefined = false;
3211
3212   Vector<FontDescriptionRun> fontDescriptionRuns;
3213   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3214
3215   struct LineRun line01 =
3216   {
3217     { 0u, 12u },
3218     { 0u, 12u },
3219     81.f,
3220     15.f,
3221     -5.f,
3222     3.f,
3223     0.f,
3224     false,
3225     false
3226   };
3227   struct LineRun line02 =
3228   {
3229     { 12u, 12u },
3230     { 12u, 12u },
3231     93.f,
3232     15.f,
3233     -5.f,
3234     0.f,
3235     0.f,
3236     false,
3237     true
3238   };
3239   Vector<LineRun> lines;
3240   lines.PushBack( line01 );
3241   lines.PushBack( line02 );
3242
3243   float positions[] =
3244   {
3245     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,
3246     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,
3247   };
3248
3249   Size textArea( 100.f, 50.f );
3250   Size layoutSize( 100.f, 60.f );
3251
3252   LayoutTextData data =
3253   {
3254     "Layout multi-line LTR text with ellipsis.",
3255     "Hello world demo hello world demo hello world demo.",
3256     textArea,
3257     1u,
3258     fontDescriptionRuns.Begin(),
3259     layoutSize,
3260     24u,
3261     positions,
3262     2u,
3263     lines.Begin(),
3264     LayoutEngine::MULTI_LINE_BOX,
3265     0u,
3266     51u,
3267     true,
3268     true
3269   };
3270
3271   if( !LayoutTextTest( data ) )
3272   {
3273     tet_result(TET_FAIL);
3274   }
3275
3276   tet_result(TET_PASS);
3277   END_TEST;
3278 }
3279
3280 int UtcDaliTextLayoutEllipsis03(void)
3281 {
3282   ToolkitTestApplication application;
3283   tet_infoline(" UtcDaliTextLayoutEllipsis03");
3284
3285   // Layout single-line RTL text with ellipsis.
3286
3287   const std::string fontHebrew( "TizenSansHebrew" );
3288   const std::string fontArabic( "TizenSansArabic" );
3289
3290   // Set a known font description
3291   FontDescriptionRun fontDescriptionRun01;
3292   fontDescriptionRun01.characterRun.characterIndex = 0u;
3293   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
3294   fontDescriptionRun01.familyLength = fontHebrew.size();
3295   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3296   memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength );
3297   fontDescriptionRun01.familyDefined = true;
3298   fontDescriptionRun01.weightDefined = false;
3299   fontDescriptionRun01.widthDefined = false;
3300   fontDescriptionRun01.slantDefined = false;
3301   fontDescriptionRun01.sizeDefined = false;
3302
3303   FontDescriptionRun fontDescriptionRun02;
3304   fontDescriptionRun02.characterRun.characterIndex = 10u;
3305   fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
3306   fontDescriptionRun02.familyLength = fontArabic.size();
3307   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
3308   memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength );
3309   fontDescriptionRun02.familyDefined = true;
3310   fontDescriptionRun02.weightDefined = false;
3311   fontDescriptionRun02.widthDefined = false;
3312   fontDescriptionRun02.slantDefined = false;
3313   fontDescriptionRun02.sizeDefined = false;
3314
3315   FontDescriptionRun fontDescriptionRun03;
3316   fontDescriptionRun03.characterRun.characterIndex = 24u;
3317   fontDescriptionRun03.characterRun.numberOfCharacters = 10u;
3318   fontDescriptionRun03.familyLength = fontHebrew.size();
3319   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
3320   memcpy( fontDescriptionRun03.familyName, fontHebrew.c_str(), fontDescriptionRun03.familyLength );
3321   fontDescriptionRun03.familyDefined = true;
3322   fontDescriptionRun03.weightDefined = false;
3323   fontDescriptionRun03.widthDefined = false;
3324   fontDescriptionRun03.slantDefined = false;
3325   fontDescriptionRun03.sizeDefined = false;
3326
3327   FontDescriptionRun fontDescriptionRun04;
3328   fontDescriptionRun04.characterRun.characterIndex = 34u;
3329   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
3330   fontDescriptionRun04.familyLength = fontArabic.size();
3331   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
3332   memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
3333   fontDescriptionRun04.familyDefined = true;
3334   fontDescriptionRun04.weightDefined = false;
3335   fontDescriptionRun04.widthDefined = false;
3336   fontDescriptionRun04.slantDefined = false;
3337   fontDescriptionRun04.sizeDefined = false;
3338
3339   FontDescriptionRun fontDescriptionRun05;
3340   fontDescriptionRun05.characterRun.characterIndex = 48u;
3341   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
3342   fontDescriptionRun05.familyLength = fontHebrew.size();
3343   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
3344   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
3345   fontDescriptionRun05.familyDefined = true;
3346   fontDescriptionRun05.weightDefined = false;
3347   fontDescriptionRun05.widthDefined = false;
3348   fontDescriptionRun05.slantDefined = false;
3349   fontDescriptionRun05.sizeDefined = false;
3350
3351   FontDescriptionRun fontDescriptionRun06;
3352   fontDescriptionRun06.characterRun.characterIndex = 58u;
3353   fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
3354   fontDescriptionRun06.familyLength = fontArabic.size();
3355   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
3356   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
3357   fontDescriptionRun06.familyDefined = true;
3358   fontDescriptionRun06.weightDefined = false;
3359   fontDescriptionRun06.widthDefined = false;
3360   fontDescriptionRun06.slantDefined = false;
3361   fontDescriptionRun06.sizeDefined = false;
3362
3363   Vector<FontDescriptionRun> fontDescriptionRuns;
3364   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3365   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
3366   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
3367   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
3368   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
3369   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
3370
3371   struct LineRun line01 =
3372   {
3373     { 0u, 16u },
3374     { 0u, 16u },
3375     95.f,
3376     15.f,
3377     -5.f,
3378     0.f,
3379     0.f,
3380     false,
3381     true
3382   };
3383   Vector<LineRun> lines;
3384   lines.PushBack( line01 );
3385
3386   float positions[] =
3387   {
3388     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,
3389   };
3390
3391   Size textArea( 100.f, 50.f );
3392   Size layoutSize( 100.f, 20.f );
3393
3394   LayoutTextData data =
3395   {
3396     "Layout single-line RTL text with ellipsis.",
3397     "שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم.",
3398     textArea,
3399     6u,
3400     fontDescriptionRuns.Begin(),
3401     layoutSize,
3402     16u,
3403     positions,
3404     1u,
3405     lines.Begin(),
3406     LayoutEngine::SINGLE_LINE_BOX,
3407     0u,
3408     72u,
3409     true,
3410     true
3411   };
3412
3413   if( !LayoutTextTest( data ) )
3414   {
3415     tet_result(TET_FAIL);
3416   }
3417
3418   tet_result(TET_PASS);
3419   END_TEST;
3420 }
3421
3422 int UtcDaliTextLayoutEllipsis04(void)
3423 {
3424   ToolkitTestApplication application;
3425   tet_infoline(" UtcDaliTextLayoutEllipsis04");
3426
3427   // Layout multi-line RTL text with ellipsis.
3428
3429   const std::string fontHebrew( "TizenSansHebrew" );
3430   const std::string fontArabic( "TizenSansArabic" );
3431
3432   // Set a known font description
3433   FontDescriptionRun fontDescriptionRun01;
3434   fontDescriptionRun01.characterRun.characterIndex = 0u;
3435   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
3436   fontDescriptionRun01.familyLength = fontHebrew.size();
3437   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3438   memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength );
3439   fontDescriptionRun01.familyDefined = true;
3440   fontDescriptionRun01.weightDefined = false;
3441   fontDescriptionRun01.widthDefined = false;
3442   fontDescriptionRun01.slantDefined = false;
3443   fontDescriptionRun01.sizeDefined = false;
3444
3445   FontDescriptionRun fontDescriptionRun02;
3446   fontDescriptionRun02.characterRun.characterIndex = 10u;
3447   fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
3448   fontDescriptionRun02.familyLength = fontArabic.size();
3449   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
3450   memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength );
3451   fontDescriptionRun02.familyDefined = true;
3452   fontDescriptionRun02.weightDefined = false;
3453   fontDescriptionRun02.widthDefined = false;
3454   fontDescriptionRun02.slantDefined = false;
3455   fontDescriptionRun02.sizeDefined = false;
3456
3457   FontDescriptionRun fontDescriptionRun03;
3458   fontDescriptionRun03.characterRun.characterIndex = 24u;
3459   fontDescriptionRun03.characterRun.numberOfCharacters = 10u;
3460   fontDescriptionRun03.familyLength = fontHebrew.size();
3461   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
3462   memcpy( fontDescriptionRun03.familyName, fontHebrew.c_str(), fontDescriptionRun03.familyLength );
3463   fontDescriptionRun03.familyDefined = true;
3464   fontDescriptionRun03.weightDefined = false;
3465   fontDescriptionRun03.widthDefined = false;
3466   fontDescriptionRun03.slantDefined = false;
3467   fontDescriptionRun03.sizeDefined = false;
3468
3469   FontDescriptionRun fontDescriptionRun04;
3470   fontDescriptionRun04.characterRun.characterIndex = 34u;
3471   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
3472   fontDescriptionRun04.familyLength = fontArabic.size();
3473   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
3474   memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
3475   fontDescriptionRun04.familyDefined = true;
3476   fontDescriptionRun04.weightDefined = false;
3477   fontDescriptionRun04.widthDefined = false;
3478   fontDescriptionRun04.slantDefined = false;
3479   fontDescriptionRun04.sizeDefined = false;
3480
3481   FontDescriptionRun fontDescriptionRun05;
3482   fontDescriptionRun05.characterRun.characterIndex = 48u;
3483   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
3484   fontDescriptionRun05.familyLength = fontHebrew.size();
3485   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
3486   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
3487   fontDescriptionRun05.familyDefined = true;
3488   fontDescriptionRun05.weightDefined = false;
3489   fontDescriptionRun05.widthDefined = false;
3490   fontDescriptionRun05.slantDefined = false;
3491   fontDescriptionRun05.sizeDefined = false;
3492
3493   FontDescriptionRun fontDescriptionRun06;
3494   fontDescriptionRun06.characterRun.characterIndex = 58u;
3495   fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
3496   fontDescriptionRun06.familyLength = fontArabic.size();
3497   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
3498   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
3499   fontDescriptionRun06.familyDefined = true;
3500   fontDescriptionRun06.weightDefined = false;
3501   fontDescriptionRun06.widthDefined = false;
3502   fontDescriptionRun06.slantDefined = false;
3503   fontDescriptionRun06.sizeDefined = false;
3504
3505   Vector<FontDescriptionRun> fontDescriptionRuns;
3506   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3507   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
3508   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
3509   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
3510   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
3511   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
3512
3513   struct LineRun line01 =
3514   {
3515     { 0u, 16u },
3516     { 0u, 16u },
3517     96.f,
3518     15.f,