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