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