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