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