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