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