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