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