71649728a97265f664c2457c235b3aa34eb36df4
[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;
90   VisualModelPtr visualModel;
91   MetricsPtr metrics;
92   Size layoutSize;
93
94   Vector<FontDescriptionRun> fontDescriptionRuns;
95   if( 0u != data.numberOfFonts )
96   {
97     fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
98                                 data.fontDescriptions,
99                                 data.fontDescriptions + data.numberOfFonts );
100   }
101
102   LayoutOptions options;
103   options.reorder = false;
104   options.align = false;
105   CreateTextModel( data.text,
106                    data.textArea,
107                    fontDescriptionRuns,
108                    options,
109                    layoutSize,
110                    logicalModel,
111                    visualModel,
112                    metrics );
113
114   // 2) Clear the layout.
115   Vector<LineRun>& lines = visualModel->mLines;
116
117   const Length numberOfCharacters = logicalModel->mText.Count();
118   const bool isLastNewParagraph = ( 0u == numberOfCharacters ) ? false : TextAbstraction::IsNewParagraph( *( logicalModel->mText.Begin() + ( numberOfCharacters - 1u ) ) );
119   const GlyphIndex lastGlyphIndex = data.startIndex + data.numberOfGlyphs - 1u;
120   const bool removeLastLine = isLastNewParagraph && ( lastGlyphIndex + 1u == visualModel->mGlyphs.Count() );
121
122   LineIndex startRemoveIndex = 0u;
123
124   if( 0u != lines.Count() )
125   {
126     startRemoveIndex = lines.Count();
127     LineIndex endRemoveIndex = startRemoveIndex;
128     ClearGlyphRuns( data.startIndex,
129                     lastGlyphIndex + ( removeLastLine ? 1u : 0u ),
130                     lines,
131                     startRemoveIndex,
132                     endRemoveIndex );
133
134     // Update the character runs of the lines.
135     const CharacterIndex* const glyphsToCharactersBuffer = visualModel->mGlyphsToCharacters.Begin();
136     const Length* const charactersPerGlyph = visualModel->mCharactersPerGlyph.Begin();
137     const CharacterIndex startCharacterIndex = *( glyphsToCharactersBuffer + data.startIndex );
138     const CharacterIndex lastCharacterIndex = *( glyphsToCharactersBuffer + lastGlyphIndex ) + *( charactersPerGlyph + lastGlyphIndex ) - 1u;
139     ClearCharacterRuns( startCharacterIndex,
140                         lastCharacterIndex + ( removeLastLine ? 1u : 0u ),
141                         lines,
142                         startRemoveIndex,
143                         endRemoveIndex );
144
145     lines.Erase( lines.Begin() + startRemoveIndex,
146                  lines.Begin() + endRemoveIndex );
147   }
148
149   Vector<Vector2>& glyphPositions = visualModel->mGlyphPositions;
150
151   glyphPositions.Erase( glyphPositions.Begin() + data.startIndex,
152                         glyphPositions.Begin() + data.startIndex + data.numberOfGlyphs );
153
154   // 3) Layout
155   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;
347   VisualModelPtr visualModel;
348   MetricsPtr metrics;
349   Size layoutSize;
350
351   Vector<FontDescriptionRun> fontDescriptionRuns;
352   if( 0u != data.numberOfFonts )
353   {
354     fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
355                                 data.fontDescriptions,
356                                 data.fontDescriptions + data.numberOfFonts );
357   }
358
359   LayoutOptions options;
360   options.reorder = false;
361   options.align = false;
362   CreateTextModel( data.text,
363                    data.textArea,
364                    fontDescriptionRuns,
365                    options,
366                    layoutSize,
367                    logicalModel,
368                    visualModel,
369                    metrics );
370
371   // 2) Call the ReLayoutRightToLeftLines() method.
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;
456   VisualModelPtr visualModel;
457   MetricsPtr metrics;
458   Size layoutSize;
459
460   Vector<FontDescriptionRun> fontDescriptionRuns;
461   if( 0u != data.numberOfFonts )
462   {
463     fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
464                                 data.fontDescriptions,
465                                 data.fontDescriptions + data.numberOfFonts );
466   }
467
468   LayoutOptions options;
469   options.align = false;
470   CreateTextModel( data.text,
471                    data.textArea,
472                    fontDescriptionRuns,
473                    options,
474                    layoutSize,
475                    logicalModel,
476                    visualModel,
477                    metrics );
478
479   // Call the Align method.
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, 39.f,  -9.f, 50.f,  -9.f, 60.f,  -9.f, 66.f, -13.f, 69.f, -13.f, 78.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     80.f,
1073     15.f,
1074     -5.f,
1075     4.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, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.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, -11.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, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.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, 41.f, -9.f, 52.f, -9.f, 62.f, -9.f, 68.f, -13.f, 71.f, -13.f, 80.f, -0.f,
1669     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 45.f, -10.f, 56.f, -13.f, 63.f, -10.f, 68.f, -10.f, 76.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, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.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     5.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     80.f,
1764     15.f,
1765     -5.f,
1766     4.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     79.f,
1788     15.f,
1789     -5.f,
1790     5.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     82.f,
1824     15.f,
1825     -5.f,
1826     4.f,
1827     0.f,
1828     false,
1829     false
1830   };
1831   struct LineRun line14 =
1832   {
1833     { 140u, 10u },
1834     { 140u, 10u },
1835     77.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     80.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, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.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, -11.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, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.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, 41.f, -9.f, 52.f, -9.f, 62.f, -9.f, 68.f, -13.f, 71.f, -13.f, 80.f, -0.f,
2196     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 45.f, -10.f, 56.f, -13.f, 63.f, -10.f, 68.f, -10.f, 76.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, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.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     5.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     80.f,
2291     15.f,
2292     -5.f,
2293     4.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     79.f,
2315     15.f,
2316     -5.f,
2317     5.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     82.f,
2351     15.f,
2352     -5.f,
2353     4.f,
2354     0.f,
2355     false,
2356     false
2357   };
2358   struct LineRun line14 =
2359   {
2360     { 140u, 10u },
2361     { 140u, 10u },
2362     77.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     80.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, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.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, -11.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, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.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, 41.f, -9.f, 52.f, -9.f, 62.f, -9.f, 68.f, -13.f, 71.f, -13.f, 80.f, -0.f,
2723     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 45.f, -10.f, 56.f, -13.f, 63.f, -10.f, 68.f, -10.f, 76.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, 39.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 78.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     5.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     80.f,
2818     15.f,
2819     -5.f,
2820     4.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     79.f,
2842     15.f,
2843     -5.f,
2844     5.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     82.f,
2878     15.f,
2879     -5.f,
2880     4.f,
2881     0.f,
2882     false,
2883     false
2884   };
2885   struct LineRun line14 =
2886   {
2887     { 140u, 10u },
2888     { 140u, 10u },
2889     77.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     80.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
2958   Vector<LineRun> lines;
2959   lines.PushBack( line01 );
2960   lines.PushBack( line02 );
2961   lines.PushBack( line03 );
2962   lines.PushBack( line04 );
2963   lines.PushBack( line05 );
2964   lines.PushBack( line06 );
2965   lines.PushBack( line07 );
2966   lines.PushBack( line08 );
2967   lines.PushBack( line09 );
2968   lines.PushBack( line10 );
2969   lines.PushBack( line11 );
2970   lines.PushBack( line12 );
2971   lines.PushBack( line13 );
2972   lines.PushBack( line14 );
2973   lines.PushBack( line15 );
2974   lines.PushBack( line16 );
2975   lines.PushBack( line17 );
2976   lines.PushBack( line18 );
2977   lines.PushBack( line19 );
2978
2979   LayoutTextData data =
2980   {
2981     "Layout bidirectional text.",
2982     "Hello world demo שלום עולם.\n"
2983     "مرحبا بالعالم hello world שלום עולם\n"
2984     "שלום עולם hello world demo.\n"
2985     "hello world مرحبا بالعالم שלום עולם\n"
2986     "Hello world demo שלום עולם.\n"
2987     "שלום עולם hello world مرحبا بالعالم\n",
2988     textArea,
2989     15u,
2990     fontDescriptionRuns.Begin(),
2991     layoutSize,
2992     192u,
2993     positions,
2994     19u,
2995     lines.Begin(),
2996     LayoutEngine::MULTI_LINE_BOX,
2997     128u,
2998     64u,
2999     false,
3000     true
3001   };
3002
3003   if( !LayoutTextTest( data ) )
3004   {
3005     tet_result(TET_FAIL);
3006   }
3007
3008   tet_result(TET_PASS);
3009   END_TEST;
3010 }
3011
3012 int UtcDaliTextLayoutEllipsis01(void)
3013 {
3014   ToolkitTestApplication application;
3015   tet_infoline(" UtcDaliTextLayoutEllipsis01");
3016
3017   // Layout single-line LTR text with ellipsis.
3018
3019   const std::string fontLatin( "TizenSans" );
3020
3021   // Set a known font description
3022   FontDescriptionRun fontDescriptionRun01;
3023   fontDescriptionRun01.characterRun.characterIndex = 0u;
3024   fontDescriptionRun01.characterRun.numberOfCharacters = 51u;
3025   fontDescriptionRun01.familyLength = fontLatin.size();
3026   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3027   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
3028   fontDescriptionRun01.familyDefined = true;
3029   fontDescriptionRun01.weightDefined = false;
3030   fontDescriptionRun01.widthDefined = false;
3031   fontDescriptionRun01.slantDefined = false;
3032   fontDescriptionRun01.sizeDefined = false;
3033
3034   Vector<FontDescriptionRun> fontDescriptionRuns;
3035   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3036
3037   struct LineRun line01 =
3038   {
3039     { 0u, 13u },
3040     { 0u, 13u },
3041     93.f,
3042     15.f,
3043     -5.f,
3044     0.f,
3045     0.f,
3046     false,
3047     true
3048   };
3049   Vector<LineRun> lines;
3050   lines.PushBack( line01 );
3051
3052   float positions[] =
3053   {
3054     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,
3055   };
3056
3057   Size textArea( 100.f, 50.f );
3058   Size layoutSize( 100.f, 20.f );
3059
3060   LayoutTextData data =
3061   {
3062     "Layout single-line LTR text with ellipsis.",
3063     "Hello world demo hello world demo hello world demo.",
3064     textArea,
3065     1u,
3066     fontDescriptionRuns.Begin(),
3067     layoutSize,
3068     13u,
3069     positions,
3070     1u,
3071     lines.Begin(),
3072     LayoutEngine::SINGLE_LINE_BOX,
3073     0u,
3074     51u,
3075     true,
3076     true
3077   };
3078
3079   if( !LayoutTextTest( data ) )
3080   {
3081     tet_result(TET_FAIL);
3082   }
3083
3084   tet_result(TET_PASS);
3085   END_TEST;
3086 }
3087
3088 int UtcDaliTextLayoutEllipsis02(void)
3089 {
3090   ToolkitTestApplication application;
3091   tet_infoline(" UtcDaliTextLayoutEllipsis02");
3092
3093   // Layout multi-line LTR text with ellipsis.
3094
3095   const std::string fontLatin( "TizenSans" );
3096
3097   // Set a known font description
3098   FontDescriptionRun fontDescriptionRun01;
3099   fontDescriptionRun01.characterRun.characterIndex = 0u;
3100   fontDescriptionRun01.characterRun.numberOfCharacters = 51u;
3101   fontDescriptionRun01.familyLength = fontLatin.size();
3102   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3103   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
3104   fontDescriptionRun01.familyDefined = true;
3105   fontDescriptionRun01.weightDefined = false;
3106   fontDescriptionRun01.widthDefined = false;
3107   fontDescriptionRun01.slantDefined = false;
3108   fontDescriptionRun01.sizeDefined = false;
3109
3110   Vector<FontDescriptionRun> fontDescriptionRuns;
3111   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3112
3113   struct LineRun line01 =
3114   {
3115     { 0u, 12u },
3116     { 0u, 12u },
3117     81.f,
3118     15.f,
3119     -5.f,
3120     3.f,
3121     0.f,
3122     false,
3123     false
3124   };
3125   struct LineRun line02 =
3126   {
3127     { 12u, 12u },
3128     { 12u, 12u },
3129     93.f,
3130     15.f,
3131     -5.f,
3132     0.f,
3133     0.f,
3134     false,
3135     true
3136   };
3137   Vector<LineRun> lines;
3138   lines.PushBack( line01 );
3139   lines.PushBack( line02 );
3140
3141   float positions[] =
3142   {
3143     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,
3144     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,
3145   };
3146
3147   Size textArea( 100.f, 50.f );
3148   Size layoutSize( 100.f, 60.f );
3149
3150   LayoutTextData data =
3151   {
3152     "Layout multi-line LTR text with ellipsis.",
3153     "Hello world demo hello world demo hello world demo.",
3154     textArea,
3155     1u,
3156     fontDescriptionRuns.Begin(),
3157     layoutSize,
3158     24u,
3159     positions,
3160     2u,
3161     lines.Begin(),
3162     LayoutEngine::MULTI_LINE_BOX,
3163     0u,
3164     51u,
3165     true,
3166     true
3167   };
3168
3169   if( !LayoutTextTest( data ) )
3170   {
3171     tet_result(TET_FAIL);
3172   }
3173
3174   tet_result(TET_PASS);
3175   END_TEST;
3176 }
3177
3178 int UtcDaliTextLayoutEllipsis03(void)
3179 {
3180   ToolkitTestApplication application;
3181   tet_infoline(" UtcDaliTextLayoutEllipsis03");
3182
3183   // Layout single-line RTL text with ellipsis.
3184
3185   const std::string fontHebrew( "TizenSansHebrew" );
3186   const std::string fontArabic( "TizenSansArabic" );
3187
3188   // Set a known font description
3189   FontDescriptionRun fontDescriptionRun01;
3190   fontDescriptionRun01.characterRun.characterIndex = 0u;
3191   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
3192   fontDescriptionRun01.familyLength = fontHebrew.size();
3193   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3194   memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength );
3195   fontDescriptionRun01.familyDefined = true;
3196   fontDescriptionRun01.weightDefined = false;
3197   fontDescriptionRun01.widthDefined = false;
3198   fontDescriptionRun01.slantDefined = false;
3199   fontDescriptionRun01.sizeDefined = false;
3200
3201   FontDescriptionRun fontDescriptionRun02;
3202   fontDescriptionRun02.characterRun.characterIndex = 10u;
3203   fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
3204   fontDescriptionRun02.familyLength = fontArabic.size();
3205   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
3206   memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength );
3207   fontDescriptionRun02.familyDefined = true;
3208   fontDescriptionRun02.weightDefined = false;
3209   fontDescriptionRun02.widthDefined = false;
3210   fontDescriptionRun02.slantDefined = false;
3211   fontDescriptionRun02.sizeDefined = false;
3212
3213   FontDescriptionRun fontDescriptionRun03;
3214   fontDescriptionRun03.characterRun.characterIndex = 24u;
3215   fontDescriptionRun03.characterRun.numberOfCharacters = 10u;
3216   fontDescriptionRun03.familyLength = fontHebrew.size();
3217   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
3218   memcpy( fontDescriptionRun03.familyName, fontHebrew.c_str(), fontDescriptionRun03.familyLength );
3219   fontDescriptionRun03.familyDefined = true;
3220   fontDescriptionRun03.weightDefined = false;
3221   fontDescriptionRun03.widthDefined = false;
3222   fontDescriptionRun03.slantDefined = false;
3223   fontDescriptionRun03.sizeDefined = false;
3224
3225   FontDescriptionRun fontDescriptionRun04;
3226   fontDescriptionRun04.characterRun.characterIndex = 34u;
3227   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
3228   fontDescriptionRun04.familyLength = fontArabic.size();
3229   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
3230   memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
3231   fontDescriptionRun04.familyDefined = true;
3232   fontDescriptionRun04.weightDefined = false;
3233   fontDescriptionRun04.widthDefined = false;
3234   fontDescriptionRun04.slantDefined = false;
3235   fontDescriptionRun04.sizeDefined = false;
3236
3237   FontDescriptionRun fontDescriptionRun05;
3238   fontDescriptionRun05.characterRun.characterIndex = 48u;
3239   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
3240   fontDescriptionRun05.familyLength = fontHebrew.size();
3241   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
3242   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
3243   fontDescriptionRun05.familyDefined = true;
3244   fontDescriptionRun05.weightDefined = false;
3245   fontDescriptionRun05.widthDefined = false;
3246   fontDescriptionRun05.slantDefined = false;
3247   fontDescriptionRun05.sizeDefined = false;
3248
3249   FontDescriptionRun fontDescriptionRun06;
3250   fontDescriptionRun06.characterRun.characterIndex = 58u;
3251   fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
3252   fontDescriptionRun06.familyLength = fontArabic.size();
3253   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
3254   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
3255   fontDescriptionRun06.familyDefined = true;
3256   fontDescriptionRun06.weightDefined = false;
3257   fontDescriptionRun06.widthDefined = false;
3258   fontDescriptionRun06.slantDefined = false;
3259   fontDescriptionRun06.sizeDefined = false;
3260
3261   Vector<FontDescriptionRun> fontDescriptionRuns;
3262   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3263   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
3264   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
3265   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
3266   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
3267   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
3268
3269   struct LineRun line01 =
3270   {
3271     { 0u, 16u },
3272     { 0u, 16u },
3273     95.f,
3274     15.f,
3275     -5.f,
3276     0.f,
3277     0.f,
3278     false,
3279     true
3280   };
3281   Vector<LineRun> lines;
3282   lines.PushBack( line01 );
3283
3284   float positions[] =
3285   {
3286     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,
3287   };
3288
3289   Size textArea( 100.f, 50.f );
3290   Size layoutSize( 100.f, 20.f );
3291
3292   LayoutTextData data =
3293   {
3294     "Layout single-line RTL text with ellipsis.",
3295     "שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم.",
3296     textArea,
3297     6u,
3298     fontDescriptionRuns.Begin(),
3299     layoutSize,
3300     16u,
3301     positions,
3302     1u,
3303     lines.Begin(),
3304     LayoutEngine::SINGLE_LINE_BOX,
3305     0u,
3306     72u,
3307     true,
3308     true
3309   };
3310
3311   if( !LayoutTextTest( data ) )
3312   {
3313     tet_result(TET_FAIL);
3314   }
3315
3316   tet_result(TET_PASS);
3317   END_TEST;
3318 }
3319
3320 int UtcDaliTextLayoutEllipsis04(void)
3321 {
3322   ToolkitTestApplication application;
3323   tet_infoline(" UtcDaliTextLayoutEllipsis04");
3324
3325   // Layout multi-line RTL text with ellipsis.
3326
3327   const std::string fontHebrew( "TizenSansHebrew" );
3328   const std::string fontArabic( "TizenSansArabic" );
3329
3330   // Set a known font description
3331   FontDescriptionRun fontDescriptionRun01;
3332   fontDescriptionRun01.characterRun.characterIndex = 0u;
3333   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
3334   fontDescriptionRun01.familyLength = fontHebrew.size();
3335   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3336   memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength );
3337   fontDescriptionRun01.familyDefined = true;
3338   fontDescriptionRun01.weightDefined = false;
3339   fontDescriptionRun01.widthDefined = false;
3340   fontDescriptionRun01.slantDefined = false;
3341   fontDescriptionRun01.sizeDefined = false;
3342
3343   FontDescriptionRun fontDescriptionRun02;
3344   fontDescriptionRun02.characterRun.characterIndex = 10u;
3345   fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
3346   fontDescriptionRun02.familyLength = fontArabic.size();
3347   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
3348   memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength );
3349   fontDescriptionRun02.familyDefined = true;
3350   fontDescriptionRun02.weightDefined = false;
3351   fontDescriptionRun02.widthDefined = false;
3352   fontDescriptionRun02.slantDefined = false;
3353   fontDescriptionRun02.sizeDefined = false;
3354
3355   FontDescriptionRun fontDescriptionRun03;
3356   fontDescriptionRun03.characterRun.characterIndex = 24u;
3357   fontDescriptionRun03.characterRun.numberOfCharacters = 10u;
3358   fontDescriptionRun03.familyLength = fontHebrew.size();
3359   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
3360   memcpy( fontDescriptionRun03.familyName, fontHebrew.c_str(), fontDescriptionRun03.familyLength );
3361   fontDescriptionRun03.familyDefined = true;
3362   fontDescriptionRun03.weightDefined = false;
3363   fontDescriptionRun03.widthDefined = false;
3364   fontDescriptionRun03.slantDefined = false;
3365   fontDescriptionRun03.sizeDefined = false;
3366
3367   FontDescriptionRun fontDescriptionRun04;
3368   fontDescriptionRun04.characterRun.characterIndex = 34u;
3369   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
3370   fontDescriptionRun04.familyLength = fontArabic.size();
3371   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
3372   memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
3373   fontDescriptionRun04.familyDefined = true;
3374   fontDescriptionRun04.weightDefined = false;
3375   fontDescriptionRun04.widthDefined = false;
3376   fontDescriptionRun04.slantDefined = false;
3377   fontDescriptionRun04.sizeDefined = false;
3378
3379   FontDescriptionRun fontDescriptionRun05;
3380   fontDescriptionRun05.characterRun.characterIndex = 48u;
3381   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
3382   fontDescriptionRun05.familyLength = fontHebrew.size();
3383   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
3384   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
3385   fontDescriptionRun05.familyDefined = true;
3386   fontDescriptionRun05.weightDefined = false;
3387   fontDescriptionRun05.widthDefined = false;
3388   fontDescriptionRun05.slantDefined = false;
3389   fontDescriptionRun05.sizeDefined = false;
3390
3391   FontDescriptionRun fontDescriptionRun06;
3392   fontDescriptionRun06.characterRun.characterIndex = 58u;
3393   fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
3394   fontDescriptionRun06.familyLength = fontArabic.size();
3395   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
3396   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
3397   fontDescriptionRun06.familyDefined = true;
3398   fontDescriptionRun06.weightDefined = false;
3399   fontDescriptionRun06.widthDefined = false;
3400   fontDescriptionRun06.slantDefined = false;
3401   fontDescriptionRun06.sizeDefined = false;
3402
3403   Vector<FontDescriptionRun> fontDescriptionRuns;
3404   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3405   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
3406   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
3407   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
3408   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
3409   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
3410
3411   struct LineRun line01 =
3412   {
3413     { 0u, 16u },
3414     { 0u, 16u },
3415     96.f,
3416     15.f,
3417     -5.f,
3418     3.f,
3419     0.f,
3420     false,
3421     false
3422   };
3423   struct LineRun line02 =
3424   {
3425     { 16u, 18u },
3426     { 16u, 18u },
3427     97.f,
3428     15.f,
3429     -5.f,
3430     4.f,
3431     0.f,
3432     false,
3433     true
3434   };
3435   Vector<LineRun> lines;
3436   lines.PushBack( line01 );
3437   lines.PushBack( line02 );
3438
3439   float positions[] =
3440   {
3441     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,
3442     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,
3443   };
3444
3445   Size textArea( 100.f, 50.f );
3446   Size layoutSize( 100.f, 60.f );
3447
3448   LayoutTextData data =
3449   {
3450     "Layout single-line RTL text with ellipsis.",
3451     "שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم.",
3452     textArea,
3453     6u,
3454     fontDescriptionRuns.Begin(),
3455     layoutSize,
3456     34u,
3457     positions,
3458     2u,
3459     lines.Begin(),
3460     LayoutEngine::MULTI_LINE_BOX,
3461     0u,
3462     72u,
3463     true,
3464     true
3465   };
3466
3467   if( !LayoutTextTest( data ) )
3468   {
3469     tet_result(TET_FAIL);
3470   }
3471
3472   tet_result(TET_PASS);
3473   END_TEST;
3474 }
3475
3476 int UtcDaliTextReorderLayout01(void)
3477 {
3478   ToolkitTestApplication application;
3479   tet_infoline(" UtcDaliTextReorderLayout01");
3480
3481   // Reorder lines. No right to left characters.
3482
3483   const std::string fontLatin( "TizenSans" );
3484
3485   // Set a known font description
3486   FontDescriptionRun fontDescriptionRun01;
3487   fontDescriptionRun01.characterRun.characterIndex = 0u;
3488   fontDescriptionRun01.characterRun.numberOfCharacters = 11u;
3489   fontDescriptionRun01.familyLength = fontLatin.size();
3490   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3491   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
3492   fontDescriptionRun01.familyDefined = true;
3493   fontDescriptionRun01.weightDefined = false;
3494   fontDescriptionRun01.widthDefined = false;
3495   fontDescriptionRun01.slantDefined = false;
3496   fontDescriptionRun01.sizeDefined = false;
3497
3498   Vector<FontDescriptionRun> fontDescriptionRuns;
3499   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3500
3501   float positions[] =
3502   {
3503     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,
3504   };
3505
3506   Size textArea( 100.f, 300.f );
3507
3508   ReLayoutRightToLeftLinesData data =
3509   {
3510     "Text with no right to left text.",
3511     "Hello world",
3512     textArea,
3513     1u,
3514     fontDescriptionRuns.Begin(),
3515     11u,
3516     positions,
3517     0u,
3518     11u
3519   };
3520
3521   if( !ReLayoutRightToLeftLinesTest( data ) )
3522   {
3523     tet_result(TET_FAIL);
3524   }
3525
3526   tet_result(TET_PASS);
3527   END_TEST;
3528 }
3529
3530 int UtcDaliTextReorderLayout02(void)
3531 {
3532   ToolkitTestApplication application;
3533   tet_infoline(" UtcDaliTextReorderLayout02");
3534
3535   // Reorder lines of the first paragraph.
3536
3537   const std::string fontHebrew( "TizenSansHebrew" );
3538   const std::string fontArabic( "TizenSansArabic" );
3539
3540   // Set a known font description
3541   FontDescriptionRun fontDescriptionRun01;
3542   fontDescriptionRun01.characterRun.characterIndex = 0u;
3543   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
3544   fontDescriptionRun01.familyLength = fontHebrew.size();
3545   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3546   memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength );
3547   fontDescriptionRun01.familyDefined = true;
3548   fontDescriptionRun01.weightDefined = false;
3549   fontDescriptionRun01.widthDefined = false;
3550   fontDescriptionRun01.slantDefined = false;
3551   fontDescriptionRun01.sizeDefined = false;
3552
3553   FontDescriptionRun fontDescriptionRun02;
3554   fontDescriptionRun02.characterRun.characterIndex = 10u;
3555   fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
3556   fontDescriptionRun02.familyLength = fontArabic.size();
3557   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
3558   memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength );
3559   fontDescriptionRun02.familyDefined = true;
3560   fontDescriptionRun02.weightDefined = false;
3561   fontDescriptionRun02.widthDefined = false;
3562   fontDescriptionRun02.slantDefined = false;
3563   fontDescriptionRun02.sizeDefined = false;
3564
3565   FontDescriptionRun fontDescriptionRun03;
3566   fontDescriptionRun03.characterRun.characterIndex = 24u;
3567   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
3568   fontDescriptionRun03.familyLength = fontArabic.size();
3569   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
3570   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
3571   fontDescriptionRun03.familyDefined = true;
3572   fontDescriptionRun03.weightDefined = false;
3573   fontDescriptionRun03.widthDefined = false;
3574   fontDescriptionRun03.slantDefined = false;
3575   fontDescriptionRun03.sizeDefined = false;
3576
3577   FontDescriptionRun fontDescriptionRun04;
3578   fontDescriptionRun04.characterRun.characterIndex = 38u;
3579   fontDescriptionRun04.characterRun.numberOfCharacters = 10u;
3580   fontDescriptionRun04.familyLength = fontHebrew.size();
3581   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
3582   memcpy( fontDescriptionRun04.familyName, fontHebrew.c_str(), fontDescriptionRun04.familyLength );
3583   fontDescriptionRun04.familyDefined = true;
3584   fontDescriptionRun04.weightDefined = false;
3585   fontDescriptionRun04.widthDefined = false;
3586   fontDescriptionRun04.slantDefined = false;
3587   fontDescriptionRun04.sizeDefined = false;
3588
3589   FontDescriptionRun fontDescriptionRun05;
3590   fontDescriptionRun05.characterRun.characterIndex = 48u;
3591   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
3592   fontDescriptionRun05.familyLength = fontHebrew.size();
3593   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
3594   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
3595   fontDescriptionRun05.familyDefined = true;
3596   fontDescriptionRun05.weightDefined = false;
3597   fontDescriptionRun05.widthDefined = false;
3598   fontDescriptionRun05.slantDefined = false;
3599   fontDescriptionRun05.sizeDefined = false;
3600
3601   FontDescriptionRun fontDescriptionRun06;
3602   fontDescriptionRun06.characterRun.characterIndex = 58u;
3603   fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
3604   fontDescriptionRun06.familyLength = fontArabic.size();
3605   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
3606   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
3607   fontDescriptionRun06.familyDefined = true;
3608   fontDescriptionRun06.weightDefined = false;
3609   fontDescriptionRun06.widthDefined = false;
3610   fontDescriptionRun06.slantDefined = false;
3611   fontDescriptionRun06.sizeDefined = false;
3612
3613   Vector<FontDescriptionRun> fontDescriptionRuns;
3614   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3615   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
3616   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
3617   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
3618   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
3619   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
3620
3621   float positions[] =
3622   {
3623     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,
3624     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,
3625     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,
3626     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
3627     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,
3628     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,
3629   };
3630
3631   Size textArea( 100.f, 300.f );
3632
3633   ReLayoutRightToLeftLinesData data =
3634   {
3635     "Paragraphs with right to left text.",
3636     "שלום עולם مرحبا بالعالم\n"
3637     "مرحبا بالعالم שלום עולם\n"
3638     "שלום עולם مرحبا بالعالم.",
3639     textArea,
3640     6u,
3641     fontDescriptionRuns.Begin(),
3642     72u,
3643     positions,
3644     0u,
3645     24u
3646   };
3647
3648   if( !ReLayoutRightToLeftLinesTest( data ) )
3649   {
3650     tet_result(TET_FAIL);
3651   }
3652
3653   tet_result(TET_PASS);
3654   END_TEST;
3655 }
3656
3657 int UtcDaliTextReorderLayout03(void)
3658 {
3659   ToolkitTestApplication application;
3660   tet_infoline(" UtcDaliTextReorderLayout03");
3661
3662   // Reorder lines of the mid paragraph.
3663
3664   const std::string fontHebrew( "TizenSansHebrew" );
3665   const std::string fontArabic( "TizenSansArabic" );
3666
3667   // Set a known font description
3668   FontDescriptionRun fontDescriptionRun01;
3669   fontDescriptionRun01.characterRun.characterIndex = 0u;
3670   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
3671   fontDescriptionRun01.familyLength = fontHebrew.size();
3672   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3673   memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength );
3674   fontDescriptionRun01.familyDefined = true;
3675   fontDescriptionRun01.weightDefined = false;
3676   fontDescriptionRun01.widthDefined = false;
3677   fontDescriptionRun01.slantDefined = false;
3678   fontDescriptionRun01.sizeDefined = false;
3679
3680   FontDescriptionRun fontDescriptionRun02;
3681   fontDescriptionRun02.characterRun.characterIndex = 10u;
3682   fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
3683   fontDescriptionRun02.familyLength = fontArabic.size();
3684   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
3685   memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength );
3686   fontDescriptionRun02.familyDefined = true;
3687   fontDescriptionRun02.weightDefined = false;
3688   fontDescriptionRun02.widthDefined = false;
3689   fontDescriptionRun02.slantDefined = false;
3690   fontDescriptionRun02.sizeDefined = false;
3691
3692   FontDescriptionRun fontDescriptionRun03;
3693   fontDescriptionRun03.characterRun.characterIndex = 24u;
3694   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
3695   fontDescriptionRun03.familyLength = fontArabic.size();
3696   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
3697   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
3698   fontDescriptionRun03.familyDefined = true;
3699   fontDescriptionRun03.weightDefined = false;
3700   fontDescriptionRun03.widthDefined = false;
3701   fontDescriptionRun03.slantDefined = false;
3702   fontDescriptionRun03.sizeDefined = false;
3703
3704   FontDescriptionRun fontDescriptionRun04;
3705   fontDescriptionRun04.characterRun.characterIndex = 38u;
3706   fontDescriptionRun04.characterRun.numberOfCharacters = 10u;
3707   fontDescriptionRun04.familyLength = fontHebrew.size();
3708   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
3709   memcpy( fontDescriptionRun04.familyName, fontHebrew.c_str(), fontDescriptionRun04.familyLength );
3710   fontDescriptionRun04.familyDefined = true;
3711   fontDescriptionRun04.weightDefined = false;
3712   fontDescriptionRun04.widthDefined = false;
3713   fontDescriptionRun04.slantDefined = false;
3714   fontDescriptionRun04.sizeDefined = false;
3715
3716   FontDescriptionRun fontDescriptionRun05;
3717   fontDescriptionRun05.characterRun.characterIndex = 48u;
3718   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
3719   fontDescriptionRun05.familyLength = fontHebrew.size();
3720   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
3721   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
3722   fontDescriptionRun05.familyDefined = true;
3723   fontDescriptionRun05.weightDefined = false;
3724   fontDescriptionRun05.widthDefined = false;
3725   fontDescriptionRun05.slantDefined = false;
3726   fontDescriptionRun05.sizeDefined = false;
3727
3728   FontDescriptionRun fontDescriptionRun06;
3729   fontDescriptionRun06.characterRun.characterIndex = 58u;
3730   fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
3731   fontDescriptionRun06.familyLength = fontArabic.size();
3732   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
3733   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
3734   fontDescriptionRun06.familyDefined = true;
3735   fontDescriptionRun06.weightDefined = false;
3736   fontDescriptionRun06.widthDefined = false;
3737   fontDescriptionRun06.slantDefined = false;
3738   fontDescriptionRun06.sizeDefined = false;
3739
3740   Vector<FontDescriptionRun> fontDescriptionRuns;
3741   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3742   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
3743   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
3744   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
3745   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
3746   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
3747
3748   float positions[] =
3749   {
3750     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,
3751     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,
3752     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,
3753     22.f, -10.f, 17.f, -10.f, 10.f, -13.f, 1.f, -10.f, 0.f, -0.f,
3754     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,
3755     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,
3756   };
3757
3758   Size textArea( 100.f, 300.f );
3759
3760   ReLayoutRightToLeftLinesData data =
3761   {
3762     "Paragraphs with right to left text.",
3763     "שלום עולם مرحبا بالعالم\n"
3764     "مرحبا بالعالم שלום עולם\n"
3765     "שלום עולם مرحبا بالعالم.",
3766     textArea,
3767     6u,
3768     fontDescriptionRuns.Begin(),
3769     72u,
3770     positions,
3771     24u,
3772     24u
3773   };
3774
3775   if( !ReLayoutRightToLeftLinesTest( data ) )
3776   {
3777     tet_result(TET_FAIL);
3778   }
3779
3780   tet_result(TET_PASS);
3781   END_TEST;
3782 }
3783
3784 int UtcDaliTextReorderLayout04(void)
3785 {
3786   ToolkitTestApplication application;
3787   tet_infoline(" UtcDaliTextReorderLayout04");
3788
3789   // Reorder lines of the last paragraph.
3790
3791   const std::string fontHebrew( "TizenSansHebrew" );
3792   const std::string fontArabic( "TizenSansArabic" );
3793
3794   // Set a known font description
3795   FontDescriptionRun fontDescriptionRun01;
3796   fontDescriptionRun01.characterRun.characterIndex = 0u;
3797   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
3798   fontDescriptionRun01.familyLength = fontHebrew.size();
3799   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3800   memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength );
3801   fontDescriptionRun01.familyDefined = true;
3802   fontDescriptionRun01.weightDefined = false;
3803   fontDescriptionRun01.widthDefined = false;
3804   fontDescriptionRun01.slantDefined = false;
3805   fontDescriptionRun01.sizeDefined = false;
3806
3807   FontDescriptionRun fontDescriptionRun02;
3808   fontDescriptionRun02.characterRun.characterIndex = 10u;
3809   fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
3810   fontDescriptionRun02.familyLength = fontArabic.size();
3811   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
3812   memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength );
3813   fontDescriptionRun02.familyDefined = true;
3814   fontDescriptionRun02.weightDefined = false;
3815   fontDescriptionRun02.widthDefined = false;
3816   fontDescriptionRun02.slantDefined = false;
3817   fontDescriptionRun02.sizeDefined = false;
3818
3819   FontDescriptionRun fontDescriptionRun03;
3820   fontDescriptionRun03.characterRun.characterIndex = 24u;
3821   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
3822   fontDescriptionRun03.familyLength = fontArabic.size();
3823   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
3824   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
3825   fontDescriptionRun03.familyDefined = true;
3826   fontDescriptionRun03.weightDefined = false;
3827   fontDescriptionRun03.widthDefined = false;
3828   fontDescriptionRun03.slantDefined = false;
3829   fontDescriptionRun03.sizeDefined = false;
3830
3831   FontDescriptionRun fontDescriptionRun04;
3832   fontDescriptionRun04.characterRun.characterIndex = 38u;
3833   fontDescriptionRun04.characterRun.numberOfCharacters = 10u;
3834   fontDescriptionRun04.familyLength = fontHebrew.size();
3835   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
3836   memcpy( fontDescriptionRun04.familyName, fontHebrew.c_str(), fontDescriptionRun04.familyLength );
3837   fontDescriptionRun04.familyDefined = true;
3838   fontDescriptionRun04.weightDefined = false;
3839   fontDescriptionRun04.widthDefined = false;
3840   fontDescriptionRun04.slantDefined = false;
3841   fontDescriptionRun04.sizeDefined = false;
3842
3843   FontDescriptionRun fontDescriptionRun05;
3844   fontDescriptionRun05.characterRun.characterIndex = 48u;
3845   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
3846   fontDescriptionRun05.familyLength = fontHebrew.size();
3847   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
3848   memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
3849   fontDescriptionRun05.familyDefined = true;
3850   fontDescriptionRun05.weightDefined = false;
3851   fontDescriptionRun05.widthDefined = false;
3852   fontDescriptionRun05.slantDefined = false;
3853   fontDescriptionRun05.sizeDefined = false;
3854
3855   FontDescriptionRun fontDescriptionRun06;
3856   fontDescriptionRun06.characterRun.characterIndex = 58u;
3857   fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
3858   fontDescriptionRun06.familyLength = fontArabic.size();
3859   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
3860   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
3861   fontDescriptionRun06.familyDefined = true;
3862   fontDescriptionRun06.weightDefined = false;
3863   fontDescriptionRun06.widthDefined = false;
3864   fontDescriptionRun06.slantDefined = false;
3865   fontDescriptionRun06.sizeDefined = false;
3866
3867   Vector<FontDescriptionRun> fontDescriptionRuns;
3868   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3869   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
3870   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
3871   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
3872   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
3873   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
3874
3875   float positions[] =
3876   {
3877     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,
3878     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,
3879     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,
3880     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
3881     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,
3882     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,
3883   };
3884
3885   Size textArea( 100.f, 300.f );
3886
3887   ReLayoutRightToLeftLinesData data =
3888   {
3889     "Paragraphs with right to left text.",
3890     "שלום עולם مرحبا بالعالم\n"
3891     "مرحبا بالعالم שלום עולם\n"
3892     "שלום עולם مرحبا بالعالم.",
3893     textArea,
3894     6u,
3895     fontDescriptionRuns.Begin(),
3896     72u,
3897     positions,
3898     48u,
3899     24u
3900   };
3901
3902   if( !ReLayoutRightToLeftLinesTest( data ) )
3903   {
3904     tet_result(TET_FAIL);
3905   }
3906
3907   tet_result(TET_PASS);
3908   END_TEST;
3909 }
3910
3911 int UtcDaliTextAlign01(void)
3912 {
3913   ToolkitTestApplication application;
3914   tet_infoline(" UtcDaliTextAlign01");
3915
3916   // Calculate text alignment.
3917
3918   const std::string fontLatin( "TizenSans" );
3919   const std::string fontHebrew( "TizenSansHebrew" );
3920   const std::string fontArabic( "TizenSansArabic" );
3921
3922   // Set a known font description
3923   FontDescriptionRun fontDescriptionRun01;
3924   fontDescriptionRun01.characterRun.characterIndex = 0u;
3925   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
3926   fontDescriptionRun01.familyLength = fontLatin.size();
3927   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
3928   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
3929   fontDescriptionRun01.familyDefined = true;
3930   fontDescriptionRun01.weightDefined = false;
3931   fontDescriptionRun01.widthDefined = false;
3932   fontDescriptionRun01.slantDefined = false;
3933   fontDescriptionRun01.sizeDefined = false;
3934
3935   FontDescriptionRun fontDescriptionRun02;
3936   fontDescriptionRun02.characterRun.characterIndex = 12u;
3937   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
3938   fontDescriptionRun02.familyLength = fontHebrew.size();
3939   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
3940   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
3941   fontDescriptionRun02.familyDefined = true;
3942   fontDescriptionRun02.weightDefined = false;
3943   fontDescriptionRun02.widthDefined = false;
3944   fontDescriptionRun02.slantDefined = false;
3945   fontDescriptionRun02.sizeDefined = false;
3946
3947   FontDescriptionRun fontDescriptionRun03;
3948   fontDescriptionRun03.characterRun.characterIndex = 22u;
3949   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
3950   fontDescriptionRun03.familyLength = fontArabic.size();
3951   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
3952   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
3953   fontDescriptionRun03.familyDefined = true;
3954   fontDescriptionRun03.weightDefined = false;
3955   fontDescriptionRun03.widthDefined = false;
3956   fontDescriptionRun03.slantDefined = false;
3957   fontDescriptionRun03.sizeDefined = false;
3958
3959   FontDescriptionRun fontDescriptionRun04;
3960   fontDescriptionRun04.characterRun.characterIndex = 36u;
3961   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
3962   fontDescriptionRun04.familyLength = fontLatin.size();
3963   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
3964   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
3965   fontDescriptionRun04.familyDefined = true;
3966   fontDescriptionRun04.weightDefined = false;
3967   fontDescriptionRun04.widthDefined = false;
3968   fontDescriptionRun04.slantDefined = false;
3969   fontDescriptionRun04.sizeDefined = false;
3970
3971   FontDescriptionRun fontDescriptionRun05;
3972   fontDescriptionRun05.characterRun.characterIndex = 48u;
3973   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
3974   fontDescriptionRun05.familyLength = fontLatin.size();
3975   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
3976   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
3977   fontDescriptionRun05.familyDefined = true;
3978   fontDescriptionRun05.weightDefined = false;
3979   fontDescriptionRun05.widthDefined = false;
3980   fontDescriptionRun05.slantDefined = false;
3981   fontDescriptionRun05.sizeDefined = false;
3982
3983   FontDescriptionRun fontDescriptionRun06;
3984   fontDescriptionRun06.characterRun.characterIndex = 60u;
3985   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
3986   fontDescriptionRun06.familyLength = fontArabic.size();
3987   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
3988   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
3989   fontDescriptionRun06.familyDefined = true;
3990   fontDescriptionRun06.weightDefined = false;
3991   fontDescriptionRun06.widthDefined = false;
3992   fontDescriptionRun06.slantDefined = false;
3993   fontDescriptionRun06.sizeDefined = false;
3994
3995   Vector<FontDescriptionRun> fontDescriptionRuns;
3996   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
3997   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
3998   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
3999   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
4000   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
4001   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
4002
4003   float positions[] = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f };
4004
4005   Size textArea( 100.f, 300.f );
4006   AlignData data =
4007   {
4008     "Begin alignment for the first paragraph.",
4009     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4010     textArea,
4011     6u,
4012     fontDescriptionRuns.Begin(),
4013     LayoutEngine::HORIZONTAL_ALIGN_BEGIN,
4014     LayoutEngine::VERTICAL_ALIGN_TOP,
4015     0u,
4016     22u,
4017     6u,
4018     positions
4019   };
4020
4021   if( !AlignTest( data ) )
4022   {
4023     tet_result(TET_FAIL);
4024   }
4025
4026   tet_result(TET_PASS);
4027   END_TEST;
4028 }
4029
4030 int UtcDaliTextAlign02(void)
4031 {
4032   ToolkitTestApplication application;
4033   tet_infoline(" UtcDaliTextAlign02");
4034
4035   // Calculate text alignment.
4036
4037   const std::string fontLatin( "TizenSans" );
4038   const std::string fontHebrew( "TizenSansHebrew" );
4039   const std::string fontArabic( "TizenSansArabic" );
4040
4041   // Set a known font description
4042   FontDescriptionRun fontDescriptionRun01;
4043   fontDescriptionRun01.characterRun.characterIndex = 0u;
4044   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4045   fontDescriptionRun01.familyLength = fontLatin.size();
4046   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
4047   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
4048   fontDescriptionRun01.familyDefined = true;
4049   fontDescriptionRun01.weightDefined = false;
4050   fontDescriptionRun01.widthDefined = false;
4051   fontDescriptionRun01.slantDefined = false;
4052   fontDescriptionRun01.sizeDefined = false;
4053
4054   FontDescriptionRun fontDescriptionRun02;
4055   fontDescriptionRun02.characterRun.characterIndex = 12u;
4056   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4057   fontDescriptionRun02.familyLength = fontHebrew.size();
4058   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
4059   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
4060   fontDescriptionRun02.familyDefined = true;
4061   fontDescriptionRun02.weightDefined = false;
4062   fontDescriptionRun02.widthDefined = false;
4063   fontDescriptionRun02.slantDefined = false;
4064   fontDescriptionRun02.sizeDefined = false;
4065
4066   FontDescriptionRun fontDescriptionRun03;
4067   fontDescriptionRun03.characterRun.characterIndex = 22u;
4068   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4069   fontDescriptionRun03.familyLength = fontArabic.size();
4070   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
4071   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
4072   fontDescriptionRun03.familyDefined = true;
4073   fontDescriptionRun03.weightDefined = false;
4074   fontDescriptionRun03.widthDefined = false;
4075   fontDescriptionRun03.slantDefined = false;
4076   fontDescriptionRun03.sizeDefined = false;
4077
4078   FontDescriptionRun fontDescriptionRun04;
4079   fontDescriptionRun04.characterRun.characterIndex = 36u;
4080   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4081   fontDescriptionRun04.familyLength = fontLatin.size();
4082   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
4083   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
4084   fontDescriptionRun04.familyDefined = true;
4085   fontDescriptionRun04.weightDefined = false;
4086   fontDescriptionRun04.widthDefined = false;
4087   fontDescriptionRun04.slantDefined = false;
4088   fontDescriptionRun04.sizeDefined = false;
4089
4090   FontDescriptionRun fontDescriptionRun05;
4091   fontDescriptionRun05.characterRun.characterIndex = 48u;
4092   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4093   fontDescriptionRun05.familyLength = fontLatin.size();
4094   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
4095   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
4096   fontDescriptionRun05.familyDefined = true;
4097   fontDescriptionRun05.weightDefined = false;
4098   fontDescriptionRun05.widthDefined = false;
4099   fontDescriptionRun05.slantDefined = false;
4100   fontDescriptionRun05.sizeDefined = false;
4101
4102   FontDescriptionRun fontDescriptionRun06;
4103   fontDescriptionRun06.characterRun.characterIndex = 60u;
4104   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4105   fontDescriptionRun06.familyLength = fontArabic.size();
4106   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
4107   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
4108   fontDescriptionRun06.familyDefined = true;
4109   fontDescriptionRun06.weightDefined = false;
4110   fontDescriptionRun06.widthDefined = false;
4111   fontDescriptionRun06.slantDefined = false;
4112   fontDescriptionRun06.sizeDefined = false;
4113
4114   Vector<FontDescriptionRun> fontDescriptionRuns;
4115   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
4116   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
4117   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
4118   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
4119   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
4120   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
4121
4122   float positions[] = { 0.f, 0.f, 2.f, 60.f, 0.f, 0.f };
4123
4124   Size textArea( 100.f, 300.f );
4125   AlignData data =
4126   {
4127     "Begin alignment for the mid paragraph.",
4128     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4129     textArea,
4130     6u,
4131     fontDescriptionRuns.Begin(),
4132     LayoutEngine::HORIZONTAL_ALIGN_BEGIN,
4133     LayoutEngine::VERTICAL_ALIGN_TOP,
4134     22u,
4135     26u,
4136     6u,
4137     positions
4138   };
4139
4140   if( !AlignTest( data ) )
4141   {
4142     tet_result(TET_FAIL);
4143   }
4144
4145   tet_result(TET_PASS);
4146   END_TEST;
4147 }
4148
4149 int UtcDaliTextAlign03(void)
4150 {
4151   ToolkitTestApplication application;
4152   tet_infoline(" UtcDaliTextAlign03");
4153
4154   // Calculate text alignment.
4155
4156   const std::string fontLatin( "TizenSans" );
4157   const std::string fontHebrew( "TizenSansHebrew" );
4158   const std::string fontArabic( "TizenSansArabic" );
4159
4160   // Set a known font description
4161   FontDescriptionRun fontDescriptionRun01;
4162   fontDescriptionRun01.characterRun.characterIndex = 0u;
4163   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4164   fontDescriptionRun01.familyLength = fontLatin.size();
4165   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
4166   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
4167   fontDescriptionRun01.familyDefined = true;
4168   fontDescriptionRun01.weightDefined = false;
4169   fontDescriptionRun01.widthDefined = false;
4170   fontDescriptionRun01.slantDefined = false;
4171   fontDescriptionRun01.sizeDefined = false;
4172
4173   FontDescriptionRun fontDescriptionRun02;
4174   fontDescriptionRun02.characterRun.characterIndex = 12u;
4175   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4176   fontDescriptionRun02.familyLength = fontHebrew.size();
4177   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
4178   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
4179   fontDescriptionRun02.familyDefined = true;
4180   fontDescriptionRun02.weightDefined = false;
4181   fontDescriptionRun02.widthDefined = false;
4182   fontDescriptionRun02.slantDefined = false;
4183   fontDescriptionRun02.sizeDefined = false;
4184
4185   FontDescriptionRun fontDescriptionRun03;
4186   fontDescriptionRun03.characterRun.characterIndex = 22u;
4187   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4188   fontDescriptionRun03.familyLength = fontArabic.size();
4189   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
4190   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
4191   fontDescriptionRun03.familyDefined = true;
4192   fontDescriptionRun03.weightDefined = false;
4193   fontDescriptionRun03.widthDefined = false;
4194   fontDescriptionRun03.slantDefined = false;
4195   fontDescriptionRun03.sizeDefined = false;
4196
4197   FontDescriptionRun fontDescriptionRun04;
4198   fontDescriptionRun04.characterRun.characterIndex = 36u;
4199   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4200   fontDescriptionRun04.familyLength = fontLatin.size();
4201   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
4202   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
4203   fontDescriptionRun04.familyDefined = true;
4204   fontDescriptionRun04.weightDefined = false;
4205   fontDescriptionRun04.widthDefined = false;
4206   fontDescriptionRun04.slantDefined = false;
4207   fontDescriptionRun04.sizeDefined = false;
4208
4209   FontDescriptionRun fontDescriptionRun05;
4210   fontDescriptionRun05.characterRun.characterIndex = 48u;
4211   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4212   fontDescriptionRun05.familyLength = fontLatin.size();
4213   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
4214   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
4215   fontDescriptionRun05.familyDefined = true;
4216   fontDescriptionRun05.weightDefined = false;
4217   fontDescriptionRun05.widthDefined = false;
4218   fontDescriptionRun05.slantDefined = false;
4219   fontDescriptionRun05.sizeDefined = false;
4220
4221   FontDescriptionRun fontDescriptionRun06;
4222   fontDescriptionRun06.characterRun.characterIndex = 60u;
4223   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4224   fontDescriptionRun06.familyLength = fontArabic.size();
4225   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
4226   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
4227   fontDescriptionRun06.familyDefined = true;
4228   fontDescriptionRun06.weightDefined = false;
4229   fontDescriptionRun06.widthDefined = false;
4230   fontDescriptionRun06.slantDefined = false;
4231   fontDescriptionRun06.sizeDefined = false;
4232
4233   Vector<FontDescriptionRun> fontDescriptionRuns;
4234   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
4235   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
4236   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
4237   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
4238   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
4239   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
4240
4241   float positions[] = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f };
4242
4243   Size textArea( 100.f, 300.f );
4244   AlignData data =
4245   {
4246     "Begin alignment for the last paragraph.",
4247     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4248     textArea,
4249     6u,
4250     fontDescriptionRuns.Begin(),
4251     LayoutEngine::HORIZONTAL_ALIGN_BEGIN,
4252     LayoutEngine::VERTICAL_ALIGN_TOP,
4253     48u,
4254     26u,
4255     6u,
4256     positions
4257   };
4258
4259   if( !AlignTest( data ) )
4260   {
4261     tet_result(TET_FAIL);
4262   }
4263
4264   tet_result(TET_PASS);
4265   END_TEST;
4266 }
4267
4268 int UtcDaliTextAlign04(void)
4269 {
4270   ToolkitTestApplication application;
4271   tet_infoline(" UtcDaliTextAlign04");
4272
4273   // Calculate text alignment.
4274
4275   const std::string fontLatin( "TizenSans" );
4276   const std::string fontHebrew( "TizenSansHebrew" );
4277   const std::string fontArabic( "TizenSansArabic" );
4278
4279   // Set a known font description
4280   FontDescriptionRun fontDescriptionRun01;
4281   fontDescriptionRun01.characterRun.characterIndex = 0u;
4282   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4283   fontDescriptionRun01.familyLength = fontLatin.size();
4284   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
4285   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
4286   fontDescriptionRun01.familyDefined = true;
4287   fontDescriptionRun01.weightDefined = false;
4288   fontDescriptionRun01.widthDefined = false;
4289   fontDescriptionRun01.slantDefined = false;
4290   fontDescriptionRun01.sizeDefined = false;
4291
4292   FontDescriptionRun fontDescriptionRun02;
4293   fontDescriptionRun02.characterRun.characterIndex = 12u;
4294   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4295   fontDescriptionRun02.familyLength = fontHebrew.size();
4296   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
4297   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
4298   fontDescriptionRun02.familyDefined = true;
4299   fontDescriptionRun02.weightDefined = false;
4300   fontDescriptionRun02.widthDefined = false;
4301   fontDescriptionRun02.slantDefined = false;
4302   fontDescriptionRun02.sizeDefined = false;
4303
4304   FontDescriptionRun fontDescriptionRun03;
4305   fontDescriptionRun03.characterRun.characterIndex = 22u;
4306   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4307   fontDescriptionRun03.familyLength = fontArabic.size();
4308   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
4309   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
4310   fontDescriptionRun03.familyDefined = true;
4311   fontDescriptionRun03.weightDefined = false;
4312   fontDescriptionRun03.widthDefined = false;
4313   fontDescriptionRun03.slantDefined = false;
4314   fontDescriptionRun03.sizeDefined = false;
4315
4316   FontDescriptionRun fontDescriptionRun04;
4317   fontDescriptionRun04.characterRun.characterIndex = 36u;
4318   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4319   fontDescriptionRun04.familyLength = fontLatin.size();
4320   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
4321   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
4322   fontDescriptionRun04.familyDefined = true;
4323   fontDescriptionRun04.weightDefined = false;
4324   fontDescriptionRun04.widthDefined = false;
4325   fontDescriptionRun04.slantDefined = false;
4326   fontDescriptionRun04.sizeDefined = false;
4327
4328   FontDescriptionRun fontDescriptionRun05;
4329   fontDescriptionRun05.characterRun.characterIndex = 48u;
4330   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4331   fontDescriptionRun05.familyLength = fontLatin.size();
4332   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
4333   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
4334   fontDescriptionRun05.familyDefined = true;
4335   fontDescriptionRun05.weightDefined = false;
4336   fontDescriptionRun05.widthDefined = false;
4337   fontDescriptionRun05.slantDefined = false;
4338   fontDescriptionRun05.sizeDefined = false;
4339
4340   FontDescriptionRun fontDescriptionRun06;
4341   fontDescriptionRun06.characterRun.characterIndex = 60u;
4342   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4343   fontDescriptionRun06.familyLength = fontArabic.size();
4344   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
4345   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
4346   fontDescriptionRun06.familyDefined = true;
4347   fontDescriptionRun06.weightDefined = false;
4348   fontDescriptionRun06.widthDefined = false;
4349   fontDescriptionRun06.slantDefined = false;
4350   fontDescriptionRun06.sizeDefined = false;
4351
4352   Vector<FontDescriptionRun> fontDescriptionRuns;
4353   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
4354   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
4355   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
4356   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
4357   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
4358   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
4359
4360   float positions[] = { 10.f, 16.f, 0.f, 0.f, 0.f, 0.f };
4361
4362   Size textArea( 100.f, 300.f );
4363   AlignData data =
4364   {
4365     "Center alignment for the first paragraph.",
4366     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4367     textArea,
4368     6u,
4369     fontDescriptionRuns.Begin(),
4370     LayoutEngine::HORIZONTAL_ALIGN_CENTER,
4371     LayoutEngine::VERTICAL_ALIGN_TOP,
4372     0u,
4373     22u,
4374     6u,
4375     positions
4376   };
4377
4378   if( !AlignTest( data ) )
4379   {
4380     tet_result(TET_FAIL);
4381   }
4382
4383   tet_result(TET_PASS);
4384   END_TEST;
4385 }
4386
4387 int UtcDaliTextAlign05(void)
4388 {
4389   ToolkitTestApplication application;
4390   tet_infoline(" UtcDaliTextAlign05");
4391
4392   // Calculate text alignment.
4393
4394   const std::string fontLatin( "TizenSans" );
4395   const std::string fontHebrew( "TizenSansHebrew" );
4396   const std::string fontArabic( "TizenSansArabic" );
4397
4398   // Set a known font description
4399   FontDescriptionRun fontDescriptionRun01;
4400   fontDescriptionRun01.characterRun.characterIndex = 0u;
4401   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4402   fontDescriptionRun01.familyLength = fontLatin.size();
4403   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
4404   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
4405   fontDescriptionRun01.familyDefined = true;
4406   fontDescriptionRun01.weightDefined = false;
4407   fontDescriptionRun01.widthDefined = false;
4408   fontDescriptionRun01.slantDefined = false;
4409   fontDescriptionRun01.sizeDefined = false;
4410
4411   FontDescriptionRun fontDescriptionRun02;
4412   fontDescriptionRun02.characterRun.characterIndex = 12u;
4413   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4414   fontDescriptionRun02.familyLength = fontHebrew.size();
4415   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
4416   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
4417   fontDescriptionRun02.familyDefined = true;
4418   fontDescriptionRun02.weightDefined = false;
4419   fontDescriptionRun02.widthDefined = false;
4420   fontDescriptionRun02.slantDefined = false;
4421   fontDescriptionRun02.sizeDefined = false;
4422
4423   FontDescriptionRun fontDescriptionRun03;
4424   fontDescriptionRun03.characterRun.characterIndex = 22u;
4425   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4426   fontDescriptionRun03.familyLength = fontArabic.size();
4427   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
4428   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
4429   fontDescriptionRun03.familyDefined = true;
4430   fontDescriptionRun03.weightDefined = false;
4431   fontDescriptionRun03.widthDefined = false;
4432   fontDescriptionRun03.slantDefined = false;
4433   fontDescriptionRun03.sizeDefined = false;
4434
4435   FontDescriptionRun fontDescriptionRun04;
4436   fontDescriptionRun04.characterRun.characterIndex = 36u;
4437   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4438   fontDescriptionRun04.familyLength = fontLatin.size();
4439   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
4440   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
4441   fontDescriptionRun04.familyDefined = true;
4442   fontDescriptionRun04.weightDefined = false;
4443   fontDescriptionRun04.widthDefined = false;
4444   fontDescriptionRun04.slantDefined = false;
4445   fontDescriptionRun04.sizeDefined = false;
4446
4447   FontDescriptionRun fontDescriptionRun05;
4448   fontDescriptionRun05.characterRun.characterIndex = 48u;
4449   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4450   fontDescriptionRun05.familyLength = fontLatin.size();
4451   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
4452   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
4453   fontDescriptionRun05.familyDefined = true;
4454   fontDescriptionRun05.weightDefined = false;
4455   fontDescriptionRun05.widthDefined = false;
4456   fontDescriptionRun05.slantDefined = false;
4457   fontDescriptionRun05.sizeDefined = false;
4458
4459   FontDescriptionRun fontDescriptionRun06;
4460   fontDescriptionRun06.characterRun.characterIndex = 60u;
4461   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4462   fontDescriptionRun06.familyLength = fontArabic.size();
4463   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
4464   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
4465   fontDescriptionRun06.familyDefined = true;
4466   fontDescriptionRun06.weightDefined = false;
4467   fontDescriptionRun06.widthDefined = false;
4468   fontDescriptionRun06.slantDefined = false;
4469   fontDescriptionRun06.sizeDefined = false;
4470
4471   Vector<FontDescriptionRun> fontDescriptionRuns;
4472   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
4473   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
4474   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
4475   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
4476   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
4477   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
4478
4479   float positions[] = { 0.f, 0.f, -1.f, 30.f, 0.f, 0.f };
4480
4481   Size textArea( 100.f, 300.f );
4482   AlignData data =
4483   {
4484     "Center alignment for the mid paragraph.",
4485     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4486     textArea,
4487     6u,
4488     fontDescriptionRuns.Begin(),
4489     LayoutEngine::HORIZONTAL_ALIGN_CENTER,
4490     LayoutEngine::VERTICAL_ALIGN_TOP,
4491     22u,
4492     26u,
4493     6u,
4494     positions
4495   };
4496
4497   if( !AlignTest( data ) )
4498   {
4499     tet_result(TET_FAIL);
4500   }
4501
4502   tet_result(TET_PASS);
4503   END_TEST;
4504 }
4505
4506 int UtcDaliTextAlign06(void)
4507 {
4508   ToolkitTestApplication application;
4509   tet_infoline(" UtcDaliTextAlign06");
4510
4511   // Calculate text alignment.
4512
4513   const std::string fontLatin( "TizenSans" );
4514   const std::string fontHebrew( "TizenSansHebrew" );
4515   const std::string fontArabic( "TizenSansArabic" );
4516
4517   // Set a known font description
4518   FontDescriptionRun fontDescriptionRun01;
4519   fontDescriptionRun01.characterRun.characterIndex = 0u;
4520   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4521   fontDescriptionRun01.familyLength = fontLatin.size();
4522   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
4523   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
4524   fontDescriptionRun01.familyDefined = true;
4525   fontDescriptionRun01.weightDefined = false;
4526   fontDescriptionRun01.widthDefined = false;
4527   fontDescriptionRun01.slantDefined = false;
4528   fontDescriptionRun01.sizeDefined = false;
4529
4530   FontDescriptionRun fontDescriptionRun02;
4531   fontDescriptionRun02.characterRun.characterIndex = 12u;
4532   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4533   fontDescriptionRun02.familyLength = fontHebrew.size();
4534   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
4535   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
4536   fontDescriptionRun02.familyDefined = true;
4537   fontDescriptionRun02.weightDefined = false;
4538   fontDescriptionRun02.widthDefined = false;
4539   fontDescriptionRun02.slantDefined = false;
4540   fontDescriptionRun02.sizeDefined = false;
4541
4542   FontDescriptionRun fontDescriptionRun03;
4543   fontDescriptionRun03.characterRun.characterIndex = 22u;
4544   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4545   fontDescriptionRun03.familyLength = fontArabic.size();
4546   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
4547   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
4548   fontDescriptionRun03.familyDefined = true;
4549   fontDescriptionRun03.weightDefined = false;
4550   fontDescriptionRun03.widthDefined = false;
4551   fontDescriptionRun03.slantDefined = false;
4552   fontDescriptionRun03.sizeDefined = false;
4553
4554   FontDescriptionRun fontDescriptionRun04;
4555   fontDescriptionRun04.characterRun.characterIndex = 36u;
4556   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4557   fontDescriptionRun04.familyLength = fontLatin.size();
4558   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
4559   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
4560   fontDescriptionRun04.familyDefined = true;
4561   fontDescriptionRun04.weightDefined = false;
4562   fontDescriptionRun04.widthDefined = false;
4563   fontDescriptionRun04.slantDefined = false;
4564   fontDescriptionRun04.sizeDefined = false;
4565
4566   FontDescriptionRun fontDescriptionRun05;
4567   fontDescriptionRun05.characterRun.characterIndex = 48u;
4568   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4569   fontDescriptionRun05.familyLength = fontLatin.size();
4570   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
4571   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
4572   fontDescriptionRun05.familyDefined = true;
4573   fontDescriptionRun05.weightDefined = false;
4574   fontDescriptionRun05.widthDefined = false;
4575   fontDescriptionRun05.slantDefined = false;
4576   fontDescriptionRun05.sizeDefined = false;
4577
4578   FontDescriptionRun fontDescriptionRun06;
4579   fontDescriptionRun06.characterRun.characterIndex = 60u;
4580   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4581   fontDescriptionRun06.familyLength = fontArabic.size();
4582   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
4583   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
4584   fontDescriptionRun06.familyDefined = true;
4585   fontDescriptionRun06.weightDefined = false;
4586   fontDescriptionRun06.widthDefined = false;
4587   fontDescriptionRun06.slantDefined = false;
4588   fontDescriptionRun06.sizeDefined = false;
4589
4590   Vector<FontDescriptionRun> fontDescriptionRuns;
4591   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
4592   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
4593   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
4594   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
4595   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
4596   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
4597
4598   float positions[] = { 0.f, 0.f, 0.f, 0.f, 10.f, 20.f };
4599
4600   Size textArea( 100.f, 300.f );
4601   AlignData data =
4602   {
4603     "Center alignment for the last paragraph.",
4604     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4605     textArea,
4606     6u,
4607     fontDescriptionRuns.Begin(),
4608     LayoutEngine::HORIZONTAL_ALIGN_CENTER,
4609     LayoutEngine::VERTICAL_ALIGN_TOP,
4610     48u,
4611     26u,
4612     6u,
4613     positions
4614   };
4615
4616   if( !AlignTest( data ) )
4617   {
4618     tet_result(TET_FAIL);
4619   }
4620
4621   tet_result(TET_PASS);
4622   END_TEST;
4623 }
4624
4625 int UtcDaliTextAlign07(void)
4626 {
4627   ToolkitTestApplication application;
4628   tet_infoline(" UtcDaliTextAlign07");
4629
4630   // Calculate text alignment.
4631
4632   const std::string fontLatin( "TizenSans" );
4633   const std::string fontHebrew( "TizenSansHebrew" );
4634   const std::string fontArabic( "TizenSansArabic" );
4635
4636   // Set a known font description
4637   FontDescriptionRun fontDescriptionRun01;
4638   fontDescriptionRun01.characterRun.characterIndex = 0u;
4639   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4640   fontDescriptionRun01.familyLength = fontLatin.size();
4641   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
4642   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
4643   fontDescriptionRun01.familyDefined = true;
4644   fontDescriptionRun01.weightDefined = false;
4645   fontDescriptionRun01.widthDefined = false;
4646   fontDescriptionRun01.slantDefined = false;
4647   fontDescriptionRun01.sizeDefined = false;
4648
4649   FontDescriptionRun fontDescriptionRun02;
4650   fontDescriptionRun02.characterRun.characterIndex = 12u;
4651   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4652   fontDescriptionRun02.familyLength = fontHebrew.size();
4653   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
4654   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
4655   fontDescriptionRun02.familyDefined = true;
4656   fontDescriptionRun02.weightDefined = false;
4657   fontDescriptionRun02.widthDefined = false;
4658   fontDescriptionRun02.slantDefined = false;
4659   fontDescriptionRun02.sizeDefined = false;
4660
4661   FontDescriptionRun fontDescriptionRun03;
4662   fontDescriptionRun03.characterRun.characterIndex = 22u;
4663   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4664   fontDescriptionRun03.familyLength = fontArabic.size();
4665   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
4666   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
4667   fontDescriptionRun03.familyDefined = true;
4668   fontDescriptionRun03.weightDefined = false;
4669   fontDescriptionRun03.widthDefined = false;
4670   fontDescriptionRun03.slantDefined = false;
4671   fontDescriptionRun03.sizeDefined = false;
4672
4673   FontDescriptionRun fontDescriptionRun04;
4674   fontDescriptionRun04.characterRun.characterIndex = 36u;
4675   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4676   fontDescriptionRun04.familyLength = fontLatin.size();
4677   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
4678   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
4679   fontDescriptionRun04.familyDefined = true;
4680   fontDescriptionRun04.weightDefined = false;
4681   fontDescriptionRun04.widthDefined = false;
4682   fontDescriptionRun04.slantDefined = false;
4683   fontDescriptionRun04.sizeDefined = false;
4684
4685   FontDescriptionRun fontDescriptionRun05;
4686   fontDescriptionRun05.characterRun.characterIndex = 48u;
4687   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4688   fontDescriptionRun05.familyLength = fontLatin.size();
4689   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
4690   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
4691   fontDescriptionRun05.familyDefined = true;
4692   fontDescriptionRun05.weightDefined = false;
4693   fontDescriptionRun05.widthDefined = false;
4694   fontDescriptionRun05.slantDefined = false;
4695   fontDescriptionRun05.sizeDefined = false;
4696
4697   FontDescriptionRun fontDescriptionRun06;
4698   fontDescriptionRun06.characterRun.characterIndex = 60u;
4699   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4700   fontDescriptionRun06.familyLength = fontArabic.size();
4701   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
4702   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
4703   fontDescriptionRun06.familyDefined = true;
4704   fontDescriptionRun06.weightDefined = false;
4705   fontDescriptionRun06.widthDefined = false;
4706   fontDescriptionRun06.slantDefined = false;
4707   fontDescriptionRun06.sizeDefined = false;
4708
4709   Vector<FontDescriptionRun> fontDescriptionRuns;
4710   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
4711   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
4712   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
4713   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
4714   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
4715   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
4716
4717   float positions[] = { 20.f, 33.f, 0.f, 0.f, 0.f, 0.f };
4718
4719   Size textArea( 100.f, 300.f );
4720   AlignData data =
4721   {
4722     "End alignment for the first paragraph.",
4723     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4724     textArea,
4725     6u,
4726     fontDescriptionRuns.Begin(),
4727     LayoutEngine::HORIZONTAL_ALIGN_END,
4728     LayoutEngine::VERTICAL_ALIGN_TOP,
4729     0u,
4730     22u,
4731     6u,
4732     positions
4733   };
4734
4735   if( !AlignTest( data ) )
4736   {
4737     tet_result(TET_FAIL);
4738   }
4739
4740   tet_result(TET_PASS);
4741   END_TEST;
4742 }
4743
4744 int UtcDaliTextAlign08(void)
4745 {
4746   ToolkitTestApplication application;
4747   tet_infoline(" UtcDaliTextAlign08");
4748
4749   // Calculate text alignment.
4750
4751   const std::string fontLatin( "TizenSans" );
4752   const std::string fontHebrew( "TizenSansHebrew" );
4753   const std::string fontArabic( "TizenSansArabic" );
4754
4755   // Set a known font description
4756   FontDescriptionRun fontDescriptionRun01;
4757   fontDescriptionRun01.characterRun.characterIndex = 0u;
4758   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4759   fontDescriptionRun01.familyLength = fontLatin.size();
4760   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
4761   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
4762   fontDescriptionRun01.familyDefined = true;
4763   fontDescriptionRun01.weightDefined = false;
4764   fontDescriptionRun01.widthDefined = false;
4765   fontDescriptionRun01.slantDefined = false;
4766   fontDescriptionRun01.sizeDefined = false;
4767
4768   FontDescriptionRun fontDescriptionRun02;
4769   fontDescriptionRun02.characterRun.characterIndex = 12u;
4770   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4771   fontDescriptionRun02.familyLength = fontHebrew.size();
4772   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
4773   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
4774   fontDescriptionRun02.familyDefined = true;
4775   fontDescriptionRun02.weightDefined = false;
4776   fontDescriptionRun02.widthDefined = false;
4777   fontDescriptionRun02.slantDefined = false;
4778   fontDescriptionRun02.sizeDefined = false;
4779
4780   FontDescriptionRun fontDescriptionRun03;
4781   fontDescriptionRun03.characterRun.characterIndex = 22u;
4782   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4783   fontDescriptionRun03.familyLength = fontArabic.size();
4784   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
4785   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
4786   fontDescriptionRun03.familyDefined = true;
4787   fontDescriptionRun03.weightDefined = false;
4788   fontDescriptionRun03.widthDefined = false;
4789   fontDescriptionRun03.slantDefined = false;
4790   fontDescriptionRun03.sizeDefined = false;
4791
4792   FontDescriptionRun fontDescriptionRun04;
4793   fontDescriptionRun04.characterRun.characterIndex = 36u;
4794   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4795   fontDescriptionRun04.familyLength = fontLatin.size();
4796   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
4797   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
4798   fontDescriptionRun04.familyDefined = true;
4799   fontDescriptionRun04.weightDefined = false;
4800   fontDescriptionRun04.widthDefined = false;
4801   fontDescriptionRun04.slantDefined = false;
4802   fontDescriptionRun04.sizeDefined = false;
4803
4804   FontDescriptionRun fontDescriptionRun05;
4805   fontDescriptionRun05.characterRun.characterIndex = 48u;
4806   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4807   fontDescriptionRun05.familyLength = fontLatin.size();
4808   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
4809   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
4810   fontDescriptionRun05.familyDefined = true;
4811   fontDescriptionRun05.weightDefined = false;
4812   fontDescriptionRun05.widthDefined = false;
4813   fontDescriptionRun05.slantDefined = false;
4814   fontDescriptionRun05.sizeDefined = false;
4815
4816   FontDescriptionRun fontDescriptionRun06;
4817   fontDescriptionRun06.characterRun.characterIndex = 60u;
4818   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4819   fontDescriptionRun06.familyLength = fontArabic.size();
4820   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
4821   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
4822   fontDescriptionRun06.familyDefined = true;
4823   fontDescriptionRun06.weightDefined = false;
4824   fontDescriptionRun06.widthDefined = false;
4825   fontDescriptionRun06.slantDefined = false;
4826   fontDescriptionRun06.sizeDefined = false;
4827
4828   Vector<FontDescriptionRun> fontDescriptionRuns;
4829   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
4830   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
4831   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
4832   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
4833   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
4834   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
4835
4836   float positions[] = { 0.f, 0.f, -4.f, 0.f, 0.f, 0.f };
4837
4838   Size textArea( 100.f, 300.f );
4839   AlignData data =
4840   {
4841     "End alignment for the mid paragraph.",
4842     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4843     textArea,
4844     6u,
4845     fontDescriptionRuns.Begin(),
4846     LayoutEngine::HORIZONTAL_ALIGN_END,
4847     LayoutEngine::VERTICAL_ALIGN_TOP,
4848     22u,
4849     26u,
4850     6u,
4851     positions
4852   };
4853
4854   if( !AlignTest( data ) )
4855   {
4856     tet_result(TET_FAIL);
4857   }
4858
4859   tet_result(TET_PASS);
4860   END_TEST;
4861 }
4862
4863 int UtcDaliTextAlign09(void)
4864 {
4865   ToolkitTestApplication application;
4866   tet_infoline(" UtcDaliTextAlign09");
4867
4868   // Calculate text alignment.
4869
4870   const std::string fontLatin( "TizenSans" );
4871   const std::string fontHebrew( "TizenSansHebrew" );
4872   const std::string fontArabic( "TizenSansArabic" );
4873
4874   // Set a known font description
4875   FontDescriptionRun fontDescriptionRun01;
4876   fontDescriptionRun01.characterRun.characterIndex = 0u;
4877   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
4878   fontDescriptionRun01.familyLength = fontLatin.size();
4879   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
4880   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
4881   fontDescriptionRun01.familyDefined = true;
4882   fontDescriptionRun01.weightDefined = false;
4883   fontDescriptionRun01.widthDefined = false;
4884   fontDescriptionRun01.slantDefined = false;
4885   fontDescriptionRun01.sizeDefined = false;
4886
4887   FontDescriptionRun fontDescriptionRun02;
4888   fontDescriptionRun02.characterRun.characterIndex = 12u;
4889   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
4890   fontDescriptionRun02.familyLength = fontHebrew.size();
4891   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
4892   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
4893   fontDescriptionRun02.familyDefined = true;
4894   fontDescriptionRun02.weightDefined = false;
4895   fontDescriptionRun02.widthDefined = false;
4896   fontDescriptionRun02.slantDefined = false;
4897   fontDescriptionRun02.sizeDefined = false;
4898
4899   FontDescriptionRun fontDescriptionRun03;
4900   fontDescriptionRun03.characterRun.characterIndex = 22u;
4901   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
4902   fontDescriptionRun03.familyLength = fontArabic.size();
4903   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
4904   memcpy( fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength );
4905   fontDescriptionRun03.familyDefined = true;
4906   fontDescriptionRun03.weightDefined = false;
4907   fontDescriptionRun03.widthDefined = false;
4908   fontDescriptionRun03.slantDefined = false;
4909   fontDescriptionRun03.sizeDefined = false;
4910
4911   FontDescriptionRun fontDescriptionRun04;
4912   fontDescriptionRun04.characterRun.characterIndex = 36u;
4913   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
4914   fontDescriptionRun04.familyLength = fontLatin.size();
4915   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
4916   memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
4917   fontDescriptionRun04.familyDefined = true;
4918   fontDescriptionRun04.weightDefined = false;
4919   fontDescriptionRun04.widthDefined = false;
4920   fontDescriptionRun04.slantDefined = false;
4921   fontDescriptionRun04.sizeDefined = false;
4922
4923   FontDescriptionRun fontDescriptionRun05;
4924   fontDescriptionRun05.characterRun.characterIndex = 48u;
4925   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
4926   fontDescriptionRun05.familyLength = fontLatin.size();
4927   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
4928   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
4929   fontDescriptionRun05.familyDefined = true;
4930   fontDescriptionRun05.weightDefined = false;
4931   fontDescriptionRun05.widthDefined = false;
4932   fontDescriptionRun05.slantDefined = false;
4933   fontDescriptionRun05.sizeDefined = false;
4934
4935   FontDescriptionRun fontDescriptionRun06;
4936   fontDescriptionRun06.characterRun.characterIndex = 60u;
4937   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
4938   fontDescriptionRun06.familyLength = fontArabic.size();
4939   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
4940   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
4941   fontDescriptionRun06.familyDefined = true;
4942   fontDescriptionRun06.weightDefined = false;
4943   fontDescriptionRun06.widthDefined = false;
4944   fontDescriptionRun06.slantDefined = false;
4945   fontDescriptionRun06.sizeDefined = false;
4946
4947   Vector<FontDescriptionRun> fontDescriptionRuns;
4948   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
4949   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
4950   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
4951   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
4952   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
4953   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
4954
4955   float positions[] = { 0.f, 0.f, 0.f, 0.f, 20.f, 40.f };
4956
4957   Size textArea( 100.f, 300.f );
4958   AlignData data =
4959   {
4960     "End alignment for the last paragraph.",
4961     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
4962     textArea,
4963     6u,
4964     fontDescriptionRuns.Begin(),
4965     LayoutEngine::HORIZONTAL_ALIGN_END,
4966     LayoutEngine::VERTICAL_ALIGN_TOP,
4967     48u,
4968     26u,
4969     6u,
4970     positions
4971   };
4972
4973   if( !AlignTest( data ) )
4974   {
4975     tet_result(TET_FAIL);
4976   }
4977
4978   tet_result(TET_PASS);
4979   END_TEST;
4980 }