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