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