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