5f0885357e1ebe4f542394a8014cd99b4af5736a
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-Text-Layout.cpp
1 /*
2  * Copyright (c) 2016 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 #include <iostream>
19 #include <stdlib.h>
20 #include <unistd.h>
21
22 #include <dali-toolkit/internal/text/layouts/layout-engine.h>
23 #include <dali-toolkit/internal/text/layouts/layout-parameters.h>
24 #include <dali-toolkit/internal/text/text-run-container.h>
25 #include <dali-toolkit-test-suite-utils.h>
26 #include <dali-toolkit/dali-toolkit.h>
27 #include <toolkit-text-utils.h>
28
29 using namespace Dali;
30 using namespace Toolkit;
31 using namespace Text;
32
33 // Tests the LayoutEngine methods.
34
35 //////////////////////////////////////////////////////////
36
37 namespace
38 {
39
40 const std::string DEFAULT_FONT_DIR( "/resources/fonts" );
41
42 struct LayoutTextData
43 {
44   std::string          description;
45   std::string          text;
46   Size                 textArea;
47   unsigned int         numberOfFonts;
48   FontDescriptionRun*  fontDescriptions;
49   Size                 layoutSize;
50   unsigned int         totalNumberOfGlyphs;
51   float*               positions;
52   unsigned int         numberOfLines;
53   LineRun*             lines;
54   Layout::Engine::Type layout;
55   unsigned int         startIndex;
56   unsigned int         numberOfGlyphs;
57   bool                 ellipsis:1;
58   bool                 updated:1;
59 };
60
61 void Print( const LineRun& line )
62 {
63   std::cout << "        glyph run, index : " << line.glyphRun.glyphIndex << ", num glyphs : " << line.glyphRun.numberOfGlyphs << std::endl;
64   std::cout << "    character run, index : " << line.characterRun.characterIndex << ", num chars : " << line.characterRun.numberOfCharacters << std::endl;
65   std::cout << "                   width : " << line.width << std::endl;
66   std::cout << "                ascender : " << line.ascender << std::endl;
67   std::cout << "               descender : " << line.descender << std::endl;
68   std::cout << "             extraLength : " << line.extraLength << std::endl;
69   std::cout << "         alignmentOffset : " << line.alignmentOffset << std::endl;
70   std::cout << "               direction : " << line.direction << std::endl;
71   std::cout << "                ellipsis : " << line.ellipsis << std::endl;
72 }
73
74 bool LayoutTextTest( const LayoutTextData& data )
75 {
76   // Load some fonts.
77   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
78   fontClient.SetDpi( 96u, 96u );
79
80   char* pathNamePtr = get_current_dir_name();
81   const std::string pathName( pathNamePtr );
82   free( pathNamePtr );
83
84   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
85   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
86   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
87
88   // 1) Create the model.
89   LogicalModelPtr logicalModel;
90   VisualModelPtr visualModel;
91   MetricsPtr metrics;
92   Size layoutSize;
93
94   Vector<FontDescriptionRun> fontDescriptionRuns;
95   if( 0u != data.numberOfFonts )
96   {
97     fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
98                                 data.fontDescriptions,
99                                 data.fontDescriptions + data.numberOfFonts );
100   }
101
102   LayoutOptions options;
103   options.reorder = false;
104   options.align = false;
105   CreateTextModel( data.text,
106                    data.textArea,
107                    fontDescriptionRuns,
108                    options,
109                    layoutSize,
110                    logicalModel,
111                    visualModel,
112                    metrics );
113
114   // 2) Clear the layout.
115   Vector<LineRun>& lines = visualModel->mLines;
116
117   const Length numberOfCharacters = logicalModel->mText.Count();
118   const bool isLastNewParagraph = ( 0u == numberOfCharacters ) ? false : TextAbstraction::IsNewParagraph( *( logicalModel->mText.Begin() + ( numberOfCharacters - 1u ) ) );
119   const GlyphIndex lastGlyphIndex = data.startIndex + data.numberOfGlyphs - 1u;
120   const bool removeLastLine = isLastNewParagraph && ( lastGlyphIndex + 1u == visualModel->mGlyphs.Count() );
121
122   LineIndex startRemoveIndex = 0u;
123
124   if( 0u != lines.Count() )
125   {
126     startRemoveIndex = lines.Count();
127     LineIndex endRemoveIndex = startRemoveIndex;
128     ClearGlyphRuns( data.startIndex,
129                     lastGlyphIndex + ( removeLastLine ? 1u : 0u ),
130                     lines,
131                     startRemoveIndex,
132                     endRemoveIndex );
133
134     // Update the character runs of the lines.
135     const CharacterIndex* const glyphsToCharactersBuffer = visualModel->mGlyphsToCharacters.Begin();
136     const Length* const charactersPerGlyph = visualModel->mCharactersPerGlyph.Begin();
137     const CharacterIndex startCharacterIndex = *( glyphsToCharactersBuffer + data.startIndex );
138     const CharacterIndex lastCharacterIndex = *( glyphsToCharactersBuffer + lastGlyphIndex ) + *( charactersPerGlyph + lastGlyphIndex ) - 1u;
139     ClearCharacterRuns( startCharacterIndex,
140                         lastCharacterIndex + ( removeLastLine ? 1u : 0u ),
141                         lines,
142                         startRemoveIndex,
143                         endRemoveIndex );
144
145     lines.Erase( lines.Begin() + startRemoveIndex,
146                  lines.Begin() + endRemoveIndex );
147   }
148
149   Vector<Vector2>& glyphPositions = visualModel->mGlyphPositions;
150
151   glyphPositions.Erase( glyphPositions.Begin() + data.startIndex,
152                         glyphPositions.Begin() + data.startIndex + data.numberOfGlyphs );
153
154   // 3) Layout
155   Layout::Engine engine;
156   engine.SetMetrics( metrics );
157   engine.SetLayout( data.layout );
158
159   const Length totalNumberOfGlyphs = visualModel->mGlyphs.Count();
160
161   Layout::Parameters layoutParameters( data.textArea,
162                                        logicalModel->mText.Begin(),
163                                        logicalModel->mLineBreakInfo.Begin(),
164                                        logicalModel->mWordBreakInfo.Begin(),
165                                        ( 0u != logicalModel->mCharacterDirections.Count() ) ? logicalModel->mCharacterDirections.Begin() : NULL,
166                                        visualModel->mGlyphs.Begin(),
167                                        visualModel->mGlyphsToCharacters.Begin(),
168                                        visualModel->mCharactersPerGlyph.Begin(),
169                                        visualModel->mCharactersToGlyph.Begin(),
170                                        visualModel->mGlyphsPerCharacter.Begin(),
171                                        totalNumberOfGlyphs,
172                                        Layout::HORIZONTAL_ALIGN_BEGIN );
173
174   layoutParameters.isLastNewParagraph = isLastNewParagraph;
175
176   // The initial glyph and the number of glyphs to layout.
177   layoutParameters.startGlyphIndex = data.startIndex;
178   layoutParameters.numberOfGlyphs = data.numberOfGlyphs;
179   layoutParameters.startLineIndex = startRemoveIndex;
180   layoutParameters.estimatedNumberOfLines = logicalModel->mParagraphInfo.Count();
181
182   layoutSize = Vector2::ZERO;
183
184   const bool updated = engine.LayoutText( layoutParameters,
185                                           glyphPositions,
186                                           lines,
187                                           layoutSize,
188                                           data.ellipsis );
189
190   // 4) Compare the results.
191
192   if( updated != data.updated )
193   {
194     std::cout << "  Different updated bool : " << updated << ", expected : " << data.updated << std::endl;
195     return false;
196   }
197
198   if( layoutSize != data.layoutSize )
199   {
200     std::cout << "  Different layout size : " << layoutSize << ", expected : " << data.layoutSize << std::endl;
201     return false;
202   }
203
204   for( unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index )
205   {
206     const Vector2& position = *( glyphPositions.Begin() + index );
207
208     if( fabsf( position.x - *( data.positions + 2u * index ) ) > Math::MACHINE_EPSILON_1000 )
209     {
210       std::cout << "  Different position for glyph " << index << " x : " << position.x << ", expected : " << *( data.positions + 2u * index ) << std::endl;
211       return false;
212     }
213     if( fabsf( position.y - *( data.positions + 2u * index + 1u ) ) > Math::MACHINE_EPSILON_1000 )
214     {
215       std::cout << "  Different position for glyph " << index << " y : " << position.y << ", expected : " << *( data.positions + 2u * index + 1u ) << std::endl;
216       return false;
217     }
218   }
219
220   if( lines.Count() != data.numberOfLines )
221   {
222     std::cout << "  Different number of lines : " << lines.Count() << ", expected : " << data.numberOfLines << std::endl;
223     return false;
224   }
225
226   for( unsigned int index = 0u; index < data.numberOfLines; ++index )
227   {
228     const LineRun& line = *( lines.Begin() + index );
229     const LineRun& expectedLine = *( data.lines + index );
230
231     if( line.glyphRun.glyphIndex != expectedLine.glyphRun.glyphIndex )
232     {
233       std::cout << "  Different line info for line : " << index << std::endl;
234       Print( line );
235       std::cout << "  expected" << std::endl;
236       Print( expectedLine );
237       return false;
238     }
239     if( line.glyphRun.numberOfGlyphs != expectedLine.glyphRun.numberOfGlyphs )
240     {
241       std::cout << "  Different line info for line : " << index << std::endl;
242       Print( line );
243       std::cout << "  expected" << std::endl;
244       Print( expectedLine );
245       return false;
246     }
247
248     if( line.characterRun.characterIndex != expectedLine.characterRun.characterIndex )
249     {
250       std::cout << "  Different line info for line : " << index << std::endl;
251       Print( line );
252       std::cout << "  expected" << std::endl;
253       Print( expectedLine );
254       return false;
255     }
256     if( line.characterRun.numberOfCharacters != expectedLine.characterRun.numberOfCharacters )
257     {
258       std::cout << "  Different line info for line : " << index << std::endl;
259       Print( line );
260       std::cout << "  expected" << std::endl;
261       Print( expectedLine );
262       return false;
263     }
264
265     if( fabsf( line.width - expectedLine.width ) > Math::MACHINE_EPSILON_1 )
266     {
267       std::cout << "  Different line info for line : " << index << std::endl;
268       Print( line );
269       std::cout << "  expected" << std::endl;
270       Print( expectedLine );
271       return false;
272     }
273
274     if( fabsf( line.ascender - expectedLine.ascender ) > Math::MACHINE_EPSILON_1 )
275     {
276       std::cout << "  Different line info for line : " << index << std::endl;
277       Print( line );
278       std::cout << "  expected" << std::endl;
279       Print( expectedLine );
280       return false;
281     }
282
283     if( fabsf( line.descender - expectedLine.descender ) > Math::MACHINE_EPSILON_1 )
284     {
285       std::cout << "  Different line info for line : " << index << std::endl;
286       Print( line );
287       std::cout << "  expected" << std::endl;
288       Print( expectedLine );
289       return false;
290     }
291
292     if( fabsf( line.extraLength - expectedLine.extraLength ) > Math::MACHINE_EPSILON_1 )
293     {
294       std::cout << "  Different line info for line : " << index << std::endl;
295       Print( line );
296       std::cout << "  expected" << std::endl;
297       Print( expectedLine );
298       return false;
299     }
300
301     if( line.ellipsis != expectedLine.ellipsis )
302     {
303       std::cout << "  Different line info for line : " << index << std::endl;
304       Print( line );
305       std::cout << "  expected" << std::endl;
306       Print( expectedLine );
307       return false;
308     }
309
310     // Do not compare the alignment offset as it's not calculated in the layout.
311     // Do not compare the line direction as it's not set in the layout.
312   }
313
314   return true;
315 }
316
317 //////////////////////////////////////////////////////////
318
319 struct ReLayoutRightToLeftLinesData
320 {
321   std::string         description;
322   std::string         text;
323   Size                textArea;
324   unsigned int        numberOfFonts;
325   FontDescriptionRun* fontDescriptions;
326   unsigned int        totalNumberOfGlyphs;
327   float*              positions;
328   unsigned int        startIndex;
329   unsigned int        numberOfCharacters;
330 };
331
332 bool ReLayoutRightToLeftLinesTest( const ReLayoutRightToLeftLinesData& data )
333 {
334   // Load some fonts.
335   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
336   fontClient.SetDpi( 96u, 96u );
337
338   char* pathNamePtr = get_current_dir_name();
339   const std::string pathName( pathNamePtr );
340   free( pathNamePtr );
341
342   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
343   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
344   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
345
346   // 1) Create the model.
347   LogicalModelPtr logicalModel;
348   VisualModelPtr visualModel;
349   MetricsPtr metrics;
350   Size layoutSize;
351
352   Vector<FontDescriptionRun> fontDescriptionRuns;
353   if( 0u != data.numberOfFonts )
354   {
355     fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
356                                 data.fontDescriptions,
357                                 data.fontDescriptions + data.numberOfFonts );
358   }
359
360   LayoutOptions options;
361   options.reorder = false;
362   options.align = false;
363   CreateTextModel( data.text,
364                    data.textArea,
365                    fontDescriptionRuns,
366                    options,
367                    layoutSize,
368                    logicalModel,
369                    visualModel,
370                    metrics );
371
372   // 2) Call the ReLayoutRightToLeftLines() method.
373   Layout::Engine engine;
374   engine.SetMetrics( metrics );
375
376   Layout::Parameters layoutParameters( data.textArea,
377                                        logicalModel->mText.Begin(),
378                                        logicalModel->mLineBreakInfo.Begin(),
379                                        logicalModel->mWordBreakInfo.Begin(),
380                                        ( 0u != logicalModel->mCharacterDirections.Count() ) ? logicalModel->mCharacterDirections.Begin() : NULL,
381                                        visualModel->mGlyphs.Begin(),
382                                        visualModel->mGlyphsToCharacters.Begin(),
383                                        visualModel->mCharactersPerGlyph.Begin(),
384                                        visualModel->mCharactersToGlyph.Begin(),
385                                        visualModel->mGlyphsPerCharacter.Begin(),
386                                        visualModel->mGlyphs.Count(),
387                                        Layout::HORIZONTAL_ALIGN_BEGIN  );
388
389   layoutParameters.numberOfBidirectionalInfoRuns = logicalModel->mBidirectionalLineInfo.Count();
390   layoutParameters.lineBidirectionalInfoRunsBuffer = logicalModel->mBidirectionalLineInfo.Begin();
391
392   engine.ReLayoutRightToLeftLines( layoutParameters,
393                                    data.startIndex,
394                                    data.numberOfCharacters,
395                                    visualModel->mGlyphPositions );
396
397   // 3) Compare the results.
398   Vector<Vector2>& glyphPositions = visualModel->mGlyphPositions;
399
400   if( data.totalNumberOfGlyphs != visualModel->mGlyphs.Count() )
401   {
402     std::cout << "  Different number of glyphs : " << visualModel->mGlyphs.Count() << ", expected : " << data.totalNumberOfGlyphs << std::endl;
403     return false;
404   }
405
406   for( unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index )
407   {
408     const Vector2& position = *( glyphPositions.Begin() + index );
409
410     if( fabsf( position.x - *( data.positions + 2u * index ) ) > Math::MACHINE_EPSILON_1000 )
411     {
412       std::cout << "  Different position for glyph " << index << " x : " << position.x << ", expected : " << *( data.positions + 2u * index ) << std::endl;
413       return false;
414     }
415     if( fabsf( position.y - *( data.positions + 2u * index + 1u ) ) > Math::MACHINE_EPSILON_1000 )
416     {
417       std::cout << "  Different position for glyph " << index << " y : " << position.y << ", expected : " << *( data.positions + 2u * index + 1u ) << std::endl;
418       return false;
419     }
420   }
421
422   return true;
423 }
424
425 //////////////////////////////////////////////////////////
426
427 struct AlignData
428 {
429   std::string                 description;
430   std::string                 text;
431   Size                        textArea;
432   unsigned int                numberOfFonts;
433   FontDescriptionRun*         fontDescriptions;
434   Layout::HorizontalAlignment horizontalAlignment;
435   Layout::VerticalAlignment   verticalAlignment;
436   unsigned int                startIndex;
437   unsigned int                numberOfCharacters;
438   unsigned int                numberOfLines;
439   float*                      lineOffsets;
440 };
441
442 bool AlignTest( const AlignData& data )
443 {
444   // Load some fonts.
445   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
446   fontClient.SetDpi( 96u, 96u );
447
448   char* pathNamePtr = get_current_dir_name();
449   const std::string pathName( pathNamePtr );
450   free( pathNamePtr );
451
452   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
453   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
454   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
455
456   // 1) Create the model.
457   LogicalModelPtr logicalModel;
458   VisualModelPtr visualModel;
459   MetricsPtr metrics;
460   Size layoutSize;
461
462   Vector<FontDescriptionRun> fontDescriptionRuns;
463   if( 0u != data.numberOfFonts )
464   {
465     fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
466                                 data.fontDescriptions,
467                                 data.fontDescriptions + data.numberOfFonts );
468   }
469
470   LayoutOptions options;
471   options.align = false;
472   CreateTextModel( data.text,
473                    data.textArea,
474                    fontDescriptionRuns,
475                    options,
476                    layoutSize,
477                    logicalModel,
478                    visualModel,
479                    metrics );
480
481   // Call the Align method.
482   Layout::Engine engine;
483   engine.SetMetrics( metrics );
484
485   float alignmentOffset = 0.f;
486   engine.Align( data.textArea,
487                 data.startIndex,
488                 data.numberOfCharacters,
489                 data.horizontalAlignment,
490                 visualModel->mLines,
491                 alignmentOffset );
492
493   // Compare results.
494   if( data.numberOfLines != visualModel->mLines.Count() )
495   {
496     std::cout << "  Different number of lines : " << visualModel->mLines.Count() << ", expected : " << data.numberOfLines << std::endl;
497     return false;
498   }
499
500   const LineRun* const linesBuffer = visualModel->mLines.Begin();
501   for( unsigned int index = 0u; index < data.numberOfLines; ++index )
502   {
503     const LineRun& line = *( linesBuffer + index );
504
505     if( line.alignmentOffset != *( data.lineOffsets + index ) )
506     {
507       std::cout << "  different line offset for index " << index << " : " << line.alignmentOffset << ", expected : " << *( data.lineOffsets + index ) << std::endl;
508       return false;
509     }
510   }
511
512   return true;
513 }
514
515 } // namespace
516
517 //////////////////////////////////////////////////////////
518 //
519 // UtcDaliTextLayoutSetGetLayout
520 // UtcDaliTextLayoutSetGetTextEllipsisEnabled
521 // UtcDaliTextLayoutSetGetHorizontalAlignment
522 // UtcDaliTextLayoutSetGetVerticalAlignment
523 // UtcDaliTextLayoutSetGetCursorWidth
524 // UtcDaliTextLayoutNoText
525 // UtcDaliTextLayoutSmallTextArea01
526 // UtcDaliTextLayoutSmallTextArea02
527 // UtcDaliTextLayoutMultilineText01
528 // UtcDaliTextLayoutMultilineText02
529 // UtcDaliTextLayoutMultilineText03
530 // UtcDaliTextLayoutMultilineText04
531 // UtcDaliTextLayoutMultilineText05
532 // UtcDaliTextUpdateLayout01
533 // UtcDaliTextUpdateLayout02
534 // UtcDaliTextUpdateLayout03
535 // UtcDaliTextLayoutEllipsis01
536 // UtcDaliTextLayoutEllipsis02
537 // UtcDaliTextLayoutEllipsis03
538 // UtcDaliTextLayoutEllipsis04
539 // UtcDaliTextLayoutEllipsis04
540 // UtcDaliTextReorderLayout01
541 // UtcDaliTextReorderLayout02
542 // UtcDaliTextReorderLayout03
543 // UtcDaliTextReorderLayout04
544 // UtcDaliTextAlign01
545 // UtcDaliTextAlign02
546 // UtcDaliTextAlign03
547 // UtcDaliTextAlign04
548 // UtcDaliTextAlign05
549 // UtcDaliTextAlign06
550 // UtcDaliTextAlign07
551 // UtcDaliTextAlign08
552 // UtcDaliTextAlign09
553 //
554 //////////////////////////////////////////////////////////
555
556 int UtcDaliTextLayoutSetGetLayout(void)
557 {
558   ToolkitTestApplication application;
559   tet_infoline(" UtcDaliTextLayoutSetGetLayout");
560
561   Layout::Engine engine;
562
563   DALI_TEST_CHECK( Layout::Engine::SINGLE_LINE_BOX == engine.GetLayout() );
564
565   engine.SetLayout( Layout::Engine::MULTI_LINE_BOX );
566   DALI_TEST_CHECK( Layout::Engine::MULTI_LINE_BOX == engine.GetLayout() );
567
568   tet_result(TET_PASS);
569   END_TEST;
570 }
571
572 int UtcDaliTextLayoutSetGetCursorWidth(void)
573 {
574   ToolkitTestApplication application;
575   tet_infoline(" ");
576
577   Layout::Engine engine;
578
579   DALI_TEST_EQUALS( 1, engine.GetCursorWidth(), TEST_LOCATION );
580
581   engine.SetCursorWidth( 2 );
582   DALI_TEST_EQUALS( 2, engine.GetCursorWidth(), TEST_LOCATION );
583
584   tet_result(TET_PASS);
585   END_TEST;
586 }
587
588 int UtcDaliTextLayoutNoText(void)
589 {
590   ToolkitTestApplication application;
591   tet_infoline(" UtcDaliTextLayoutNoText");
592
593   Size textArea(100.f, 60.f);
594   Size layoutSize = Vector2::ZERO;
595   LayoutTextData data =
596   {
597     "No text",
598     "",
599     textArea,
600     0u,
601     NULL,
602     layoutSize,
603     0u,
604     NULL,
605     0u,
606     NULL,
607     Layout::Engine::MULTI_LINE_BOX,
608     0u,
609     0u,
610     false,
611     false
612   };
613
614   if( !LayoutTextTest( data ) )
615   {
616     tet_result(TET_FAIL);
617   }
618
619   tet_result(TET_PASS);
620   END_TEST;
621 }
622
623 int UtcDaliTextLayoutSmallTextArea01(void)
624 {
625   ToolkitTestApplication application;
626   tet_infoline(" UtcDaliTextLayoutSmallTextArea01");
627
628   // Won't layout the text in multi-line if the width is too small.
629
630   const std::string fontFamily( "TizenSans" );
631
632   // Set a known font description
633   FontDescriptionRun fontDescriptionRun;
634   fontDescriptionRun.characterRun.characterIndex = 0u;
635   fontDescriptionRun.characterRun.numberOfCharacters = 11u;
636   fontDescriptionRun.familyLength = fontFamily.size();
637   fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
638   memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
639   fontDescriptionRun.familyDefined = true;
640   fontDescriptionRun.weightDefined = false;
641   fontDescriptionRun.widthDefined = false;
642   fontDescriptionRun.slantDefined = false;
643   fontDescriptionRun.sizeDefined = false;
644
645   Vector<FontDescriptionRun> fontDescriptionRuns;
646   fontDescriptionRuns.PushBack( fontDescriptionRun );
647   Size textArea(1.f, 1.f);
648   Size layoutSize = Vector2::ZERO;
649   LayoutTextData data =
650   {
651     "Layout text in a small area",
652     "Hello world",
653     textArea,
654     1u,
655     fontDescriptionRuns.Begin(),
656     layoutSize,
657     0u,
658     NULL,
659     0u,
660     NULL,
661     Layout::Engine::MULTI_LINE_BOX,
662     0u,
663     11u,
664     false,
665     false
666   };
667
668   if( !LayoutTextTest( data ) )
669   {
670     tet_result(TET_FAIL);
671   }
672
673   tet_result(TET_PASS);
674   END_TEST;
675 }
676
677 int UtcDaliTextLayoutSmallTextArea02(void)
678 {
679   ToolkitTestApplication application;
680   tet_infoline(" UtcDaliTextLayoutSmallTextArea02");
681
682   // Will layout the text in single line as it can be scrolled.
683
684   const std::string fontFamily( "TizenSans" );
685
686   // Set a known font description
687   FontDescriptionRun fontDescriptionRun;
688   fontDescriptionRun.characterRun.characterIndex = 0u;
689   fontDescriptionRun.characterRun.numberOfCharacters = 11u;
690   fontDescriptionRun.familyLength = fontFamily.size();
691   fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
692   memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
693   fontDescriptionRun.familyDefined = true;
694   fontDescriptionRun.weightDefined = false;
695   fontDescriptionRun.widthDefined = false;
696   fontDescriptionRun.slantDefined = false;
697   fontDescriptionRun.sizeDefined = false;
698
699   Vector<FontDescriptionRun> fontDescriptionRuns;
700   fontDescriptionRuns.PushBack( fontDescriptionRun );
701   Size textArea(1.f, 1.f);
702   Size layoutSize(80.f, 20.f);
703   float positions[] = { 1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f };
704   struct LineRun line =
705   {
706     { 0u, 11u },
707     { 0u, 11u },
708     80.f,
709     15.f,
710     -5.f,
711     0.f,
712     0.f,
713     false,
714     false
715   };
716   Vector<LineRun> lines;
717   lines.PushBack( line );
718
719   LayoutTextData data =
720   {
721     "Layout text in a small area",
722     "Hello world",
723     textArea,
724     1u,
725     fontDescriptionRuns.Begin(),
726     layoutSize,
727     11u,
728     positions,
729     1u,
730     lines.Begin(),
731     Layout::Engine::SINGLE_LINE_BOX,
732     0u,
733     11u,
734     false,
735     true
736   };
737
738   if( !LayoutTextTest( data ) )
739   {
740     tet_result(TET_FAIL);
741   }
742
743   tet_result(TET_PASS);
744   END_TEST;
745 }
746
747 int UtcDaliTextLayoutMultilineText01(void)
748 {
749   ToolkitTestApplication application;
750   tet_infoline(" UtcDaliTextLayoutMultilineText01");
751
752   // Layout some lines of left to right text.
753
754   const std::string fontFamily( "TizenSans" );
755
756   // Set a known font description
757   FontDescriptionRun fontDescriptionRun1;
758   fontDescriptionRun1.characterRun.characterIndex = 0u;
759   fontDescriptionRun1.characterRun.numberOfCharacters = 18u;
760   fontDescriptionRun1.familyLength = fontFamily.size();
761   fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
762   memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength );
763   fontDescriptionRun1.familyDefined = true;
764   fontDescriptionRun1.weightDefined = false;
765   fontDescriptionRun1.widthDefined = false;
766   fontDescriptionRun1.slantDefined = false;
767   fontDescriptionRun1.sizeDefined = false;
768
769   FontDescriptionRun fontDescriptionRun2;
770   fontDescriptionRun2.characterRun.characterIndex = 18u;
771   fontDescriptionRun2.characterRun.numberOfCharacters = 31u;
772   fontDescriptionRun2.familyLength = fontFamily.size();
773   fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
774   memcpy( fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength );
775   fontDescriptionRun2.familyDefined = true;
776   fontDescriptionRun2.weightDefined = false;
777   fontDescriptionRun2.widthDefined = false;
778   fontDescriptionRun2.slantDefined = false;
779   fontDescriptionRun2.sizeDefined = false;
780
781   Vector<FontDescriptionRun> fontDescriptionRuns;
782   fontDescriptionRuns.PushBack( fontDescriptionRun1 );
783   fontDescriptionRuns.PushBack( fontDescriptionRun2 );
784   Size textArea(100.f, 300.f);
785   Size layoutSize(95.f, 97.f);
786   float positions[] =
787   {
788     1.f, -12.f, 12.f,  -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f,  -0.f, 40.f, -9.f, 51.f,  -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
789     0.f, -13.f, 10.f,  -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -3.f, 42.f, -12.f,
790     1.f, -12.f,  9.f,  -9.f, 17.f,  -9.f, 27.f,  -9.f, 36.f, -9.f, 45.f, -11.f, 51.f, -0.f,
791     1.f, -12.f, 11.f, -12.f, 15.f, -12.f, 26.f,  -9.f, 35.f, -9.f, 41.f,  -9.f, 50.f, -9.f, 59.f, -11.f, 65.f, -0.f,
792     1.f, -12.f,  5.f, -12.f,  9.f,  -9.f, 19.f,  -9.f, 28.f, -9.f, 35.f,  -0.f, 41.f, -9.f, 50.f, -12.f, 54.f, -0.f, 59.f, -11.f, 66.f,  -9.f, 75.f, -9.f, 83.f, -11.f, 91.f, -2.f
793   };
794   struct LineRun line0 =
795   {
796     { 0u, 12u },
797     { 0u, 12u },
798     81.f,
799     15.f,
800     -5.f,
801     3.f,
802     0.f,
803     false,
804     false
805   };
806   struct LineRun line1 =
807   {
808     { 12u, 6u },
809     { 12u, 6u },
810     43.f,
811     15.f,
812     -5.f,
813     0.f,
814     0.f,
815     false,
816     false
817   };
818   struct LineRun line2 =
819   {
820     { 18u, 7u },
821     { 18u, 7u },
822     52.f,
823     15.f,
824     -4.f,
825     5.f,
826     0.f,
827     false,
828     false
829   };
830   struct LineRun line3 =
831   {
832     { 25u, 9u },
833     { 25u, 10u },
834     66.f,
835     15.f,
836     -4.f,
837     5.f,
838     0.f,
839     false,
840     false
841   };
842   struct LineRun line4 =
843   {
844     { 34u, 14u },
845     { 35u, 14u },
846     95.f,
847     15.f,
848     -4.f,
849     0.f,
850     0.f,
851     false,
852     false
853   };
854   Vector<LineRun> lines;
855   lines.PushBack( line0 );
856   lines.PushBack( line1 );
857   lines.PushBack( line2 );
858   lines.PushBack( line3 );
859   lines.PushBack( line4 );
860
861   LayoutTextData data =
862   {
863     "Layout simple multi-line text",
864     "Hello world demo.\n"
865     "Layout different lines of text.",
866     textArea,
867     1u,
868     fontDescriptionRuns.Begin(),
869     layoutSize,
870     48u,
871     positions,
872     5u,
873     lines.Begin(),
874     Layout::Engine::MULTI_LINE_BOX,
875     0u,
876     48u,
877     false,
878     true
879   };
880
881   if( !LayoutTextTest( data ) )
882   {
883     tet_result(TET_FAIL);
884   }
885
886   tet_result(TET_PASS);
887   END_TEST;
888 }
889
890 int UtcDaliTextLayoutMultilineText02(void)
891 {
892   ToolkitTestApplication application;
893   tet_infoline(" UtcDaliTextLayoutMultilineText02");
894
895   // Layout some lines of bidirectional text.
896
897   const std::string fontFamily1( "TizenSans" );
898
899   // Set a known font description
900   FontDescriptionRun fontDescriptionRun1;
901   fontDescriptionRun1.characterRun.characterIndex = 0u;
902   fontDescriptionRun1.characterRun.numberOfCharacters = 17u;
903   fontDescriptionRun1.familyLength = fontFamily1.size();
904   fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
905   memcpy( fontDescriptionRun1.familyName, fontFamily1.c_str(), fontDescriptionRun1.familyLength );
906   fontDescriptionRun1.familyDefined = true;
907   fontDescriptionRun1.weightDefined = false;
908   fontDescriptionRun1.widthDefined = false;
909   fontDescriptionRun1.slantDefined = false;
910   fontDescriptionRun1.sizeDefined = false;
911
912   const std::string fontFamily2( "TizenSansHebrew" );
913
914   // Set a known font description
915   FontDescriptionRun fontDescriptionRun2;
916   fontDescriptionRun2.characterRun.characterIndex = 17u;
917   fontDescriptionRun2.characterRun.numberOfCharacters = 9u;
918   fontDescriptionRun2.familyLength = fontFamily2.size();
919   fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
920   memcpy( fontDescriptionRun2.familyName, fontFamily2.c_str(), fontDescriptionRun2.familyLength );
921   fontDescriptionRun2.familyDefined = true;
922   fontDescriptionRun2.weightDefined = false;
923   fontDescriptionRun2.widthDefined = false;
924   fontDescriptionRun2.slantDefined = false;
925   fontDescriptionRun2.sizeDefined = false;
926
927   const std::string fontFamily3( "TizenSans" );
928
929   // Set a known font description
930   FontDescriptionRun fontDescriptionRun3;
931   fontDescriptionRun3.characterRun.characterIndex = 26u;
932   fontDescriptionRun3.characterRun.numberOfCharacters = 2u;
933   fontDescriptionRun3.familyLength = fontFamily3.size();
934   fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength];
935   memcpy( fontDescriptionRun3.familyName, fontFamily3.c_str(), fontDescriptionRun3.familyLength );
936   fontDescriptionRun3.familyDefined = true;
937   fontDescriptionRun3.weightDefined = false;
938   fontDescriptionRun3.widthDefined = false;
939   fontDescriptionRun3.slantDefined = false;
940   fontDescriptionRun3.sizeDefined = false;
941
942   const std::string fontFamily4( "TizenSansHebrew" );
943
944   // Set a known font description
945   FontDescriptionRun fontDescriptionRun4;
946   fontDescriptionRun4.characterRun.characterIndex = 28u;
947   fontDescriptionRun4.characterRun.numberOfCharacters = 10u;
948   fontDescriptionRun4.familyLength = fontFamily4.size();
949   fontDescriptionRun4.familyName = new char[fontDescriptionRun4.familyLength];
950   memcpy( fontDescriptionRun4.familyName, fontFamily4.c_str(), fontDescriptionRun4.familyLength );
951   fontDescriptionRun4.familyDefined = true;
952   fontDescriptionRun4.weightDefined = false;
953   fontDescriptionRun4.widthDefined = false;
954   fontDescriptionRun4.slantDefined = false;
955   fontDescriptionRun4.sizeDefined = false;
956
957   const std::string fontFamily5( "TizenSans" );
958
959   // Set a known font description
960   FontDescriptionRun fontDescriptionRun5;
961   fontDescriptionRun5.characterRun.characterIndex = 38u;
962   fontDescriptionRun5.characterRun.numberOfCharacters = 17u;
963   fontDescriptionRun5.familyLength = fontFamily5.size();
964   fontDescriptionRun5.familyName = new char[fontDescriptionRun5.familyLength];
965   memcpy( fontDescriptionRun5.familyName, fontFamily5.c_str(), fontDescriptionRun5.familyLength );
966   fontDescriptionRun5.familyDefined = true;
967   fontDescriptionRun5.weightDefined = false;
968   fontDescriptionRun5.widthDefined = false;
969   fontDescriptionRun5.slantDefined = false;
970   fontDescriptionRun5.sizeDefined = false;
971
972   Vector<FontDescriptionRun> fontDescriptionRuns;
973   fontDescriptionRuns.PushBack( fontDescriptionRun1 );
974   fontDescriptionRuns.PushBack( fontDescriptionRun2 );
975   fontDescriptionRuns.PushBack( fontDescriptionRun3 );
976   fontDescriptionRuns.PushBack( fontDescriptionRun4 );
977   fontDescriptionRuns.PushBack( fontDescriptionRun5 );
978   Size textArea(100.f, 300.f);
979   Size layoutSize(81.f, 120.f);
980   float positions[] =
981   {
982     1.f, -12.f, 12.f,  -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f,  -0.f, 40.f,  -9.f, 51.f,  -9.f, 61.f,  -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
983     0.f, -13.f, 10.f,  -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f,  -0.f,
984     1.f, -10.f,  9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
985     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f,  -0.f,
986     1.f, -13.f, 10.f,  -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f,  -0.f, 38.f,  -9.f, 49.f,  -9.f, 59.f,  -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
987     0.f, -13.f, 10.f,  -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -3.f,
988   };
989   struct LineRun line0 =
990   {
991     { 0u, 12u },
992     { 0u, 12u },
993     81.f,
994     15.f,
995     -5.f,
996     3.f,
997     0.f,
998     false,
999     false
1000   };
1001   struct LineRun line1 =
1002   {
1003     { 12u, 10u },
1004     { 12u, 10u },
1005     76.f,
1006     15.f,
1007     -5.f,
1008     4.f,
1009     0.f,
1010     false,
1011     false
1012   };
1013   struct LineRun line2 =
1014   {
1015     { 22u, 6u },
1016     { 22u, 6u },
1017     34.f,
1018     15.f,
1019     -5.f,
1020     0.f,
1021     0.f,
1022     false,
1023     false
1024   };
1025   struct LineRun line3 =
1026   {
1027     { 28u, 10u },
1028     { 28u, 10u },
1029     67.f,
1030     15.f,
1031     -5.f,
1032     4.f,
1033     0.f,
1034     false,
1035     false
1036   };
1037   struct LineRun line4 =
1038   {
1039     { 38u, 12u },
1040     { 38u, 12u },
1041     79.f,
1042     15.f,
1043     -5.f,
1044     3.f,
1045     0.f,
1046     false,
1047     false
1048   };
1049   struct LineRun line5 =
1050   {
1051     { 50u, 5u },
1052     { 50u, 5u },
1053     43.f,
1054     15.f,
1055     -5.f,
1056     0.f,
1057     0.f,
1058     false,
1059     false
1060   };
1061   Vector<LineRun> lines;
1062   lines.PushBack( line0 );
1063   lines.PushBack( line1 );
1064   lines.PushBack( line2 );
1065   lines.PushBack( line3 );
1066   lines.PushBack( line4 );
1067   lines.PushBack( line5 );
1068
1069   LayoutTextData data =
1070   {
1071     "Layout bidirectional text.",
1072     "Hello world demo שלום עולם.\n"
1073     "שלום עולם hello world demo.",
1074     textArea,
1075     5u,
1076     fontDescriptionRuns.Begin(),
1077     layoutSize,
1078     55u,
1079     positions,
1080     6u,
1081     lines.Begin(),
1082     Layout::Engine::MULTI_LINE_BOX,
1083     0u,
1084     55u,
1085     false,
1086     true
1087   };
1088
1089   if( !LayoutTextTest( data ) )
1090   {
1091     tet_result(TET_FAIL);
1092   }
1093
1094   tet_result(TET_PASS);
1095   END_TEST;
1096 }
1097
1098 int UtcDaliTextLayoutMultilineText03(void)
1099 {
1100   ToolkitTestApplication application;
1101   tet_infoline(" UtcDaliTextLayoutMultilineText03");
1102
1103   // Layout a long word which doesn't fit in the width of the text area.
1104
1105   const std::string fontFamily( "TizenSans" );
1106
1107   // Set a known font description
1108   FontDescriptionRun fontDescriptionRun;
1109   fontDescriptionRun.characterRun.characterIndex = 0u;
1110   fontDescriptionRun.characterRun.numberOfCharacters = 29u;
1111   fontDescriptionRun.familyLength = fontFamily.size();
1112   fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1113   memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1114   fontDescriptionRun.familyDefined = true;
1115   fontDescriptionRun.weightDefined = false;
1116   fontDescriptionRun.widthDefined = false;
1117   fontDescriptionRun.slantDefined = false;
1118   fontDescriptionRun.sizeDefined = false;
1119
1120   Vector<FontDescriptionRun> fontDescriptionRuns;
1121   fontDescriptionRuns.PushBack( fontDescriptionRun );
1122   Size textArea(100.f, 300.f);
1123   Size layoutSize(96.f, 60.f);
1124   float positions[] =
1125   {
1126     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f,  -9.f, 36.f,  -9.f, 47.f, -9.f, 57.f, -9.f, 63.f, -13.f, 66.f, -13.f, 75.f, -13.f, 85.f,  -9.f,
1127     1.f,  -9.f, 13.f, -9.f, 23.f, -13.f, 32.f,  -9.f, 40.f, -13.f, 44.f, -13.f, 47.f, -9.f, 56.f, -9.f, 67.f,  -9.f, 77.f,  -9.f, 83.f, -13.f, 86.f, -13.f,
1128     0.f, -13.f, 10.f, -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f,  -3.f,
1129   };
1130   struct LineRun line0 =
1131   {
1132     { 0u, 12u },
1133     { 0u, 12u },
1134     94.f,
1135     15.f,
1136     -5.f,
1137     0.f,
1138     0.f,
1139     false,
1140     false
1141   };
1142   struct LineRun line1 =
1143   {
1144     { 12u, 12u },
1145     { 12u, 12u },
1146     96.f,
1147     15.f,
1148     -5.f,
1149     0.f,
1150     0.f,
1151     false,
1152     false
1153   };
1154   struct LineRun line2 =
1155   {
1156     { 24u, 5u },
1157     { 24u, 5u },
1158     43.f,
1159     15.f,
1160     -5.f,
1161     0.f,
1162     0.f,
1163     false,
1164     false
1165   };
1166   Vector<LineRun> lines;
1167   lines.PushBack( line0 );
1168   lines.PushBack( line1 );
1169   lines.PushBack( line2 );
1170
1171   LayoutTextData data =
1172   {
1173     "Layout a long word which doesn't fit in the width of the text area.",
1174     "Helloworlddemohelloworlddemo.",
1175     textArea,
1176     1u,
1177     fontDescriptionRuns.Begin(),
1178     layoutSize,
1179     29u,
1180     positions,
1181     3u,
1182     lines.Begin(),
1183     Layout::Engine::MULTI_LINE_BOX,
1184     0u,
1185     29u,
1186     false,
1187     true
1188   };
1189
1190   if( !LayoutTextTest( data ) )
1191   {
1192     tet_result(TET_FAIL);
1193   }
1194
1195   tet_result(TET_PASS);
1196   END_TEST;
1197 }
1198
1199 int UtcDaliTextLayoutMultilineText04(void)
1200 {
1201   ToolkitTestApplication application;
1202   tet_infoline(" UtcDaliTextLayoutMultilineText04");
1203
1204   // Layout simple text ending with a \n. It has to add a void line at the end.
1205
1206   const std::string fontFamily( "TizenSans" );
1207
1208   // Set a known font description
1209   FontDescriptionRun fontDescriptionRun;
1210   fontDescriptionRun.characterRun.characterIndex = 0u;
1211   fontDescriptionRun.characterRun.numberOfCharacters = 13u;
1212   fontDescriptionRun.familyLength = fontFamily.size();
1213   fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
1214   memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
1215   fontDescriptionRun.familyDefined = true;
1216   fontDescriptionRun.weightDefined = false;
1217   fontDescriptionRun.widthDefined = false;
1218   fontDescriptionRun.slantDefined = false;
1219   fontDescriptionRun.sizeDefined = false;
1220
1221   Vector<FontDescriptionRun> fontDescriptionRuns;
1222   fontDescriptionRuns.PushBack( fontDescriptionRun );
1223   Size textArea(100.f, 300.f);
1224   Size layoutSize(83.f, 40.f);
1225   float positions[] =
1226   {
1227     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -3.f, 82.f, -12.f
1228   };
1229   struct LineRun line0 =
1230   {
1231     { 0u, 13u },
1232     { 0u, 13u },
1233     83.f,
1234     15.f,
1235     -5.f,
1236     0.f,
1237     0.f,
1238     false,
1239     false
1240   };
1241   struct LineRun line1 =
1242   {
1243     { 13u, 0u },
1244     { 13u, 0u },
1245     0.f,
1246     15.f,
1247     -5.f,
1248     0.f,
1249     0.f,
1250     false,
1251     false
1252   };
1253   Vector<LineRun> lines;
1254   lines.PushBack( line0 );
1255   lines.PushBack( line1 );
1256
1257   LayoutTextData data =
1258   {
1259     "Layout simple text ending with a \n.",
1260     "Hello world.\n",
1261     textArea,
1262     1u,
1263     fontDescriptionRuns.Begin(),
1264     layoutSize,
1265     13u,
1266     positions,
1267     2u,
1268     lines.Begin(),
1269     Layout::Engine::MULTI_LINE_BOX,
1270     0u,
1271     13u,
1272     false,
1273     true
1274   };
1275
1276   if( !LayoutTextTest( data ) )
1277   {
1278     tet_result(TET_FAIL);
1279   }
1280
1281   tet_result(TET_PASS);
1282   END_TEST;
1283 }
1284
1285 int UtcDaliTextLayoutMultilineText05(void)
1286 {
1287   ToolkitTestApplication application;
1288   tet_infoline(" UtcDaliTextLayoutMultilineText05");
1289
1290   // Layout simple text with one character with a different font size.
1291
1292   const std::string fontFamily( "TizenSans" );
1293
1294   // Set a known font description
1295   FontDescriptionRun fontDescriptionRun1;
1296   fontDescriptionRun1.characterRun.characterIndex = 0u;
1297   fontDescriptionRun1.characterRun.numberOfCharacters = 6u;
1298   fontDescriptionRun1.familyLength = fontFamily.size();
1299   fontDescriptionRun1.familyName = new char[fontDescriptionRun1.familyLength];
1300   memcpy( fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength );
1301   fontDescriptionRun1.familyDefined = true;
1302   fontDescriptionRun1.weightDefined = false;
1303   fontDescriptionRun1.widthDefined = false;
1304   fontDescriptionRun1.slantDefined = false;
1305   fontDescriptionRun1.sizeDefined = false;
1306
1307   FontDescriptionRun fontDescriptionRun2;
1308   fontDescriptionRun2.characterRun.characterIndex = 6u;
1309   fontDescriptionRun2.characterRun.numberOfCharacters = 1u;
1310   fontDescriptionRun2.familyLength = fontFamily.size();
1311   fontDescriptionRun2.familyName = new char[fontDescriptionRun2.familyLength];
1312   memcpy( fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength );
1313   fontDescriptionRun2.size = 1280u;
1314   fontDescriptionRun2.familyDefined = true;
1315   fontDescriptionRun2.weightDefined = false;
1316   fontDescriptionRun2.widthDefined = false;
1317   fontDescriptionRun2.slantDefined = false;
1318   fontDescriptionRun2.sizeDefined = true;
1319
1320   FontDescriptionRun fontDescriptionRun3;
1321   fontDescriptionRun3.characterRun.characterIndex = 7u;
1322   fontDescriptionRun3.characterRun.numberOfCharacters = 10u;
1323   fontDescriptionRun3.familyLength = fontFamily.size();
1324   fontDescriptionRun3.familyName = new char[fontDescriptionRun3.familyLength];
1325   memcpy( fontDescriptionRun3.familyName, fontFamily.c_str(), fontDescriptionRun3.familyLength );
1326   fontDescriptionRun3.familyDefined = true;
1327   fontDescriptionRun3.weightDefined = false;
1328   fontDescriptionRun3.widthDefined = false;
1329   fontDescriptionRun3.slantDefined = false;
1330   fontDescriptionRun3.sizeDefined = false;
1331
1332   Vector<FontDescriptionRun> fontDescriptionRuns;
1333   fontDescriptionRuns.PushBack( fontDescriptionRun1 );
1334   fontDescriptionRuns.PushBack( fontDescriptionRun2 );
1335   fontDescriptionRuns.PushBack( fontDescriptionRun3 );
1336   Size textArea(100.f, 300.f);
1337   Size layoutSize(88.f, 53.f);
1338   float positions[] =
1339   {
1340     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -14.f, 59.f, -9.f, 69.f, -9.f, 75.f, -13.f, 78.f, -13.f, 87.f, -0.f,
1341     0.f, -13.f, 10.f, -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -3.f
1342   };
1343   struct LineRun line0 =
1344   {
1345     { 0u, 12u },
1346     { 0u, 12u },
1347     88.f,
1348     25.f,
1349     -8.f,
1350     4.f,
1351     0.f,
1352     false,
1353     false
1354   };
1355   struct LineRun line1 =
1356   {
1357     { 12u, 5u },
1358     { 12u, 5u },
1359     43.f,
1360     15.f,
1361     -5.f,
1362     0.f,
1363     0.f,
1364     false,
1365     false
1366   };
1367   Vector<LineRun> lines;
1368   lines.PushBack( line0 );
1369   lines.PushBack( line1 );
1370
1371   LayoutTextData data =
1372   {
1373     "Layout simple text with one character with a different font size.",
1374     "Hello world demo.",
1375     textArea,
1376     3u,
1377     fontDescriptionRuns.Begin(),
1378     layoutSize,
1379     17u,
1380     positions,
1381     2u,
1382     lines.Begin(),
1383     Layout::Engine::MULTI_LINE_BOX,
1384     0u,
1385     17u,
1386     false,
1387     true
1388   };
1389
1390   if( !LayoutTextTest( data ) )
1391   {
1392     tet_result(TET_FAIL);
1393   }
1394
1395   tet_result(TET_PASS);
1396   END_TEST;
1397 }
1398
1399 int UtcDaliTextUpdateLayout01(void)
1400 {
1401   ToolkitTestApplication application;
1402   tet_infoline(" UtcDaliTextUpdateLayout01");
1403
1404   // Layout some lines of bidirectional text. Update the paragraphs at the beginning.
1405
1406   const std::string fontLatin( "TizenSans" );
1407   const std::string fontHebrew( "TizenSansHebrew" );
1408   const std::string fontArabic( "TizenSansArabic" );
1409
1410   // Set a known font description
1411   FontDescriptionRun fontDescriptionRun01;
1412   fontDescriptionRun01.characterRun.characterIndex = 0u;
1413   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
1414   fontDescriptionRun01.familyLength = fontLatin.size();
1415   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
1416   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
1417   fontDescriptionRun01.familyDefined = true;
1418   fontDescriptionRun01.weightDefined = false;
1419   fontDescriptionRun01.widthDefined = false;
1420   fontDescriptionRun01.slantDefined = false;
1421   fontDescriptionRun01.sizeDefined = false;
1422
1423   // Set a known font description
1424   FontDescriptionRun fontDescriptionRun02;
1425   fontDescriptionRun02.characterRun.characterIndex = 17u;
1426   fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
1427   fontDescriptionRun02.familyLength = fontHebrew.size();
1428   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
1429   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
1430   fontDescriptionRun02.familyDefined = true;
1431   fontDescriptionRun02.weightDefined = false;
1432   fontDescriptionRun02.widthDefined = false;
1433   fontDescriptionRun02.slantDefined = false;
1434   fontDescriptionRun02.sizeDefined = false;
1435
1436   // Set a known font description
1437   FontDescriptionRun fontDescriptionRun03;
1438   fontDescriptionRun03.characterRun.characterIndex = 26u;
1439   fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
1440   fontDescriptionRun03.familyLength = fontLatin.size();
1441   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
1442   memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
1443   fontDescriptionRun03.familyDefined = true;
1444   fontDescriptionRun03.weightDefined = false;
1445   fontDescriptionRun03.widthDefined = false;
1446   fontDescriptionRun03.slantDefined = false;
1447   fontDescriptionRun03.sizeDefined = false;
1448
1449   // Set a known font description
1450   FontDescriptionRun fontDescriptionRun04;
1451   fontDescriptionRun04.characterRun.characterIndex = 28u;
1452   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
1453   fontDescriptionRun04.familyLength = fontArabic.size();
1454   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
1455   memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
1456   fontDescriptionRun04.familyDefined = true;
1457   fontDescriptionRun04.weightDefined = false;
1458   fontDescriptionRun04.widthDefined = false;
1459   fontDescriptionRun04.slantDefined = false;
1460   fontDescriptionRun04.sizeDefined = false;
1461
1462   // Set a known font description
1463   FontDescriptionRun fontDescriptionRun05;
1464   fontDescriptionRun05.characterRun.characterIndex = 42u;
1465   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
1466   fontDescriptionRun05.familyLength = fontLatin.size();
1467   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
1468   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
1469   fontDescriptionRun05.familyDefined = true;
1470   fontDescriptionRun05.weightDefined = false;
1471   fontDescriptionRun05.widthDefined = false;
1472   fontDescriptionRun05.slantDefined = false;
1473   fontDescriptionRun05.sizeDefined = false;
1474
1475   // Set a known font description
1476   FontDescriptionRun fontDescriptionRun06;
1477   fontDescriptionRun06.characterRun.characterIndex = 54u;
1478   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
1479   fontDescriptionRun06.familyLength = fontHebrew.size();
1480   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
1481   memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
1482   fontDescriptionRun06.familyDefined = true;
1483   fontDescriptionRun06.weightDefined = false;
1484   fontDescriptionRun06.widthDefined = false;
1485   fontDescriptionRun06.slantDefined = false;
1486   fontDescriptionRun06.sizeDefined = false;
1487
1488   // Set a known font description
1489   FontDescriptionRun fontDescriptionRun07;
1490   fontDescriptionRun07.characterRun.characterIndex = 64u;
1491   fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
1492   fontDescriptionRun07.familyLength = fontHebrew.size();
1493   fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
1494   memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
1495   fontDescriptionRun07.familyDefined = true;
1496   fontDescriptionRun07.weightDefined = false;
1497   fontDescriptionRun07.widthDefined = false;
1498   fontDescriptionRun07.slantDefined = false;
1499   fontDescriptionRun07.sizeDefined = false;
1500
1501   // Set a known font description
1502   FontDescriptionRun fontDescriptionRun08;
1503   fontDescriptionRun08.characterRun.characterIndex = 74u;
1504   fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
1505   fontDescriptionRun08.familyLength = fontLatin.size();
1506   fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
1507   memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
1508   fontDescriptionRun08.familyDefined = true;
1509   fontDescriptionRun08.weightDefined = false;
1510   fontDescriptionRun08.widthDefined = false;
1511   fontDescriptionRun08.slantDefined = false;
1512   fontDescriptionRun08.sizeDefined = false;
1513
1514   // Set a known font description
1515   FontDescriptionRun fontDescriptionRun09;
1516   fontDescriptionRun09.characterRun.characterIndex = 92u;
1517   fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
1518   fontDescriptionRun09.familyLength = fontLatin.size();
1519   fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
1520   memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
1521   fontDescriptionRun09.familyDefined = true;
1522   fontDescriptionRun09.weightDefined = false;
1523   fontDescriptionRun09.widthDefined = false;
1524   fontDescriptionRun09.slantDefined = false;
1525   fontDescriptionRun09.sizeDefined = false;
1526
1527   // Set a known font description
1528   FontDescriptionRun fontDescriptionRun10;
1529   fontDescriptionRun10.characterRun.characterIndex = 104u;
1530   fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
1531   fontDescriptionRun10.familyLength = fontArabic.size();
1532   fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
1533   memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
1534   fontDescriptionRun10.familyDefined = true;
1535   fontDescriptionRun10.weightDefined = false;
1536   fontDescriptionRun10.widthDefined = false;
1537   fontDescriptionRun10.slantDefined = false;
1538   fontDescriptionRun10.sizeDefined = false;
1539
1540   // Set a known font description
1541   FontDescriptionRun fontDescriptionRun11;
1542   fontDescriptionRun11.characterRun.characterIndex = 118u;
1543   fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
1544   fontDescriptionRun11.familyLength = fontHebrew.size();
1545   fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
1546   memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
1547   fontDescriptionRun11.familyDefined = true;
1548   fontDescriptionRun11.weightDefined = false;
1549   fontDescriptionRun11.widthDefined = false;
1550   fontDescriptionRun11.slantDefined = false;
1551   fontDescriptionRun11.sizeDefined = false;
1552
1553   // Set a known font description
1554   FontDescriptionRun fontDescriptionRun12;
1555   fontDescriptionRun12.characterRun.characterIndex = 128u;
1556   fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
1557   fontDescriptionRun12.familyLength = fontLatin.size();
1558   fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
1559   memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
1560   fontDescriptionRun12.familyDefined = true;
1561   fontDescriptionRun12.weightDefined = false;
1562   fontDescriptionRun12.widthDefined = false;
1563   fontDescriptionRun12.slantDefined = false;
1564   fontDescriptionRun12.sizeDefined = false;
1565
1566   // Set a known font description
1567   FontDescriptionRun fontDescriptionRun13;
1568   fontDescriptionRun13.characterRun.characterIndex = 145u;
1569   fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
1570   fontDescriptionRun13.familyLength = fontHebrew.size();
1571   fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
1572   memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
1573   fontDescriptionRun13.familyDefined = true;
1574   fontDescriptionRun13.weightDefined = false;
1575   fontDescriptionRun13.widthDefined = false;
1576   fontDescriptionRun13.slantDefined = false;
1577   fontDescriptionRun13.sizeDefined = false;
1578
1579   // Set a known font description
1580   FontDescriptionRun fontDescriptionRun14;
1581   fontDescriptionRun14.characterRun.characterIndex = 154u;
1582   fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
1583   fontDescriptionRun14.familyLength = fontLatin.size();
1584   fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
1585   memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
1586   fontDescriptionRun14.familyDefined = true;
1587   fontDescriptionRun14.weightDefined = false;
1588   fontDescriptionRun14.widthDefined = false;
1589   fontDescriptionRun14.slantDefined = false;
1590   fontDescriptionRun14.sizeDefined = false;
1591
1592   // Set a known font description
1593   FontDescriptionRun fontDescriptionRun15;
1594   fontDescriptionRun15.characterRun.characterIndex = 156u;
1595   fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
1596   fontDescriptionRun15.familyLength = fontHebrew.size();
1597   fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
1598   memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
1599   fontDescriptionRun15.familyDefined = true;
1600   fontDescriptionRun15.weightDefined = false;
1601   fontDescriptionRun15.widthDefined = false;
1602   fontDescriptionRun15.slantDefined = false;
1603   fontDescriptionRun15.sizeDefined = false;
1604
1605   // Set a known font description
1606   FontDescriptionRun fontDescriptionRun16;
1607   fontDescriptionRun16.characterRun.characterIndex = 166u;
1608   fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
1609   fontDescriptionRun16.familyLength = fontLatin.size();
1610   fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
1611   memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
1612   fontDescriptionRun16.familyDefined = true;
1613   fontDescriptionRun16.weightDefined = false;
1614   fontDescriptionRun16.widthDefined = false;
1615   fontDescriptionRun16.slantDefined = false;
1616   fontDescriptionRun16.sizeDefined = false;
1617
1618   // Set a known font description
1619   FontDescriptionRun fontDescriptionRun17;
1620   fontDescriptionRun17.characterRun.characterIndex = 178u;
1621   fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
1622   fontDescriptionRun17.familyLength = fontArabic.size();
1623   fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
1624   memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
1625   fontDescriptionRun17.familyDefined = true;
1626   fontDescriptionRun17.weightDefined = false;
1627   fontDescriptionRun17.widthDefined = false;
1628   fontDescriptionRun17.slantDefined = false;
1629   fontDescriptionRun17.sizeDefined = false;
1630
1631   Vector<FontDescriptionRun> fontDescriptionRuns;
1632   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
1633   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
1634   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
1635   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
1636   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
1637   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
1638   fontDescriptionRuns.PushBack( fontDescriptionRun07 );
1639   fontDescriptionRuns.PushBack( fontDescriptionRun08 );
1640   fontDescriptionRuns.PushBack( fontDescriptionRun09 );
1641   fontDescriptionRuns.PushBack( fontDescriptionRun10 );
1642   fontDescriptionRuns.PushBack( fontDescriptionRun11 );
1643   fontDescriptionRuns.PushBack( fontDescriptionRun12 );
1644   fontDescriptionRuns.PushBack( fontDescriptionRun13 );
1645   fontDescriptionRuns.PushBack( fontDescriptionRun14 );
1646   fontDescriptionRuns.PushBack( fontDescriptionRun15 );
1647   fontDescriptionRuns.PushBack( fontDescriptionRun16 );
1648   fontDescriptionRuns.PushBack( fontDescriptionRun17 );
1649   Size textArea(100.f, 300.f);
1650   Size layoutSize(92.f, 380.f);
1651   float positions[] =
1652   {
1653     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
1654     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
1655     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
1656     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -13.f, 68.f, -9.f, 76.f, -13.f, 80.f, -13.f, 83.f, -9.f, 92.f, -0.f,
1657     0.f, -9.f, 11.f, -9.f, 21.f, -9.f, 27.f, -13.f, 30.f, -13.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
1658     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
1659     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
1660     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
1661     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
1662     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
1663     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
1664     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
1665     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
1666     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
1667     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
1668     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
1669     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
1670     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f,
1671   };
1672
1673   struct LineRun line01 =
1674   {
1675     { 0u, 12u },
1676     { 0u, 12u },
1677     81.f,
1678     15.f,
1679     -5.f,
1680     3.f,
1681     0.f,
1682     false,
1683     false
1684   };
1685   struct LineRun line02 =
1686   {
1687     { 12u, 10u },
1688     { 12u, 10u },
1689     76.f,
1690     15.f,
1691     -5.f,
1692     4.f,
1693     0.f,
1694     false,
1695     false
1696   };
1697   struct LineRun line03 =
1698   {
1699     { 22u, 6u },
1700     { 22u, 6u },
1701     34.f,
1702     15.f,
1703     -5.f,
1704     0.f,
1705     0.f,
1706     false,
1707     false
1708   };
1709   struct LineRun line04 =
1710   {
1711     { 28u, 20u },
1712     { 28u, 20u },
1713     92.f,
1714     15.f,
1715     -5.f,
1716     4.f,
1717     0.f,
1718     false,
1719     false
1720   };
1721   struct LineRun line05 =
1722   {
1723     { 48u, 11u },
1724     { 48u, 11u },
1725     76.f,
1726     15.f,
1727     -5.f,
1728     4.f,
1729     0.f,
1730     false,
1731     false
1732   };
1733   struct LineRun line06 =
1734   {
1735     { 59u, 5u },
1736     { 59u, 5u },
1737     31.f,
1738     15.f,
1739     -5.f,
1740     0.f,
1741     0.f,
1742     false,
1743     false
1744   };
1745   struct LineRun line07 =
1746   {
1747     { 64u, 10u },
1748     { 64u, 10u },
1749     67.f,
1750     15.f,
1751     -5.f,
1752     4.f,
1753     0.f,
1754     false,
1755     false
1756   };
1757   struct LineRun line08 =
1758   {
1759     { 74u, 12u },
1760     { 74u, 12u },
1761     79.f,
1762     15.f,
1763     -5.f,
1764     3.f,
1765     0.f,
1766     false,
1767     false
1768   };
1769   struct LineRun line09 =
1770   {
1771     { 86u, 6u },
1772     { 86u, 6u },
1773     43.f,
1774     15.f,
1775     -5.f,
1776     0.f,
1777     0.f,
1778     false,
1779     false
1780   };
1781   struct LineRun line10 =
1782   {
1783     { 92u, 12u },
1784     { 92u, 12u },
1785     78.f,
1786     15.f,
1787     -5.f,
1788     4.f,
1789     0.f,
1790     false,
1791     false
1792   };
1793   struct LineRun line11 =
1794   {
1795     { 104u, 19u },
1796     { 104u, 19u },
1797     90.f,
1798     15.f,
1799     -5.f,
1800     4.f,
1801     0.f,
1802     false,
1803     false
1804   };
1805   struct LineRun line12 =
1806   {
1807     { 123u, 5u },
1808     { 123u, 5u },
1809     31.f,
1810     15.f,
1811     -5.f,
1812     0.f,
1813     0.f,
1814     false,
1815     false
1816   };
1817   struct LineRun line13 =
1818   {
1819     { 128u, 12u },
1820     { 128u, 12u },
1821     81.f,
1822     15.f,
1823     -5.f,
1824     3.f,
1825     0.f,
1826     false,
1827     false
1828   };
1829   struct LineRun line14 =
1830   {
1831     { 140u, 10u },
1832     { 140u, 10u },
1833     76.f,
1834     15.f,
1835     -5.f,
1836     4.f,
1837     0.f,
1838     false,
1839     false
1840   };
1841   struct LineRun line15 =
1842   {
1843     { 150u, 6u },
1844     { 150u, 6u },
1845     34.f,
1846     15.f,
1847     -5.f,
1848     0.f,
1849     0.f,
1850     false,
1851     false
1852   };
1853   struct LineRun line16 =
1854   {
1855     { 156u, 10u },
1856     { 156u, 10u },
1857     67.f,
1858     15.f,
1859     -5.f,
1860     4.f,
1861     0.f,
1862     false,
1863     false
1864   };
1865   struct LineRun line17 =
1866   {
1867     { 166u, 12u },
1868     { 166u, 12u },
1869     79.f,
1870     15.f,
1871     -5.f,
1872     4.f,
1873     0.f,
1874     false,
1875     false
1876   };
1877   struct LineRun line18 =
1878   {
1879     { 178u, 14u },
1880     { 178u, 14u },
1881     55.f,
1882     15.f,
1883     -5.f,
1884     0.f,
1885     0.f,
1886     false,
1887     false
1888   };
1889   struct LineRun line19 =
1890   {
1891     { 192u, 0u },
1892     { 192u, 0u },
1893     0.f,
1894     15.f,
1895     -5.f,
1896     0.f,
1897     0.f,
1898     false,
1899     false
1900   };
1901   Vector<LineRun> lines;
1902   lines.PushBack( line01 );
1903   lines.PushBack( line02 );
1904   lines.PushBack( line03 );
1905   lines.PushBack( line04 );
1906   lines.PushBack( line05 );
1907   lines.PushBack( line06 );
1908   lines.PushBack( line07 );
1909   lines.PushBack( line08 );
1910   lines.PushBack( line09 );
1911   lines.PushBack( line10 );
1912   lines.PushBack( line11 );
1913   lines.PushBack( line12 );
1914   lines.PushBack( line13 );
1915   lines.PushBack( line14 );
1916   lines.PushBack( line15 );
1917   lines.PushBack( line16 );
1918   lines.PushBack( line17 );
1919   lines.PushBack( line18 );
1920   lines.PushBack( line19 );
1921
1922   LayoutTextData data =
1923   {
1924     "Layout bidirectional text.",
1925     "Hello world demo שלום עולם.\n"
1926     "مرحبا بالعالم hello world שלום עולם\n"
1927     "שלום עולם hello world demo.\n"
1928     "hello world مرحبا بالعالم שלום עולם\n"
1929     "Hello world demo שלום עולם.\n"
1930     "שלום עולם hello world مرحبا بالعالم\n",
1931     textArea,
1932     17u,
1933     fontDescriptionRuns.Begin(),
1934     layoutSize,
1935     192u,
1936     positions,
1937     19u,
1938     lines.Begin(),
1939     Layout::Engine::MULTI_LINE_BOX,
1940     0u,
1941     64u,
1942     false,
1943     true
1944   };
1945
1946   if( !LayoutTextTest( data ) )
1947   {
1948     tet_result(TET_FAIL);
1949   }
1950
1951   tet_result(TET_PASS);
1952   END_TEST;
1953 }
1954
1955 int UtcDaliTextUpdateLayout02(void)
1956 {
1957   ToolkitTestApplication application;
1958   tet_infoline(" UtcDaliTextUpdateLayout02");
1959
1960   // Layout some lines of bidirectional text. Update the paragraphs at the middle.
1961
1962   const std::string fontLatin( "TizenSans" );
1963   const std::string fontHebrew( "TizenSansHebrew" );
1964   const std::string fontArabic( "TizenSansArabic" );
1965
1966   // Set a known font description
1967   FontDescriptionRun fontDescriptionRun01;
1968   fontDescriptionRun01.characterRun.characterIndex = 0u;
1969   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
1970   fontDescriptionRun01.familyLength = fontLatin.size();
1971   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
1972   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
1973   fontDescriptionRun01.familyDefined = true;
1974   fontDescriptionRun01.weightDefined = false;
1975   fontDescriptionRun01.widthDefined = false;
1976   fontDescriptionRun01.slantDefined = false;
1977   fontDescriptionRun01.sizeDefined = false;
1978
1979   // Set a known font description
1980   FontDescriptionRun fontDescriptionRun02;
1981   fontDescriptionRun02.characterRun.characterIndex = 17u;
1982   fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
1983   fontDescriptionRun02.familyLength = fontHebrew.size();
1984   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
1985   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
1986   fontDescriptionRun02.familyDefined = true;
1987   fontDescriptionRun02.weightDefined = false;
1988   fontDescriptionRun02.widthDefined = false;
1989   fontDescriptionRun02.slantDefined = false;
1990   fontDescriptionRun02.sizeDefined = false;
1991
1992   // Set a known font description
1993   FontDescriptionRun fontDescriptionRun03;
1994   fontDescriptionRun03.characterRun.characterIndex = 26u;
1995   fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
1996   fontDescriptionRun03.familyLength = fontLatin.size();
1997   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
1998   memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
1999   fontDescriptionRun03.familyDefined = true;
2000   fontDescriptionRun03.weightDefined = false;
2001   fontDescriptionRun03.widthDefined = false;
2002   fontDescriptionRun03.slantDefined = false;
2003   fontDescriptionRun03.sizeDefined = false;
2004
2005   // Set a known font description
2006   FontDescriptionRun fontDescriptionRun04;
2007   fontDescriptionRun04.characterRun.characterIndex = 28u;
2008   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
2009   fontDescriptionRun04.familyLength = fontArabic.size();
2010   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
2011   memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
2012   fontDescriptionRun04.familyDefined = true;
2013   fontDescriptionRun04.weightDefined = false;
2014   fontDescriptionRun04.widthDefined = false;
2015   fontDescriptionRun04.slantDefined = false;
2016   fontDescriptionRun04.sizeDefined = false;
2017
2018   // Set a known font description
2019   FontDescriptionRun fontDescriptionRun05;
2020   fontDescriptionRun05.characterRun.characterIndex = 42u;
2021   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
2022   fontDescriptionRun05.familyLength = fontLatin.size();
2023   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
2024   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
2025   fontDescriptionRun05.familyDefined = true;
2026   fontDescriptionRun05.weightDefined = false;
2027   fontDescriptionRun05.widthDefined = false;
2028   fontDescriptionRun05.slantDefined = false;
2029   fontDescriptionRun05.sizeDefined = false;
2030
2031   // Set a known font description
2032   FontDescriptionRun fontDescriptionRun06;
2033   fontDescriptionRun06.characterRun.characterIndex = 54u;
2034   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2035   fontDescriptionRun06.familyLength = fontHebrew.size();
2036   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
2037   memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
2038   fontDescriptionRun06.familyDefined = true;
2039   fontDescriptionRun06.weightDefined = false;
2040   fontDescriptionRun06.widthDefined = false;
2041   fontDescriptionRun06.slantDefined = false;
2042   fontDescriptionRun06.sizeDefined = false;
2043
2044   // Set a known font description
2045   FontDescriptionRun fontDescriptionRun07;
2046   fontDescriptionRun07.characterRun.characterIndex = 64u;
2047   fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
2048   fontDescriptionRun07.familyLength = fontHebrew.size();
2049   fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
2050   memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
2051   fontDescriptionRun07.familyDefined = true;
2052   fontDescriptionRun07.weightDefined = false;
2053   fontDescriptionRun07.widthDefined = false;
2054   fontDescriptionRun07.slantDefined = false;
2055   fontDescriptionRun07.sizeDefined = false;
2056
2057   // Set a known font description
2058   FontDescriptionRun fontDescriptionRun08;
2059   fontDescriptionRun08.characterRun.characterIndex = 74u;
2060   fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
2061   fontDescriptionRun08.familyLength = fontLatin.size();
2062   fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
2063   memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
2064   fontDescriptionRun08.familyDefined = true;
2065   fontDescriptionRun08.weightDefined = false;
2066   fontDescriptionRun08.widthDefined = false;
2067   fontDescriptionRun08.slantDefined = false;
2068   fontDescriptionRun08.sizeDefined = false;
2069
2070   // Set a known font description
2071   FontDescriptionRun fontDescriptionRun09;
2072   fontDescriptionRun09.characterRun.characterIndex = 92u;
2073   fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
2074   fontDescriptionRun09.familyLength = fontLatin.size();
2075   fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
2076   memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
2077   fontDescriptionRun09.familyDefined = true;
2078   fontDescriptionRun09.weightDefined = false;
2079   fontDescriptionRun09.widthDefined = false;
2080   fontDescriptionRun09.slantDefined = false;
2081   fontDescriptionRun09.sizeDefined = false;
2082
2083   // Set a known font description
2084   FontDescriptionRun fontDescriptionRun10;
2085   fontDescriptionRun10.characterRun.characterIndex = 104u;
2086   fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
2087   fontDescriptionRun10.familyLength = fontArabic.size();
2088   fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
2089   memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
2090   fontDescriptionRun10.familyDefined = true;
2091   fontDescriptionRun10.weightDefined = false;
2092   fontDescriptionRun10.widthDefined = false;
2093   fontDescriptionRun10.slantDefined = false;
2094   fontDescriptionRun10.sizeDefined = false;
2095
2096   // Set a known font description
2097   FontDescriptionRun fontDescriptionRun11;
2098   fontDescriptionRun11.characterRun.characterIndex = 118u;
2099   fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
2100   fontDescriptionRun11.familyLength = fontHebrew.size();
2101   fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
2102   memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
2103   fontDescriptionRun11.familyDefined = true;
2104   fontDescriptionRun11.weightDefined = false;
2105   fontDescriptionRun11.widthDefined = false;
2106   fontDescriptionRun11.slantDefined = false;
2107   fontDescriptionRun11.sizeDefined = false;
2108
2109   // Set a known font description
2110   FontDescriptionRun fontDescriptionRun12;
2111   fontDescriptionRun12.characterRun.characterIndex = 128u;
2112   fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
2113   fontDescriptionRun12.familyLength = fontLatin.size();
2114   fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
2115   memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
2116   fontDescriptionRun12.familyDefined = true;
2117   fontDescriptionRun12.weightDefined = false;
2118   fontDescriptionRun12.widthDefined = false;
2119   fontDescriptionRun12.slantDefined = false;
2120   fontDescriptionRun12.sizeDefined = false;
2121
2122   // Set a known font description
2123   FontDescriptionRun fontDescriptionRun13;
2124   fontDescriptionRun13.characterRun.characterIndex = 145u;
2125   fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
2126   fontDescriptionRun13.familyLength = fontHebrew.size();
2127   fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
2128   memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
2129   fontDescriptionRun13.familyDefined = true;
2130   fontDescriptionRun13.weightDefined = false;
2131   fontDescriptionRun13.widthDefined = false;
2132   fontDescriptionRun13.slantDefined = false;
2133   fontDescriptionRun13.sizeDefined = false;
2134
2135   // Set a known font description
2136   FontDescriptionRun fontDescriptionRun14;
2137   fontDescriptionRun14.characterRun.characterIndex = 154u;
2138   fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
2139   fontDescriptionRun14.familyLength = fontLatin.size();
2140   fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
2141   memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
2142   fontDescriptionRun14.familyDefined = true;
2143   fontDescriptionRun14.weightDefined = false;
2144   fontDescriptionRun14.widthDefined = false;
2145   fontDescriptionRun14.slantDefined = false;
2146   fontDescriptionRun14.sizeDefined = false;
2147
2148   // Set a known font description
2149   FontDescriptionRun fontDescriptionRun15;
2150   fontDescriptionRun15.characterRun.characterIndex = 156u;
2151   fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
2152   fontDescriptionRun15.familyLength = fontHebrew.size();
2153   fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
2154   memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
2155   fontDescriptionRun15.familyDefined = true;
2156   fontDescriptionRun15.weightDefined = false;
2157   fontDescriptionRun15.widthDefined = false;
2158   fontDescriptionRun15.slantDefined = false;
2159   fontDescriptionRun15.sizeDefined = false;
2160
2161   // Set a known font description
2162   FontDescriptionRun fontDescriptionRun16;
2163   fontDescriptionRun16.characterRun.characterIndex = 166u;
2164   fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
2165   fontDescriptionRun16.familyLength = fontLatin.size();
2166   fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
2167   memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
2168   fontDescriptionRun16.familyDefined = true;
2169   fontDescriptionRun16.weightDefined = false;
2170   fontDescriptionRun16.widthDefined = false;
2171   fontDescriptionRun16.slantDefined = false;
2172   fontDescriptionRun16.sizeDefined = false;
2173
2174   // Set a known font description
2175   FontDescriptionRun fontDescriptionRun17;
2176   fontDescriptionRun17.characterRun.characterIndex = 178u;
2177   fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
2178   fontDescriptionRun17.familyLength = fontArabic.size();
2179   fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
2180   memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
2181   fontDescriptionRun17.familyDefined = true;
2182   fontDescriptionRun17.weightDefined = false;
2183   fontDescriptionRun17.widthDefined = false;
2184   fontDescriptionRun17.slantDefined = false;
2185   fontDescriptionRun17.sizeDefined = false;
2186
2187   Vector<FontDescriptionRun> fontDescriptionRuns;
2188   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
2189   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
2190   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
2191   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
2192   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
2193   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
2194   fontDescriptionRuns.PushBack( fontDescriptionRun07 );
2195   fontDescriptionRuns.PushBack( fontDescriptionRun08 );
2196   fontDescriptionRuns.PushBack( fontDescriptionRun09 );
2197   fontDescriptionRuns.PushBack( fontDescriptionRun10 );
2198   fontDescriptionRuns.PushBack( fontDescriptionRun11 );
2199   fontDescriptionRuns.PushBack( fontDescriptionRun12 );
2200   fontDescriptionRuns.PushBack( fontDescriptionRun13 );
2201   fontDescriptionRuns.PushBack( fontDescriptionRun14 );
2202   fontDescriptionRuns.PushBack( fontDescriptionRun15 );
2203   fontDescriptionRuns.PushBack( fontDescriptionRun16 );
2204   fontDescriptionRuns.PushBack( fontDescriptionRun17 );
2205   Size textArea(100.f, 300.f);
2206   Size layoutSize(92.f, 380.f);
2207   float positions[] =
2208   {
2209     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
2210     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2211     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2212     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -13.f, 68.f, -9.f, 76.f, -13.f, 80.f, -13.f, 83.f, -9.f, 92.f, -0.f,
2213     0.f, -9.f, 11.f, -9.f, 21.f, -9.f, 27.f, -13.f, 30.f, -13.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2214     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2215     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
2216     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2217     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
2218     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2219     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
2220     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2221     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
2222     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2223     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2224     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
2225     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2226     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f,
2227   };
2228
2229   struct LineRun line01 =
2230   {
2231     { 0u, 12u },
2232     { 0u, 12u },
2233     81.f,
2234     15.f,
2235     -5.f,
2236     3.f,
2237     0.f,
2238     false,
2239     false
2240   };
2241   struct LineRun line02 =
2242   {
2243     { 12u, 10u },
2244     { 12u, 10u },
2245     76.f,
2246     15.f,
2247     -5.f,
2248     4.f,
2249     0.f,
2250     false,
2251     false
2252   };
2253   struct LineRun line03 =
2254   {
2255     { 22u, 6u },
2256     { 22u, 6u },
2257     34.f,
2258     15.f,
2259     -5.f,
2260     0.f,
2261     0.f,
2262     false,
2263     false
2264   };
2265   struct LineRun line04 =
2266   {
2267     { 28u, 20u },
2268     { 28u, 20u },
2269     92.f,
2270     15.f,
2271     -5.f,
2272     4.f,
2273     0.f,
2274     false,
2275     false
2276   };
2277   struct LineRun line05 =
2278   {
2279     { 48u, 11u },
2280     { 48u, 11u },
2281     76.f,
2282     15.f,
2283     -5.f,
2284     4.f,
2285     0.f,
2286     false,
2287     false
2288   };
2289   struct LineRun line06 =
2290   {
2291     { 59u, 5u },
2292     { 59u, 5u },
2293     31.f,
2294     15.f,
2295     -5.f,
2296     0.f,
2297     0.f,
2298     false,
2299     false
2300   };
2301   struct LineRun line07 =
2302   {
2303     { 64u, 10u },
2304     { 64u, 10u },
2305     67.f,
2306     15.f,
2307     -5.f,
2308     4.f,
2309     0.f,
2310     false,
2311     false
2312   };
2313   struct LineRun line08 =
2314   {
2315     { 74u, 12u },
2316     { 74u, 12u },
2317     79.f,
2318     15.f,
2319     -5.f,
2320     3.f,
2321     0.f,
2322     false,
2323     false
2324   };
2325   struct LineRun line09 =
2326   {
2327     { 86u, 6u },
2328     { 86u, 6u },
2329     43.f,
2330     15.f,
2331     -5.f,
2332     0.f,
2333     0.f,
2334     false,
2335     false
2336   };
2337   struct LineRun line10 =
2338   {
2339     { 92u, 12u },
2340     { 92u, 12u },
2341     78.f,
2342     15.f,
2343     -5.f,
2344     4.f,
2345     0.f,
2346     false,
2347     false
2348   };
2349   struct LineRun line11 =
2350   {
2351     { 104u, 19u },
2352     { 104u, 19u },
2353     90.f,
2354     15.f,
2355     -5.f,
2356     4.f,
2357     0.f,
2358     false,
2359     false
2360   };
2361   struct LineRun line12 =
2362   {
2363     { 123u, 5u },
2364     { 123u, 5u },
2365     31.f,
2366     15.f,
2367     -5.f,
2368     0.f,
2369     0.f,
2370     false,
2371     false
2372   };
2373   struct LineRun line13 =
2374   {
2375     { 128u, 12u },
2376     { 128u, 12u },
2377     81.f,
2378     15.f,
2379     -5.f,
2380     3.f,
2381     0.f,
2382     false,
2383     false
2384   };
2385   struct LineRun line14 =
2386   {
2387     { 140u, 10u },
2388     { 140u, 10u },
2389     76.f,
2390     15.f,
2391     -5.f,
2392     4.f,
2393     0.f,
2394     false,
2395     false
2396   };
2397   struct LineRun line15 =
2398   {
2399     { 150u, 6u },
2400     { 150u, 6u },
2401     34.f,
2402     15.f,
2403     -5.f,
2404     0.f,
2405     0.f,
2406     false,
2407     false
2408   };
2409   struct LineRun line16 =
2410   {
2411     { 156u, 10u },
2412     { 156u, 10u },
2413     67.f,
2414     15.f,
2415     -5.f,
2416     4.f,
2417     0.f,
2418     false,
2419     false
2420   };
2421   struct LineRun line17 =
2422   {
2423     { 166u, 12u },
2424     { 166u, 12u },
2425     79.f,
2426     15.f,
2427     -5.f,
2428     4.f,
2429     0.f,
2430     false,
2431     false
2432   };
2433   struct LineRun line18 =
2434   {
2435     { 178u, 14u },
2436     { 178u, 14u },
2437     55.f,
2438     15.f,
2439     -5.f,
2440     0.f,
2441     0.f,
2442     false,
2443     false
2444   };
2445   struct LineRun line19 =
2446   {
2447     { 192u, 0u },
2448     { 192u, 0u },
2449     0.f,
2450     15.f,
2451     -5.f,
2452     0.f,
2453     0.f,
2454     false,
2455     false
2456   };
2457   Vector<LineRun> lines;
2458   lines.PushBack( line01 );
2459   lines.PushBack( line02 );
2460   lines.PushBack( line03 );
2461   lines.PushBack( line04 );
2462   lines.PushBack( line05 );
2463   lines.PushBack( line06 );
2464   lines.PushBack( line07 );
2465   lines.PushBack( line08 );
2466   lines.PushBack( line09 );
2467   lines.PushBack( line10 );
2468   lines.PushBack( line11 );
2469   lines.PushBack( line12 );
2470   lines.PushBack( line13 );
2471   lines.PushBack( line14 );
2472   lines.PushBack( line15 );
2473   lines.PushBack( line16 );
2474   lines.PushBack( line17 );
2475   lines.PushBack( line18 );
2476   lines.PushBack( line19 );
2477
2478   LayoutTextData data =
2479   {
2480     "Layout bidirectional text.",
2481     "Hello world demo שלום עולם.\n"
2482     "مرحبا بالعالم hello world שלום עולם\n"
2483     "שלום עולם hello world demo.\n"
2484     "hello world مرحبا بالعالم שלום עולם\n"
2485     "Hello world demo שלום עולם.\n"
2486     "שלום עולם hello world مرحبا بالعالم\n",
2487     textArea,
2488     17u,
2489     fontDescriptionRuns.Begin(),
2490     layoutSize,
2491     192u,
2492     positions,
2493     19u,
2494     lines.Begin(),
2495     Layout::Engine::MULTI_LINE_BOX,
2496     64u,
2497     64u,
2498     false,
2499     true
2500   };
2501
2502   if( !LayoutTextTest( data ) )
2503   {
2504     tet_result(TET_FAIL);
2505   }
2506
2507   tet_result(TET_PASS);
2508   END_TEST;
2509 }
2510
2511 int UtcDaliTextUpdateLayout03(void)
2512 {
2513   ToolkitTestApplication application;
2514   tet_infoline(" UtcDaliTextUpdateLayout03");
2515
2516   // Layout some lines of bidirectional text. Update the paragraphs at the middle.
2517
2518   const std::string fontLatin( "TizenSans" );
2519   const std::string fontHebrew( "TizenSansHebrew" );
2520   const std::string fontArabic( "TizenSansArabic" );
2521
2522   // Set a known font description
2523   FontDescriptionRun fontDescriptionRun01;
2524   fontDescriptionRun01.characterRun.characterIndex = 0u;
2525   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
2526   fontDescriptionRun01.familyLength = fontLatin.size();
2527   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
2528   memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
2529   fontDescriptionRun01.familyDefined = true;
2530   fontDescriptionRun01.weightDefined = false;
2531   fontDescriptionRun01.widthDefined = false;
2532   fontDescriptionRun01.slantDefined = false;
2533   fontDescriptionRun01.sizeDefined = false;
2534
2535   // Set a known font description
2536   FontDescriptionRun fontDescriptionRun02;
2537   fontDescriptionRun02.characterRun.characterIndex = 17u;
2538   fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
2539   fontDescriptionRun02.familyLength = fontHebrew.size();
2540   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
2541   memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
2542   fontDescriptionRun02.familyDefined = true;
2543   fontDescriptionRun02.weightDefined = false;
2544   fontDescriptionRun02.widthDefined = false;
2545   fontDescriptionRun02.slantDefined = false;
2546   fontDescriptionRun02.sizeDefined = false;
2547
2548   // Set a known font description
2549   FontDescriptionRun fontDescriptionRun03;
2550   fontDescriptionRun03.characterRun.characterIndex = 26u;
2551   fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
2552   fontDescriptionRun03.familyLength = fontLatin.size();
2553   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
2554   memcpy( fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength );
2555   fontDescriptionRun03.familyDefined = true;
2556   fontDescriptionRun03.weightDefined = false;
2557   fontDescriptionRun03.widthDefined = false;
2558   fontDescriptionRun03.slantDefined = false;
2559   fontDescriptionRun03.sizeDefined = false;
2560
2561   // Set a known font description
2562   FontDescriptionRun fontDescriptionRun04;
2563   fontDescriptionRun04.characterRun.characterIndex = 28u;
2564   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
2565   fontDescriptionRun04.familyLength = fontArabic.size();
2566   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
2567   memcpy( fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength );
2568   fontDescriptionRun04.familyDefined = true;
2569   fontDescriptionRun04.weightDefined = false;
2570   fontDescriptionRun04.widthDefined = false;
2571   fontDescriptionRun04.slantDefined = false;
2572   fontDescriptionRun04.sizeDefined = false;
2573
2574   // Set a known font description
2575   FontDescriptionRun fontDescriptionRun05;
2576   fontDescriptionRun05.characterRun.characterIndex = 42u;
2577   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
2578   fontDescriptionRun05.familyLength = fontLatin.size();
2579   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
2580   memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
2581   fontDescriptionRun05.familyDefined = true;
2582   fontDescriptionRun05.weightDefined = false;
2583   fontDescriptionRun05.widthDefined = false;
2584   fontDescriptionRun05.slantDefined = false;
2585   fontDescriptionRun05.sizeDefined = false;
2586
2587   // Set a known font description
2588   FontDescriptionRun fontDescriptionRun06;
2589   fontDescriptionRun06.characterRun.characterIndex = 54u;
2590   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2591   fontDescriptionRun06.familyLength = fontHebrew.size();
2592   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
2593   memcpy( fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength );
2594   fontDescriptionRun06.familyDefined = true;
2595   fontDescriptionRun06.weightDefined = false;
2596   fontDescriptionRun06.widthDefined = false;
2597   fontDescriptionRun06.slantDefined = false;
2598   fontDescriptionRun06.sizeDefined = false;
2599
2600   // Set a known font description
2601   FontDescriptionRun fontDescriptionRun07;
2602   fontDescriptionRun07.characterRun.characterIndex = 64u;
2603   fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
2604   fontDescriptionRun07.familyLength = fontHebrew.size();
2605   fontDescriptionRun07.familyName = new char[fontDescriptionRun07.familyLength];
2606   memcpy( fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength );
2607   fontDescriptionRun07.familyDefined = true;
2608   fontDescriptionRun07.weightDefined = false;
2609   fontDescriptionRun07.widthDefined = false;
2610   fontDescriptionRun07.slantDefined = false;
2611   fontDescriptionRun07.sizeDefined = false;
2612
2613   // Set a known font description
2614   FontDescriptionRun fontDescriptionRun08;
2615   fontDescriptionRun08.characterRun.characterIndex = 74u;
2616   fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
2617   fontDescriptionRun08.familyLength = fontLatin.size();
2618   fontDescriptionRun08.familyName = new char[fontDescriptionRun08.familyLength];
2619   memcpy( fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength );
2620   fontDescriptionRun08.familyDefined = true;
2621   fontDescriptionRun08.weightDefined = false;
2622   fontDescriptionRun08.widthDefined = false;
2623   fontDescriptionRun08.slantDefined = false;
2624   fontDescriptionRun08.sizeDefined = false;
2625
2626   // Set a known font description
2627   FontDescriptionRun fontDescriptionRun09;
2628   fontDescriptionRun09.characterRun.characterIndex = 92u;
2629   fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
2630   fontDescriptionRun09.familyLength = fontLatin.size();
2631   fontDescriptionRun09.familyName = new char[fontDescriptionRun09.familyLength];
2632   memcpy( fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength );
2633   fontDescriptionRun09.familyDefined = true;
2634   fontDescriptionRun09.weightDefined = false;
2635   fontDescriptionRun09.widthDefined = false;
2636   fontDescriptionRun09.slantDefined = false;
2637   fontDescriptionRun09.sizeDefined = false;
2638
2639   // Set a known font description
2640   FontDescriptionRun fontDescriptionRun10;
2641   fontDescriptionRun10.characterRun.characterIndex = 104u;
2642   fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
2643   fontDescriptionRun10.familyLength = fontArabic.size();
2644   fontDescriptionRun10.familyName = new char[fontDescriptionRun10.familyLength];
2645   memcpy( fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength );
2646   fontDescriptionRun10.familyDefined = true;
2647   fontDescriptionRun10.weightDefined = false;
2648   fontDescriptionRun10.widthDefined = false;
2649   fontDescriptionRun10.slantDefined = false;
2650   fontDescriptionRun10.sizeDefined = false;
2651
2652   // Set a known font description
2653   FontDescriptionRun fontDescriptionRun11;
2654   fontDescriptionRun11.characterRun.characterIndex = 118u;
2655   fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
2656   fontDescriptionRun11.familyLength = fontHebrew.size();
2657   fontDescriptionRun11.familyName = new char[fontDescriptionRun11.familyLength];
2658   memcpy( fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength );
2659   fontDescriptionRun11.familyDefined = true;
2660   fontDescriptionRun11.weightDefined = false;
2661   fontDescriptionRun11.widthDefined = false;
2662   fontDescriptionRun11.slantDefined = false;
2663   fontDescriptionRun11.sizeDefined = false;
2664
2665   // Set a known font description
2666   FontDescriptionRun fontDescriptionRun12;
2667   fontDescriptionRun12.characterRun.characterIndex = 128u;
2668   fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
2669   fontDescriptionRun12.familyLength = fontLatin.size();
2670   fontDescriptionRun12.familyName = new char[fontDescriptionRun12.familyLength];
2671   memcpy( fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength );
2672   fontDescriptionRun12.familyDefined = true;
2673   fontDescriptionRun12.weightDefined = false;
2674   fontDescriptionRun12.widthDefined = false;
2675   fontDescriptionRun12.slantDefined = false;
2676   fontDescriptionRun12.sizeDefined = false;
2677
2678   // Set a known font description
2679   FontDescriptionRun fontDescriptionRun13;
2680   fontDescriptionRun13.characterRun.characterIndex = 145u;
2681   fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
2682   fontDescriptionRun13.familyLength = fontHebrew.size();
2683   fontDescriptionRun13.familyName = new char[fontDescriptionRun13.familyLength];
2684   memcpy( fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength );
2685   fontDescriptionRun13.familyDefined = true;
2686   fontDescriptionRun13.weightDefined = false;
2687   fontDescriptionRun13.widthDefined = false;
2688   fontDescriptionRun13.slantDefined = false;
2689   fontDescriptionRun13.sizeDefined = false;
2690
2691   // Set a known font description
2692   FontDescriptionRun fontDescriptionRun14;
2693   fontDescriptionRun14.characterRun.characterIndex = 154u;
2694   fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
2695   fontDescriptionRun14.familyLength = fontLatin.size();
2696   fontDescriptionRun14.familyName = new char[fontDescriptionRun14.familyLength];
2697   memcpy( fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength );
2698   fontDescriptionRun14.familyDefined = true;
2699   fontDescriptionRun14.weightDefined = false;
2700   fontDescriptionRun14.widthDefined = false;
2701   fontDescriptionRun14.slantDefined = false;
2702   fontDescriptionRun14.sizeDefined = false;
2703
2704   // Set a known font description
2705   FontDescriptionRun fontDescriptionRun15;
2706   fontDescriptionRun15.characterRun.characterIndex = 156u;
2707   fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
2708   fontDescriptionRun15.familyLength = fontHebrew.size();
2709   fontDescriptionRun15.familyName = new char[fontDescriptionRun15.familyLength];
2710   memcpy( fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength );
2711   fontDescriptionRun15.familyDefined = true;
2712   fontDescriptionRun15.weightDefined = false;
2713   fontDescriptionRun15.widthDefined = false;
2714   fontDescriptionRun15.slantDefined = false;
2715   fontDescriptionRun15.sizeDefined = false;
2716
2717   // Set a known font description
2718   FontDescriptionRun fontDescriptionRun16;
2719   fontDescriptionRun16.characterRun.characterIndex = 166u;
2720   fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
2721   fontDescriptionRun16.familyLength = fontLatin.size();
2722   fontDescriptionRun16.familyName = new char[fontDescriptionRun16.familyLength];
2723   memcpy( fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength );
2724   fontDescriptionRun16.familyDefined = true;
2725   fontDescriptionRun16.weightDefined = false;
2726   fontDescriptionRun16.widthDefined = false;
2727   fontDescriptionRun16.slantDefined = false;
2728   fontDescriptionRun16.sizeDefined = false;
2729
2730   // Set a known font description
2731   FontDescriptionRun fontDescriptionRun17;
2732   fontDescriptionRun17.characterRun.characterIndex = 178u;
2733   fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
2734   fontDescriptionRun17.familyLength = fontArabic.size();
2735   fontDescriptionRun17.familyName = new char[fontDescriptionRun17.familyLength];
2736   memcpy( fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength );
2737   fontDescriptionRun17.familyDefined = true;
2738   fontDescriptionRun17.weightDefined = false;
2739   fontDescriptionRun17.widthDefined = false;
2740   fontDescriptionRun17.slantDefined = false;
2741   fontDescriptionRun17.sizeDefined = false;
2742
2743   Vector<FontDescriptionRun> fontDescriptionRuns;
2744   fontDescriptionRuns.PushBack( fontDescriptionRun01 );
2745   fontDescriptionRuns.PushBack( fontDescriptionRun02 );
2746   fontDescriptionRuns.PushBack( fontDescriptionRun03 );
2747   fontDescriptionRuns.PushBack( fontDescriptionRun04 );
2748   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
2749   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
2750   fontDescriptionRuns.PushBack( fontDescriptionRun07 );
2751   fontDescriptionRuns.PushBack( fontDescriptionRun08 );
2752   fontDescriptionRuns.PushBack( fontDescriptionRun09 );
2753   fontDescriptionRuns.PushBack( fontDescriptionRun10 );
2754   fontDescriptionRuns.PushBack( fontDescriptionRun11 );
2755   fontDescriptionRuns.PushBack( fontDescriptionRun12 );
2756   fontDescriptionRuns.PushBack( fontDescriptionRun13 );
2757   fontDescriptionRuns.PushBack( fontDescriptionRun14 );
2758   fontDescriptionRuns.PushBack( fontDescriptionRun15 );
2759   fontDescriptionRuns.PushBack( fontDescriptionRun16 );
2760   fontDescriptionRuns.PushBack( fontDescriptionRun17 );
2761   Size textArea(100.f, 300.f);
2762   Size layoutSize(92.f, 380.f);
2763   float positions[] =
2764   {
2765     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
2766     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2767     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2768     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -13.f, 68.f, -9.f, 76.f, -13.f, 80.f, -13.f, 83.f, -9.f, 92.f, -0.f,
2769     0.f, -9.f, 11.f, -9.f, 21.f, -9.f, 27.f, -13.f, 30.f, -13.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2770     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2771     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
2772     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2773     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
2774     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2775     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
2776     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
2777     1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
2778     0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
2779     1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
2780     1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
2781     1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
2782     0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f,
2783   };
2784
2785   struct LineRun line01 =
2786   {
2787     { 0u, 12u },
2788     { 0u, 12u },
2789     81.f,
2790     15.f,
2791     -5.f,
2792     3.f,
2793     0.f,
2794     false,
2795     false
2796   };
2797   struct LineRun line02 =
2798   {
2799     { 12u, 10u },
2800     { 12u, 10u },
2801     76.f,
2802     15.f,
2803     -5.f,
2804     4.f,
2805     0.f,
2806     false,
2807     false
2808   };
2809   struct LineRun line03 =
2810   {
2811     { 22u, 6u },
2812     { 22u, 6u },
2813     34.f,
2814     15.f,
2815     -5.f,
2816     0.f,
2817     0.f,
2818     false,
2819     false
2820   };
2821   struct LineRun line04 =
2822   {
2823     { 28u, 20u },
2824     { 28u, 20u },
2825     92.f,
2826     15.f,
2827     -5.f,
2828     4.f,
2829     0.f,
2830     false,
2831     false
2832   };
2833   struct LineRun line05 =
2834   {
2835     { 48u, 11u },
2836     { 48u, 11u },
2837     76.f,
2838     15.f,
2839     -5.f,
2840     4.f,
2841     0.f,
2842     false,
2843     false
2844   };
2845   struct LineRun line06 =
2846   {
2847     { 59u, 5u },
2848     { 59u, 5u },
2849     31.f,
2850     15.f,
2851     -5.f,
2852     0.f,
2853     0.f,
2854     false,
2855     false
2856   };
2857   struct LineRun line07 =
2858   {
2859     { 64u, 10u },
2860     { 64u, 10u },
2861     67.f,
2862     15.f,
2863     -5.f,
2864     4.f,
2865     0.f,
2866     false,
2867     false
2868   };
2869   struct LineRun line08 =
2870   {
2871     { 74u, 12u },
2872     { 74u, 12u },
2873     79.f,
2874     15.f,
2875     -5.f,
2876     3.f,
2877     0.f,
2878     false,
2879     false
2880   };
2881   struct LineRun line09 =
2882   {
2883     { 86u, 6u },
2884     { 86u, 6u },
2885     43.f,
2886     15.f,
2887     -5.f,
2888     0.f,
2889     0.f,
2890     false,
2891     false
2892   };
2893   struct LineRun line10 =
2894   {
2895     { 92u, 12u },
2896     { 92u, 12u },
2897     78.f,
2898     15.f,
2899     -5.f,
2900     4.f,
2901     0.f,
2902     false,
2903     false
2904   };
2905   struct LineRun line11 =
2906   {
2907     { 104u, 19u },
2908     { 104u, 19u },
2909     90.f,
2910     15.f,
2911     -5.f,
2912     4.f,
2913     0.f,
2914     false,
2915     false
2916   };
2917   struct LineRun line12 =
2918   {
2919     { 123u, 5u },
2920     { 123u, 5u },
2921     31.f,
2922     15.f,
2923     -5.f,
2924     0.f,
2925     0.f,
2926     false,
2927     false
2928   };
2929   struct LineRun line13 =
2930   {
2931     { 128u, 12u },
2932     { 128u, 12u },
2933     81.f,
2934     15.f,
2935     -5.f,
2936     3.f,
2937     0.f,
2938     false,
2939     false
2940   };
2941   struct LineRun line14 =
2942   {
2943     { 140u, 10u },
2944     { 140u, 10u },
2945     76.f,
2946     15.f,
2947     -5.f,
2948     4.f,
2949     0.f,
2950     false,
2951     false
2952   };
2953   struct LineRun line15 =
2954   {
2955     { 150u, 6u },
2956     { 150u, 6u },
2957     34.f,
2958     15.f,
2959     -5.f,
2960     0.f,
2961     0.f,
2962     false,
2963     false
2964   };
2965   struct LineRun line16 =
2966   {
2967     { 156u, 10u },
2968     { 156u, 10u },
2969     67.f,
2970     15.f,
2971     -5.f,
2972     4.f,
2973     0.f,
2974     false,
2975     false
2976   };
2977   struct LineRun line17 =
2978   {
2979     { 166u, 12u },
2980     { 166u, 12u },
2981     79.f,
2982     15.f,
2983     -5.f,
2984     4.f,
2985     0.f,
2986     false,
2987     false
2988   };
2989   struct LineRun line18 =
2990   {
2991     { 178u, 14u },
2992     { 178u, 14u },
2993     55.f,
2994     15.f,
2995     -5.f,
2996     0.f,
2997     0.f,
2998     false,
2999     false
3000   };
3001   struct LineRun line19 =
3002   {
3003     { 192u, 0u },
3004     { 192u, 0u },
3005     0.f,
3006     15.f,
3007     -5.f,
3008     0.f,
3009     0.f,
3010     false,
3011     false
3012   };
3013   Vector<LineRun> lines;
3014   lines.PushBack( line01 );
3015   lines.PushBack( line02 );
3016   lines.PushBack( line03 );
3017   lines.PushBack( line04 );
3018   lines.PushBack( line05 );
3019   lines.PushBack( line06 );
3020   lines.PushBack( line07 );
3021   lines.PushBack( line08 );
3022   lines.PushBack( line09 );
3023   lines.PushBack( line10 );
3024   lines.PushBack( line11 );
3025   lines.PushBack( line12 );
3026   lines.PushBack( line13 );
3027   lines.PushBack( line14 );
3028   lines.PushBack( line15 );
3029   lines.PushBack( line16 );
3030   lines.PushBack( line17 );
3031   lines.PushBack( line18 );
3032   lines.PushBack( line19 );
3033
3034   LayoutTextData data =
3035   {
3036     "Layout bidirectional text.",
3037     "Hello world demo שלום עולם.\n"
3038     "مرحبا بالعالم hello world שלום עולם\n"
3039     "שלום עולם hello world demo.\n"
3040     "hello world مرحبا بالعالم שלום עולם\n"
3041     "Hello world demo שלום עולם.\n"
3042     "שלום עולם hello world مرحبا بالعالم\n",
3043     textArea,
3044     17u,
3045     fontDescriptionRuns.Begin(),
3046     layoutSize,
3047     192u,
3048     positions,
3049     19u,
3050     lines.Begin(),
3051     Layout::Engine::MULTI_LINE_BOX,
3052     128u,
3053     64u,
3054     false,
3055     true
3056   };
3057
3058   if( !LayoutTextTest( data ) )
3059   {
3060     tet_result(TET_FAIL);
3061   }
3062
3063   tet_result(TET_PASS);
3064   END_TEST;
3065 }
3066