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