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