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