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