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