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