521cbf91520904057ed6eb4ad91be15bc2520b6d
[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   layoutParameters.estimatedNumberOfLines = logicalModel->mParagraphInfo.Count();
181
182   layoutSize = Vector2::ZERO;
183
184   const bool updated = engine.LayoutText( layoutParameters,
185                                           glyphPositions,
186                                           lines,
187                                           layoutSize );
188
189   // 4) Compare the results.
190
191   if( updated != data.updated )
192   {
193     std::cout << "  Different updated bool : " << updated << ", expected : " << data.updated << std::endl;
194     return false;
195   }
196
197   if( layoutSize != data.layoutSize )
198   {
199     std::cout << "  Different layout size : " << layoutSize << ", expected : " << data.layoutSize << std::endl;
200     return false;
201   }
202
203   for( unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index )
204   {
205     const Vector2& position = *( glyphPositions.Begin() + index );
206
207     if( fabsf( position.x - *( data.positions + 2u * index ) ) > Math::MACHINE_EPSILON_1000 )
208     {
209       std::cout << "  Different position for glyph " << index << " x : " << position.x << ", expected : " << *( data.positions + 2u * index ) << std::endl;
210       return false;
211     }
212     if( fabsf( position.y - *( data.positions + 2u * index + 1u ) ) > Math::MACHINE_EPSILON_1000 )
213     {
214       std::cout << "  Different position for glyph " << index << " y : " << position.y << ", expected : " << *( data.positions + 2u * index + 1u ) << std::endl;
215       return false;
216     }
217   }
218
219   if( lines.Count() != data.numberOfLines )
220   {
221     std::cout << "  Different number of lines : " << lines.Count() << ", expected : " << data.numberOfLines << std::endl;
222     return false;
223   }
224
225   for( unsigned int index = 0u; index < data.numberOfLines; ++index )
226   {
227     const LineRun& line = *( lines.Begin() + index );
228     const LineRun& expectedLine = *( data.lines + index );
229
230     if( line.glyphRun.glyphIndex != expectedLine.glyphRun.glyphIndex )
231     {
232       std::cout << "  Different line info for line : " << index << std::endl;
233       Print( line );
234       std::cout << "  expected" << std::endl;
235       Print( expectedLine );
236       return false;
237     }
238     if( line.glyphRun.numberOfGlyphs != expectedLine.glyphRun.numberOfGlyphs )
239     {
240       std::cout << "  Different line info for line : " << index << std::endl;
241       Print( line );
242       std::cout << "  expected" << std::endl;
243       Print( expectedLine );
244       return false;
245     }
246
247     if( line.characterRun.characterIndex != expectedLine.characterRun.characterIndex )
248     {
249       std::cout << "  Different line info for line : " << index << std::endl;
250       Print( line );
251       std::cout << "  expected" << std::endl;
252       Print( expectedLine );
253       return false;
254     }
255     if( line.characterRun.numberOfCharacters != expectedLine.characterRun.numberOfCharacters )
256     {
257       std::cout << "  Different line info for line : " << index << std::endl;
258       Print( line );
259       std::cout << "  expected" << std::endl;
260       Print( expectedLine );
261       return false;
262     }
263
264     if( fabsf( line.width - expectedLine.width ) > Math::MACHINE_EPSILON_1 )
265     {
266       std::cout << "  Different line info for line : " << index << std::endl;
267       Print( line );
268       std::cout << "  expected" << std::endl;
269       Print( expectedLine );
270       return false;
271     }
272
273     if( fabsf( line.ascender - expectedLine.ascender ) > Math::MACHINE_EPSILON_1 )
274     {
275       std::cout << "  Different line info for line : " << index << std::endl;
276       Print( line );
277       std::cout << "  expected" << std::endl;
278       Print( expectedLine );
279       return false;
280     }
281
282     if( fabsf( line.descender - expectedLine.descender ) > Math::MACHINE_EPSILON_1 )
283     {
284       std::cout << "  Different line info for line : " << index << std::endl;
285       Print( line );
286       std::cout << "  expected" << std::endl;
287       Print( expectedLine );
288       return false;
289     }
290
291     if( fabsf( line.extraLength - expectedLine.extraLength ) > Math::MACHINE_EPSILON_1 )
292     {
293       std::cout << "  Different line info for line : " << index << std::endl;
294       Print( line );
295       std::cout << "  expected" << std::endl;
296       Print( expectedLine );
297       return false;
298     }
299
300     if( line.ellipsis != expectedLine.ellipsis )
301     {
302       std::cout << "  Different line info for line : " << index << std::endl;
303       Print( line );
304       std::cout << "  expected" << std::endl;
305       Print( expectedLine );
306       return false;
307     }
308
309     // Do not compare the alignment offset as it's not calculated in the layout.
310     // Do not compare the line direction as it's not set in the layout.
311   }
312
313   return true;
314 }
315
316 //////////////////////////////////////////////////////////
317
318 struct ReLayoutRightToLeftLinesData
319 {
320   std::string         description;
321   std::string         text;
322   Size                textArea;
323   unsigned int        numberOfFonts;
324   FontDescriptionRun* fontDescriptions;
325   unsigned int        totalNumberOfGlyphs;
326   float*              positions;
327   unsigned int        startIndex;
328   unsigned int        numberOfCharacters;
329 };
330
331 bool ReLayoutRightToLeftLinesTest( const ReLayoutRightToLeftLinesData& data )
332 {
333   // Load some fonts.
334   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
335   fontClient.SetDpi( 96u, 96u );
336
337   char* pathNamePtr = get_current_dir_name();
338   const std::string pathName( pathNamePtr );
339   free( pathNamePtr );
340
341   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
342   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
343   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
344
345   // 1) Create the model.
346   LogicalModelPtr logicalModel = LogicalModel::New();
347   VisualModelPtr visualModel = VisualModel::New();
348   Size layoutSize;
349
350   Vector<FontDescriptionRun> fontDescriptionRuns;
351   if( 0u != data.numberOfFonts )
352   {
353     fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
354                                 data.fontDescriptions,
355                                 data.fontDescriptions + data.numberOfFonts );
356   }
357
358   LayoutOptions options;
359   options.reorder = false;
360   options.align = false;
361   CreateTextModel( data.text,
362                    data.textArea,
363                    fontDescriptionRuns,
364                    options,
365                    layoutSize,
366                    logicalModel,
367                    visualModel );
368
369   // 2) Call the ReLayoutRightToLeftLines() method.
370   MetricsPtr metrics = Metrics::New( fontClient );
371
372   LayoutEngine engine;
373   engine.SetMetrics( metrics );
374
375   LayoutParameters layoutParameters( data.textArea,
376                                      logicalModel->mText.Begin(),
377                                      logicalModel->mLineBreakInfo.Begin(),
378                                      logicalModel->mWordBreakInfo.Begin(),
379                                      ( 0u != logicalModel->mCharacterDirections.Count() ) ? logicalModel->mCharacterDirections.Begin() : NULL,
380                                      visualModel->mGlyphs.Begin(),
381                                      visualModel->mGlyphsToCharacters.Begin(),
382                                      visualModel->mCharactersPerGlyph.Begin(),
383                                      visualModel->mCharactersToGlyph.Begin(),
384                                      visualModel->mGlyphsPerCharacter.Begin(),
385                                      visualModel->mGlyphs.Count() );
386
387   layoutParameters.numberOfBidirectionalInfoRuns = logicalModel->mBidirectionalLineInfo.Count();
388   layoutParameters.lineBidirectionalInfoRunsBuffer = logicalModel->mBidirectionalLineInfo.Begin();
389
390   engine.ReLayoutRightToLeftLines( layoutParameters,
391                                    data.startIndex,
392                                    data.numberOfCharacters,
393                                    visualModel->mGlyphPositions );
394
395   // 3) Compare the results.
396   Vector<Vector2>& glyphPositions = visualModel->mGlyphPositions;
397
398   if( data.totalNumberOfGlyphs != visualModel->mGlyphs.Count() )
399   {
400     std::cout << "  Different number of glyphs : " << visualModel->mGlyphs.Count() << ", expected : " << data.totalNumberOfGlyphs << std::endl;
401     return false;
402   }
403
404   for( unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index )
405   {
406     const Vector2& position = *( glyphPositions.Begin() + index );
407
408     if( fabsf( position.x - *( data.positions + 2u * index ) ) > Math::MACHINE_EPSILON_1000 )
409     {
410       std::cout << "  Different position for glyph " << index << " x : " << position.x << ", expected : " << *( data.positions + 2u * index ) << std::endl;
411       return false;
412     }
413     if( fabsf( position.y - *( data.positions + 2u * index + 1u ) ) > Math::MACHINE_EPSILON_1000 )
414     {
415       std::cout << "  Different position for glyph " << index << " y : " << position.y << ", expected : " << *( data.positions + 2u * index + 1u ) << std::endl;
416       return false;
417     }
418   }
419
420   return true;
421 }
422
423 //////////////////////////////////////////////////////////
424
425 struct AlignData
426 {
427   std::string                       description;
428   std::string                       text;
429   Size                              textArea;
430   unsigned int                      numberOfFonts;
431   FontDescriptionRun*               fontDescriptions;
432   LayoutEngine::HorizontalAlignment horizontalAlignment;
433   LayoutEngine::VerticalAlignment   verticalAlignment;
434   unsigned int                      startIndex;
435   unsigned int                      numberOfCharacters;
436   unsigned int                      numberOfLines;
437   float*                            lineOffsets;
438 };
439
440 bool AlignTest( const AlignData& data )
441 {
442   // Load some fonts.
443   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
444   fontClient.SetDpi( 96u, 96u );
445
446   char* pathNamePtr = get_current_dir_name();
447   const std::string pathName( pathNamePtr );
448   free( pathNamePtr );
449
450   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
451   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
452   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
453
454   // 1) Create the model.
455   LogicalModelPtr logicalModel = LogicalModel::New();
456   VisualModelPtr visualModel = VisualModel::New();
457   Size layoutSize;
458
459   Vector<FontDescriptionRun> fontDescriptionRuns;
460   if( 0u != data.numberOfFonts )
461   {
462     fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
463                                 data.fontDescriptions,
464                                 data.fontDescriptions + data.numberOfFonts );
465   }
466
467   LayoutOptions options;
468   options.align = false;
469   CreateTextModel( data.text,
470                    data.textArea,
471                    fontDescriptionRuns,
472                    options,
473                    layoutSize,
474                    logicalModel,
475                    visualModel );
476
477   // Call the Align method.
478   MetricsPtr metrics = Metrics::New( fontClient );
479
480   LayoutEngine engine;
481   engine.SetMetrics( metrics );
482
483   engine.SetHorizontalAlignment( data.horizontalAlignment );
484   engine.SetVerticalAlignment( data.verticalAlignment );
485
486   engine.Align( data.textArea,
487                 data.startIndex,
488                 data.numberOfCharacters,
489                 visualModel->mLines );
490
491   // Compare results.
492   if( data.numberOfLines != visualModel->mLines.Count() )
493   {
494     std::cout << "  Different number of lines : " << visualModel->mLines.Count() << ", expected : " << data.numberOfLines << std::endl;
495     return false;
496   }
497
498   const LineRun* const linesBuffer = visualModel->mLines.Begin();
499   for( unsigned int index = 0u; index < data.numberOfLines; ++index )
500   {
501     const LineRun& line = *( linesBuffer + index );
502
503     if( line.alignmentOffset != *( data.lineOffsets + index ) )
504     {
505       std::cout << "  different line offset for index " << index << " : " << line.alignmentOffset << ", expected : " << *( data.lineOffsets + index ) << std::endl;
506       return false;
507     }
508   }
509
510   return true;
511 }
512
513 } // namespace
514
515 //////////////////////////////////////////////////////////
516 //
517 // UtcDaliTextLayoutSetGetLayout
518 // UtcDaliTextLayoutSetGetTextEllipsisEnabled
519 // UtcDaliTextLayoutSetGetHorizontalAlignment
520 // UtcDaliTextLayoutSetGetVerticalAlignment
521 // UtcDaliTextLayoutSetGetCursorWidth
522 // UtcDaliTextLayoutNoText
523 // UtcDaliTextLayoutSmallTextArea01
524 // UtcDaliTextLayoutSmallTextArea02
525 // UtcDaliTextLayoutMultilineText01
526 // UtcDaliTextLayoutMultilineText02
527 // UtcDaliTextLayoutMultilineText03
528 // UtcDaliTextLayoutMultilineText04
529 // UtcDaliTextLayoutMultilineText05
530 // UtcDaliTextUpdateLayout01
531 // UtcDaliTextUpdateLayout02
532 // UtcDaliTextUpdateLayout03
533 // UtcDaliTextLayoutEllipsis01
534 // UtcDaliTextLayoutEllipsis02
535 // UtcDaliTextLayoutEllipsis03
536 // UtcDaliTextLayoutEllipsis04
537 // UtcDaliTextLayoutEllipsis04
538 // UtcDaliTextReorderLayout01
539 // UtcDaliTextReorderLayout02
540 // UtcDaliTextReorderLayout03
541 // UtcDaliTextReorderLayout04
542 // UtcDaliTextAlign01
543 // UtcDaliTextAlign02
544 // UtcDaliTextAlign03
545 // UtcDaliTextAlign04
546 // UtcDaliTextAlign05
547 // UtcDaliTextAlign06
548 // UtcDaliTextAlign07
549 // UtcDaliTextAlign08
550 // UtcDaliTextAlign09
551 //
552 //////////////////////////////////////////////////////////
553
554 int UtcDaliTextLayoutSetGetLayout(void)
555 {
556   ToolkitTestApplication application;
557   tet_infoline(" UtcDaliTextLayoutSetGetLayout");
558
559   LayoutEngine engine;
560
561   DALI_TEST_CHECK( LayoutEngine::SINGLE_LINE_BOX == engine.GetLayout() );
562
563   engine.SetLayout( LayoutEngine::MULTI_LINE_BOX );
564   DALI_TEST_CHECK( LayoutEngine::MULTI_LINE_BOX == engine.GetLayout() );
565
566   tet_result(TET_PASS);
567   END_TEST;
568 }
569
570 int UtcDaliTextLayoutSetGetTextEllipsisEnabled(void)
571 {
572   ToolkitTestApplication application;
573   tet_infoline(" UtcDaliTextLayoutSetGetTextEllipsisEnabled");
574
575   LayoutEngine engine;
576
577   DALI_TEST_CHECK( !engine.GetTextEllipsisEnabled() );
578
579   engine.SetTextEllipsisEnabled( true );
580   DALI_TEST_CHECK( engine.GetTextEllipsisEnabled() );
581
582   tet_result(TET_PASS);
583   END_TEST;
584 }
585
586 int UtcDaliTextLayoutSetGetHorizontalAlignment(void)
587 {
588   ToolkitTestApplication application;
589   tet_infoline(" ");
590
591   LayoutEngine engine;
592
593   DALI_TEST_CHECK( LayoutEngine::HORIZONTAL_ALIGN_BEGIN == engine.GetHorizontalAlignment() );
594
595   engine.SetHorizontalAlignment( LayoutEngine::HORIZONTAL_ALIGN_END );
596   DALI_TEST_CHECK( LayoutEngine::HORIZONTAL_ALIGN_END == engine.GetHorizontalAlignment() );
597
598   tet_result(TET_PASS);
599   END_TEST;
600 }
601
602 int UtcDaliTextLayoutSetGetVerticalAlignment(void)
603 {
604   ToolkitTestApplication application;
605   tet_infoline(" UtcDaliTextLayoutSetGetVerticalAlignment");
606
607   LayoutEngine engine;
608
609   DALI_TEST_CHECK( LayoutEngine::VERTICAL_ALIGN_TOP == engine.GetVerticalAlignment() );
610
611   engine.SetVerticalAlignment( LayoutEngine::VERTICAL_ALIGN_TOP );
612   DALI_TEST_CHECK( LayoutEngine::VERTICAL_ALIGN_TOP == engine.GetVerticalAlignment() );
613
614
615   tet_result(TET_PASS);
616   END_TEST;
617 }
618
619 int UtcDaliTextLayoutSetGetCursorWidth(void)
620 {
621   ToolkitTestApplication application;
622   tet_infoline(" ");
623
624   LayoutEngine engine;
625
626   DALI_TEST_EQUALS( 1, engine.GetCursorWidth(), TEST_LOCATION );
627
628   engine.SetCursorWidth( 2 );
629   DALI_TEST_EQUALS( 2, engine.GetCursorWidth(), TEST_LOCATION );
630
631   tet_result(TET_PASS);
632   END_TEST;
633 }
634
635 int UtcDaliTextLayoutNoText(void)
636 {
637   ToolkitTestApplication application;
638   tet_infoline(" UtcDaliTextLayoutNoText");
639
640   Size textArea(100.f, 60.f);
641   Size layoutSize = Vector2::ZERO;
642   LayoutTextData data =
643   {
644     "No text",
645     "",
646     textArea,
647     0u,
648     NULL,
649     layoutSize,
650     0u,
651     NULL,
652     0u,
653     NULL,
654     LayoutEngine::MULTI_LINE_BOX,
655     0u,
656     0u,
657     false,
658     false
659   };
660
661   if( !LayoutTextTest( data ) )
662   {
663     tet_result(TET_FAIL);
664   }
665
666   tet_result(TET_PASS);
667   END_TEST;
668 }
669
670 int UtcDaliTextLayoutSmallTextArea01(void)
671 {
672   ToolkitTestApplication application;
673   tet_infoline(" UtcDaliTextLayoutSmallTextArea01");
674
675   // Won't layout the text in multi-line if the width is too small.
676
677   const std::string fontFamily( "TizenSans" );
678
679   // Set a known font description
680   FontDescriptionRun fontDescriptionRun;
681   fontDescriptionRun.characterRun.characterIndex = 0u;
682   fontDescriptionRun.characterRun.numberOfCharacters = 11u;
683   fontDescriptionRun.familyLength = fontFamily.size();
684   fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
685   memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
686   fontDescriptionRun.familyDefined = true;
687   fontDescriptionRun.weightDefined = false;
688   fontDescriptionRun.widthDefined = false;
689   fontDescriptionRun.slantDefined = false;
690   fontDescriptionRun.sizeDefined = false;
691
692   Vector<FontDescriptionRun> fontDescriptionRuns;
693   fontDescriptionRuns.PushBack( fontDescriptionRun );
694   Size textArea(1.f, 1.f);
695   Size layoutSize = Vector2::ZERO;
696   LayoutTextData data =
697   {
698     "Layout text in a small area",
699     "Hello world",
700     textArea,
701     1u,
702     fontDescriptionRuns.Begin(),
703     layoutSize,
704     0u,
705     NULL,
706     0u,
707     NULL,
708     LayoutEngine::MULTI_LINE_BOX,
709     0u,
710     11u,
711     false,
712     false
713   };
714
715   if( !LayoutTextTest( data ) )
716   {
717     tet_result(TET_FAIL);
718   }
719
720   tet_result(TET_PASS);
721   END_TEST;
722 }
723
724 int UtcDaliTextLayoutSmallTextArea02(void)
725 {
726   ToolkitTestApplication application;
727   tet_infoline(" UtcDaliTextLayoutSmallTextArea02");
728
729   // Will layout the text in single line as it can be scrolled.
730
731   const std::string fontFamily( "TizenSans" );
732
733   // Set a known font description
734   FontDescriptionRun fontDescriptionRun;
735   fontDescriptionRun.characterRun.characterIndex = 0u;
736   fontDescriptionRun.characterRun.numberOfCharacters = 11u;
737   fontDescriptionRun.familyLength = fontFamily.size();
738   fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
739   memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
740   fontDescriptionRun.familyDefined = true;
741   fontDescriptionRun.weightDefined = false;
742   fontDescriptionRun.widthDefined = false;
743   fontDescriptionRun.slantDefined = false;
744   fontDescriptionRun.sizeDefined = false;
745
746   Vector<FontDescriptionRun> fontDescriptionRuns;
747   fontDescriptionRuns.PushBack( fontDescriptionRun );
748   Size textArea(1.f, 1.f);
749   Size layoutSize(80.f, 20.f);
750   float positions[] = { 1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f };
751   struct LineRun line =
752   {
753     { 0u, 11u },
754     { 0u, 11u },
755     80.f,
756     15.f,
757     -5.f,
758     0.f,
759     0.f,
760     false,
761     false
762   };
763   Vector<LineRun> lines;
764   lines.PushBack( line );
765
766   LayoutTextData data =
767   {
768     "Layout text in a small area",
769     "Hello world",
770     textArea,
771     1u,
772     fontDescriptionRuns.Begin(),
773     layoutSize,
774     11u,
775     positions,
776     1u,
777     lines.Begin(),
778     LayoutEngine::SINGLE_LINE_BOX,
779     0u,
780     11u,
781     false,
782     true
783   };
784
785   if( !LayoutTextTest( data ) )
786   {
787     tet_result(TET_FAIL);
788   }
789
790   tet_result(TET_PASS);
791   END_TEST;
792 }
793
794 int UtcDaliTextLayoutMultilineText01(void)
795 {
796   ToolkitTestApplication application;
797   tet_infoline(" UtcDaliTextLayoutMultilineText01");
798
799   // Layout some lines of left to right text.
800
801   const std::string fontFamily( "TizenSans" );
802
803   // Set a known font description
804   FontDescriptionRun fontDescriptionRun1;
805   fontDescriptionRun1.characterRun.characterIndex = 0u;
806   fontDescriptionRun1.characterRun.numberOfCharacters = 18u;
807   fontDescriptionRun1.familyLength = fontFamily.size();
808   fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
809   memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength );
810   fontDescriptionRun1.familyDefined = true;
811   fontDescriptionRun1.weightDefined = false;
812   fontDescriptionRun1.widthDefined = false;
813   fontDescriptionRun1.slantDefined = false;
814   fontDescriptionRun1.sizeDefined = false;
815
816   FontDescriptionRun fontDescriptionRun2;
817   fontDescriptionRun2.characterRun.characterIndex = 18u;
818   fontDescriptionRun2.characterRun.numberOfCharacters = 31u;
819   fontDescriptionRun2.familyLength = fontFamily.size();
820   fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
821   memcpy( fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength );
822   fontDescriptionRun2.familyDefined = true;
823   fontDescriptionRun2.weightDefined = false;
824   fontDescriptionRun2.widthDefined = false;
825   fontDescriptionRun2.slantDefined = false;
826   fontDescriptionRun2.sizeDefined = false;
827
828   Vector<FontDescriptionRun> fontDescriptionRuns;
829   fontDescriptionRuns.PushBack( fontDescriptionRun1 );
830   fontDescriptionRuns.PushBack( fontDescriptionRun2 );
831   Size textArea(100.f, 300.f);
832   Size layoutSize(95.f, 97.f);
833   float positions[] =
834   {
835     1.f, -12.f, 12.f,  -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f,  -0.f, 40.f, -9.f, 51.f,  -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
836     0.f, -13.f, 10.f,  -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -3.f, 42.f, -12.f,
837     1.f, -12.f,  9.f,  -9.f, 17.f,  -9.f, 27.f,  -9.f, 36.f, -9.f, 45.f, -11.f, 51.f, -0.f,
838     1.f, -12.f, 11.f, -12.f, 15.f, -12.f, 26.f,  -9.f, 35.f, -9.f, 41.f,  -9.f, 50.f, -9.f, 59.f, -11.f, 65.f, -0.f,
839     1.f, -12.f,  5.f, -12.f,  9.f,  -9.f, 19.f,  -9.f, 28.f, -9.f, 35.f,  -0.f, 41.f, -9.f, 50.f, -12.f, 54.f, -0.f, 59.f, -11.f, 66.f,  -9.f, 75.f, -9.f, 83.f, -11.f, 91.f, -2.f
840   };
841   struct LineRun line0 =
842   {
843     { 0u, 12u },
844     { 0u, 12u },
845     81.f,
846     15.f,
847     -5.f,
848     3.f,
849     0.f,
850     false,
851     false
852   };
853   struct LineRun line1 =
854   {
855     { 12u, 6u },
856     { 12u, 6u },
857     43.f,
858     15.f,
859     -5.f,
860     0.f,
861     0.f,
862     false,
863     false
864   };
865   struct LineRun line2 =
866   {
867     { 18u, 7u },
868     { 18u, 7u },
869     52.f,
870     15.f,
871     -4.f,
872     5.f,
873     0.f,
874     false,
875     false
876   };
877   struct LineRun line3 =
878   {
879     { 25u, 9u },
880     { 25u, 10u },
881     66.f,
882     15.f,
883     -4.f,
884     5.f,
885     0.f,
886     false,
887     false
888   };
889   struct LineRun line4 =
890   {
891     { 34u, 14u },
892     { 35u, 14u },
893     95.f,
894     15.f,
895     -4.f,
896     0.f,
897     0.f,
898     false,
899     false
900   };
901   Vector<LineRun> lines;
902   lines.PushBack( line0 );
903   lines.PushBack( line1 );
904   lines.PushBack( line2 );
905   lines.PushBack( line3 );
906   lines.PushBack( line4 );
907
908   LayoutTextData data =
909   {
910     "Layout simple multi-line text",
911     "Hello world demo.\n"
912     "Layout different lines of text.",
913     textArea,
914     1u,
915     fontDescriptionRuns.Begin(),
916     layoutSize,
917     48u,
918     positions,
919     5u,
920     lines.Begin(),
921     LayoutEngine::MULTI_LINE_BOX,
922     0u,
923     48u,
924     false,
925     true
926   };
927
928   if( !LayoutTextTest( data ) )
929   {
930     tet_result(TET_FAIL);
931   }
932
933   tet_result(TET_PASS);
934   END_TEST;
935 }
936
937 int UtcDaliTextLayoutMultilineText02(void)
938 {
939   ToolkitTestApplication application;
940   tet_infoline(" UtcDaliTextLayoutMultilineText02");
941
942   // Layout some lines of bidirectional text.
943
944   const std::string fontFamily1( "TizenSans" );
945
946   // Set a known font description
947   FontDescriptionRun fontDescriptionRun1;
948   fontDescriptionRun1.characterRun.characterIndex = 0u;
949   fontDescriptionRun1.characterRun.numberOfCharacters = 17u;
950   fontDescriptionRun1.familyLength = fontFamily1.size();
951   fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
952   memcpy( fontDescriptionRun1.familyName, fontFamily1.c_str(), fontDescriptionRun1.familyLength );
953   fontDescriptionRun1.familyDefined = true;
954   fontDescriptionRun1.weightDefined = false;
955   fontDescriptionRun1.widthDefined = false;
956   fontDescriptionRun1.slantDefined = false;
957   fontDescriptionRun1.sizeDefined = false;
958
959   const std::string fontFamily2( "TizenSansHebrew" );
960
961   // Set a known font description
962   FontDescriptionRun fontDescriptionRun2;
963   fontDescriptionRun2.characterRun.characterIndex = 17u;
964   fontDescriptionRun2.characterRun.numberOfCharacters = 11u;
965   fontDescriptionRun2.familyLength = fontFamily2.size();
966   fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
967   memcpy( fontDescriptionRun2.familyName, fontFamily2.c_str(), fontDescriptionRun2.familyLength );
968   fontDescriptionRun2.familyDefined = true;
969   fontDescriptionRun2.weightDefined = false;
970   fontDescriptionRun2.widthDefined = false;
971   fontDescriptionRun2.slantDefined = false;
972   fontDescriptionRun2.sizeDefined = false;
973
974   const std::string fontFamily3( "TizenSansHebrew" );
975
976   // Set a known font description
977   FontDescriptionRun fontDescriptionRun3;
978   fontDescriptionRun3.characterRun.characterIndex = 28u;
979   fontDescriptionRun3.characterRun.numberOfCharacters = 10u;
980   fontDescriptionRun3.familyLength = fontFamily3.size();
981   fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength];
982   memcpy( fontDescriptionRun3.familyName, fontFamily3.c_str(), fontDescriptionRun3.familyLength );
983   fontDescriptionRun3.familyDefined = true;
984   fontDescriptionRun3.weightDefined = false;
985   fontDescriptionRun3.widthDefined = false;
986   fontDescriptionRun3.slantDefined = false;
987   fontDescriptionRun3.sizeDefined = false;
988
989   const std::string fontFamily4( "TizenSans" );
990
991   // Set a known font description
992   FontDescriptionRun fontDescriptionRun4;
993   fontDescriptionRun4.characterRun.characterIndex = 38u;
994   fontDescriptionRun4.characterRun.numberOfCharacters = 17u;
995   fontDescriptionRun4.familyLength = fontFamily4.size();
996   fontDescriptionRun4.familyName = new char[fontDescriptionRun4.familyLength];
997   memcpy( fontDescriptionRun4.familyName, fontFamily4.c_str(), fontDescriptionRun4.familyLength );
998   fontDescriptionRun4.familyDefined = true;
999   fontDescriptionRun4.weightDefined = false;
1000   fontDescriptionRun4.widthDefined = false;
1001   fontDescriptionRun4.slantDefined = false;
1002   fontDescriptionRun4.sizeDefined = false;
1003
1004   Vector<FontDescriptionRun> fontDescriptionRuns;
1005   fontDescriptionRuns.PushBack( fontDescriptionRun1 );
1006   fontDescriptionRuns.PushBack( fontDescriptionRun2 );
1007   fontDescriptionRuns.PushBack( fontDescriptionRun3 );
1008   fontDescriptionRuns.PushBack( fontDescriptionRun4 );
1009   Size textArea(100.f, 300.f);
1010   Size layoutSize(81.f, 120.f);
1011   float positions[] =
1012   {
1013     1.f, -12.f, 12.f,  -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f,  -0.f, 40.f,  -9.f, 51.f,  -9.f, 61.f,  -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
1014     0.f, -13.f, 10.f,  -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f,  -0.f,
1015     1.f, -10.f,  9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 32.f, -2.f, 35.f, -11.f,
1016     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f,  -0.f,
1017     1.f, -13.f, 10.f,  -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f,  -0.f, 38.f,  -9.f, 49.f,  -9.f, 59.f,  -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
1018     0.f, -13.f, 10.f,  -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -3.f,
1019   };
1020   struct LineRun line0 =
1021   {
1022     { 0u, 12u },
1023     { 0u, 12u },
1024     81.f,
1025     15.f,
1026     -5.f,
1027     3.f,
1028     0.f,
1029     false,
1030     false
1031   };
1032   struct LineRun line1 =
1033   {
1034     { 12u, 10u },
1035     { 12u, 10u },
1036     76.f,
1037     15.f,
1038     -5.f,
1039     4.f,
1040     0.f,
1041     false,
1042     false
1043   };
1044   struct LineRun line2 =
1045   {
1046     { 22u, 6u },
1047     { 22u, 6u },
1048     36.f,
1049     15.f,
1050     -5.f,
1051     0.f,
1052     0.f,
1053     false,
1054     false
1055   };
1056   struct LineRun line3 =
1057   {
1058     { 28u, 10u },
1059     { 28u, 10u },
1060     67.f,
1061     15.f,
1062     -5.f,
1063     4.f,
1064     0.f,
1065     false,
1066     false
1067   };
1068   struct LineRun line4 =
1069   {
1070     { 38u, 12u },
1071     { 38u, 12u },
1072     79.f,
1073     15.f,
1074     -5.f,
1075     3.f,
1076     0.f,
1077     false,
1078     false
1079   };
1080   struct LineRun line5 =
1081   {
1082     { 50u, 5u },
1083     { 50u, 5u },
1084     43.f,
1085     15.f,
1086     -5.f,
1087     0.f,
1088     0.f,
1089     false,
1090     false
1091   };
1092   Vector<LineRun> lines;
1093   lines.PushBack( line0 );
1094   lines.PushBack( line1 );
1095   lines.PushBack( line2 );
1096   lines.PushBack( line3 );
1097   lines.PushBack( line4 );
1098   lines.PushBack( line5 );
1099
1100   LayoutTextData data =
1101   {
1102     "Layout bidirectional text.",
1103     "Hello world demo שלום עולם.\n"
1104     "שלום עולם hello world demo.",
1105     textArea,
1106     4u,
1107     fontDescriptionRuns.Begin(),
1108     layoutSize,
1109     55u,
1110     positions,
1111     6u,
1112     lines.Begin(),
1113     LayoutEngine::MULTI_LINE_BOX,
1114     0u,
1115     55u,
1116     false,
1117     true
1118   };
1119
1120   if( !LayoutTextTest( data ) )
1121   {
1122     tet_result(TET_FAIL);
1123   }
1124
1125   tet_result(TET_PASS);
1126   END_TEST;
1127 }
1128
1129 int UtcDaliTextLayoutMultilineText03(void)
1130 {
1131   ToolkitTestApplication application;
1132   tet_infoline(" UtcDaliTextLayoutMultilineText03");
1133
1134   // Layout a long word which doesn't fit in the width of the text area.
1135
1136   const std::string fontFamily( "TizenSans" );
1137
1138   // Set a known font description
1139   FontDescriptionRun fontDescriptionRun;
1140   fontDescriptionRun.characterRun.characterIndex = 0u;
1141   fontDescriptionRun.characterRun.numberOfCharacters = 29u;
1142   fontDescriptionRun.familyLength = fontFamily.size();
1143   fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1144   memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1145   fontDescriptionRun.familyDefined = true;
1146   fontDescriptionRun.weightDefined = false;
1147   fontDescriptionRun.widthDefined = false;
1148   fontDescriptionRun.slantDefined = false;
1149   fontDescriptionRun.sizeDefined = false;
1150
1151   Vector<FontDescriptionRun> fontDescriptionRuns;
1152   fontDescriptionRuns.PushBack( fontDescriptionRun );
1153   Size textArea(100.f, 300.f);
1154   Size layoutSize(96.f, 60.f);
1155   float positions[] =
1156   {
1157     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f,  -9.f, 36.f,  -9.f, 47.f, -9.f, 57.f, -9.f, 63.f, -13.f, 66.f, -13.f, 75.f, -13.f, 85.f,  -9.f,
1158     1.f,  -9.f, 13.f, -9.f, 23.f, -13.f, 32.f,  -9.f, 40.f, -13.f, 44.f, -13.f, 47.f, -9.f, 56.f, -9.f, 67.f,  -9.f, 77.f,  -9.f, 83.f, -13.f, 86.f, -13.f,
1159     0.f, -13.f, 10.f, -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f,  -3.f,
1160   };
1161   struct LineRun line0 =
1162   {
1163     { 0u, 12u },
1164     { 0u, 12u },
1165     94.f,
1166     15.f,
1167     -5.f,
1168     0.f,
1169     0.f,
1170     false,
1171     false
1172   };
1173   struct LineRun line1 =
1174   {
1175     { 12u, 12u },
1176     { 12u, 12u },
1177     96.f,
1178     15.f,
1179     -5.f,
1180     0.f,
1181     0.f,
1182     false,
1183     false
1184   };
1185   struct LineRun line2 =
1186   {
1187     { 24u, 5u },
1188     { 24u, 5u },
1189     43.f,
1190     15.f,
1191     -5.f,
1192     0.f,
1193     0.f,
1194     false,
1195     false
1196   };
1197   Vector<LineRun> lines;
1198   lines.PushBack( line0 );
1199   lines.PushBack( line1 );
1200   lines.PushBack( line2 );
1201
1202   LayoutTextData data =
1203   {
1204     "Layout a long word which doesn't fit in the width of the text area.",
1205     "Helloworlddemohelloworlddemo.",
1206     textArea,
1207     1u,
1208     fontDescriptionRuns.Begin(),
1209     layoutSize,
1210     29u,
1211     positions,
1212     3u,
1213     lines.Begin(),
1214     LayoutEngine::MULTI_LINE_BOX,
1215     0u,
1216     29u,
1217     false,
1218     true
1219   };
1220
1221   if( !LayoutTextTest( data ) )
1222   {
1223     tet_result(TET_FAIL);
1224   }
1225
1226   tet_result(TET_PASS);
1227   END_TEST;
1228 }
1229
1230 int UtcDaliTextLayoutMultilineText04(void)
1231 {
1232   ToolkitTestApplication application;
1233   tet_infoline(" UtcDaliTextLayoutMultilineText04");
1234
1235   // Layout simple text ending with a \n. It has to add a void line at the end.
1236
1237   const std::string fontFamily( "TizenSans" );
1238
1239   // Set a known font description
1240   FontDescriptionRun fontDescriptionRun;
1241   fontDescriptionRun.characterRun.characterIndex = 0u;
1242   fontDescriptionRun.characterRun.numberOfCharacters = 13u;
1243   fontDescriptionRun.familyLength = fontFamily.size();
1244   fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1245   memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1246   fontDescriptionRun.familyDefined = true;
1247   fontDescriptionRun.weightDefined = false;
1248   fontDescriptionRun.widthDefined = false;
1249   fontDescriptionRun.slantDefined = false;
1250   fontDescriptionRun.sizeDefined = false;
1251
1252   Vector<FontDescriptionRun> fontDescriptionRuns;
1253   fontDescriptionRuns.PushBack( fontDescriptionRun );
1254   Size textArea(100.f, 300.f);
1255   Size layoutSize(83.f, 40.f);
1256   float positions[] =
1257   {
1258     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -3.f, 82.f, -12.f
1259   };
1260   struct LineRun line0 =
1261   {
1262     { 0u, 13u },
1263     { 0u, 13u },
1264     83.f,
1265     15.f,
1266     -5.f,
1267     0.f,
1268     0.f,
1269     false,
1270     false
1271   };
1272   struct LineRun line1 =
1273   {
1274     { 13u, 0u },
1275     { 13u, 0u },
1276     0.f,
1277     15.f,
1278     -5.f,
1279     0.f,
1280     0.f,
1281     false,
1282     false
1283   };
1284   Vector<LineRun> lines;
1285   lines.PushBack( line0 );
1286   lines.PushBack( line1 );
1287
1288   LayoutTextData data =
1289   {
1290     "Layout simple text ending with a \n.",
1291     "Hello world.\n",
1292     textArea,
1293     1u,
1294     fontDescriptionRuns.Begin(),
1295     layoutSize,
1296     13u,
1297     positions,
1298     2u,
1299     lines.Begin(),
1300     LayoutEngine::MULTI_LINE_BOX,
1301     0u,
1302     13u,
1303     false,
1304     true
1305   };
1306
1307   if( !LayoutTextTest( data ) )
1308   {
1309     tet_result(TET_FAIL);
1310   }
1311
1312   tet_result(TET_PASS);
1313   END_TEST;
1314 }
1315
1316 int UtcDaliTextLayoutMultilineText05(void)
1317 {
1318   ToolkitTestApplication application;
1319   tet_infoline(" UtcDaliTextLayoutMultilineText05");
1320
1321   // Layout simple text with one character with a different font size.
1322
1323   const std::string fontFamily( "TizenSans" );
1324
1325   // Set a known font description
1326   FontDescriptionRun fontDescriptionRun1;
1327   fontDescriptionRun1.characterRun.characterIndex = 0u;
1328   fontDescriptionRun1.characterRun.numberOfCharacters = 6u;
1329   fontDescriptionRun1.familyLength = fontFamily.size();
1330   fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
1331   memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength );
1332   fontDescriptionRun1.familyDefined = true;
1333   fontDescriptionRun1.weightDefined = false;
1334   fontDescriptionRun1.widthDefined = false;
1335   fontDescriptionRun1.slantDefined = false;
1336   fontDescriptionRun1.sizeDefined = false;
1337
1338   FontDescriptionRun fontDescriptionRun2;
1339   fontDescriptionRun2.characterRun.characterIndex = 6u;
1340   fontDescriptionRun2.characterRun.numberOfCharacters = 1u;
1341   fontDescriptionRun2.familyLength = fontFamily.size();
1342   fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
1343   memcpy( fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength );
1344   fontDescriptionRun2.size = 1280u;
1345   fontDescriptionRun2.familyDefined = true;
1346   fontDescriptionRun2.weightDefined = false;
1347   fontDescriptionRun2.widthDefined = false;
1348   fontDescriptionRun2.slantDefined = false;
1349   fontDescriptionRun2.sizeDefined = true;
1350
1351   FontDescriptionRun fontDescriptionRun3;
1352   fontDescriptionRun3.characterRun.characterIndex = 7u;
1353   fontDescriptionRun3.characterRun.numberOfCharacters = 10u;
1354   fontDescriptionRun3.familyLength = fontFamily.size();
1355   fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength];
1356   memcpy( fontDescriptionRun3.familyName, fontFamily.c_str(), fontDescriptionRun3.familyLength );
1357   fontDescriptionRun3.familyDefined = true;
1358   fontDescriptionRun3.weightDefined = false;
1359   fontDescriptionRun3.widthDefined = false;
1360   fontDescriptionRun3.slantDefined = false;
1361   fontDescriptionRun3.sizeDefined = false;
1362
1363   Vector<FontDescriptionRun> fontDescriptionRuns;
1364   fontDescriptionRuns.PushBack( fontDescriptionRun1 );
1365   fontDescriptionRuns.PushBack( fontDescriptionRun2 );
1366   fontDescriptionRuns.PushBack( fontDescriptionRun3 );
1367   Size textArea(100.f, 300.f);
1368   Size layoutSize(88.f, 53.f);
1369   float positions[] =
1370   {
1371     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -14.f, 59.f, -9.f, 69.f, -9.f, 75.f, -13.f, 78.f, -13.f, 87.f, -0.f,
1372     0.f, -13.f, 10.f, -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -3.f
1373   };
1374   struct LineRun line0 =
1375   {
1376     { 0u, 12u },
1377     { 0u, 12u },
1378     88.f,
1379     25.f,
1380     -8.f,
1381     4.f,
1382     0.f,
1383     false,
1384     false
1385   };
1386   struct LineRun line1 =
1387   {
1388     { 12u, 5u },
1389     { 12u, 5u },
1390     43.f,
1391     15.f,
1392     -5.f,
1393     0.f,
1394     0.f,
1395     false,
1396     false
1397   };
1398   Vector<LineRun> lines;
1399   lines.PushBack( line0 );
1400   lines.PushBack( line1 );
1401
1402   LayoutTextData data =
1403   {
1404     "Layout simple text with one character with a different font size.",
1405     "Hello world demo.",
1406     textArea,
1407     3u,
1408     fontDescriptionRuns.Begin(),
1409     layoutSize,
1410     17u,
1411     positions,
1412     2u,
1413     lines.Begin(),
1414     LayoutEngine::MULTI_LINE_BOX,
1415     0u,
1416     17u,
1417     false,
1418     true
1419   };
1420
1421   if( !LayoutTextTest( data ) )
1422   {
1423     tet_result(TET_FAIL);
1424   }
1425
1426   tet_result(TET_PASS);
1427   END_TEST;
1428 }
1429
1430 int UtcDaliTextUpdateLayout01(void)
1431 {
1432   ToolkitTestApplication application;
1433   tet_infoline(" UtcDaliTextUpdateLayout01");
1434
1435   // Layout some lines of bidirectional text. Update the paragraphs at the beginning.
1436
1437   const std::string fontLatin( "TizenSans" );
1438   const std::string fontHebrew( "TizenSansHebrew" );
1439   const std::string fontArabic( "TizenSansArabic" );
1440
1441   // Set a known font description
1442   FontDescriptionRun fontDescriptionRun01;
1443   fontDescriptionRun01.characterRun.characterIndex = 0u;
1444   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
1445   fontDescriptionRun01.familyLength = fontLatin.size();
1446   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
1447   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
1448   fontDescriptionRun01.familyDefined = true;
1449   fontDescriptionRun01.weightDefined = false;
1450   fontDescriptionRun01.widthDefined = false;
1451   fontDescriptionRun01.slantDefined = false;
1452   fontDescriptionRun01.sizeDefined = false;
1453
1454   // Set a known font description
1455   FontDescriptionRun fontDescriptionRun02;
1456   fontDescriptionRun02.characterRun.characterIndex = 17u;
1457   fontDescriptionRun02.characterRun.numberOfCharacters = 11u;
1458   fontDescriptionRun02.familyLength = fontHebrew.size();
1459   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
1460   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
1461   fontDescriptionRun02.familyDefined = true;
1462   fontDescriptionRun02.weightDefined = false;
1463   fontDescriptionRun02.widthDefined = false;
1464   fontDescriptionRun02.slantDefined = false;
1465   fontDescriptionRun02.sizeDefined = false;
1466
1467   // Set a known font description
1468   FontDescriptionRun fontDescriptionRun03;
1469   fontDescriptionRun03.characterRun.characterIndex = 28u;
1470   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
1471   fontDescriptionRun03.familyLength = fontArabic.size();
1472   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
1473   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
1474   fontDescriptionRun03.familyDefined = true;
1475   fontDescriptionRun03.weightDefined = false;
1476   fontDescriptionRun03.widthDefined = false;
1477   fontDescriptionRun03.slantDefined = false;
1478   fontDescriptionRun03.sizeDefined = false;
1479
1480   // Set a known font description
1481   FontDescriptionRun fontDescriptionRun04;
1482   fontDescriptionRun04.characterRun.characterIndex = 42u;
1483   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
1484   fontDescriptionRun04.familyLength = fontLatin.size();
1485   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
1486   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
1487   fontDescriptionRun04.familyDefined = true;
1488   fontDescriptionRun04.weightDefined = false;
1489   fontDescriptionRun04.widthDefined = false;
1490   fontDescriptionRun04.slantDefined = false;
1491   fontDescriptionRun04.sizeDefined = false;
1492
1493   // Set a known font description
1494   FontDescriptionRun fontDescriptionRun05;
1495   fontDescriptionRun05.characterRun.characterIndex = 54u;
1496   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
1497   fontDescriptionRun05.familyLength = fontHebrew.size();
1498   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
1499   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
1500   fontDescriptionRun05.familyDefined = true;
1501   fontDescriptionRun05.weightDefined = false;
1502   fontDescriptionRun05.widthDefined = false;
1503   fontDescriptionRun05.slantDefined = false;
1504   fontDescriptionRun05.sizeDefined = false;
1505
1506   // Set a known font description
1507   FontDescriptionRun fontDescriptionRun06;
1508   fontDescriptionRun06.characterRun.characterIndex = 64u;
1509   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
1510   fontDescriptionRun06.familyLength = fontHebrew.size();
1511   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
1512   memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
1513   fontDescriptionRun06.familyDefined = true;
1514   fontDescriptionRun06.weightDefined = false;
1515   fontDescriptionRun06.widthDefined = false;
1516   fontDescriptionRun06.slantDefined = false;
1517   fontDescriptionRun06.sizeDefined = false;
1518
1519   // Set a known font description
1520   FontDescriptionRun fontDescriptionRun07;
1521   fontDescriptionRun07.characterRun.characterIndex = 74u;
1522   fontDescriptionRun07.characterRun.numberOfCharacters = 18u;
1523   fontDescriptionRun07.familyLength = fontLatin.size();
1524   fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
1525   memcpy( fontDescriptionRun07.familyName, fontLatin.c_str(), fontDescriptionRun07.familyLength );
1526   fontDescriptionRun07.familyDefined = true;
1527   fontDescriptionRun07.weightDefined = false;
1528   fontDescriptionRun07.widthDefined = false;
1529   fontDescriptionRun07.slantDefined = false;
1530   fontDescriptionRun07.sizeDefined = false;
1531
1532   // Set a known font description
1533   FontDescriptionRun fontDescriptionRun08;
1534   fontDescriptionRun08.characterRun.characterIndex = 92u;
1535   fontDescriptionRun08.characterRun.numberOfCharacters = 12u;
1536   fontDescriptionRun08.familyLength = fontLatin.size();
1537   fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
1538   memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
1539   fontDescriptionRun08.familyDefined = true;
1540   fontDescriptionRun08.weightDefined = false;
1541   fontDescriptionRun08.widthDefined = false;
1542   fontDescriptionRun08.slantDefined = false;
1543   fontDescriptionRun08.sizeDefined = false;
1544
1545   // Set a known font description
1546   FontDescriptionRun fontDescriptionRun09;
1547   fontDescriptionRun09.characterRun.characterIndex = 104u;
1548   fontDescriptionRun09.characterRun.numberOfCharacters = 14u;
1549   fontDescriptionRun09.familyLength = fontArabic.size();
1550   fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
1551   memcpy( fontDescriptionRun09.familyName, fontArabic.c_str(), fontDescriptionRun09.familyLength );
1552   fontDescriptionRun09.familyDefined = true;
1553   fontDescriptionRun09.weightDefined = false;
1554   fontDescriptionRun09.widthDefined = false;
1555   fontDescriptionRun09.slantDefined = false;
1556   fontDescriptionRun09.sizeDefined = false;
1557
1558   // Set a known font description
1559   FontDescriptionRun fontDescriptionRun10;
1560   fontDescriptionRun10.characterRun.characterIndex = 118u;
1561   fontDescriptionRun10.characterRun.numberOfCharacters = 10u;
1562   fontDescriptionRun10.familyLength = fontHebrew.size();
1563   fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
1564   memcpy( fontDescriptionRun10.familyName, fontHebrew.c_str(), fontDescriptionRun10.familyLength );
1565   fontDescriptionRun10.familyDefined = true;
1566   fontDescriptionRun10.weightDefined = false;
1567   fontDescriptionRun10.widthDefined = false;
1568   fontDescriptionRun10.slantDefined = false;
1569   fontDescriptionRun10.sizeDefined = false;
1570
1571   // Set a known font description
1572   FontDescriptionRun fontDescriptionRun11;
1573   fontDescriptionRun11.characterRun.characterIndex = 128u;
1574   fontDescriptionRun11.characterRun.numberOfCharacters = 17u;
1575   fontDescriptionRun11.familyLength = fontLatin.size();
1576   fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
1577   memcpy( fontDescriptionRun11.familyName, fontLatin.c_str(), fontDescriptionRun11.familyLength );
1578   fontDescriptionRun11.familyDefined = true;
1579   fontDescriptionRun11.weightDefined = false;
1580   fontDescriptionRun11.widthDefined = false;
1581   fontDescriptionRun11.slantDefined = false;
1582   fontDescriptionRun11.sizeDefined = false;
1583
1584   // Set a known font description
1585   FontDescriptionRun fontDescriptionRun12;
1586   fontDescriptionRun12.characterRun.characterIndex = 145u;
1587   fontDescriptionRun12.characterRun.numberOfCharacters = 11u;
1588   fontDescriptionRun12.familyLength = fontHebrew.size();
1589   fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
1590   memcpy( fontDescriptionRun12.familyName, fontHebrew.c_str(), fontDescriptionRun12.familyLength );
1591   fontDescriptionRun12.familyDefined = true;
1592   fontDescriptionRun12.weightDefined = false;
1593   fontDescriptionRun12.widthDefined = false;
1594   fontDescriptionRun12.slantDefined = false;
1595   fontDescriptionRun12.sizeDefined = false;
1596
1597   // Set a known font description
1598   FontDescriptionRun fontDescriptionRun13;
1599   fontDescriptionRun13.characterRun.characterIndex = 156u;
1600   fontDescriptionRun13.characterRun.numberOfCharacters = 10u;
1601   fontDescriptionRun13.familyLength = fontHebrew.size();
1602   fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
1603   memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
1604   fontDescriptionRun13.familyDefined = true;
1605   fontDescriptionRun13.weightDefined = false;
1606   fontDescriptionRun13.widthDefined = false;
1607   fontDescriptionRun13.slantDefined = false;
1608   fontDescriptionRun13.sizeDefined = false;
1609
1610   // Set a known font description
1611   FontDescriptionRun fontDescriptionRun14;
1612   fontDescriptionRun14.characterRun.characterIndex = 166u;
1613   fontDescriptionRun14.characterRun.numberOfCharacters = 12u;
1614   fontDescriptionRun14.familyLength = fontLatin.size();
1615   fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
1616   memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
1617   fontDescriptionRun14.familyDefined = true;
1618   fontDescriptionRun14.weightDefined = false;
1619   fontDescriptionRun14.widthDefined = false;
1620   fontDescriptionRun14.slantDefined = false;
1621   fontDescriptionRun14.sizeDefined = false;
1622
1623   // Set a known font description
1624   FontDescriptionRun fontDescriptionRun15;
1625   fontDescriptionRun15.characterRun.characterIndex = 178u;
1626   fontDescriptionRun15.characterRun.numberOfCharacters = 14u;
1627   fontDescriptionRun15.familyLength = fontArabic.size();
1628   fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
1629   memcpy( fontDescriptionRun15.familyName, fontArabic.c_str(), fontDescriptionRun15.familyLength );
1630   fontDescriptionRun15.familyDefined = true;
1631   fontDescriptionRun15.weightDefined = false;
1632   fontDescriptionRun15.widthDefined = false;
1633   fontDescriptionRun15.slantDefined = false;
1634   fontDescriptionRun15.sizeDefined = false;
1635
1636   Vector<FontDescriptionRun> fontDescriptionRuns;
1637   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
1638   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
1639   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
1640   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
1641   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
1642   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
1643   fontDescriptionRuns.PushBack( fontDescriptionRun07 );
1644   fontDescriptionRuns.PushBack( fontDescriptionRun08 );
1645   fontDescriptionRuns.PushBack( fontDescriptionRun09 );
1646   fontDescriptionRuns.PushBack( fontDescriptionRun10 );
1647   fontDescriptionRuns.PushBack( fontDescriptionRun11 );
1648   fontDescriptionRuns.PushBack( fontDescriptionRun12 );
1649   fontDescriptionRuns.PushBack( fontDescriptionRun13 );
1650   fontDescriptionRuns.PushBack( fontDescriptionRun14 );
1651   fontDescriptionRuns.PushBack( fontDescriptionRun15 );
1652   Size textArea(100.f, 300.f);
1653   Size layoutSize(92.f, 380.f);
1654   float positions[] =
1655   {
1656     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
1657     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
1658     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 32.f, -2.f, 35.f, -11.f,
1659     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -13.f, 68.f, -9.f, 76.f, -13.f, 80.f, -13.f, 83.f, -9.f, 92.f, -0.f,
1660     0.f, -9.f, 11.f, -9.f, 21.f, -9.f, 27.f, -13.f, 30.f, -13.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
1661     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
1662     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
1663     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
1664     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
1665     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
1666     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
1667     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
1668     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
1669     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
1670     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 32.f, -2.f, 35.f, -11.f,
1671     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
1672     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
1673     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f,
1674   };
1675   struct LineRun line01 =
1676   {
1677     { 0u, 12u },
1678     { 0u, 12u },
1679     81.f,
1680     15.f,
1681     -5.f,
1682     3.f,
1683     0.f,
1684     false,
1685     false
1686   };
1687   struct LineRun line02 =
1688   {
1689     { 12u, 10u },
1690     { 12u, 10u },
1691     76.f,
1692     15.f,
1693     -5.f,
1694     4.f,
1695     0.f,
1696     false,
1697     false
1698   };
1699   struct LineRun line03 =
1700   {
1701     { 22u, 6u },
1702     { 22u, 6u },
1703     36.f,
1704     15.f,
1705     -5.f,
1706     0.f,
1707     0.f,
1708     false,
1709     false
1710   };
1711   struct LineRun line04 =
1712   {
1713     { 28u, 20u },
1714     { 28u, 20u },
1715     92.f,
1716     15.f,
1717     -5.f,
1718     4.f,
1719     0.f,
1720     false,
1721     false
1722   };
1723   struct LineRun line05 =
1724   {
1725     { 48u, 11u },
1726     { 48u, 11u },
1727     76.f,
1728     15.f,
1729     -5.f,
1730     4.f,
1731     0.f,
1732     false,
1733     false
1734   };
1735   struct LineRun line06 =
1736   {
1737     { 59u, 5u },
1738     { 59u, 5u },
1739     31.f,
1740     15.f,
1741     -5.f,
1742     0.f,
1743     0.f,
1744     false,
1745     false
1746   };
1747   struct LineRun line07 =
1748   {
1749     { 64u, 10u },
1750     { 64u, 10u },
1751     67.f,
1752     15.f,
1753     -5.f,
1754     4.f,
1755     0.f,
1756     false,
1757     false
1758   };
1759   struct LineRun line08 =
1760   {
1761     { 74u, 12u },
1762     { 74u, 12u },
1763     79.f,
1764     15.f,
1765     -5.f,
1766     3.f,
1767     0.f,
1768     false,
1769     false
1770   };
1771   struct LineRun line09 =
1772   {
1773     { 86u, 6u },
1774     { 86u, 6u },
1775     43.f,
1776     15.f,
1777     -5.f,
1778     0.f,
1779     0.f,
1780     false,
1781     false
1782   };
1783   struct LineRun line10 =
1784   {
1785     { 92u, 12u },
1786     { 92u, 12u },
1787     78.f,
1788     15.f,
1789     -5.f,
1790     4.f,
1791     0.f,
1792     false,
1793     false
1794   };
1795   struct LineRun line11 =
1796   {
1797     { 104u, 19u },
1798     { 104u, 19u },
1799     90.f,
1800     15.f,
1801     -5.f,
1802     4.f,
1803     0.f,
1804     false,
1805     false
1806   };
1807   struct LineRun line12 =
1808   {
1809     { 123u, 5u },
1810     { 123u, 5u },
1811     31.f,
1812     15.f,
1813     -5.f,
1814     0.f,
1815     0.f,
1816     false,
1817     false
1818   };
1819   struct LineRun line13 =
1820   {
1821     { 128u, 12u },
1822     { 128u, 12u },
1823     81.f,
1824     15.f,
1825     -5.f,
1826     3.f,
1827     0.f,
1828     false,
1829     false
1830   };
1831   struct LineRun line14 =
1832   {
1833     { 140u, 10u },
1834     { 140u, 10u },
1835     76.f,
1836     15.f,
1837     -5.f,
1838     4.f,
1839     0.f,
1840     false,
1841     false
1842   };
1843   struct LineRun line15 =
1844   {
1845     { 150u, 6u },
1846     { 150u, 6u },
1847     36.f,
1848     15.f,
1849     -5.f,
1850     0.f,
1851     0.f,
1852     false,
1853     false
1854   };
1855   struct LineRun line16 =
1856   {
1857     { 156u, 10u },
1858     { 156u, 10u },
1859     67.f,
1860     15.f,
1861     -5.f,
1862     4.f,
1863     0.f,
1864     false,
1865     false
1866   };
1867   struct LineRun line17 =
1868   {
1869     { 166u, 12u },
1870     { 166u, 12u },
1871     79.f,
1872     15.f,
1873     -5.f,
1874     4.f,
1875     0.f,
1876     false,
1877     false
1878   };
1879   struct LineRun line18 =
1880   {
1881     { 178u, 14u },
1882     { 178u, 14u },
1883     55.f,
1884     15.f,
1885     -5.f,
1886     0.f,
1887     0.f,
1888     false,
1889     false
1890   };
1891   struct LineRun line19 =
1892   {
1893     { 192u, 0u },
1894     { 192u, 0u },
1895     0.f,
1896     15.f,
1897     -5.f,
1898     0.f,
1899     0.f,
1900     false,
1901     false
1902   };
1903   Vector<LineRun> lines;
1904   lines.PushBack( line01 );
1905   lines.PushBack( line02 );
1906   lines.PushBack( line03 );
1907   lines.PushBack( line04 );
1908   lines.PushBack( line05 );
1909   lines.PushBack( line06 );
1910   lines.PushBack( line07 );
1911   lines.PushBack( line08 );
1912   lines.PushBack( line09 );
1913   lines.PushBack( line10 );
1914   lines.PushBack( line11 );
1915   lines.PushBack( line12 );
1916   lines.PushBack( line13 );
1917   lines.PushBack( line14 );
1918   lines.PushBack( line15 );
1919   lines.PushBack( line16 );
1920   lines.PushBack( line17 );
1921   lines.PushBack( line18 );
1922   lines.PushBack( line19 );
1923
1924   LayoutTextData data =
1925   {
1926     "Layout bidirectional text.",
1927     "Hello world demo שלום עולם.\n"
1928     "مرحبا بالعالم hello world שלום עולם\n"
1929     "שלום עולם hello world demo.\n"
1930     "hello world مرحبا بالعالم שלום עולם\n"
1931     "Hello world demo שלום עולם.\n"
1932     "שלום עולם hello world مرحبا بالعالم\n",
1933     textArea,
1934     15u,
1935     fontDescriptionRuns.Begin(),
1936     layoutSize,
1937     192u,
1938     positions,
1939     19u,
1940     lines.Begin(),
1941     LayoutEngine::MULTI_LINE_BOX,
1942     0u,
1943     64u,
1944     false,
1945     true
1946   };
1947
1948   if( !LayoutTextTest( data ) )
1949   {
1950     tet_result(TET_FAIL);
1951   }
1952
1953   tet_result(TET_PASS);
1954   END_TEST;
1955 }
1956
1957 int UtcDaliTextUpdateLayout02(void)
1958 {
1959   ToolkitTestApplication application;
1960   tet_infoline(" UtcDaliTextUpdateLayout02");
1961
1962   // Layout some lines of bidirectional text. Update the paragraphs at the middle.
1963
1964   const std::string fontLatin( "TizenSans" );
1965   const std::string fontHebrew( "TizenSansHebrew" );
1966   const std::string fontArabic( "TizenSansArabic" );
1967
1968   // Set a known font description
1969   FontDescriptionRun fontDescriptionRun01;
1970   fontDescriptionRun01.characterRun.characterIndex = 0u;
1971   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
1972   fontDescriptionRun01.familyLength = fontLatin.size();
1973   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
1974   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
1975   fontDescriptionRun01.familyDefined = true;
1976   fontDescriptionRun01.weightDefined = false;
1977   fontDescriptionRun01.widthDefined = false;
1978   fontDescriptionRun01.slantDefined = false;
1979   fontDescriptionRun01.sizeDefined = false;
1980
1981   // Set a known font description
1982   FontDescriptionRun fontDescriptionRun02;
1983   fontDescriptionRun02.characterRun.characterIndex = 17u;
1984   fontDescriptionRun02.characterRun.numberOfCharacters = 11u;
1985   fontDescriptionRun02.familyLength = fontHebrew.size();
1986   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
1987   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
1988   fontDescriptionRun02.familyDefined = true;
1989   fontDescriptionRun02.weightDefined = false;
1990   fontDescriptionRun02.widthDefined = false;
1991   fontDescriptionRun02.slantDefined = false;
1992   fontDescriptionRun02.sizeDefined = false;
1993
1994   // Set a known font description
1995   FontDescriptionRun fontDescriptionRun03;
1996   fontDescriptionRun03.characterRun.characterIndex = 28u;
1997   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
1998   fontDescriptionRun03.familyLength = fontArabic.size();
1999   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
2000   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
2001   fontDescriptionRun03.familyDefined = true;
2002   fontDescriptionRun03.weightDefined = false;
2003   fontDescriptionRun03.widthDefined = false;
2004   fontDescriptionRun03.slantDefined = false;
2005   fontDescriptionRun03.sizeDefined = false;
2006
2007   // Set a known font description
2008   FontDescriptionRun fontDescriptionRun04;
2009   fontDescriptionRun04.characterRun.characterIndex = 42u;
2010   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
2011   fontDescriptionRun04.familyLength = fontLatin.size();
2012   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
2013   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
2014   fontDescriptionRun04.familyDefined = true;
2015   fontDescriptionRun04.weightDefined = false;
2016   fontDescriptionRun04.widthDefined = false;
2017   fontDescriptionRun04.slantDefined = false;
2018   fontDescriptionRun04.sizeDefined = false;
2019
2020   // Set a known font description
2021   FontDescriptionRun fontDescriptionRun05;
2022   fontDescriptionRun05.characterRun.characterIndex = 54u;
2023   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
2024   fontDescriptionRun05.familyLength = fontHebrew.size();
2025   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
2026   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
2027   fontDescriptionRun05.familyDefined = true;
2028   fontDescriptionRun05.weightDefined = false;
2029   fontDescriptionRun05.widthDefined = false;
2030   fontDescriptionRun05.slantDefined = false;
2031   fontDescriptionRun05.sizeDefined = false;
2032
2033   // Set a known font description
2034   FontDescriptionRun fontDescriptionRun06;
2035   fontDescriptionRun06.characterRun.characterIndex = 64u;
2036   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2037   fontDescriptionRun06.familyLength = fontHebrew.size();
2038   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
2039   memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
2040   fontDescriptionRun06.familyDefined = true;
2041   fontDescriptionRun06.weightDefined = false;
2042   fontDescriptionRun06.widthDefined = false;
2043   fontDescriptionRun06.slantDefined = false;
2044   fontDescriptionRun06.sizeDefined = false;
2045
2046   // Set a known font description
2047   FontDescriptionRun fontDescriptionRun07;
2048   fontDescriptionRun07.characterRun.characterIndex = 74u;
2049   fontDescriptionRun07.characterRun.numberOfCharacters = 18u;
2050   fontDescriptionRun07.familyLength = fontLatin.size();
2051   fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
2052   memcpy( fontDescriptionRun07.familyName, fontLatin.c_str(), fontDescriptionRun07.familyLength );
2053   fontDescriptionRun07.familyDefined = true;
2054   fontDescriptionRun07.weightDefined = false;
2055   fontDescriptionRun07.widthDefined = false;
2056   fontDescriptionRun07.slantDefined = false;
2057   fontDescriptionRun07.sizeDefined = false;
2058
2059   // Set a known font description
2060   FontDescriptionRun fontDescriptionRun08;
2061   fontDescriptionRun08.characterRun.characterIndex = 92u;
2062   fontDescriptionRun08.characterRun.numberOfCharacters = 12u;
2063   fontDescriptionRun08.familyLength = fontLatin.size();
2064   fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
2065   memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
2066   fontDescriptionRun08.familyDefined = true;
2067   fontDescriptionRun08.weightDefined = false;
2068   fontDescriptionRun08.widthDefined = false;
2069   fontDescriptionRun08.slantDefined = false;
2070   fontDescriptionRun08.sizeDefined = false;
2071
2072   // Set a known font description
2073   FontDescriptionRun fontDescriptionRun09;
2074   fontDescriptionRun09.characterRun.characterIndex = 104u;
2075   fontDescriptionRun09.characterRun.numberOfCharacters = 14u;
2076   fontDescriptionRun09.familyLength = fontArabic.size();
2077   fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
2078   memcpy( fontDescriptionRun09.familyName, fontArabic.c_str(), fontDescriptionRun09.familyLength );
2079   fontDescriptionRun09.familyDefined = true;
2080   fontDescriptionRun09.weightDefined = false;
2081   fontDescriptionRun09.widthDefined = false;
2082   fontDescriptionRun09.slantDefined = false;
2083   fontDescriptionRun09.sizeDefined = false;
2084
2085   // Set a known font description
2086   FontDescriptionRun fontDescriptionRun10;
2087   fontDescriptionRun10.characterRun.characterIndex = 118u;
2088   fontDescriptionRun10.characterRun.numberOfCharacters = 10u;
2089   fontDescriptionRun10.familyLength = fontHebrew.size();
2090   fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
2091   memcpy( fontDescriptionRun10.familyName, fontHebrew.c_str(), fontDescriptionRun10.familyLength );
2092   fontDescriptionRun10.familyDefined = true;
2093   fontDescriptionRun10.weightDefined = false;
2094   fontDescriptionRun10.widthDefined = false;
2095   fontDescriptionRun10.slantDefined = false;
2096   fontDescriptionRun10.sizeDefined = false;
2097
2098   // Set a known font description
2099   FontDescriptionRun fontDescriptionRun11;
2100   fontDescriptionRun11.characterRun.characterIndex = 128u;
2101   fontDescriptionRun11.characterRun.numberOfCharacters = 17u;
2102   fontDescriptionRun11.familyLength = fontLatin.size();
2103   fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
2104   memcpy( fontDescriptionRun11.familyName, fontLatin.c_str(), fontDescriptionRun11.familyLength );
2105   fontDescriptionRun11.familyDefined = true;
2106   fontDescriptionRun11.weightDefined = false;
2107   fontDescriptionRun11.widthDefined = false;
2108   fontDescriptionRun11.slantDefined = false;
2109   fontDescriptionRun11.sizeDefined = false;
2110
2111   // Set a known font description
2112   FontDescriptionRun fontDescriptionRun12;
2113   fontDescriptionRun12.characterRun.characterIndex = 145u;
2114   fontDescriptionRun12.characterRun.numberOfCharacters = 11u;
2115   fontDescriptionRun12.familyLength = fontHebrew.size();
2116   fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
2117   memcpy( fontDescriptionRun12.familyName, fontHebrew.c_str(), fontDescriptionRun12.familyLength );
2118   fontDescriptionRun12.familyDefined = true;
2119   fontDescriptionRun12.weightDefined = false;
2120   fontDescriptionRun12.widthDefined = false;
2121   fontDescriptionRun12.slantDefined = false;
2122   fontDescriptionRun12.sizeDefined = false;
2123
2124   // Set a known font description
2125   FontDescriptionRun fontDescriptionRun13;
2126   fontDescriptionRun13.characterRun.characterIndex = 156u;
2127   fontDescriptionRun13.characterRun.numberOfCharacters = 10u;
2128   fontDescriptionRun13.familyLength = fontHebrew.size();
2129   fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
2130   memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
2131   fontDescriptionRun13.familyDefined = true;
2132   fontDescriptionRun13.weightDefined = false;
2133   fontDescriptionRun13.widthDefined = false;
2134   fontDescriptionRun13.slantDefined = false;
2135   fontDescriptionRun13.sizeDefined = false;
2136
2137   // Set a known font description
2138   FontDescriptionRun fontDescriptionRun14;
2139   fontDescriptionRun14.characterRun.characterIndex = 166u;
2140   fontDescriptionRun14.characterRun.numberOfCharacters = 12u;
2141   fontDescriptionRun14.familyLength = fontLatin.size();
2142   fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
2143   memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
2144   fontDescriptionRun14.familyDefined = true;
2145   fontDescriptionRun14.weightDefined = false;
2146   fontDescriptionRun14.widthDefined = false;
2147   fontDescriptionRun14.slantDefined = false;
2148   fontDescriptionRun14.sizeDefined = false;
2149
2150   // Set a known font description
2151   FontDescriptionRun fontDescriptionRun15;
2152   fontDescriptionRun15.characterRun.characterIndex = 178u;
2153   fontDescriptionRun15.characterRun.numberOfCharacters = 14u;
2154   fontDescriptionRun15.familyLength = fontArabic.size();
2155   fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
2156   memcpy( fontDescriptionRun15.familyName, fontArabic.c_str(), fontDescriptionRun15.familyLength );
2157   fontDescriptionRun15.familyDefined = true;
2158   fontDescriptionRun15.weightDefined = false;
2159   fontDescriptionRun15.widthDefined = false;
2160   fontDescriptionRun15.slantDefined = false;
2161   fontDescriptionRun15.sizeDefined = false;
2162
2163   Vector<FontDescriptionRun> fontDescriptionRuns;
2164   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
2165   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
2166   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
2167   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
2168   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
2169   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
2170   fontDescriptionRuns.PushBack( fontDescriptionRun07 );
2171   fontDescriptionRuns.PushBack( fontDescriptionRun08 );
2172   fontDescriptionRuns.PushBack( fontDescriptionRun09 );
2173   fontDescriptionRuns.PushBack( fontDescriptionRun10 );
2174   fontDescriptionRuns.PushBack( fontDescriptionRun11 );
2175   fontDescriptionRuns.PushBack( fontDescriptionRun12 );
2176   fontDescriptionRuns.PushBack( fontDescriptionRun13 );
2177   fontDescriptionRuns.PushBack( fontDescriptionRun14 );
2178   fontDescriptionRuns.PushBack( fontDescriptionRun15 );
2179   Size textArea(100.f, 300.f);
2180   Size layoutSize(92.f, 380.f);
2181   float positions[] =
2182   {
2183     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
2184     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2185     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 32.f, -2.f, 35.f, -11.f,
2186     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -13.f, 68.f, -9.f, 76.f, -13.f, 80.f, -13.f, 83.f, -9.f, 92.f, -0.f,
2187     0.f, -9.f, 11.f, -9.f, 21.f, -9.f, 27.f, -13.f, 30.f, -13.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2188     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2189     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
2190     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2191     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
2192     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2193     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
2194     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2195     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
2196     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2197     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 32.f, -2.f, 35.f, -11.f,
2198     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
2199     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2200     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f,
2201   };
2202   struct LineRun line01 =
2203   {
2204     { 0u, 12u },
2205     { 0u, 12u },
2206     81.f,
2207     15.f,
2208     -5.f,
2209     3.f,
2210     0.f,
2211     false,
2212     false
2213   };
2214   struct LineRun line02 =
2215   {
2216     { 12u, 10u },
2217     { 12u, 10u },
2218     76.f,
2219     15.f,
2220     -5.f,
2221     4.f,
2222     0.f,
2223     false,
2224     false
2225   };
2226   struct LineRun line03 =
2227   {
2228     { 22u, 6u },
2229     { 22u, 6u },
2230     36.f,
2231     15.f,
2232     -5.f,
2233     0.f,
2234     0.f,
2235     false,
2236     false
2237   };
2238   struct LineRun line04 =
2239   {
2240     { 28u, 20u },
2241     { 28u, 20u },
2242     92.f,
2243     15.f,
2244     -5.f,
2245     4.f,
2246     0.f,
2247     false,
2248     false
2249   };
2250   struct LineRun line05 =
2251   {
2252     { 48u, 11u },
2253     { 48u, 11u },
2254     76.f,
2255     15.f,
2256     -5.f,
2257     4.f,
2258     0.f,
2259     false,
2260     false
2261   };
2262   struct LineRun line06 =
2263   {
2264     { 59u, 5u },
2265     { 59u, 5u },
2266     31.f,
2267     15.f,
2268     -5.f,
2269     0.f,
2270     0.f,
2271     false,
2272     false
2273   };
2274   struct LineRun line07 =
2275   {
2276     { 64u, 10u },
2277     { 64u, 10u },
2278     67.f,
2279     15.f,
2280     -5.f,
2281     4.f,
2282     0.f,
2283     false,
2284     false
2285   };
2286   struct LineRun line08 =
2287   {
2288     { 74u, 12u },
2289     { 74u, 12u },
2290     79.f,
2291     15.f,
2292     -5.f,
2293     3.f,
2294     0.f,
2295     false,
2296     false
2297   };
2298   struct LineRun line09 =
2299   {
2300     { 86u, 6u },
2301     { 86u, 6u },
2302     43.f,
2303     15.f,
2304     -5.f,
2305     0.f,
2306     0.f,
2307     false,
2308     false
2309   };
2310   struct LineRun line10 =
2311   {
2312     { 92u, 12u },
2313     { 92u, 12u },
2314     78.f,
2315     15.f,
2316     -5.f,
2317     4.f,
2318     0.f,
2319     false,
2320     false
2321   };
2322   struct LineRun line11 =
2323   {
2324     { 104u, 19u },
2325     { 104u, 19u },
2326     90.f,
2327     15.f,
2328     -5.f,
2329     4.f,
2330     0.f,
2331     false,
2332     false
2333   };
2334   struct LineRun line12 =
2335   {
2336     { 123u, 5u },
2337     { 123u, 5u },
2338     31.f,
2339     15.f,
2340     -5.f,
2341     0.f,
2342     0.f,
2343     false,
2344     false
2345   };
2346   struct LineRun line13 =
2347   {
2348     { 128u, 12u },
2349     { 128u, 12u },
2350     81.f,
2351     15.f,
2352     -5.f,
2353     3.f,
2354     0.f,
2355     false,
2356     false
2357   };
2358   struct LineRun line14 =
2359   {
2360     { 140u, 10u },
2361     { 140u, 10u },
2362     76.f,
2363     15.f,
2364     -5.f,
2365     4.f,
2366     0.f,
2367     false,
2368     false
2369   };
2370   struct LineRun line15 =
2371   {
2372     { 150u, 6u },
2373     { 150u, 6u },
2374     36.f,
2375     15.f,
2376     -5.f,
2377     0.f,
2378     0.f,
2379     false,
2380     false
2381   };
2382   struct LineRun line16 =
2383   {
2384     { 156u, 10u },
2385     { 156u, 10u },
2386     67.f,
2387     15.f,
2388     -5.f,
2389     4.f,
2390     0.f,
2391     false,
2392     false
2393   };
2394   struct LineRun line17 =
2395   {
2396     { 166u, 12u },
2397     { 166u, 12u },
2398     79.f,
2399     15.f,
2400     -5.f,
2401     4.f,
2402     0.f,
2403     false,
2404     false
2405   };
2406   struct LineRun line18 =
2407   {
2408     { 178u, 14u },
2409     { 178u, 14u },
2410     55.f,
2411     15.f,
2412     -5.f,
2413     0.f,
2414     0.f,
2415     false,
2416     false
2417   };
2418   struct LineRun line19 =
2419   {
2420     { 192u, 0u },
2421     { 192u, 0u },
2422     0.f,
2423     15.f,
2424     -5.f,
2425     0.f,
2426     0.f,
2427     false,
2428     false
2429   };
2430   Vector<LineRun> lines;
2431   lines.PushBack( line01 );
2432   lines.PushBack( line02 );
2433   lines.PushBack( line03 );
2434   lines.PushBack( line04 );
2435   lines.PushBack( line05 );
2436   lines.PushBack( line06 );
2437   lines.PushBack( line07 );
2438   lines.PushBack( line08 );
2439   lines.PushBack( line09 );
2440   lines.PushBack( line10 );
2441   lines.PushBack( line11 );
2442   lines.PushBack( line12 );
2443   lines.PushBack( line13 );
2444   lines.PushBack( line14 );
2445   lines.PushBack( line15 );
2446   lines.PushBack( line16 );
2447   lines.PushBack( line17 );
2448   lines.PushBack( line18 );
2449   lines.PushBack( line19 );
2450
2451   LayoutTextData data =
2452   {
2453     "Layout bidirectional text.",
2454     "Hello world demo שלום עולם.\n"
2455     "مرحبا بالعالم hello world שלום עולם\n"
2456     "שלום עולם hello world demo.\n"
2457     "hello world مرحبا بالعالم שלום עולם\n"
2458     "Hello world demo שלום עולם.\n"
2459     "שלום עולם hello world مرحبا بالعالم\n",
2460     textArea,
2461     15u,
2462     fontDescriptionRuns.Begin(),
2463     layoutSize,
2464     192u,
2465     positions,
2466     19u,
2467     lines.Begin(),
2468     LayoutEngine::MULTI_LINE_BOX,
2469     64u,
2470     64u,
2471     false,
2472     true
2473   };
2474
2475   if( !LayoutTextTest( data ) )
2476   {
2477     tet_result(TET_FAIL);
2478   }
2479
2480   tet_result(TET_PASS);
2481   END_TEST;
2482 }
2483
2484 int UtcDaliTextUpdateLayout03(void)
2485 {
2486   ToolkitTestApplication application;
2487   tet_infoline(" UtcDaliTextUpdateLayout03");
2488
2489   // Layout some lines of bidirectional text. Update the paragraphs at the middle.
2490
2491   const std::string fontLatin( "TizenSans" );
2492   const std::string fontHebrew( "TizenSansHebrew" );
2493   const std::string fontArabic( "TizenSansArabic" );
2494
2495   // Set a known font description
2496   FontDescriptionRun fontDescriptionRun01;
2497   fontDescriptionRun01.characterRun.characterIndex = 0u;
2498   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
2499   fontDescriptionRun01.familyLength = fontLatin.size();
2500   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
2501   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
2502   fontDescriptionRun01.familyDefined = true;
2503   fontDescriptionRun01.weightDefined = false;
2504   fontDescriptionRun01.widthDefined = false;
2505   fontDescriptionRun01.slantDefined = false;
2506   fontDescriptionRun01.sizeDefined = false;
2507
2508   // Set a known font description
2509   FontDescriptionRun fontDescriptionRun02;
2510   fontDescriptionRun02.characterRun.characterIndex = 17u;
2511   fontDescriptionRun02.characterRun.numberOfCharacters = 11u;
2512   fontDescriptionRun02.familyLength = fontHebrew.size();
2513   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
2514   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
2515   fontDescriptionRun02.familyDefined = true;
2516   fontDescriptionRun02.weightDefined = false;
2517   fontDescriptionRun02.widthDefined = false;
2518   fontDescriptionRun02.slantDefined = false;
2519   fontDescriptionRun02.sizeDefined = false;
2520
2521   // Set a known font description
2522   FontDescriptionRun fontDescriptionRun03;
2523   fontDescriptionRun03.characterRun.characterIndex = 28u;
2524   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
2525   fontDescriptionRun03.familyLength = fontArabic.size();
2526   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
2527   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
2528   fontDescriptionRun03.familyDefined = true;
2529   fontDescriptionRun03.weightDefined = false;
2530   fontDescriptionRun03.widthDefined = false;
2531   fontDescriptionRun03.slantDefined = false;
2532   fontDescriptionRun03.sizeDefined = false;
2533
2534   // Set a known font description
2535   FontDescriptionRun fontDescriptionRun04;
2536   fontDescriptionRun04.characterRun.characterIndex = 42u;
2537   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
2538   fontDescriptionRun04.familyLength = fontLatin.size();
2539   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
2540   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
2541   fontDescriptionRun04.familyDefined = true;
2542   fontDescriptionRun04.weightDefined = false;
2543   fontDescriptionRun04.widthDefined = false;
2544   fontDescriptionRun04.slantDefined = false;
2545   fontDescriptionRun04.sizeDefined = false;
2546
2547   // Set a known font description
2548   FontDescriptionRun fontDescriptionRun05;
2549   fontDescriptionRun05.characterRun.characterIndex = 54u;
2550   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
2551   fontDescriptionRun05.familyLength = fontHebrew.size();
2552   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
2553   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
2554   fontDescriptionRun05.familyDefined = true;
2555   fontDescriptionRun05.weightDefined = false;
2556   fontDescriptionRun05.widthDefined = false;
2557   fontDescriptionRun05.slantDefined = false;
2558   fontDescriptionRun05.sizeDefined = false;
2559
2560   // Set a known font description
2561   FontDescriptionRun fontDescriptionRun06;
2562   fontDescriptionRun06.characterRun.characterIndex = 64u;
2563   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2564   fontDescriptionRun06.familyLength = fontHebrew.size();
2565   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
2566   memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
2567   fontDescriptionRun06.familyDefined = true;
2568   fontDescriptionRun06.weightDefined = false;
2569   fontDescriptionRun06.widthDefined = false;
2570   fontDescriptionRun06.slantDefined = false;
2571   fontDescriptionRun06.sizeDefined = false;
2572
2573   // Set a known font description
2574   FontDescriptionRun fontDescriptionRun07;
2575   fontDescriptionRun07.characterRun.characterIndex = 74u;
2576   fontDescriptionRun07.characterRun.numberOfCharacters = 18u;
2577   fontDescriptionRun07.familyLength = fontLatin.size();
2578   fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
2579   memcpy( fontDescriptionRun07.familyName, fontLatin.c_str(), fontDescriptionRun07.familyLength );
2580   fontDescriptionRun07.familyDefined = true;
2581   fontDescriptionRun07.weightDefined = false;
2582   fontDescriptionRun07.widthDefined = false;
2583   fontDescriptionRun07.slantDefined = false;
2584   fontDescriptionRun07.sizeDefined = false;
2585
2586   // Set a known font description
2587   FontDescriptionRun fontDescriptionRun08;
2588   fontDescriptionRun08.characterRun.characterIndex = 92u;
2589   fontDescriptionRun08.characterRun.numberOfCharacters = 12u;
2590   fontDescriptionRun08.familyLength = fontLatin.size();
2591   fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
2592   memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
2593   fontDescriptionRun08.familyDefined = true;
2594   fontDescriptionRun08.weightDefined = false;
2595   fontDescriptionRun08.widthDefined = false;
2596   fontDescriptionRun08.slantDefined = false;
2597   fontDescriptionRun08.sizeDefined = false;
2598
2599   // Set a known font description
2600   FontDescriptionRun fontDescriptionRun09;
2601   fontDescriptionRun09.characterRun.characterIndex = 104u;
2602   fontDescriptionRun09.characterRun.numberOfCharacters = 14u;
2603   fontDescriptionRun09.familyLength = fontArabic.size();
2604   fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
2605   memcpy( fontDescriptionRun09.familyName, fontArabic.c_str(), fontDescriptionRun09.familyLength );
2606   fontDescriptionRun09.familyDefined = true;
2607   fontDescriptionRun09.weightDefined = false;
2608   fontDescriptionRun09.widthDefined = false;
2609   fontDescriptionRun09.slantDefined = false;
2610   fontDescriptionRun09.sizeDefined = false;
2611
2612   // Set a known font description
2613   FontDescriptionRun fontDescriptionRun10;
2614   fontDescriptionRun10.characterRun.characterIndex = 118u;
2615   fontDescriptionRun10.characterRun.numberOfCharacters = 10u;
2616   fontDescriptionRun10.familyLength = fontHebrew.size();
2617   fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
2618   memcpy( fontDescriptionRun10.familyName, fontHebrew.c_str(), fontDescriptionRun10.familyLength );
2619   fontDescriptionRun10.familyDefined = true;
2620   fontDescriptionRun10.weightDefined = false;
2621   fontDescriptionRun10.widthDefined = false;
2622   fontDescriptionRun10.slantDefined = false;
2623   fontDescriptionRun10.sizeDefined = false;
2624
2625   // Set a known font description
2626   FontDescriptionRun fontDescriptionRun11;
2627   fontDescriptionRun11.characterRun.characterIndex = 128u;
2628   fontDescriptionRun11.characterRun.numberOfCharacters = 17u;
2629   fontDescriptionRun11.familyLength = fontLatin.size();
2630   fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
2631   memcpy( fontDescriptionRun11.familyName, fontLatin.c_str(), fontDescriptionRun11.familyLength );
2632   fontDescriptionRun11.familyDefined = true;
2633   fontDescriptionRun11.weightDefined = false;
2634   fontDescriptionRun11.widthDefined = false;
2635   fontDescriptionRun11.slantDefined = false;
2636   fontDescriptionRun11.sizeDefined = false;
2637
2638   // Set a known font description
2639   FontDescriptionRun fontDescriptionRun12;
2640   fontDescriptionRun12.characterRun.characterIndex = 145u;
2641   fontDescriptionRun12.characterRun.numberOfCharacters = 11u;
2642   fontDescriptionRun12.familyLength = fontHebrew.size();
2643   fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
2644   memcpy( fontDescriptionRun12.familyName, fontHebrew.c_str(), fontDescriptionRun12.familyLength );
2645   fontDescriptionRun12.familyDefined = true;
2646   fontDescriptionRun12.weightDefined = false;
2647   fontDescriptionRun12.widthDefined = false;
2648   fontDescriptionRun12.slantDefined = false;
2649   fontDescriptionRun12.sizeDefined = false;
2650
2651   // Set a known font description
2652   FontDescriptionRun fontDescriptionRun13;
2653   fontDescriptionRun13.characterRun.characterIndex = 156u;
2654   fontDescriptionRun13.characterRun.numberOfCharacters = 10u;
2655   fontDescriptionRun13.familyLength = fontHebrew.size();
2656   fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
2657   memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
2658   fontDescriptionRun13.familyDefined = true;
2659   fontDescriptionRun13.weightDefined = false;
2660   fontDescriptionRun13.widthDefined = false;
2661   fontDescriptionRun13.slantDefined = false;
2662   fontDescriptionRun13.sizeDefined = false;
2663
2664   // Set a known font description
2665   FontDescriptionRun fontDescriptionRun14;
2666   fontDescriptionRun14.characterRun.characterIndex = 166u;
2667   fontDescriptionRun14.characterRun.numberOfCharacters = 12u;
2668   fontDescriptionRun14.familyLength = fontLatin.size();
2669   fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
2670   memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
2671   fontDescriptionRun14.familyDefined = true;
2672   fontDescriptionRun14.weightDefined = false;
2673   fontDescriptionRun14.widthDefined = false;
2674   fontDescriptionRun14.slantDefined = false;
2675   fontDescriptionRun14.sizeDefined = false;
2676
2677   // Set a known font description
2678   FontDescriptionRun fontDescriptionRun15;
2679   fontDescriptionRun15.characterRun.characterIndex = 178u;
2680   fontDescriptionRun15.characterRun.numberOfCharacters = 14u;
2681   fontDescriptionRun15.familyLength = fontArabic.size();
2682   fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
2683   memcpy( fontDescriptionRun15.familyName, fontArabic.c_str(), fontDescriptionRun15.familyLength );
2684   fontDescriptionRun15.familyDefined = true;
2685   fontDescriptionRun15.weightDefined = false;
2686   fontDescriptionRun15.widthDefined = false;
2687   fontDescriptionRun15.slantDefined = false;
2688   fontDescriptionRun15.sizeDefined = false;
2689
2690   Vector<FontDescriptionRun> fontDescriptionRuns;
2691   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
2692   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
2693   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
2694   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
2695   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
2696   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
2697   fontDescriptionRuns.PushBack( fontDescriptionRun07 );
2698   fontDescriptionRuns.PushBack( fontDescriptionRun08 );
2699   fontDescriptionRuns.PushBack( fontDescriptionRun09 );
2700   fontDescriptionRuns.PushBack( fontDescriptionRun10 );
2701   fontDescriptionRuns.PushBack( fontDescriptionRun11 );
2702   fontDescriptionRuns.PushBack( fontDescriptionRun12 );
2703   fontDescriptionRuns.PushBack( fontDescriptionRun13 );
2704   fontDescriptionRuns.PushBack( fontDescriptionRun14 );
2705   fontDescriptionRuns.PushBack( fontDescriptionRun15 );
2706   Size textArea(100.f, 300.f);
2707   Size layoutSize(92.f, 380.f);
2708   float positions[] =
2709   {
2710     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
2711     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2712     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 32.f, -2.f, 35.f, -11.f,
2713     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -13.f, 68.f, -9.f, 76.f, -13.f, 80.f, -13.f, 83.f, -9.f, 92.f, -0.f,
2714     0.f, -9.f, 11.f, -9.f, 21.f, -9.f, 27.f, -13.f, 30.f, -13.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2715     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2716     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
2717     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2718     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
2719     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2720     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
2721     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2722     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
2723     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2724     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 32.f, -2.f, 35.f, -11.f,
2725     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
2726     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2727     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f,
2728   };
2729   struct LineRun line01 =
2730   {
2731     { 0u, 12u },
2732     { 0u, 12u },
2733     81.f,
2734     15.f,
2735     -5.f,
2736     3.f,
2737     0.f,
2738     false,
2739     false
2740   };
2741   struct LineRun line02 =
2742   {
2743     { 12u, 10u },
2744     { 12u, 10u },
2745     76.f,
2746     15.f,
2747     -5.f,
2748     4.f,
2749     0.f,
2750     false,
2751     false
2752   };
2753   struct LineRun line03 =
2754   {
2755     { 22u, 6u },
2756     { 22u, 6u },
2757     36.f,
2758     15.f,
2759     -5.f,
2760     0.f,
2761     0.f,
2762     false,
2763     false
2764   };
2765   struct LineRun line04 =
2766   {
2767     { 28u, 20u },
2768     { 28u, 20u },
2769     92.f,
2770     15.f,
2771     -5.f,
2772     4.f,
2773     0.f,
2774     false,
2775     false
2776   };
2777   struct LineRun line05 =
2778   {
2779     { 48u, 11u },
2780     { 48u, 11u },
2781     76.f,
2782     15.f,
2783     -5.f,
2784     4.f,
2785     0.f,
2786     false,
2787     false
2788   };
2789   struct LineRun line06 =
2790   {
2791     { 59u, 5u },
2792     { 59u, 5u },
2793     31.f,
2794     15.f,
2795     -5.f,
2796     0.f,
2797     0.f,
2798     false,
2799     false
2800   };
2801   struct LineRun line07 =
2802   {
2803     { 64u, 10u },
2804     { 64u, 10u },
2805     67.f,
2806     15.f,
2807     -5.f,
2808     4.f,
2809     0.f,
2810     false,
2811     false
2812   };
2813   struct LineRun line08 =
2814   {
2815     { 74u, 12u },
2816     { 74u, 12u },
2817     79.f,
2818     15.f,
2819     -5.f,
2820     3.f,
2821     0.f,
2822     false,
2823     false
2824   };
2825   struct LineRun line09 =
2826   {
2827     { 86u, 6u },
2828     { 86u, 6u },
2829     43.f,
2830     15.f,
2831     -5.f,
2832     0.f,
2833     0.f,
2834     false,
2835     false
2836   };
2837   struct LineRun line10 =
2838   {
2839     { 92u, 12u },
2840     { 92u, 12u },
2841     78.f,
2842     15.f,
2843     -5.f,
2844     4.f,
2845     0.f,
2846     false,
2847     false
2848   };
2849   struct LineRun line11 =
2850   {
2851     { 104u, 19u },
2852     { 104u, 19u },
2853     90.f,
2854     15.f,
2855     -5.f,
2856     4.f,
2857     0.f,
2858     false,
2859     false
2860   };
2861   struct LineRun line12 =
2862   {
2863     { 123u, 5u },
2864     { 123u, 5u },
2865     31.f,
2866     15.f,
2867     -5.f,
2868     0.f,
2869     0.f,
2870     false,
2871     false
2872   };
2873   struct LineRun line13 =
2874   {
2875     { 128u, 12u },
2876     { 128u, 12u },
2877     81.f,
2878     15.f,
2879     -5.f,
2880     3.f,
2881     0.f,
2882     false,
2883     false
2884   };
2885   struct LineRun line14 =
2886   {
2887     { 140u, 10u },
2888     { 140u, 10u },
2889     76.f,
2890     15.f,
2891     -5.f,
2892     4.f,
2893     0.f,
2894     false,
2895     false
2896   };
2897   struct LineRun line15 =
2898   {
2899     { 150u, 6u },
2900     { 150u, 6u },
2901     36.f,
2902     15.f,
2903     -5.f,
2904     0.f,
2905     0.f,
2906     false,
2907     false
2908   };
2909   struct LineRun line16 =
2910   {
2911     { 156u, 10u },
2912     { 156u, 10u },
2913     67.f,
2914     15.f,
2915     -5.f,
2916     4.f,
2917     0.f,
2918     false,
2919     false
2920   };
2921   struct LineRun line17 =
2922   {
2923     { 166u, 12u },
2924     { 166u, 12u },
2925     79.f,
2926     15.f,
2927     -5.f,
2928     4.f,
2929     0.f,
2930     false,
2931     false
2932   };
2933   struct LineRun line18 =
2934   {
2935     { 178u, 14u },
2936     { 178u, 14u },
2937     55.f,
2938     15.f,
2939     -5.f,
2940     0.f,
2941     0.f,
2942     false,
2943     false
2944   };
2945   struct LineRun line19 =
2946   {
2947     { 192u, 0u },
2948     { 192u, 0u },
2949     0.f,
2950     15.f,
2951     -5.f,
2952     0.f,
2953     0.f,
2954     false,
2955     false
2956   };
2957   Vector<LineRun> lines;
2958   lines.PushBack( line01 );
2959   lines.PushBack( line02 );
2960   lines.PushBack( line03 );
2961   lines.PushBack( line04 );
2962   lines.PushBack( line05 );
2963   lines.PushBack( line06 );
2964   lines.PushBack( line07 );
2965   lines.PushBack( line08 );
2966   lines.PushBack( line09 );
2967   lines.PushBack( line10 );
2968   lines.PushBack( line11 );
2969   lines.PushBack( line12 );
2970   lines.PushBack( line13 );
2971   lines.PushBack( line14 );
2972   lines.PushBack( line15 );
2973   lines.PushBack( line16 );
2974   lines.PushBack( line17 );
2975   lines.PushBack( line18 );
2976   lines.PushBack( line19 );
2977
2978   LayoutTextData data =
2979   {
2980     "Layout bidirectional text.",
2981     "Hello world demo שלום עולם.\n"
2982     "مرحبا بالعالم hello world שלום עולם\n"
2983     "שלום עולם hello world demo.\n"
2984     "hello world مرحبا بالعالم שלום עולם\n"
2985     "Hello world demo שלום עולם.\n"
2986     "שלום עולם hello world مرحبا بالعالم\n",
2987     textArea,
2988     15u,
2989     fontDescriptionRuns.Begin(),
2990     layoutSize,
2991     192u,
2992     positions,
2993     19u,
2994     lines.Begin(),
2995     LayoutEngine::MULTI_LINE_BOX,
2996     128u,
2997     64u,
2998     false,
2999     true
3000   };
3001
3002   if( !LayoutTextTest( data ) )
3003   {
3004     tet_result(TET_FAIL);
3005   }
3006
3007   tet_result(TET_PASS);
3008   END_TEST;
3009 }
3010
3011 int UtcDaliTextLayoutEllipsis01(void)
3012 {
3013   ToolkitTestApplication application;
3014   tet_infoline(" UtcDaliTextLayoutEllipsis01");
3015
3016   // Layout single-line LTR text with ellipsis.
3017
3018   const std::string fontLatin( "TizenSans" );
3019
3020   // Set a known font description
3021   FontDescriptionRun fontDescriptionRun01;
3022   fontDescriptionRun01.characterRun.characterIndex = 0u;
3023   fontDescriptionRun01.characterRun.numberOfCharacters = 51u;
3024   fontDescriptionRun01.familyLength = fontLatin.size();
3025   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3026   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
3027   fontDescriptionRun01.familyDefined = true;
3028   fontDescriptionRun01.weightDefined = false;
3029   fontDescriptionRun01.widthDefined = false;
3030   fontDescriptionRun01.slantDefined = false;
3031   fontDescriptionRun01.sizeDefined = false;
3032
3033   Vector<FontDescriptionRun> fontDescriptionRuns;
3034   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3035
3036   struct LineRun line01 =
3037   {
3038     { 0u, 13u },
3039     { 0u, 13u },
3040     93.f,
3041     15.f,
3042     -5.f,
3043     0.f,
3044     0.f,
3045     false,
3046     true
3047   };
3048   Vector<LineRun> lines;
3049   lines.PushBack( line01 );
3050
3051   float positions[] =
3052   {
3053     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f, 83.f, -13.f,
3054   };
3055
3056   Size textArea( 100.f, 50.f );
3057   Size layoutSize( 100.f, 20.f );
3058
3059   LayoutTextData data =
3060   {
3061     "Layout single-line LTR text with ellipsis.",
3062     "Hello world demo hello world demo hello world demo.",
3063     textArea,
3064     1u,
3065     fontDescriptionRuns.Begin(),
3066     layoutSize,
3067     13u,
3068     positions,
3069     1u,
3070     lines.Begin(),
3071     LayoutEngine::SINGLE_LINE_BOX,
3072     0u,
3073     51u,
3074     true,
3075     true
3076   };
3077
3078   if( !LayoutTextTest( data ) )
3079   {
3080     tet_result(TET_FAIL);
3081   }
3082
3083   tet_result(TET_PASS);
3084   END_TEST;
3085 }
3086
3087 int UtcDaliTextLayoutEllipsis02(void)
3088 {
3089   ToolkitTestApplication application;
3090   tet_infoline(" UtcDaliTextLayoutEllipsis02");
3091
3092   // Layout multi-line LTR text with ellipsis.
3093
3094   const std::string fontLatin( "TizenSans" );
3095
3096   // Set a known font description
3097   FontDescriptionRun fontDescriptionRun01;
3098   fontDescriptionRun01.characterRun.characterIndex = 0u;
3099   fontDescriptionRun01.characterRun.numberOfCharacters = 51u;
3100   fontDescriptionRun01.familyLength = fontLatin.size();
3101   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3102   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
3103   fontDescriptionRun01.familyDefined = true;
3104   fontDescriptionRun01.weightDefined = false;
3105   fontDescriptionRun01.widthDefined = false;
3106   fontDescriptionRun01.slantDefined = false;
3107   fontDescriptionRun01.sizeDefined = false;
3108
3109   Vector<FontDescriptionRun> fontDescriptionRuns;
3110   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3111
3112   struct LineRun line01 =
3113   {
3114     { 0u, 12u },
3115     { 0u, 12u },
3116     81.f,
3117     15.f,
3118     -5.f,
3119     3.f,
3120     0.f,
3121     false,
3122     false
3123   };
3124   struct LineRun line02 =
3125   {
3126     { 12u, 12u },
3127     { 12u, 12u },
3128     93.f,
3129     15.f,
3130     -5.f,
3131     0.f,
3132     0.f,
3133     false,
3134     true
3135   };
3136   Vector<LineRun> lines;
3137   lines.PushBack( line01 );
3138   lines.PushBack( line02 );
3139
3140   float positions[] =
3141   {
3142     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
3143     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -13.f, 53.f, -9.f, 61.f, -13.f, 65.f, -13.f, 68.f, -9.f, 77.f, -0.f, 81.f, -9.f,
3144   };
3145
3146   Size textArea( 100.f, 50.f );
3147   Size layoutSize( 100.f, 60.f );
3148
3149   LayoutTextData data =
3150   {
3151     "Layout multi-line LTR text with ellipsis.",
3152     "Hello world demo hello world demo hello world demo.",
3153     textArea,
3154     1u,
3155     fontDescriptionRuns.Begin(),
3156     layoutSize,
3157     24u,
3158     positions,
3159     2u,
3160     lines.Begin(),
3161     LayoutEngine::MULTI_LINE_BOX,
3162     0u,
3163     51u,
3164     true,
3165     true
3166   };
3167
3168   if( !LayoutTextTest( data ) )
3169   {
3170     tet_result(TET_FAIL);
3171   }
3172
3173   tet_result(TET_PASS);
3174   END_TEST;
3175 }
3176
3177 int UtcDaliTextLayoutEllipsis03(void)
3178 {
3179   ToolkitTestApplication application;
3180   tet_infoline(" UtcDaliTextLayoutEllipsis03");
3181
3182   // Layout single-line RTL text with ellipsis.
3183
3184   const std::string fontHebrew( "TizenSansHebrew" );
3185   const std::string fontArabic( "TizenSansArabic" );
3186
3187   // Set a known font description
3188   FontDescriptionRun fontDescriptionRun01;
3189   fontDescriptionRun01.characterRun.characterIndex = 0u;
3190   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
3191   fontDescriptionRun01.familyLength = fontHebrew.size();
3192   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3193   memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength );
3194   fontDescriptionRun01.familyDefined = true;
3195   fontDescriptionRun01.weightDefined = false;
3196   fontDescriptionRun01.widthDefined = false;
3197   fontDescriptionRun01.slantDefined = false;
3198   fontDescriptionRun01.sizeDefined = false;
3199
3200   FontDescriptionRun fontDescriptionRun02;
3201   fontDescriptionRun02.characterRun.characterIndex = 10u;
3202   fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
3203   fontDescriptionRun02.familyLength = fontArabic.size();
3204   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
3205   memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength );
3206   fontDescriptionRun02.familyDefined = true;
3207   fontDescriptionRun02.weightDefined = false;
3208   fontDescriptionRun02.widthDefined = false;
3209   fontDescriptionRun02.slantDefined = false;
3210   fontDescriptionRun02.sizeDefined = false;
3211
3212   FontDescriptionRun fontDescriptionRun03;
3213   fontDescriptionRun03.characterRun.characterIndex = 24u;
3214   fontDescriptionRun03.characterRun.numberOfCharacters = 10u;
3215   fontDescriptionRun03.familyLength = fontHebrew.size();
3216   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
3217   memcpy( fontDescriptionRun03.familyName, fontHebrew.c_str(), fontDescriptionRun03.familyLength );
3218   fontDescriptionRun03.familyDefined = true;
3219   fontDescriptionRun03.weightDefined = false;
3220   fontDescriptionRun03.widthDefined = false;
3221   fontDescriptionRun03.slantDefined = false;
3222   fontDescriptionRun03.sizeDefined = false;
3223
3224   FontDescriptionRun fontDescriptionRun04;
3225   fontDescriptionRun04.characterRun.characterIndex = 34u;
3226   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
3227   fontDescriptionRun04.familyLength = fontArabic.size();
3228   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
3229   memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
3230   fontDescriptionRun04.familyDefined = true;
3231   fontDescriptionRun04.weightDefined = false;
3232   fontDescriptionRun04.widthDefined = false;
3233   fontDescriptionRun04.slantDefined = false;
3234   fontDescriptionRun04.sizeDefined = false;
3235
3236   FontDescriptionRun fontDescriptionRun05;
3237   fontDescriptionRun05.characterRun.characterIndex = 48u;
3238   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
3239   fontDescriptionRun05.familyLength = fontHebrew.size();
3240   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
3241   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
3242   fontDescriptionRun05.familyDefined = true;
3243   fontDescriptionRun05.weightDefined = false;
3244   fontDescriptionRun05.widthDefined = false;
3245   fontDescriptionRun05.slantDefined = false;
3246   fontDescriptionRun05.sizeDefined = false;
3247
3248   FontDescriptionRun fontDescriptionRun06;
3249   fontDescriptionRun06.characterRun.characterIndex = 58u;
3250   fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
3251   fontDescriptionRun06.familyLength = fontArabic.size();
3252   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
3253   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
3254   fontDescriptionRun06.familyDefined = true;
3255   fontDescriptionRun06.weightDefined = false;
3256   fontDescriptionRun06.widthDefined = false;
3257   fontDescriptionRun06.slantDefined = false;
3258   fontDescriptionRun06.sizeDefined = false;
3259
3260   Vector<FontDescriptionRun> fontDescriptionRuns;
3261   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3262   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
3263   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
3264   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
3265   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
3266   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
3267
3268   struct LineRun line01 =
3269   {
3270     { 0u, 16u },
3271     { 0u, 16u },
3272     95.f,
3273     15.f,
3274     -5.f,
3275     0.f,
3276     0.f,
3277     false,
3278     true
3279   };
3280   Vector<LineRun> lines;
3281   lines.PushBack( line01 );
3282
3283   float positions[] =
3284   {
3285     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f, 69.f, -8.f, 76.f, -6.f, 81.f, -7.f, 87.f, -7.f, 92.f, -11.f, 94.f, -0.f,
3286   };
3287
3288   Size textArea( 100.f, 50.f );
3289   Size layoutSize( 100.f, 20.f );
3290
3291   LayoutTextData data =
3292   {
3293     "Layout single-line RTL text with ellipsis.",
3294     "שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم.",
3295     textArea,
3296     6u,
3297     fontDescriptionRuns.Begin(),
3298     layoutSize,
3299     16u,
3300     positions,
3301     1u,
3302     lines.Begin(),
3303     LayoutEngine::SINGLE_LINE_BOX,
3304     0u,
3305     72u,
3306     true,
3307     true
3308   };
3309
3310   if( !LayoutTextTest( data ) )
3311   {
3312     tet_result(TET_FAIL);
3313   }
3314
3315   tet_result(TET_PASS);
3316   END_TEST;
3317 }
3318
3319 int UtcDaliTextLayoutEllipsis04(void)
3320 {
3321   ToolkitTestApplication application;
3322   tet_infoline(" UtcDaliTextLayoutEllipsis04");
3323
3324   // Layout multi-line RTL text with ellipsis.
3325
3326   const std::string fontHebrew( "TizenSansHebrew" );
3327   const std::string fontArabic( "TizenSansArabic" );
3328
3329   // Set a known font description
3330   FontDescriptionRun fontDescriptionRun01;
3331   fontDescriptionRun01.characterRun.characterIndex = 0u;
3332   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
3333   fontDescriptionRun01.familyLength = fontHebrew.size();
3334   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3335   memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength );
3336   fontDescriptionRun01.familyDefined = true;
3337   fontDescriptionRun01.weightDefined = false;
3338   fontDescriptionRun01.widthDefined = false;
3339   fontDescriptionRun01.slantDefined = false;
3340   fontDescriptionRun01.sizeDefined = false;
3341
3342   FontDescriptionRun fontDescriptionRun02;
3343   fontDescriptionRun02.characterRun.characterIndex = 10u;
3344   fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
3345   fontDescriptionRun02.familyLength = fontArabic.size();
3346   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
3347   memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength );
3348   fontDescriptionRun02.familyDefined = true;
3349   fontDescriptionRun02.weightDefined = false;
3350   fontDescriptionRun02.widthDefined = false;
3351   fontDescriptionRun02.slantDefined = false;
3352   fontDescriptionRun02.sizeDefined = false;
3353
3354   FontDescriptionRun fontDescriptionRun03;
3355   fontDescriptionRun03.characterRun.characterIndex = 24u;
3356   fontDescriptionRun03.characterRun.numberOfCharacters = 10u;
3357   fontDescriptionRun03.familyLength = fontHebrew.size();
3358   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
3359   memcpy( fontDescriptionRun03.familyName, fontHebrew.c_str(), fontDescriptionRun03.familyLength );
3360   fontDescriptionRun03.familyDefined = true;
3361   fontDescriptionRun03.weightDefined = false;
3362   fontDescriptionRun03.widthDefined = false;
3363   fontDescriptionRun03.slantDefined = false;
3364   fontDescriptionRun03.sizeDefined = false;
3365
3366   FontDescriptionRun fontDescriptionRun04;
3367   fontDescriptionRun04.characterRun.characterIndex = 34u;
3368   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
3369   fontDescriptionRun04.familyLength = fontArabic.size();
3370   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
3371   memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
3372   fontDescriptionRun04.familyDefined = true;
3373   fontDescriptionRun04.weightDefined = false;
3374   fontDescriptionRun04.widthDefined = false;
3375   fontDescriptionRun04.slantDefined = false;
3376   fontDescriptionRun04.sizeDefined = false;
3377
3378   FontDescriptionRun fontDescriptionRun05;
3379   fontDescriptionRun05.characterRun.characterIndex = 48u;
3380   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
3381   fontDescriptionRun05.familyLength = fontHebrew.size();
3382   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
3383   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
3384   fontDescriptionRun05.familyDefined = true;
3385   fontDescriptionRun05.weightDefined = false;
3386   fontDescriptionRun05.widthDefined = false;
3387   fontDescriptionRun05.slantDefined = false;
3388   fontDescriptionRun05.sizeDefined = false;
3389
3390   FontDescriptionRun fontDescriptionRun06;
3391   fontDescriptionRun06.characterRun.characterIndex = 58u;
3392   fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
3393   fontDescriptionRun06.familyLength = fontArabic.size();
3394   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
3395   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
3396   fontDescriptionRun06.familyDefined = true;
3397   fontDescriptionRun06.weightDefined = false;
3398   fontDescriptionRun06.widthDefined = false;
3399   fontDescriptionRun06.slantDefined = false;
3400   fontDescriptionRun06.sizeDefined = false;
3401
3402   Vector<FontDescriptionRun> fontDescriptionRuns;
3403   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3404   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
3405   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
3406   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
3407   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
3408   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
3409
3410   struct LineRun line01 =
3411   {
3412     { 0u, 16u },
3413     { 0u, 16u },
3414     96.f,
3415     15.f,
3416     -5.f,
3417     3.f,
3418     0.f,
3419     false,
3420     false
3421   };
3422   struct LineRun line02 =
3423   {
3424     { 16u, 18u },
3425     { 16u, 18u },
3426     97.f,
3427     15.f,
3428     -5.f,
3429     4.f,
3430     0.f,
3431     false,
3432     true
3433   };
3434   Vector<LineRun> lines;
3435   lines.PushBack( line01 );
3436   lines.PushBack( line02 );
3437
3438   float positions[] =
3439   {
3440     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f, 69.f, -8.f, 76.f, -6.f, 81.f, -7.f, 87.f, -7.f, 92.f, -11.f, 94.f, -0.f,
3441     0.f, -7.f, 5.f, -11.f, 6.f, -11.f, 10.f, -8.f, 17.f, -11.f, 18.f, -11.f, 22.f, -8.f, 28.f, -0.f, 32.f, -10.f, 43.f, -13.f, 50.f, -10.f, 55.f, -10.f, 63.f, -0.f, 68.f, -10.f, 76.f, -10.f, 81.f, -13.f, 89.f, -10.f, 97.f, -0.f,
3442   };
3443
3444   Size textArea( 100.f, 50.f );
3445   Size layoutSize( 100.f, 60.f );
3446
3447   LayoutTextData data =
3448   {
3449     "Layout single-line RTL text with ellipsis.",
3450     "שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم.",
3451     textArea,
3452     6u,
3453     fontDescriptionRuns.Begin(),
3454     layoutSize,
3455     34u,
3456     positions,
3457     2u,
3458     lines.Begin(),
3459     LayoutEngine::MULTI_LINE_BOX,
3460     0u,
3461     72u,
3462     true,
3463     true
3464   };
3465
3466   if( !LayoutTextTest( data ) )
3467   {
3468     tet_result(TET_FAIL);
3469   }
3470
3471   tet_result(TET_PASS);
3472   END_TEST;
3473 }
3474
3475 int UtcDaliTextReorderLayout01(void)
3476 {
3477   ToolkitTestApplication application;
3478   tet_infoline(" UtcDaliTextReorderLayout01");
3479
3480   // Reorder lines. No right to left characters.
3481
3482   const std::string fontLatin( "TizenSans" );
3483
3484   // Set a known font description
3485   FontDescriptionRun fontDescriptionRun01;
3486   fontDescriptionRun01.characterRun.characterIndex = 0u;
3487   fontDescriptionRun01.characterRun.numberOfCharacters = 11u;
3488   fontDescriptionRun01.familyLength = fontLatin.size();
3489   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3490   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
3491   fontDescriptionRun01.familyDefined = true;
3492   fontDescriptionRun01.weightDefined = false;
3493   fontDescriptionRun01.widthDefined = false;
3494   fontDescriptionRun01.slantDefined = false;
3495   fontDescriptionRun01.sizeDefined = false;
3496
3497   Vector<FontDescriptionRun> fontDescriptionRuns;
3498   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3499
3500   float positions[] =
3501   {
3502     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f,
3503   };
3504
3505   Size textArea( 100.f, 300.f );
3506
3507   ReLayoutRightToLeftLinesData data =
3508   {
3509     "Text with no right to left text.",
3510     "Hello world",
3511     textArea,
3512     1u,
3513     fontDescriptionRuns.Begin(),
3514     11u,
3515     positions,
3516     0u,
3517     11u
3518   };
3519
3520   if( !ReLayoutRightToLeftLinesTest( data ) )
3521   {
3522     tet_result(TET_FAIL);
3523   }
3524
3525   tet_result(TET_PASS);
3526   END_TEST;
3527 }
3528
3529 int UtcDaliTextReorderLayout02(void)
3530 {
3531   ToolkitTestApplication application;
3532   tet_infoline(" UtcDaliTextReorderLayout02");
3533
3534   // Reorder lines of the first paragraph.
3535
3536   const std::string fontHebrew( "TizenSansHebrew" );
3537   const std::string fontArabic( "TizenSansArabic" );
3538
3539   // Set a known font description
3540   FontDescriptionRun fontDescriptionRun01;
3541   fontDescriptionRun01.characterRun.characterIndex = 0u;
3542   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
3543   fontDescriptionRun01.familyLength = fontHebrew.size();
3544   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3545   memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength );
3546   fontDescriptionRun01.familyDefined = true;
3547   fontDescriptionRun01.weightDefined = false;
3548   fontDescriptionRun01.widthDefined = false;
3549   fontDescriptionRun01.slantDefined = false;
3550   fontDescriptionRun01.sizeDefined = false;
3551
3552   FontDescriptionRun fontDescriptionRun02;
3553   fontDescriptionRun02.characterRun.characterIndex = 10u;
3554   fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
3555   fontDescriptionRun02.familyLength = fontArabic.size();
3556   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
3557   memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength );
3558   fontDescriptionRun02.familyDefined = true;
3559   fontDescriptionRun02.weightDefined = false;
3560   fontDescriptionRun02.widthDefined = false;
3561   fontDescriptionRun02.slantDefined = false;
3562   fontDescriptionRun02.sizeDefined = false;
3563
3564   FontDescriptionRun fontDescriptionRun03;
3565   fontDescriptionRun03.characterRun.characterIndex = 24u;
3566   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
3567   fontDescriptionRun03.familyLength = fontArabic.size();
3568   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
3569   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
3570   fontDescriptionRun03.familyDefined = true;
3571   fontDescriptionRun03.weightDefined = false;
3572   fontDescriptionRun03.widthDefined = false;
3573   fontDescriptionRun03.slantDefined = false;
3574   fontDescriptionRun03.sizeDefined = false;
3575
3576   FontDescriptionRun fontDescriptionRun04;
3577   fontDescriptionRun04.characterRun.characterIndex = 38u;
3578   fontDescriptionRun04.characterRun.numberOfCharacters = 10u;
3579   fontDescriptionRun04.familyLength = fontHebrew.size();
3580   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
3581   memcpy( fontDescriptionRun04.familyName, fontHebrew.c_str(), fontDescriptionRun04.familyLength );
3582   fontDescriptionRun04.familyDefined = true;
3583   fontDescriptionRun04.weightDefined = false;
3584   fontDescriptionRun04.widthDefined = false;
3585   fontDescriptionRun04.slantDefined = false;
3586   fontDescriptionRun04.sizeDefined = false;
3587
3588   FontDescriptionRun fontDescriptionRun05;
3589   fontDescriptionRun05.characterRun.characterIndex = 48u;
3590   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
3591   fontDescriptionRun05.familyLength = fontHebrew.size();
3592   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
3593   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
3594   fontDescriptionRun05.familyDefined = true;
3595   fontDescriptionRun05.weightDefined = false;
3596   fontDescriptionRun05.widthDefined = false;
3597   fontDescriptionRun05.slantDefined = false;
3598   fontDescriptionRun05.sizeDefined = false;
3599
3600   FontDescriptionRun fontDescriptionRun06;
3601   fontDescriptionRun06.characterRun.characterIndex = 58u;
3602   fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
3603   fontDescriptionRun06.familyLength = fontArabic.size();
3604   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
3605   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
3606   fontDescriptionRun06.familyDefined = true;
3607   fontDescriptionRun06.weightDefined = false;
3608   fontDescriptionRun06.widthDefined = false;
3609   fontDescriptionRun06.slantDefined = false;
3610   fontDescriptionRun06.sizeDefined = false;
3611
3612   Vector<FontDescriptionRun> fontDescriptionRuns;
3613   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3614   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
3615   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
3616   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
3617   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
3618   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
3619
3620   float positions[] =
3621   {
3622     87.f, -10.f, 79.f, -13.f, 74.f, -10.f, 66.f, -10.f, 61.f, -0.f, 53.f, -10.f, 48.f, -10.f, 41.f, -13.f, 32.f, -10.f, 27.f, -0.f, 20.f, -8.f, 15.f, -6.f, 8.f, -7.f, 5.f, -7.f, 4.f, -11.f, 0.f, -0.f,
3623     23.f, -7.f, 22.f, -11.f, 17.f, -11.f, 12.f, -8.f, 10.f, -11.f, 5.f, -11.f, 0.f, -8.f, 0.f, -0.f,
3624     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
3625     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
3626     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f, 69.f, -8.f, 76.f, -6.f, 81.f, -7.f, 87.f, -7.f, 92.f, -11.f, 94.f, -0.f,
3627     0.f, -7.f, 5.f, -11.f, 6.f, -11.f, 10.f, -8.f, 17.f, -11.f, 18.f, -11.f, 22.f, -8.f, 30.f, -2.f,
3628   };
3629
3630   Size textArea( 100.f, 300.f );
3631
3632   ReLayoutRightToLeftLinesData data =
3633   {
3634     "Paragraphs with right to left text.",
3635     "שלום עולם مرحبا بالعالم\n"
3636     "مرحبا بالعالم שלום עולם\n"
3637     "שלום עולם مرحبا بالعالم.",
3638     textArea,
3639     6u,
3640     fontDescriptionRuns.Begin(),
3641     72u,
3642     positions,
3643     0u,
3644     24u
3645   };
3646
3647   if( !ReLayoutRightToLeftLinesTest( data ) )
3648   {
3649     tet_result(TET_FAIL);
3650   }
3651
3652   tet_result(TET_PASS);
3653   END_TEST;
3654 }
3655
3656 int UtcDaliTextReorderLayout03(void)
3657 {
3658   ToolkitTestApplication application;
3659   tet_infoline(" UtcDaliTextReorderLayout03");
3660
3661   // Reorder lines of the mid paragraph.
3662
3663   const std::string fontHebrew( "TizenSansHebrew" );
3664   const std::string fontArabic( "TizenSansArabic" );
3665
3666   // Set a known font description
3667   FontDescriptionRun fontDescriptionRun01;
3668   fontDescriptionRun01.characterRun.characterIndex = 0u;
3669   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
3670   fontDescriptionRun01.familyLength = fontHebrew.size();
3671   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3672   memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength );
3673   fontDescriptionRun01.familyDefined = true;
3674   fontDescriptionRun01.weightDefined = false;
3675   fontDescriptionRun01.widthDefined = false;
3676   fontDescriptionRun01.slantDefined = false;
3677   fontDescriptionRun01.sizeDefined = false;
3678
3679   FontDescriptionRun fontDescriptionRun02;
3680   fontDescriptionRun02.characterRun.characterIndex = 10u;
3681   fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
3682   fontDescriptionRun02.familyLength = fontArabic.size();
3683   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
3684   memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength );
3685   fontDescriptionRun02.familyDefined = true;
3686   fontDescriptionRun02.weightDefined = false;
3687   fontDescriptionRun02.widthDefined = false;
3688   fontDescriptionRun02.slantDefined = false;
3689   fontDescriptionRun02.sizeDefined = false;
3690
3691   FontDescriptionRun fontDescriptionRun03;
3692   fontDescriptionRun03.characterRun.characterIndex = 24u;
3693   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
3694   fontDescriptionRun03.familyLength = fontArabic.size();
3695   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
3696   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
3697   fontDescriptionRun03.familyDefined = true;
3698   fontDescriptionRun03.weightDefined = false;
3699   fontDescriptionRun03.widthDefined = false;
3700   fontDescriptionRun03.slantDefined = false;
3701   fontDescriptionRun03.sizeDefined = false;
3702
3703   FontDescriptionRun fontDescriptionRun04;
3704   fontDescriptionRun04.characterRun.characterIndex = 38u;
3705   fontDescriptionRun04.characterRun.numberOfCharacters = 10u;
3706   fontDescriptionRun04.familyLength = fontHebrew.size();
3707   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
3708   memcpy( fontDescriptionRun04.familyName, fontHebrew.c_str(), fontDescriptionRun04.familyLength );
3709   fontDescriptionRun04.familyDefined = true;
3710   fontDescriptionRun04.weightDefined = false;
3711   fontDescriptionRun04.widthDefined = false;
3712   fontDescriptionRun04.slantDefined = false;
3713   fontDescriptionRun04.sizeDefined = false;
3714
3715   FontDescriptionRun fontDescriptionRun05;
3716   fontDescriptionRun05.characterRun.characterIndex = 48u;
3717   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
3718   fontDescriptionRun05.familyLength = fontHebrew.size();
3719   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
3720   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
3721   fontDescriptionRun05.familyDefined = true;
3722   fontDescriptionRun05.weightDefined = false;
3723   fontDescriptionRun05.widthDefined = false;
3724   fontDescriptionRun05.slantDefined = false;
3725   fontDescriptionRun05.sizeDefined = false;
3726
3727   FontDescriptionRun fontDescriptionRun06;
3728   fontDescriptionRun06.characterRun.characterIndex = 58u;
3729   fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
3730   fontDescriptionRun06.familyLength = fontArabic.size();
3731   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
3732   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
3733   fontDescriptionRun06.familyDefined = true;
3734   fontDescriptionRun06.weightDefined = false;
3735   fontDescriptionRun06.widthDefined = false;
3736   fontDescriptionRun06.slantDefined = false;
3737   fontDescriptionRun06.sizeDefined = false;
3738
3739   Vector<FontDescriptionRun> fontDescriptionRuns;
3740   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3741   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
3742   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
3743   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
3744   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
3745   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
3746
3747   float positions[] =
3748   {
3749     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f, 69.f, -8.f, 76.f, -6.f, 81.f, -7.f, 87.f, -7.f, 92.f, -11.f, 94.f, -0.f,
3750     0.f, -7.f,  5.f, -11.f, 6.f, -11.f, 10.f, -8.f, 17.f, -11.f, 18.f, -11.f, 22.f, -8.f, 28.f, -0.f,
3751     86.f, -8.f, 81.f, -6.f, 74.f, -7.f, 71.f, -7.f, 70.f, -11.f, 66.f, -0.f, 62.f, -7.f, 61.f, -11.f, 56.f, -11.f, 51.f, -8.f, 49.f, -11.f, 44.f, -11.f, 39.f, -8.f, 36.f, -0.f, 26.f, -10.f, 18.f, -13.f, 13.f, -10.f, 5.f, -10.f, 0.f, -0.f,
3752     22.f, -10.f, 17.f, -10.f, 10.f, -13.f, 1.f, -10.f, 0.f, -0.f,
3753     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f, 69.f, -8.f, 76.f, -6.f, 81.f, -7.f, 87.f, -7.f, 92.f, -11.f, 94.f, -0.f,
3754     0.f, -7.f, 5.f, -11.f, 6.f, -11.f, 10.f, -8.f, 17.f, -11.f, 18.f, -11.f, 22.f, -8.f, 30.f, -2.f,
3755   };
3756
3757   Size textArea( 100.f, 300.f );
3758
3759   ReLayoutRightToLeftLinesData data =
3760   {
3761     "Paragraphs with right to left text.",
3762     "שלום עולם مرحبا بالعالم\n"
3763     "مرحبا بالعالم שלום עולם\n"
3764     "שלום עולם مرحبا بالعالم.",
3765     textArea,
3766     6u,
3767     fontDescriptionRuns.Begin(),
3768     72u,
3769     positions,
3770     24u,
3771     24u
3772   };
3773
3774   if( !ReLayoutRightToLeftLinesTest( data ) )
3775   {
3776     tet_result(TET_FAIL);
3777   }
3778
3779   tet_result(TET_PASS);
3780   END_TEST;
3781 }
3782
3783 int UtcDaliTextReorderLayout04(void)
3784 {
3785   ToolkitTestApplication application;
3786   tet_infoline(" UtcDaliTextReorderLayout04");
3787
3788   // Reorder lines of the last paragraph.
3789
3790   const std::string fontHebrew( "TizenSansHebrew" );
3791   const std::string fontArabic( "TizenSansArabic" );
3792
3793   // Set a known font description
3794   FontDescriptionRun fontDescriptionRun01;
3795   fontDescriptionRun01.characterRun.characterIndex = 0u;
3796   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
3797   fontDescriptionRun01.familyLength = fontHebrew.size();
3798   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3799   memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength );
3800   fontDescriptionRun01.familyDefined = true;
3801   fontDescriptionRun01.weightDefined = false;
3802   fontDescriptionRun01.widthDefined = false;
3803   fontDescriptionRun01.slantDefined = false;
3804   fontDescriptionRun01.sizeDefined = false;
3805
3806   FontDescriptionRun fontDescriptionRun02;
3807   fontDescriptionRun02.characterRun.characterIndex = 10u;
3808   fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
3809   fontDescriptionRun02.familyLength = fontArabic.size();
3810   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
3811   memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength );
3812   fontDescriptionRun02.familyDefined = true;
3813   fontDescriptionRun02.weightDefined = false;
3814   fontDescriptionRun02.widthDefined = false;
3815   fontDescriptionRun02.slantDefined = false;
3816   fontDescriptionRun02.sizeDefined = false;
3817
3818   FontDescriptionRun fontDescriptionRun03;
3819   fontDescriptionRun03.characterRun.characterIndex = 24u;
3820   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
3821   fontDescriptionRun03.familyLength = fontArabic.size();
3822   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
3823   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
3824   fontDescriptionRun03.familyDefined = true;
3825   fontDescriptionRun03.weightDefined = false;
3826   fontDescriptionRun03.widthDefined = false;
3827   fontDescriptionRun03.slantDefined = false;
3828   fontDescriptionRun03.sizeDefined = false;
3829
3830   FontDescriptionRun fontDescriptionRun04;
3831   fontDescriptionRun04.characterRun.characterIndex = 38u;
3832   fontDescriptionRun04.characterRun.numberOfCharacters = 10u;
3833   fontDescriptionRun04.familyLength = fontHebrew.size();
3834   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
3835   memcpy( fontDescriptionRun04.familyName, fontHebrew.c_str(), fontDescriptionRun04.familyLength );
3836   fontDescriptionRun04.familyDefined = true;
3837   fontDescriptionRun04.weightDefined = false;
3838   fontDescriptionRun04.widthDefined = false;
3839   fontDescriptionRun04.slantDefined = false;
3840   fontDescriptionRun04.sizeDefined = false;
3841
3842   FontDescriptionRun fontDescriptionRun05;
3843   fontDescriptionRun05.characterRun.characterIndex = 48u;
3844   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
3845   fontDescriptionRun05.familyLength = fontHebrew.size();
3846   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
3847   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
3848   fontDescriptionRun05.familyDefined = true;
3849   fontDescriptionRun05.weightDefined = false;
3850   fontDescriptionRun05.widthDefined = false;
3851   fontDescriptionRun05.slantDefined = false;
3852   fontDescriptionRun05.sizeDefined = false;
3853
3854   FontDescriptionRun fontDescriptionRun06;
3855   fontDescriptionRun06.characterRun.characterIndex = 58u;
3856   fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
3857   fontDescriptionRun06.familyLength = fontArabic.size();
3858   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
3859   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
3860   fontDescriptionRun06.familyDefined = true;
3861   fontDescriptionRun06.weightDefined = false;
3862   fontDescriptionRun06.widthDefined = false;
3863   fontDescriptionRun06.slantDefined = false;
3864   fontDescriptionRun06.sizeDefined = false;
3865
3866   Vector<FontDescriptionRun> fontDescriptionRuns;
3867   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3868   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
3869   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
3870   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
3871   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
3872   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
3873
3874   float positions[] =
3875   {
3876     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f, 69.f, -8.f, 76.f, -6.f, 81.f, -7.f, 87.f, -7.f, 92.f, -11.f, 94.f, -0.f,
3877     0.f, -7.f, 5.f, -11.f, 6.f, -11.f, 10.f, -8.f, 17.f, -11.f, 18.f, -11.f, 22.f, -8.f, 28.f, -0.f,
3878     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
3879     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
3880     87.f, -10.f, 79.f, -13.f, 74.f, -10.f, 66.f, -10.f, 61.f, -0.f, 53.f, -10.f, 48.f, -10.f, 41.f, -13.f, 32.f, -10.f, 27.f, -0.f, 20.f, -8.f, 15.f, -6.f, 8.f, -7.f, 5.f, -7.f, 4.f, -11.f, 0.f, -0.f,
3881     28.f, -7.f, 27.f, -11.f, 22.f, -11.f, 17.f, -8.f, 15.f, -11.f, 10.f, -11.f, 5.f, -8.f, 2.f, -2.f,
3882   };
3883
3884   Size textArea( 100.f, 300.f );
3885
3886   ReLayoutRightToLeftLinesData data =
3887   {
3888     "Paragraphs with right to left text.",
3889     "שלום עולם مرحبا بالعالم\n"
3890     "مرحبا بالعالم שלום עולם\n"
3891     "שלום עולם مرحبا بالعالم.",
3892     textArea,
3893     6u,
3894     fontDescriptionRuns.Begin(),
3895     72u,
3896     positions,
3897     48u,
3898     24u
3899   };
3900
3901   if( !ReLayoutRightToLeftLinesTest( data ) )
3902   {
3903     tet_result(TET_FAIL);
3904   }
3905
3906   tet_result(TET_PASS);
3907   END_TEST;
3908 }
3909
3910 int UtcDaliTextAlign01(void)
3911 {
3912   ToolkitTestApplication application;
3913   tet_infoline(" UtcDaliTextAlign01");
3914
3915   // Calculate text alignment.
3916
3917   const std::string fontLatin( "TizenSans" );
3918   const std::string fontHebrew( "TizenSansHebrew" );
3919   const std::string fontArabic( "TizenSansArabic" );
3920
3921   // Set a known font description
3922   FontDescriptionRun fontDescriptionRun01;
3923   fontDescriptionRun01.characterRun.characterIndex = 0u;
3924   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
3925   fontDescriptionRun01.familyLength = fontLatin.size();
3926   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3927   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
3928   fontDescriptionRun01.familyDefined = true;
3929   fontDescriptionRun01.weightDefined = false;
3930   fontDescriptionRun01.widthDefined = false;
3931   fontDescriptionRun01.slantDefined = false;
3932   fontDescriptionRun01.sizeDefined = false;
3933
3934   FontDescriptionRun fontDescriptionRun02;
3935   fontDescriptionRun02.characterRun.characterIndex = 12u;
3936   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
3937   fontDescriptionRun02.familyLength = fontHebrew.size();
3938   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
3939   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
3940   fontDescriptionRun02.familyDefined = true;
3941   fontDescriptionRun02.weightDefined = false;
3942   fontDescriptionRun02.widthDefined = false;
3943   fontDescriptionRun02.slantDefined = false;
3944   fontDescriptionRun02.sizeDefined = false;
3945
3946   FontDescriptionRun fontDescriptionRun03;
3947   fontDescriptionRun03.characterRun.characterIndex = 22u;
3948   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
3949   fontDescriptionRun03.familyLength = fontArabic.size();
3950   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
3951   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
3952   fontDescriptionRun03.familyDefined = true;
3953   fontDescriptionRun03.weightDefined = false;
3954   fontDescriptionRun03.widthDefined = false;
3955   fontDescriptionRun03.slantDefined = false;
3956   fontDescriptionRun03.sizeDefined = false;
3957
3958   FontDescriptionRun fontDescriptionRun04;
3959   fontDescriptionRun04.characterRun.characterIndex = 36u;
3960   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
3961   fontDescriptionRun04.familyLength = fontLatin.size();
3962   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
3963   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
3964   fontDescriptionRun04.familyDefined = true;
3965   fontDescriptionRun04.weightDefined = false;
3966   fontDescriptionRun04.widthDefined = false;
3967   fontDescriptionRun04.slantDefined = false;
3968   fontDescriptionRun04.sizeDefined = false;
3969
3970   FontDescriptionRun fontDescriptionRun05;
3971   fontDescriptionRun05.characterRun.characterIndex = 48u;
3972   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
3973   fontDescriptionRun05.familyLength = fontLatin.size();
3974   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
3975   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
3976   fontDescriptionRun05.familyDefined = true;
3977   fontDescriptionRun05.weightDefined = false;
3978   fontDescriptionRun05.widthDefined = false;
3979   fontDescriptionRun05.slantDefined = false;
3980   fontDescriptionRun05.sizeDefined = false;
3981
3982   FontDescriptionRun fontDescriptionRun06;
3983   fontDescriptionRun06.characterRun.characterIndex = 60u;
3984   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
3985   fontDescriptionRun06.familyLength = fontArabic.size();
3986   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
3987   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
3988   fontDescriptionRun06.familyDefined = true;
3989   fontDescriptionRun06.weightDefined = false;
3990   fontDescriptionRun06.widthDefined = false;
3991   fontDescriptionRun06.slantDefined = false;
3992   fontDescriptionRun06.sizeDefined = false;
3993
3994   Vector<FontDescriptionRun> fontDescriptionRuns;
3995   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3996   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
3997   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
3998   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
3999   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
4000   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
4001
4002   float positions[] = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f };
4003
4004   Size textArea( 100.f, 300.f );
4005   AlignData data =
4006   {
4007     "Begin alignment for the first paragraph.",
4008     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4009     textArea,
4010     6u,
4011     fontDescriptionRuns.Begin(),
4012     LayoutEngine::HORIZONTAL_ALIGN_BEGIN,
4013     LayoutEngine::VERTICAL_ALIGN_TOP,
4014     0u,
4015     22u,
4016     6u,
4017     positions
4018   };
4019
4020   if( !AlignTest( data ) )
4021   {
4022     tet_result(TET_FAIL);
4023   }
4024
4025   tet_result(TET_PASS);
4026   END_TEST;
4027 }
4028
4029 int UtcDaliTextAlign02(void)
4030 {
4031   ToolkitTestApplication application;
4032   tet_infoline(" UtcDaliTextAlign02");
4033
4034   // Calculate text alignment.
4035
4036   const std::string fontLatin( "TizenSans" );
4037   const std::string fontHebrew( "TizenSansHebrew" );
4038   const std::string fontArabic( "TizenSansArabic" );
4039
4040   // Set a known font description
4041   FontDescriptionRun fontDescriptionRun01;
4042   fontDescriptionRun01.characterRun.characterIndex = 0u;
4043   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4044   fontDescriptionRun01.familyLength = fontLatin.size();
4045   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
4046   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
4047   fontDescriptionRun01.familyDefined = true;
4048   fontDescriptionRun01.weightDefined = false;
4049   fontDescriptionRun01.widthDefined = false;
4050   fontDescriptionRun01.slantDefined = false;
4051   fontDescriptionRun01.sizeDefined = false;
4052
4053   FontDescriptionRun fontDescriptionRun02;
4054   fontDescriptionRun02.characterRun.characterIndex = 12u;
4055   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4056   fontDescriptionRun02.familyLength = fontHebrew.size();
4057   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
4058   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
4059   fontDescriptionRun02.familyDefined = true;
4060   fontDescriptionRun02.weightDefined = false;
4061   fontDescriptionRun02.widthDefined = false;
4062   fontDescriptionRun02.slantDefined = false;
4063   fontDescriptionRun02.sizeDefined = false;
4064
4065   FontDescriptionRun fontDescriptionRun03;
4066   fontDescriptionRun03.characterRun.characterIndex = 22u;
4067   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4068   fontDescriptionRun03.familyLength = fontArabic.size();
4069   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
4070   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
4071   fontDescriptionRun03.familyDefined = true;
4072   fontDescriptionRun03.weightDefined = false;
4073   fontDescriptionRun03.widthDefined = false;
4074   fontDescriptionRun03.slantDefined = false;
4075   fontDescriptionRun03.sizeDefined = false;
4076
4077   FontDescriptionRun fontDescriptionRun04;
4078   fontDescriptionRun04.characterRun.characterIndex = 36u;
4079   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4080   fontDescriptionRun04.familyLength = fontLatin.size();
4081   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
4082   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
4083   fontDescriptionRun04.familyDefined = true;
4084   fontDescriptionRun04.weightDefined = false;
4085   fontDescriptionRun04.widthDefined = false;
4086   fontDescriptionRun04.slantDefined = false;
4087   fontDescriptionRun04.sizeDefined = false;
4088
4089   FontDescriptionRun fontDescriptionRun05;
4090   fontDescriptionRun05.characterRun.characterIndex = 48u;
4091   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4092   fontDescriptionRun05.familyLength = fontLatin.size();
4093   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
4094   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
4095   fontDescriptionRun05.familyDefined = true;
4096   fontDescriptionRun05.weightDefined = false;
4097   fontDescriptionRun05.widthDefined = false;
4098   fontDescriptionRun05.slantDefined = false;
4099   fontDescriptionRun05.sizeDefined = false;
4100
4101   FontDescriptionRun fontDescriptionRun06;
4102   fontDescriptionRun06.characterRun.characterIndex = 60u;
4103   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4104   fontDescriptionRun06.familyLength = fontArabic.size();
4105   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
4106   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
4107   fontDescriptionRun06.familyDefined = true;
4108   fontDescriptionRun06.weightDefined = false;
4109   fontDescriptionRun06.widthDefined = false;
4110   fontDescriptionRun06.slantDefined = false;
4111   fontDescriptionRun06.sizeDefined = false;
4112
4113   Vector<FontDescriptionRun> fontDescriptionRuns;
4114   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
4115   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
4116   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
4117   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
4118   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
4119   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
4120
4121   float positions[] = { 0.f, 0.f, 2.f, 60.f, 0.f, 0.f };
4122
4123   Size textArea( 100.f, 300.f );
4124   AlignData data =
4125   {
4126     "Begin alignment for the mid paragraph.",
4127     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4128     textArea,
4129     6u,
4130     fontDescriptionRuns.Begin(),
4131     LayoutEngine::HORIZONTAL_ALIGN_BEGIN,
4132     LayoutEngine::VERTICAL_ALIGN_TOP,
4133     22u,
4134     26u,
4135     6u,
4136     positions
4137   };
4138
4139   if( !AlignTest( data ) )
4140   {
4141     tet_result(TET_FAIL);
4142   }
4143
4144   tet_result(TET_PASS);
4145   END_TEST;
4146 }
4147
4148 int UtcDaliTextAlign03(void)
4149 {
4150   ToolkitTestApplication application;
4151   tet_infoline(" UtcDaliTextAlign03");
4152
4153   // Calculate text alignment.
4154
4155   const std::string fontLatin( "TizenSans" );
4156   const std::string fontHebrew( "TizenSansHebrew" );
4157   const std::string fontArabic( "TizenSansArabic" );
4158
4159   // Set a known font description
4160   FontDescriptionRun fontDescriptionRun01;
4161   fontDescriptionRun01.characterRun.characterIndex = 0u;
4162   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4163   fontDescriptionRun01.familyLength = fontLatin.size();
4164   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
4165   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
4166   fontDescriptionRun01.familyDefined = true;
4167   fontDescriptionRun01.weightDefined = false;
4168   fontDescriptionRun01.widthDefined = false;
4169   fontDescriptionRun01.slantDefined = false;
4170   fontDescriptionRun01.sizeDefined = false;
4171
4172   FontDescriptionRun fontDescriptionRun02;
4173   fontDescriptionRun02.characterRun.characterIndex = 12u;
4174   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4175   fontDescriptionRun02.familyLength = fontHebrew.size();
4176   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
4177   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
4178   fontDescriptionRun02.familyDefined = true;
4179   fontDescriptionRun02.weightDefined = false;
4180   fontDescriptionRun02.widthDefined = false;
4181   fontDescriptionRun02.slantDefined = false;
4182   fontDescriptionRun02.sizeDefined = false;
4183
4184   FontDescriptionRun fontDescriptionRun03;
4185   fontDescriptionRun03.characterRun.characterIndex = 22u;
4186   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4187   fontDescriptionRun03.familyLength = fontArabic.size();
4188   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
4189   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
4190   fontDescriptionRun03.familyDefined = true;
4191   fontDescriptionRun03.weightDefined = false;
4192   fontDescriptionRun03.widthDefined = false;
4193   fontDescriptionRun03.slantDefined = false;
4194   fontDescriptionRun03.sizeDefined = false;
4195
4196   FontDescriptionRun fontDescriptionRun04;
4197   fontDescriptionRun04.characterRun.characterIndex = 36u;
4198   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4199   fontDescriptionRun04.familyLength = fontLatin.size();
4200   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
4201   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
4202   fontDescriptionRun04.familyDefined = true;
4203   fontDescriptionRun04.weightDefined = false;
4204   fontDescriptionRun04.widthDefined = false;
4205   fontDescriptionRun04.slantDefined = false;
4206   fontDescriptionRun04.sizeDefined = false;
4207
4208   FontDescriptionRun fontDescriptionRun05;
4209   fontDescriptionRun05.characterRun.characterIndex = 48u;
4210   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4211   fontDescriptionRun05.familyLength = fontLatin.size();
4212   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
4213   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
4214   fontDescriptionRun05.familyDefined = true;
4215   fontDescriptionRun05.weightDefined = false;
4216   fontDescriptionRun05.widthDefined = false;
4217   fontDescriptionRun05.slantDefined = false;
4218   fontDescriptionRun05.sizeDefined = false;
4219
4220   FontDescriptionRun fontDescriptionRun06;
4221   fontDescriptionRun06.characterRun.characterIndex = 60u;
4222   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4223   fontDescriptionRun06.familyLength = fontArabic.size();
4224   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
4225   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
4226   fontDescriptionRun06.familyDefined = true;
4227   fontDescriptionRun06.weightDefined = false;
4228   fontDescriptionRun06.widthDefined = false;
4229   fontDescriptionRun06.slantDefined = false;
4230   fontDescriptionRun06.sizeDefined = false;
4231
4232   Vector<FontDescriptionRun> fontDescriptionRuns;
4233   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
4234   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
4235   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
4236   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
4237   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
4238   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
4239
4240   float positions[] = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f };
4241
4242   Size textArea( 100.f, 300.f );
4243   AlignData data =
4244   {
4245     "Begin alignment for the last paragraph.",
4246     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4247     textArea,
4248     6u,
4249     fontDescriptionRuns.Begin(),
4250     LayoutEngine::HORIZONTAL_ALIGN_BEGIN,
4251     LayoutEngine::VERTICAL_ALIGN_TOP,
4252     48u,
4253     26u,
4254     6u,
4255     positions
4256   };
4257
4258   if( !AlignTest( data ) )
4259   {
4260     tet_result(TET_FAIL);
4261   }
4262
4263   tet_result(TET_PASS);
4264   END_TEST;
4265 }
4266
4267 int UtcDaliTextAlign04(void)
4268 {
4269   ToolkitTestApplication application;
4270   tet_infoline(" UtcDaliTextAlign04");
4271
4272   // Calculate text alignment.
4273
4274   const std::string fontLatin( "TizenSans" );
4275   const std::string fontHebrew( "TizenSansHebrew" );
4276   const std::string fontArabic( "TizenSansArabic" );
4277
4278   // Set a known font description
4279   FontDescriptionRun fontDescriptionRun01;
4280   fontDescriptionRun01.characterRun.characterIndex = 0u;
4281   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4282   fontDescriptionRun01.familyLength = fontLatin.size();
4283   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
4284   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
4285   fontDescriptionRun01.familyDefined = true;
4286   fontDescriptionRun01.weightDefined = false;
4287   fontDescriptionRun01.widthDefined = false;
4288   fontDescriptionRun01.slantDefined = false;
4289   fontDescriptionRun01.sizeDefined = false;
4290
4291   FontDescriptionRun fontDescriptionRun02;
4292   fontDescriptionRun02.characterRun.characterIndex = 12u;
4293   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4294   fontDescriptionRun02.familyLength = fontHebrew.size();
4295   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
4296   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
4297   fontDescriptionRun02.familyDefined = true;
4298   fontDescriptionRun02.weightDefined = false;
4299   fontDescriptionRun02.widthDefined = false;
4300   fontDescriptionRun02.slantDefined = false;
4301   fontDescriptionRun02.sizeDefined = false;
4302
4303   FontDescriptionRun fontDescriptionRun03;
4304   fontDescriptionRun03.characterRun.characterIndex = 22u;
4305   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4306   fontDescriptionRun03.familyLength = fontArabic.size();
4307   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
4308   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
4309   fontDescriptionRun03.familyDefined = true;
4310   fontDescriptionRun03.weightDefined = false;
4311   fontDescriptionRun03.widthDefined = false;
4312   fontDescriptionRun03.slantDefined = false;
4313   fontDescriptionRun03.sizeDefined = false;
4314
4315   FontDescriptionRun fontDescriptionRun04;
4316   fontDescriptionRun04.characterRun.characterIndex = 36u;
4317   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4318   fontDescriptionRun04.familyLength = fontLatin.size();
4319   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
4320   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
4321   fontDescriptionRun04.familyDefined = true;
4322   fontDescriptionRun04.weightDefined = false;
4323   fontDescriptionRun04.widthDefined = false;
4324   fontDescriptionRun04.slantDefined = false;
4325   fontDescriptionRun04.sizeDefined = false;
4326
4327   FontDescriptionRun fontDescriptionRun05;
4328   fontDescriptionRun05.characterRun.characterIndex = 48u;
4329   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4330   fontDescriptionRun05.familyLength = fontLatin.size();
4331   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
4332   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
4333   fontDescriptionRun05.familyDefined = true;
4334   fontDescriptionRun05.weightDefined = false;
4335   fontDescriptionRun05.widthDefined = false;
4336   fontDescriptionRun05.slantDefined = false;
4337   fontDescriptionRun05.sizeDefined = false;
4338
4339   FontDescriptionRun fontDescriptionRun06;
4340   fontDescriptionRun06.characterRun.characterIndex = 60u;
4341   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4342   fontDescriptionRun06.familyLength = fontArabic.size();
4343   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
4344   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
4345   fontDescriptionRun06.familyDefined = true;
4346   fontDescriptionRun06.weightDefined = false;
4347   fontDescriptionRun06.widthDefined = false;
4348   fontDescriptionRun06.slantDefined = false;
4349   fontDescriptionRun06.sizeDefined = false;
4350
4351   Vector<FontDescriptionRun> fontDescriptionRuns;
4352   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
4353   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
4354   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
4355   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
4356   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
4357   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
4358
4359   float positions[] = { 10.f, 16.f, 0.f, 0.f, 0.f, 0.f };
4360
4361   Size textArea( 100.f, 300.f );
4362   AlignData data =
4363   {
4364     "Center alignment for the first paragraph.",
4365     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4366     textArea,
4367     6u,
4368     fontDescriptionRuns.Begin(),
4369     LayoutEngine::HORIZONTAL_ALIGN_CENTER,
4370     LayoutEngine::VERTICAL_ALIGN_TOP,
4371     0u,
4372     22u,
4373     6u,
4374     positions
4375   };
4376
4377   if( !AlignTest( data ) )
4378   {
4379     tet_result(TET_FAIL);
4380   }
4381
4382   tet_result(TET_PASS);
4383   END_TEST;
4384 }
4385
4386 int UtcDaliTextAlign05(void)
4387 {
4388   ToolkitTestApplication application;
4389   tet_infoline(" UtcDaliTextAlign05");
4390
4391   // Calculate text alignment.
4392
4393   const std::string fontLatin( "TizenSans" );
4394   const std::string fontHebrew( "TizenSansHebrew" );
4395   const std::string fontArabic( "TizenSansArabic" );
4396
4397   // Set a known font description
4398   FontDescriptionRun fontDescriptionRun01;
4399   fontDescriptionRun01.characterRun.characterIndex = 0u;
4400   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4401   fontDescriptionRun01.familyLength = fontLatin.size();
4402   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
4403   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
4404   fontDescriptionRun01.familyDefined = true;
4405   fontDescriptionRun01.weightDefined = false;
4406   fontDescriptionRun01.widthDefined = false;
4407   fontDescriptionRun01.slantDefined = false;
4408   fontDescriptionRun01.sizeDefined = false;
4409
4410   FontDescriptionRun fontDescriptionRun02;
4411   fontDescriptionRun02.characterRun.characterIndex = 12u;
4412   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4413   fontDescriptionRun02.familyLength = fontHebrew.size();
4414   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
4415   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
4416   fontDescriptionRun02.familyDefined = true;
4417   fontDescriptionRun02.weightDefined = false;
4418   fontDescriptionRun02.widthDefined = false;
4419   fontDescriptionRun02.slantDefined = false;
4420   fontDescriptionRun02.sizeDefined = false;
4421
4422   FontDescriptionRun fontDescriptionRun03;
4423   fontDescriptionRun03.characterRun.characterIndex = 22u;
4424   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4425   fontDescriptionRun03.familyLength = fontArabic.size();
4426   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
4427   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
4428   fontDescriptionRun03.familyDefined = true;
4429   fontDescriptionRun03.weightDefined = false;
4430   fontDescriptionRun03.widthDefined = false;
4431   fontDescriptionRun03.slantDefined = false;
4432   fontDescriptionRun03.sizeDefined = false;
4433
4434   FontDescriptionRun fontDescriptionRun04;
4435   fontDescriptionRun04.characterRun.characterIndex = 36u;
4436   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4437   fontDescriptionRun04.familyLength = fontLatin.size();
4438   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
4439   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
4440   fontDescriptionRun04.familyDefined = true;
4441   fontDescriptionRun04.weightDefined = false;
4442   fontDescriptionRun04.widthDefined = false;
4443   fontDescriptionRun04.slantDefined = false;
4444   fontDescriptionRun04.sizeDefined = false;
4445
4446   FontDescriptionRun fontDescriptionRun05;
4447   fontDescriptionRun05.characterRun.characterIndex = 48u;
4448   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4449   fontDescriptionRun05.familyLength = fontLatin.size();
4450   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
4451   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
4452   fontDescriptionRun05.familyDefined = true;
4453   fontDescriptionRun05.weightDefined = false;
4454   fontDescriptionRun05.widthDefined = false;
4455   fontDescriptionRun05.slantDefined = false;
4456   fontDescriptionRun05.sizeDefined = false;
4457
4458   FontDescriptionRun fontDescriptionRun06;
4459   fontDescriptionRun06.characterRun.characterIndex = 60u;
4460   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4461   fontDescriptionRun06.familyLength = fontArabic.size();
4462   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
4463   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
4464   fontDescriptionRun06.familyDefined = true;
4465   fontDescriptionRun06.weightDefined = false;
4466   fontDescriptionRun06.widthDefined = false;
4467   fontDescriptionRun06.slantDefined = false;
4468   fontDescriptionRun06.sizeDefined = false;
4469
4470   Vector<FontDescriptionRun> fontDescriptionRuns;
4471   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
4472   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
4473   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
4474   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
4475   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
4476   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
4477
4478   float positions[] = { 0.f, 0.f, -1.f, 30.f, 0.f, 0.f };
4479
4480   Size textArea( 100.f, 300.f );
4481   AlignData data =
4482   {
4483     "Center alignment for the mid paragraph.",
4484     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4485     textArea,
4486     6u,
4487     fontDescriptionRuns.Begin(),
4488     LayoutEngine::HORIZONTAL_ALIGN_CENTER,
4489     LayoutEngine::VERTICAL_ALIGN_TOP,
4490     22u,
4491     26u,
4492     6u,
4493     positions
4494   };
4495
4496   if( !AlignTest( data ) )
4497   {
4498     tet_result(TET_FAIL);
4499   }
4500
4501   tet_result(TET_PASS);
4502   END_TEST;
4503 }
4504
4505 int UtcDaliTextAlign06(void)
4506 {
4507   ToolkitTestApplication application;
4508   tet_infoline(" UtcDaliTextAlign06");
4509
4510   // Calculate text alignment.
4511
4512   const std::string fontLatin( "TizenSans" );
4513   const std::string fontHebrew( "TizenSansHebrew" );
4514   const std::string fontArabic( "TizenSansArabic" );
4515
4516   // Set a known font description
4517   FontDescriptionRun fontDescriptionRun01;
4518   fontDescriptionRun01.characterRun.characterIndex = 0u;
4519   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4520   fontDescriptionRun01.familyLength = fontLatin.size();
4521   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
4522   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
4523   fontDescriptionRun01.familyDefined = true;
4524   fontDescriptionRun01.weightDefined = false;
4525   fontDescriptionRun01.widthDefined = false;
4526   fontDescriptionRun01.slantDefined = false;
4527   fontDescriptionRun01.sizeDefined = false;
4528
4529   FontDescriptionRun fontDescriptionRun02;
4530   fontDescriptionRun02.characterRun.characterIndex = 12u;
4531   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4532   fontDescriptionRun02.familyLength = fontHebrew.size();
4533   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
4534   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
4535   fontDescriptionRun02.familyDefined = true;
4536   fontDescriptionRun02.weightDefined = false;
4537   fontDescriptionRun02.widthDefined = false;
4538   fontDescriptionRun02.slantDefined = false;
4539   fontDescriptionRun02.sizeDefined = false;
4540
4541   FontDescriptionRun fontDescriptionRun03;
4542   fontDescriptionRun03.characterRun.characterIndex = 22u;
4543   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4544   fontDescriptionRun03.familyLength = fontArabic.size();
4545   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
4546   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
4547   fontDescriptionRun03.familyDefined = true;
4548   fontDescriptionRun03.weightDefined = false;
4549   fontDescriptionRun03.widthDefined = false;
4550   fontDescriptionRun03.slantDefined = false;
4551   fontDescriptionRun03.sizeDefined = false;
4552
4553   FontDescriptionRun fontDescriptionRun04;
4554   fontDescriptionRun04.characterRun.characterIndex = 36u;
4555   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4556   fontDescriptionRun04.familyLength = fontLatin.size();
4557   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
4558   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
4559   fontDescriptionRun04.familyDefined = true;
4560   fontDescriptionRun04.weightDefined = false;
4561   fontDescriptionRun04.widthDefined = false;
4562   fontDescriptionRun04.slantDefined = false;
4563   fontDescriptionRun04.sizeDefined = false;
4564
4565   FontDescriptionRun fontDescriptionRun05;
4566   fontDescriptionRun05.characterRun.characterIndex = 48u;
4567   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4568   fontDescriptionRun05.familyLength = fontLatin.size();
4569   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
4570   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
4571   fontDescriptionRun05.familyDefined = true;
4572   fontDescriptionRun05.weightDefined = false;
4573   fontDescriptionRun05.widthDefined = false;
4574   fontDescriptionRun05.slantDefined = false;
4575   fontDescriptionRun05.sizeDefined = false;
4576
4577   FontDescriptionRun fontDescriptionRun06;
4578   fontDescriptionRun06.characterRun.characterIndex = 60u;
4579   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4580   fontDescriptionRun06.familyLength = fontArabic.size();
4581   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
4582   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
4583   fontDescriptionRun06.familyDefined = true;
4584   fontDescriptionRun06.weightDefined = false;
4585   fontDescriptionRun06.widthDefined = false;
4586   fontDescriptionRun06.slantDefined = false;
4587   fontDescriptionRun06.sizeDefined = false;
4588
4589   Vector<FontDescriptionRun> fontDescriptionRuns;
4590   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
4591   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
4592   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
4593   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
4594   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
4595   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
4596
4597   float positions[] = { 0.f, 0.f, 0.f, 0.f, 10.f, 20.f };
4598
4599   Size textArea( 100.f, 300.f );
4600   AlignData data =
4601   {
4602     "Center alignment for the last paragraph.",
4603     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4604     textArea,
4605     6u,
4606     fontDescriptionRuns.Begin(),
4607     LayoutEngine::HORIZONTAL_ALIGN_CENTER,
4608     LayoutEngine::VERTICAL_ALIGN_TOP,
4609     48u,
4610     26u,
4611     6u,
4612     positions
4613   };
4614
4615   if( !AlignTest( data ) )
4616   {
4617     tet_result(TET_FAIL);
4618   }
4619
4620   tet_result(TET_PASS);
4621   END_TEST;
4622 }
4623
4624 int UtcDaliTextAlign07(void)
4625 {
4626   ToolkitTestApplication application;
4627   tet_infoline(" UtcDaliTextAlign07");
4628
4629   // Calculate text alignment.
4630
4631   const std::string fontLatin( "TizenSans" );
4632   const std::string fontHebrew( "TizenSansHebrew" );
4633   const std::string fontArabic( "TizenSansArabic" );
4634
4635   // Set a known font description
4636   FontDescriptionRun fontDescriptionRun01;
4637   fontDescriptionRun01.characterRun.characterIndex = 0u;
4638   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4639   fontDescriptionRun01.familyLength = fontLatin.size();
4640   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
4641   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
4642   fontDescriptionRun01.familyDefined = true;
4643   fontDescriptionRun01.weightDefined = false;
4644   fontDescriptionRun01.widthDefined = false;
4645   fontDescriptionRun01.slantDefined = false;
4646   fontDescriptionRun01.sizeDefined = false;
4647
4648   FontDescriptionRun fontDescriptionRun02;
4649   fontDescriptionRun02.characterRun.characterIndex = 12u;
4650   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4651   fontDescriptionRun02.familyLength = fontHebrew.size();
4652   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
4653   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
4654   fontDescriptionRun02.familyDefined = true;
4655   fontDescriptionRun02.weightDefined = false;
4656   fontDescriptionRun02.widthDefined = false;
4657   fontDescriptionRun02.slantDefined = false;
4658   fontDescriptionRun02.sizeDefined = false;
4659
4660   FontDescriptionRun fontDescriptionRun03;
4661   fontDescriptionRun03.characterRun.characterIndex = 22u;
4662   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4663   fontDescriptionRun03.familyLength = fontArabic.size();
4664   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
4665   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
4666   fontDescriptionRun03.familyDefined = true;
4667   fontDescriptionRun03.weightDefined = false;
4668   fontDescriptionRun03.widthDefined = false;
4669   fontDescriptionRun03.slantDefined = false;
4670   fontDescriptionRun03.sizeDefined = false;
4671
4672   FontDescriptionRun fontDescriptionRun04;
4673   fontDescriptionRun04.characterRun.characterIndex = 36u;
4674   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4675   fontDescriptionRun04.familyLength = fontLatin.size();
4676   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
4677   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
4678   fontDescriptionRun04.familyDefined = true;
4679   fontDescriptionRun04.weightDefined = false;
4680   fontDescriptionRun04.widthDefined = false;
4681   fontDescriptionRun04.slantDefined = false;
4682   fontDescriptionRun04.sizeDefined = false;
4683
4684   FontDescriptionRun fontDescriptionRun05;
4685   fontDescriptionRun05.characterRun.characterIndex = 48u;
4686   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4687   fontDescriptionRun05.familyLength = fontLatin.size();
4688   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
4689   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
4690   fontDescriptionRun05.familyDefined = true;
4691   fontDescriptionRun05.weightDefined = false;
4692   fontDescriptionRun05.widthDefined = false;
4693   fontDescriptionRun05.slantDefined = false;
4694   fontDescriptionRun05.sizeDefined = false;
4695
4696   FontDescriptionRun fontDescriptionRun06;
4697   fontDescriptionRun06.characterRun.characterIndex = 60u;
4698   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4699   fontDescriptionRun06.familyLength = fontArabic.size();
4700   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
4701   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
4702   fontDescriptionRun06.familyDefined = true;
4703   fontDescriptionRun06.weightDefined = false;
4704   fontDescriptionRun06.widthDefined = false;
4705   fontDescriptionRun06.slantDefined = false;
4706   fontDescriptionRun06.sizeDefined = false;
4707
4708   Vector<FontDescriptionRun> fontDescriptionRuns;
4709   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
4710   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
4711   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
4712   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
4713   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
4714   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
4715
4716   float positions[] = { 20.f, 33.f, 0.f, 0.f, 0.f, 0.f };
4717
4718   Size textArea( 100.f, 300.f );
4719   AlignData data =
4720   {
4721     "End alignment for the first paragraph.",
4722     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4723     textArea,
4724     6u,
4725     fontDescriptionRuns.Begin(),
4726     LayoutEngine::HORIZONTAL_ALIGN_END,
4727     LayoutEngine::VERTICAL_ALIGN_TOP,
4728     0u,
4729     22u,
4730     6u,
4731     positions
4732   };
4733
4734   if( !AlignTest( data ) )
4735   {
4736     tet_result(TET_FAIL);
4737   }
4738
4739   tet_result(TET_PASS);
4740   END_TEST;
4741 }
4742
4743 int UtcDaliTextAlign08(void)
4744 {
4745   ToolkitTestApplication application;
4746   tet_infoline(" UtcDaliTextAlign08");
4747
4748   // Calculate text alignment.
4749
4750   const std::string fontLatin( "TizenSans" );
4751   const std::string fontHebrew( "TizenSansHebrew" );
4752   const std::string fontArabic( "TizenSansArabic" );
4753
4754   // Set a known font description
4755   FontDescriptionRun fontDescriptionRun01;
4756   fontDescriptionRun01.characterRun.characterIndex = 0u;
4757   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4758   fontDescriptionRun01.familyLength = fontLatin.size();
4759   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
4760   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
4761   fontDescriptionRun01.familyDefined = true;
4762   fontDescriptionRun01.weightDefined = false;
4763   fontDescriptionRun01.widthDefined = false;
4764   fontDescriptionRun01.slantDefined = false;
4765   fontDescriptionRun01.sizeDefined = false;
4766
4767   FontDescriptionRun fontDescriptionRun02;
4768   fontDescriptionRun02.characterRun.characterIndex = 12u;
4769   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4770   fontDescriptionRun02.familyLength = fontHebrew.size();
4771   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
4772   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
4773   fontDescriptionRun02.familyDefined = true;
4774   fontDescriptionRun02.weightDefined = false;
4775   fontDescriptionRun02.widthDefined = false;
4776   fontDescriptionRun02.slantDefined = false;
4777   fontDescriptionRun02.sizeDefined = false;
4778
4779   FontDescriptionRun fontDescriptionRun03;
4780   fontDescriptionRun03.characterRun.characterIndex = 22u;
4781   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4782   fontDescriptionRun03.familyLength = fontArabic.size();
4783   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
4784   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
4785   fontDescriptionRun03.familyDefined = true;
4786   fontDescriptionRun03.weightDefined = false;
4787   fontDescriptionRun03.widthDefined = false;
4788   fontDescriptionRun03.slantDefined = false;
4789   fontDescriptionRun03.sizeDefined = false;
4790
4791   FontDescriptionRun fontDescriptionRun04;
4792   fontDescriptionRun04.characterRun.characterIndex = 36u;
4793   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4794   fontDescriptionRun04.familyLength = fontLatin.size();
4795   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
4796   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
4797   fontDescriptionRun04.familyDefined = true;
4798   fontDescriptionRun04.weightDefined = false;
4799   fontDescriptionRun04.widthDefined = false;
4800   fontDescriptionRun04.slantDefined = false;
4801   fontDescriptionRun04.sizeDefined = false;
4802
4803   FontDescriptionRun fontDescriptionRun05;
4804   fontDescriptionRun05.characterRun.characterIndex = 48u;
4805   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4806   fontDescriptionRun05.familyLength = fontLatin.size();
4807   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
4808   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
4809   fontDescriptionRun05.familyDefined = true;
4810   fontDescriptionRun05.weightDefined = false;
4811   fontDescriptionRun05.widthDefined = false;
4812   fontDescriptionRun05.slantDefined = false;
4813   fontDescriptionRun05.sizeDefined = false;
4814
4815   FontDescriptionRun fontDescriptionRun06;
4816   fontDescriptionRun06.characterRun.characterIndex = 60u;
4817   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4818   fontDescriptionRun06.familyLength = fontArabic.size();
4819   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
4820   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
4821   fontDescriptionRun06.familyDefined = true;
4822   fontDescriptionRun06.weightDefined = false;
4823   fontDescriptionRun06.widthDefined = false;
4824   fontDescriptionRun06.slantDefined = false;
4825   fontDescriptionRun06.sizeDefined = false;
4826
4827   Vector<FontDescriptionRun> fontDescriptionRuns;
4828   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
4829   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
4830   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
4831   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
4832   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
4833   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
4834
4835   float positions[] = { 0.f, 0.f, -4.f, 0.f, 0.f, 0.f };
4836
4837   Size textArea( 100.f, 300.f );
4838   AlignData data =
4839   {
4840     "End alignment for the mid paragraph.",
4841     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4842     textArea,
4843     6u,
4844     fontDescriptionRuns.Begin(),
4845     LayoutEngine::HORIZONTAL_ALIGN_END,
4846     LayoutEngine::VERTICAL_ALIGN_TOP,
4847     22u,
4848     26u,
4849     6u,
4850     positions
4851   };
4852
4853   if( !AlignTest( data ) )
4854   {
4855     tet_result(TET_FAIL);
4856   }
4857
4858   tet_result(TET_PASS);
4859   END_TEST;
4860 }
4861
4862 int UtcDaliTextAlign09(void)
4863 {
4864   ToolkitTestApplication application;
4865   tet_infoline(" UtcDaliTextAlign09");
4866
4867   // Calculate text alignment.
4868
4869   const std::string fontLatin( "TizenSans" );
4870   const std::string fontHebrew( "TizenSansHebrew" );
4871   const std::string fontArabic( "TizenSansArabic" );
4872
4873   // Set a known font description
4874   FontDescriptionRun fontDescriptionRun01;
4875   fontDescriptionRun01.characterRun.characterIndex = 0u;
4876   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4877   fontDescriptionRun01.familyLength = fontLatin.size();
4878   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
4879   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
4880   fontDescriptionRun01.familyDefined = true;
4881   fontDescriptionRun01.weightDefined = false;
4882   fontDescriptionRun01.widthDefined = false;
4883   fontDescriptionRun01.slantDefined = false;
4884   fontDescriptionRun01.sizeDefined = false;
4885
4886   FontDescriptionRun fontDescriptionRun02;
4887   fontDescriptionRun02.characterRun.characterIndex = 12u;
4888   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4889   fontDescriptionRun02.familyLength = fontHebrew.size();
4890   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
4891   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
4892   fontDescriptionRun02.familyDefined = true;
4893   fontDescriptionRun02.weightDefined = false;
4894   fontDescriptionRun02.widthDefined = false;
4895   fontDescriptionRun02.slantDefined = false;
4896   fontDescriptionRun02.sizeDefined = false;
4897
4898   FontDescriptionRun fontDescriptionRun03;
4899   fontDescriptionRun03.characterRun.characterIndex = 22u;
4900   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4901   fontDescriptionRun03.familyLength = fontArabic.size();
4902   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
4903   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
4904   fontDescriptionRun03.familyDefined = true;
4905   fontDescriptionRun03.weightDefined = false;
4906   fontDescriptionRun03.widthDefined = false;
4907   fontDescriptionRun03.slantDefined = false;
4908   fontDescriptionRun03.sizeDefined = false;
4909
4910   FontDescriptionRun fontDescriptionRun04;
4911   fontDescriptionRun04.characterRun.characterIndex = 36u;
4912   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4913   fontDescriptionRun04.familyLength = fontLatin.size();
4914   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
4915   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
4916   fontDescriptionRun04.familyDefined = true;
4917   fontDescriptionRun04.weightDefined = false;
4918   fontDescriptionRun04.widthDefined = false;
4919   fontDescriptionRun04.slantDefined = false;
4920   fontDescriptionRun04.sizeDefined = false;
4921
4922   FontDescriptionRun fontDescriptionRun05;
4923   fontDescriptionRun05.characterRun.characterIndex = 48u;
4924   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4925   fontDescriptionRun05.familyLength = fontLatin.size();
4926   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
4927   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
4928   fontDescriptionRun05.familyDefined = true;
4929   fontDescriptionRun05.weightDefined = false;
4930   fontDescriptionRun05.widthDefined = false;
4931   fontDescriptionRun05.slantDefined = false;
4932   fontDescriptionRun05.sizeDefined = false;
4933
4934   FontDescriptionRun fontDescriptionRun06;
4935   fontDescriptionRun06.characterRun.characterIndex = 60u;
4936   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4937   fontDescriptionRun06.familyLength = fontArabic.size();
4938   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
4939   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
4940   fontDescriptionRun06.familyDefined = true;
4941   fontDescriptionRun06.weightDefined = false;
4942   fontDescriptionRun06.widthDefined = false;
4943   fontDescriptionRun06.slantDefined = false;
4944   fontDescriptionRun06.sizeDefined = false;
4945
4946   Vector<FontDescriptionRun> fontDescriptionRuns;
4947   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
4948   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
4949   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
4950   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
4951   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
4952   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
4953
4954   float positions[] = { 0.f, 0.f, 0.f, 0.f, 20.f, 40.f };
4955
4956   Size textArea( 100.f, 300.f );
4957   AlignData data =
4958   {
4959     "End alignment for the last paragraph.",
4960     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4961     textArea,
4962     6u,
4963     fontDescriptionRuns.Begin(),
4964     LayoutEngine::HORIZONTAL_ALIGN_END,
4965     LayoutEngine::VERTICAL_ALIGN_TOP,
4966     48u,
4967     26u,
4968     6u,
4969     positions
4970   };
4971
4972   if( !AlignTest( data ) )
4973   {
4974     tet_result(TET_FAIL);
4975   }
4976
4977   tet_result(TET_PASS);
4978   END_TEST;
4979 }