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