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