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