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