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