Merge "Fix text AutoScroll ellipsis issue" into devel/master
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-Text-Layout.cpp
1 /*
2  * Copyright (c) 2022 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 <stdlib.h>
19 #include <unistd.h>
20 #include <iostream>
21
22 #include <dali-toolkit-test-suite-utils.h>
23 #include <dali-toolkit/dali-toolkit.h>
24 #include <dali-toolkit/internal/text/layouts/layout-engine.h>
25 #include <dali-toolkit/internal/text/layouts/layout-parameters.h>
26 #include <dali-toolkit/internal/text/text-run-container.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 const std::string DEFAULT_FONT_DIR("/resources/fonts");
40
41 struct LayoutTextData
42 {
43   std::string                       description;
44   std::string                       text;
45   Size                              textArea;
46   unsigned int                      numberOfFonts;
47   FontDescriptionRun*               fontDescriptions;
48   Size                              layoutSize;
49   unsigned int                      totalNumberOfGlyphs;
50   float*                            positions;
51   unsigned int                      numberOfLines;
52   LineRun*                          lines;
53   Layout::Engine::Type              layout;
54   unsigned int                      startIndex;
55   unsigned int                      numberOfGlyphs;
56   bool                              ellipsis : 1;
57   DevelText::EllipsisPosition::Type ellipsisPosition;
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                   false,
114                   Toolkit::DevelText::EllipsisPosition::END,
115                   0.0f, // lineSpacing
116                   0.0f  // characterSpacing
117   );
118
119   LogicalModelPtr logicalModel = textModel->mLogicalModel;
120   VisualModelPtr  visualModel  = textModel->mVisualModel;
121
122   // 2) Clear the layout.
123   Vector<LineRun>& lines = visualModel->mLines;
124
125   const Length     numberOfCharacters = logicalModel->mText.Count();
126   const bool       isLastNewParagraph = (0u == numberOfCharacters) ? false : TextAbstraction::IsNewParagraph(*(logicalModel->mText.Begin() + (numberOfCharacters - 1u)));
127   const GlyphIndex lastGlyphIndex     = data.startIndex + data.numberOfGlyphs - 1u;
128   const bool       removeLastLine     = isLastNewParagraph && (lastGlyphIndex + 1u == visualModel->mGlyphs.Count());
129
130   LineIndex startRemoveIndex = 0u;
131
132   if(0u != lines.Count())
133   {
134     startRemoveIndex         = lines.Count();
135     LineIndex endRemoveIndex = startRemoveIndex;
136     ClearGlyphRuns(data.startIndex,
137                    lastGlyphIndex + (removeLastLine ? 1u : 0u),
138                    lines,
139                    startRemoveIndex,
140                    endRemoveIndex);
141
142     // Update the character runs of the lines.
143     const CharacterIndex* const glyphsToCharactersBuffer = visualModel->mGlyphsToCharacters.Begin();
144     const Length* const         charactersPerGlyph       = visualModel->mCharactersPerGlyph.Begin();
145     const CharacterIndex        startCharacterIndex      = *(glyphsToCharactersBuffer + data.startIndex);
146     const CharacterIndex        lastCharacterIndex       = *(glyphsToCharactersBuffer + lastGlyphIndex) + *(charactersPerGlyph + lastGlyphIndex) - 1u;
147     ClearCharacterRuns(startCharacterIndex,
148                        lastCharacterIndex + (removeLastLine ? 1u : 0u),
149                        lines,
150                        startRemoveIndex,
151                        endRemoveIndex);
152
153     lines.Erase(lines.Begin() + startRemoveIndex,
154                 lines.Begin() + endRemoveIndex);
155   }
156
157   Vector<Vector2>& glyphPositions = visualModel->mGlyphPositions;
158
159   glyphPositions.Erase(glyphPositions.Begin() + data.startIndex,
160                        glyphPositions.Begin() + data.startIndex + data.numberOfGlyphs);
161
162   // 3) Layout
163   Layout::Engine engine;
164   engine.SetMetrics(metrics);
165   engine.SetLayout(data.layout);
166
167   textModel->mHorizontalAlignment   = Text::HorizontalAlignment::BEGIN;
168   textModel->mLineWrapMode          = LineWrap::WORD;
169   textModel->mIgnoreSpacesAfterText = true;
170   Layout::Parameters layoutParameters(data.textArea,
171                                       textModel);
172
173   layoutParameters.isLastNewParagraph = isLastNewParagraph;
174
175   // The initial glyph and the number of glyphs to layout.
176   layoutParameters.startGlyphIndex        = data.startIndex;
177   layoutParameters.numberOfGlyphs         = data.numberOfGlyphs;
178   layoutParameters.startLineIndex         = startRemoveIndex;
179   layoutParameters.estimatedNumberOfLines = logicalModel->mParagraphInfo.Count();
180
181   layoutSize = Vector2::ZERO;
182
183   bool       isAutoScroll                   = false;
184   bool       isAutoScrollMaxTextureExceeded = false;
185   const bool updated                        = engine.LayoutText(layoutParameters,
186                                          layoutSize,
187                                          data.ellipsis,
188                                          isAutoScroll,
189                                          isAutoScrollMaxTextureExceeded,
190                                          data.ellipsisPosition);
191
192   // 4) Compare the results.
193
194   if(updated != data.updated)
195   {
196     std::cout << "  Different updated bool : " << updated << ", expected : " << data.updated << std::endl;
197     return false;
198   }
199
200   if(layoutSize != data.layoutSize)
201   {
202     std::cout << "  Different layout size : " << layoutSize << ", expected : " << data.layoutSize << std::endl;
203     return false;
204   }
205
206   for(unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index)
207   {
208     const Vector2& position = *(glyphPositions.Begin() + index);
209
210     if(fabsf(std::round(position.x) - *(data.positions + 2u * index)) > Math::MACHINE_EPSILON_1000)
211     {
212       std::cout << "  Different position for glyph " << index << " x : " << position.x << ", expected : " << *(data.positions + 2u * index) << std::endl;
213       return false;
214     }
215     if(fabsf(position.y - *(data.positions + 2u * index + 1u)) > Math::MACHINE_EPSILON_1000)
216     {
217       std::cout << "  Different position for glyph " << index << " y : " << position.y << ", expected : " << *(data.positions + 2u * index + 1u) << std::endl;
218       return false;
219     }
220   }
221
222   if(lines.Count() != data.numberOfLines)
223   {
224     std::cout << "  Different number of lines : " << lines.Count() << ", expected : " << data.numberOfLines << std::endl;
225     return false;
226   }
227
228   for(unsigned int index = 0u; index < data.numberOfLines; ++index)
229   {
230     const LineRun& line         = *(lines.Begin() + index);
231     const LineRun& expectedLine = *(data.lines + index);
232
233     if(line.glyphRun.glyphIndex != expectedLine.glyphRun.glyphIndex)
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     if(line.glyphRun.numberOfGlyphs != expectedLine.glyphRun.numberOfGlyphs)
242     {
243       std::cout << "  Different line info for line : " << index << std::endl;
244       Print(line);
245       std::cout << "  expected" << std::endl;
246       Print(expectedLine);
247       return false;
248     }
249
250     if(line.characterRun.characterIndex != expectedLine.characterRun.characterIndex)
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     if(line.characterRun.numberOfCharacters != expectedLine.characterRun.numberOfCharacters)
259     {
260       std::cout << "  Different line info for line : " << index << std::endl;
261       Print(line);
262       std::cout << "  expected" << std::endl;
263       Print(expectedLine);
264       return false;
265     }
266
267     if(fabsf(floor(line.width) - expectedLine.width) > Math::MACHINE_EPSILON_1)
268     {
269       std::cout << "  Different line info for line : " << index << std::endl;
270       Print(line);
271       std::cout << "  expected" << std::endl;
272       Print(expectedLine);
273       return false;
274     }
275
276     if(fabsf(line.ascender - expectedLine.ascender) > Math::MACHINE_EPSILON_1)
277     {
278       std::cout << "  Different line info for line : " << index << std::endl;
279       Print(line);
280       std::cout << "  expected" << std::endl;
281       Print(expectedLine);
282       return false;
283     }
284
285     if(fabsf(line.descender - expectedLine.descender) > Math::MACHINE_EPSILON_1)
286     {
287       std::cout << "  Different line info for line : " << index << std::endl;
288       Print(line);
289       std::cout << "  expected" << std::endl;
290       Print(expectedLine);
291       return false;
292     }
293
294     if(fabsf(line.extraLength - expectedLine.extraLength) > Math::MACHINE_EPSILON_1)
295     {
296       std::cout << "  Different line info for line : " << index << std::endl;
297       Print(line);
298       std::cout << "  expected" << std::endl;
299       Print(expectedLine);
300       return false;
301     }
302
303     if(line.ellipsis != expectedLine.ellipsis)
304     {
305       std::cout << "  Different line info for line : " << index << std::endl;
306       Print(line);
307       std::cout << "  expected" << std::endl;
308       Print(expectedLine);
309       return false;
310     }
311
312     // Do not compare the alignment offset as it's not calculated in the layout.
313     // Do not compare the line direction as it's not set in the layout.
314   }
315
316   return true;
317 }
318
319 //////////////////////////////////////////////////////////
320
321 struct AlignData
322 {
323   std::string                     description;
324   std::string                     text;
325   Size                            textArea;
326   unsigned int                    numberOfFonts;
327   FontDescriptionRun*             fontDescriptions;
328   Text::HorizontalAlignment::Type horizontalAlignment;
329   Text::VerticalAlignment::Type   verticalAlignment;
330   unsigned int                    startIndex;
331   unsigned int                    numberOfCharacters;
332   unsigned int                    numberOfLines;
333   float*                          lineOffsets;
334   Dali::LayoutDirection::Type     layoutDirection;
335   bool                            matchSystemLanguageDirection;
336 };
337
338 bool AlignTest(const AlignData& data)
339 {
340   // Load some fonts.
341   TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
342   fontClient.SetDpi(96u, 96u);
343
344   char*             pathNamePtr = get_current_dir_name();
345   const std::string pathName(pathNamePtr);
346   free(pathNamePtr);
347
348   fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf");
349   fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf");
350   fontClient.GetFontId(pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf");
351
352   // 1) Create the model.
353   ModelPtr   textModel;
354   MetricsPtr metrics;
355   Size       layoutSize;
356
357   Vector<FontDescriptionRun> fontDescriptionRuns;
358   if(0u != data.numberOfFonts)
359   {
360     fontDescriptionRuns.Insert(fontDescriptionRuns.End(),
361                                data.fontDescriptions,
362                                data.fontDescriptions + data.numberOfFonts);
363   }
364
365   LayoutOptions options;
366   options.align = false;
367   CreateTextModel(data.text,
368                   data.textArea,
369                   fontDescriptionRuns,
370                   options,
371                   layoutSize,
372                   textModel,
373                   metrics,
374                   false,
375                   LineWrap::WORD,
376                   false,
377                   Toolkit::DevelText::EllipsisPosition::END,
378                   0.0f, // lineSpacing
379                   0.0f  // characterSpacing
380   );
381
382   LogicalModelPtr logicalModel = textModel->mLogicalModel;
383   VisualModelPtr  visualModel  = textModel->mVisualModel;
384
385   // Call the Align method.
386   Layout::Engine engine;
387   engine.SetMetrics(metrics);
388
389   float alignmentOffset = 0.f;
390   engine.Align(data.textArea,
391                data.startIndex,
392                data.numberOfCharacters,
393                data.horizontalAlignment,
394                visualModel->mLines,
395                alignmentOffset,
396                data.layoutDirection,
397                data.matchSystemLanguageDirection);
398
399   // Compare results.
400   if(data.numberOfLines != visualModel->mLines.Count())
401   {
402     std::cout << "  Different number of lines : " << visualModel->mLines.Count() << ", expected : " << data.numberOfLines << std::endl;
403     return false;
404   }
405
406   const LineRun* const linesBuffer = visualModel->mLines.Begin();
407   for(unsigned int index = 0u; index < data.numberOfLines; ++index)
408   {
409     const LineRun& line = *(linesBuffer + index);
410
411     if(line.alignmentOffset != *(data.lineOffsets + index))
412     {
413       std::cout << "  different line offset for index " << index << " : " << line.alignmentOffset << ", expected : " << *(data.lineOffsets + index) << std::endl;
414       return false;
415     }
416   }
417   return true;
418 }
419
420 } // namespace
421
422 //////////////////////////////////////////////////////////
423 //
424 // UtcDaliTextLayoutSetGetLayout
425 // UtcDaliTextLayoutSetGetTextEllipsisEnabled
426 // UtcDaliTextLayoutSetGetHorizontalAlignment
427 // UtcDaliTextLayoutSetGetVerticalAlignment
428 // UtcDaliTextLayoutSetGetCursorWidth
429 // UtcDaliTextLayoutNoText
430 // UtcDaliTextLayoutSmallTextArea01
431 // UtcDaliTextLayoutSmallTextArea02
432 // UtcDaliTextLayoutMultilineText01
433 // UtcDaliTextLayoutMultilineText02
434 // UtcDaliTextLayoutMultilineText03
435 // UtcDaliTextLayoutMultilineText04
436 // UtcDaliTextLayoutMultilineText05
437 // UtcDaliTextLayoutMultilineText06
438 // UtcDaliTextUpdateLayout01
439 // UtcDaliTextUpdateLayout02
440 // UtcDaliTextUpdateLayout03
441 // UtcDaliTextLayoutEllipsis01
442 // UtcDaliTextLayoutEllipsis02
443 // UtcDaliTextLayoutEllipsis03
444 // UtcDaliTextLayoutEllipsis04
445 // UtcDaliTextLayoutEllipsis04
446 // UtcDaliTextReorderLayout01
447 // UtcDaliTextReorderLayout02
448 // UtcDaliTextReorderLayout03
449 // UtcDaliTextReorderLayout04
450 // UtcDaliTextAlign01
451 // UtcDaliTextAlign02
452 // UtcDaliTextAlign03
453 // UtcDaliTextAlign04
454 // UtcDaliTextAlign05
455 // UtcDaliTextAlign06
456 // UtcDaliTextAlign07
457 // UtcDaliTextAlign08
458 // UtcDaliTextAlign09
459 //
460 //////////////////////////////////////////////////////////
461
462 int UtcDaliTextLayoutSetGetLayout(void)
463 {
464   ToolkitTestApplication application;
465   tet_infoline(" UtcDaliTextLayoutSetGetLayout");
466
467   Layout::Engine engine;
468
469   DALI_TEST_CHECK(Layout::Engine::SINGLE_LINE_BOX == engine.GetLayout());
470
471   engine.SetLayout(Layout::Engine::MULTI_LINE_BOX);
472   DALI_TEST_CHECK(Layout::Engine::MULTI_LINE_BOX == engine.GetLayout());
473
474   tet_result(TET_PASS);
475   END_TEST;
476 }
477
478 int UtcDaliTextLayoutSetGetCursorWidth(void)
479 {
480   ToolkitTestApplication application;
481   tet_infoline(" ");
482
483   Layout::Engine engine;
484
485   DALI_TEST_EQUALS(0, engine.GetCursorWidth(), TEST_LOCATION);
486
487   engine.SetCursorWidth(2);
488   DALI_TEST_EQUALS(2, engine.GetCursorWidth(), TEST_LOCATION);
489
490   tet_result(TET_PASS);
491   END_TEST;
492 }
493
494 int UtcDaliTextLayoutNoText(void)
495 {
496   ToolkitTestApplication application;
497   tet_infoline(" UtcDaliTextLayoutNoText");
498
499   Size           textArea(100.f, 60.f);
500   Size           layoutSize = Vector2::ZERO;
501   LayoutTextData data =
502     {
503       "No text",
504       "",
505       textArea,
506       0u,
507       NULL,
508       layoutSize,
509       0u,
510       NULL,
511       0u,
512       NULL,
513       Layout::Engine::MULTI_LINE_BOX,
514       0u,
515       0u,
516       false,
517       DevelText::EllipsisPosition::END,
518       false};
519
520   if(!LayoutTextTest(data))
521   {
522     tet_result(TET_FAIL);
523   }
524
525   tet_result(TET_PASS);
526   END_TEST;
527 }
528
529 int UtcDaliTextLayoutSmallTextArea01(void)
530 {
531   ToolkitTestApplication application;
532   tet_infoline(" UtcDaliTextLayoutSmallTextArea01");
533
534   // Won't layout the text in multi-line if the width is too small.
535
536   const std::string fontFamily("TizenSans");
537
538   // Set a known font description
539   FontDescriptionRun fontDescriptionRun;
540   fontDescriptionRun.characterRun.characterIndex     = 0u;
541   fontDescriptionRun.characterRun.numberOfCharacters = 11u;
542   fontDescriptionRun.familyLength                    = fontFamily.size();
543   fontDescriptionRun.familyName                      = new char[fontDescriptionRun.familyLength];
544   memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength);
545   fontDescriptionRun.familyDefined = true;
546   fontDescriptionRun.weightDefined = false;
547   fontDescriptionRun.widthDefined  = false;
548   fontDescriptionRun.slantDefined  = false;
549   fontDescriptionRun.sizeDefined   = false;
550
551   Vector<FontDescriptionRun> fontDescriptionRuns;
552   fontDescriptionRuns.PushBack(fontDescriptionRun);
553   Size           textArea(1.f, 1.f);
554   Size           layoutSize = Vector2::ZERO;
555   LayoutTextData data =
556     {
557       "Layout text in a small area",
558       "Hello world",
559       textArea,
560       1u,
561       fontDescriptionRuns.Begin(),
562       layoutSize,
563       0u,
564       NULL,
565       0u,
566       NULL,
567       Layout::Engine::MULTI_LINE_BOX,
568       0u,
569       11u,
570       false,
571       DevelText::EllipsisPosition::END,
572       false};
573
574   if(!LayoutTextTest(data))
575   {
576     tet_result(TET_FAIL);
577   }
578
579   tet_result(TET_PASS);
580   END_TEST;
581 }
582
583 int UtcDaliTextLayoutSmallTextArea02(void)
584 {
585   ToolkitTestApplication application;
586   tet_infoline(" UtcDaliTextLayoutSmallTextArea02");
587
588   // Will layout the text in single line as it can be scrolled.
589
590   const std::string fontFamily("TizenSans");
591
592   // Set a known font description
593   FontDescriptionRun fontDescriptionRun;
594   fontDescriptionRun.characterRun.characterIndex     = 0u;
595   fontDescriptionRun.characterRun.numberOfCharacters = 11u;
596   fontDescriptionRun.familyLength                    = fontFamily.size();
597   fontDescriptionRun.familyName                      = new char[fontDescriptionRun.familyLength];
598   memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength);
599   fontDescriptionRun.familyDefined = true;
600   fontDescriptionRun.weightDefined = false;
601   fontDescriptionRun.widthDefined  = false;
602   fontDescriptionRun.slantDefined  = false;
603   fontDescriptionRun.sizeDefined   = false;
604
605   Vector<FontDescriptionRun> fontDescriptionRuns;
606   fontDescriptionRuns.PushBack(fontDescriptionRun);
607   Size           textArea(1.f, 1.f);
608   Size           layoutSize(81.f, 20.f);
609   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};
610   struct LineRun line =
611     {
612       {0u, 11u},
613       {0u, 11u},
614       81.f,
615       15.f,
616       -5.f,
617       0.f,
618       0.f,
619       0.f,
620       false,
621       false};
622   Vector<LineRun> lines;
623   lines.PushBack(line);
624
625   LayoutTextData data =
626     {
627       "Layout text in a small area",
628       "Hello world",
629       textArea,
630       1u,
631       fontDescriptionRuns.Begin(),
632       layoutSize,
633       11u,
634       positions,
635       1u,
636       lines.Begin(),
637       Layout::Engine::SINGLE_LINE_BOX,
638       0u,
639       11u,
640       false,
641       DevelText::EllipsisPosition::END,
642       true};
643
644   if(!LayoutTextTest(data))
645   {
646     tet_result(TET_FAIL);
647   }
648
649   tet_result(TET_PASS);
650   END_TEST;
651 }
652
653 int UtcDaliTextLayoutMultilineText01(void)
654 {
655   ToolkitTestApplication application;
656   tet_infoline(" UtcDaliTextLayoutMultilineText01");
657
658   // Layout some lines of left to right text.
659
660   const std::string fontFamily("TizenSans");
661
662   // Set a known font description
663   FontDescriptionRun fontDescriptionRun1;
664   fontDescriptionRun1.characterRun.characterIndex     = 0u;
665   fontDescriptionRun1.characterRun.numberOfCharacters = 18u;
666   fontDescriptionRun1.familyLength                    = fontFamily.size();
667   fontDescriptionRun1.familyName                      = new char[fontDescriptionRun1.familyLength];
668   memcpy(fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength);
669   fontDescriptionRun1.familyDefined = true;
670   fontDescriptionRun1.weightDefined = false;
671   fontDescriptionRun1.widthDefined  = false;
672   fontDescriptionRun1.slantDefined  = false;
673   fontDescriptionRun1.sizeDefined   = false;
674
675   FontDescriptionRun fontDescriptionRun2;
676   fontDescriptionRun2.characterRun.characterIndex     = 18u;
677   fontDescriptionRun2.characterRun.numberOfCharacters = 31u;
678   fontDescriptionRun2.familyLength                    = fontFamily.size();
679   fontDescriptionRun2.familyName                      = new char[fontDescriptionRun2.familyLength];
680   memcpy(fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength);
681   fontDescriptionRun2.familyDefined = true;
682   fontDescriptionRun2.weightDefined = false;
683   fontDescriptionRun2.widthDefined  = false;
684   fontDescriptionRun2.slantDefined  = false;
685   fontDescriptionRun2.sizeDefined   = false;
686
687   Vector<FontDescriptionRun> fontDescriptionRuns;
688   fontDescriptionRuns.PushBack(fontDescriptionRun1);
689   fontDescriptionRuns.PushBack(fontDescriptionRun2);
690   Size  textArea(100.f, 300.f);
691   Size  layoutSize(98.f, 97.f);
692   float positions[] =
693     {
694       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.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -2.f, 45.f, -12.f, 0.f, -12.f, 8.f, -9.f, 18.f, -9.f, 27.f, -9.f, 38.f, -9.f, 47.f, -11.f, 53.f, -0.f, 0.f, -12.f, 11.f, -12.f, 15.f, -12.f, 26.f, -9.f, 36.f, -9.f, 42.f, -9.f, 53.f, -9.f, 62.f, -11.f, 68.f, -0.f, 0.f, -12.f, 4.f, -12.f, 9.f, -9.f, 18.f, -9.f, 28.f, -9.f, 36.f, -0.f, 41.f, -9.f, 51.f, -12.f, 57.f, -0.f, 62.f, -11.f, 68.f, -9.f, 78.f, -9.f, 87.f, -11.f, 94.f, -2.f};
695   struct LineRun line0 =
696     {
697       {0u, 12u},
698       {0u, 12u},
699       81.f,
700       15.f,
701       -5.f,
702       4.f,
703       0.f,
704       0.f,
705       false,
706       false};
707   struct LineRun line1 =
708     {
709       {12u, 6u},
710       {12u, 6u},
711       44.f,
712       15.f,
713       -5.f,
714       0.f,
715       0.f,
716       0.f,
717       false,
718       false};
719   struct LineRun line2 =
720     {
721       {18u, 7u},
722       {18u, 7u},
723       54.f,
724       15.f,
725       -4.f,
726       6.f,
727       0.f,
728       0.f,
729       false,
730       false};
731   struct LineRun line3 =
732     {
733       {25u, 9u},
734       {25u, 10u},
735       68.f,
736       15.f,
737       -4.f,
738       6.f,
739       0.f,
740       0.f,
741       false,
742       false};
743   struct LineRun line4 =
744     {
745       {34u, 14u},
746       {35u, 14u},
747       98.f,
748       15.f,
749       -4.f,
750       0.f,
751       0.f,
752       0.f,
753       false,
754       false};
755   Vector<LineRun> lines;
756   lines.PushBack(line0);
757   lines.PushBack(line1);
758   lines.PushBack(line2);
759   lines.PushBack(line3);
760   lines.PushBack(line4);
761
762   LayoutTextData data =
763     {
764       "Layout simple multi-line text",
765       "Hello world demo.\n"
766       "Layout different lines of text.",
767       textArea,
768       1u,
769       fontDescriptionRuns.Begin(),
770       layoutSize,
771       48u,
772       positions,
773       5u,
774       lines.Begin(),
775       Layout::Engine::MULTI_LINE_BOX,
776       0u,
777       48u,
778       false,
779       DevelText::EllipsisPosition::END,
780       true};
781
782   if(!LayoutTextTest(data))
783   {
784     tet_result(TET_FAIL);
785   }
786
787   tet_result(TET_PASS);
788   END_TEST;
789 }
790
791 int UtcDaliTextLayoutMultilineText02(void)
792 {
793   ToolkitTestApplication application;
794   tet_infoline(" UtcDaliTextLayoutMultilineText02");
795
796   // Layout some lines of bidirectional text.
797
798   const std::string fontFamily1("TizenSans");
799
800   // Set a known font description
801   FontDescriptionRun fontDescriptionRun1;
802   fontDescriptionRun1.characterRun.characterIndex     = 0u;
803   fontDescriptionRun1.characterRun.numberOfCharacters = 17u;
804   fontDescriptionRun1.familyLength                    = fontFamily1.size();
805   fontDescriptionRun1.familyName                      = new char[fontDescriptionRun1.familyLength];
806   memcpy(fontDescriptionRun1.familyName, fontFamily1.c_str(), fontDescriptionRun1.familyLength);
807   fontDescriptionRun1.familyDefined = true;
808   fontDescriptionRun1.weightDefined = false;
809   fontDescriptionRun1.widthDefined  = false;
810   fontDescriptionRun1.slantDefined  = false;
811   fontDescriptionRun1.sizeDefined   = false;
812
813   const std::string fontFamily2("TizenSansHebrew");
814
815   // Set a known font description
816   FontDescriptionRun fontDescriptionRun2;
817   fontDescriptionRun2.characterRun.characterIndex     = 17u;
818   fontDescriptionRun2.characterRun.numberOfCharacters = 9u;
819   fontDescriptionRun2.familyLength                    = fontFamily2.size();
820   fontDescriptionRun2.familyName                      = new char[fontDescriptionRun2.familyLength];
821   memcpy(fontDescriptionRun2.familyName, fontFamily2.c_str(), fontDescriptionRun2.familyLength);
822   fontDescriptionRun2.familyDefined = true;
823   fontDescriptionRun2.weightDefined = false;
824   fontDescriptionRun2.widthDefined  = false;
825   fontDescriptionRun2.slantDefined  = false;
826   fontDescriptionRun2.sizeDefined   = false;
827
828   const std::string fontFamily3("TizenSans");
829
830   // Set a known font description
831   FontDescriptionRun fontDescriptionRun3;
832   fontDescriptionRun3.characterRun.characterIndex     = 26u;
833   fontDescriptionRun3.characterRun.numberOfCharacters = 2u;
834   fontDescriptionRun3.familyLength                    = fontFamily3.size();
835   fontDescriptionRun3.familyName                      = new char[fontDescriptionRun3.familyLength];
836   memcpy(fontDescriptionRun3.familyName, fontFamily3.c_str(), fontDescriptionRun3.familyLength);
837   fontDescriptionRun3.familyDefined = true;
838   fontDescriptionRun3.weightDefined = false;
839   fontDescriptionRun3.widthDefined  = false;
840   fontDescriptionRun3.slantDefined  = false;
841   fontDescriptionRun3.sizeDefined   = false;
842
843   const std::string fontFamily4("TizenSansHebrew");
844
845   // Set a known font description
846   FontDescriptionRun fontDescriptionRun4;
847   fontDescriptionRun4.characterRun.characterIndex     = 28u;
848   fontDescriptionRun4.characterRun.numberOfCharacters = 10u;
849   fontDescriptionRun4.familyLength                    = fontFamily4.size();
850   fontDescriptionRun4.familyName                      = new char[fontDescriptionRun4.familyLength];
851   memcpy(fontDescriptionRun4.familyName, fontFamily4.c_str(), fontDescriptionRun4.familyLength);
852   fontDescriptionRun4.familyDefined = true;
853   fontDescriptionRun4.weightDefined = false;
854   fontDescriptionRun4.widthDefined  = false;
855   fontDescriptionRun4.slantDefined  = false;
856   fontDescriptionRun4.sizeDefined   = false;
857
858   const std::string fontFamily5("TizenSans");
859
860   // Set a known font description
861   FontDescriptionRun fontDescriptionRun5;
862   fontDescriptionRun5.characterRun.characterIndex     = 38u;
863   fontDescriptionRun5.characterRun.numberOfCharacters = 17u;
864   fontDescriptionRun5.familyLength                    = fontFamily5.size();
865   fontDescriptionRun5.familyName                      = new char[fontDescriptionRun5.familyLength];
866   memcpy(fontDescriptionRun5.familyName, fontFamily5.c_str(), fontDescriptionRun5.familyLength);
867   fontDescriptionRun5.familyDefined = true;
868   fontDescriptionRun5.weightDefined = false;
869   fontDescriptionRun5.widthDefined  = false;
870   fontDescriptionRun5.slantDefined  = false;
871   fontDescriptionRun5.sizeDefined   = false;
872
873   Vector<FontDescriptionRun> fontDescriptionRuns;
874   fontDescriptionRuns.PushBack(fontDescriptionRun1);
875   fontDescriptionRuns.PushBack(fontDescriptionRun2);
876   fontDescriptionRuns.PushBack(fontDescriptionRun3);
877   fontDescriptionRuns.PushBack(fontDescriptionRun4);
878   fontDescriptionRuns.PushBack(fontDescriptionRun5);
879   Size  textArea(100.f, 300.f);
880   Size  layoutSize(81.f, 120.f);
881   float positions[] =
882     {
883       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
884       0.f,
885       -13.f,
886       9.f,
887       -9.f,
888       19.f,
889       -9.f,
890       32.f,
891       -9.f,
892       41.f,
893       -0.f,
894       68.f,
895       -10.f,
896       59.f,
897       -13.f,
898       54.f,
899       -10.f,
900       45.f,
901       -10.f,
902       79.f,
903       -0.f, // 12 .. 21
904       23.f,
905       -10.f,
906       19.f,
907       -10.f,
908       10.f,
909       -13.f,
910       0.f,
911       -10.f,
912       32.f,
913       -2.f,
914       36.f,
915       -12.f, // 22 .. 27
916       63.f,
917       -10.f,
918       54.f,
919       -13.f,
920       50.f,
921       -10.f,
922       41.f,
923       -10.f,
924       36.f,
925       -0.f,
926       27.f,
927       -10.f,
928       23.f,
929       -10.f,
930       14.f,
931       -13.f,
932       4.f,
933       -10.f,
934       0.f,
935       -0.f, // 28 .. 37
936       4.f,
937       -13.f,
938       12.f,
939       -9.f,
940       22.f,
941       -13.f,
942       26.f,
943       -13.f,
944       29.f,
945       -9.f,
946       38.f,
947       -0.f,
948       42.f,
949       -9.f,
950       54.f,
951       -9.f,
952       64.f,
953       -9.f,
954       70.f,
955       -13.f,
956       73.f,
957       -13.f,
958       0.f,
959       -0.f, // 38 .. 49
960       4.f,
961       -13.f,
962       13.f,
963       -9.f,
964       23.f,
965       -9.f,
966       36.f,
967       -9.f,
968       0.f,
969       -2.f, // 50 .. 54
970     };
971   struct LineRun line0 =
972     {
973       {0u, 12u},
974       {0u, 12u},
975       81.f,
976       15.f,
977       -5.f,
978       4.f,
979       0.f,
980       0.f,
981       false,
982       false};
983   struct LineRun line1 =
984     {
985       {12u, 10u},
986       {12u, 10u},
987       79.f,
988       15.f,
989       -5.f,
990       5.f,
991       0.f,
992       0.f,
993       false,
994       false};
995   struct LineRun line2 =
996     {
997       {22u, 6u},
998       {22u, 6u},
999       35.f,
1000       15.f,
1001       -5.f,
1002       0.f,
1003       0.f,
1004       0.f,
1005       false,
1006       false};
1007   struct LineRun line3 =
1008     {
1009       {28u, 10u},
1010       {28u, 10u},
1011       70.f,
1012       15.f,
1013       -5.f,
1014       5.f,
1015       0.f,
1016       0.f,
1017       false,
1018       false};
1019   struct LineRun line4 =
1020     {
1021       {38u, 12u},
1022       {38u, 12u},
1023       79.f,
1024       15.f,
1025       -5.f,
1026       4.f,
1027       0.f,
1028       0.f,
1029       false,
1030       false};
1031   struct LineRun line5 =
1032     {
1033       {50u, 5u},
1034       {50u, 5u},
1035       45.f,
1036       15.f,
1037       -5.f,
1038       0.f,
1039       0.f,
1040       0.f,
1041       false,
1042       false};
1043   Vector<LineRun> lines;
1044   lines.PushBack(line0);
1045   lines.PushBack(line1);
1046   lines.PushBack(line2);
1047   lines.PushBack(line3);
1048   lines.PushBack(line4);
1049   lines.PushBack(line5);
1050
1051   LayoutTextData data =
1052     {
1053       "Layout bidirectional text.",
1054       "Hello world demo שלום עולם.\n"
1055       "שלום עולם hello world demo.",
1056       textArea,
1057       5u,
1058       fontDescriptionRuns.Begin(),
1059       layoutSize,
1060       55u,
1061       positions,
1062       6u,
1063       lines.Begin(),
1064       Layout::Engine::MULTI_LINE_BOX,
1065       0u,
1066       55u,
1067       false,
1068       DevelText::EllipsisPosition::END,
1069       true};
1070
1071   if(!LayoutTextTest(data))
1072   {
1073     tet_result(TET_FAIL);
1074   }
1075
1076   tet_result(TET_PASS);
1077   END_TEST;
1078 }
1079
1080 int UtcDaliTextLayoutMultilineText03(void)
1081 {
1082   ToolkitTestApplication application;
1083   tet_infoline(" UtcDaliTextLayoutMultilineText03");
1084
1085   // Layout a long word which doesn't fit in the width of the text area.
1086
1087   const std::string fontFamily("TizenSans");
1088
1089   // Set a known font description
1090   FontDescriptionRun fontDescriptionRun;
1091   fontDescriptionRun.characterRun.characterIndex     = 0u;
1092   fontDescriptionRun.characterRun.numberOfCharacters = 29u;
1093   fontDescriptionRun.familyLength                    = fontFamily.size();
1094   fontDescriptionRun.familyName                      = new char[fontDescriptionRun.familyLength];
1095   memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength);
1096   fontDescriptionRun.familyDefined = true;
1097   fontDescriptionRun.weightDefined = false;
1098   fontDescriptionRun.widthDefined  = false;
1099   fontDescriptionRun.slantDefined  = false;
1100   fontDescriptionRun.sizeDefined   = false;
1101
1102   Vector<FontDescriptionRun> fontDescriptionRuns;
1103   fontDescriptionRuns.PushBack(fontDescriptionRun);
1104   Size  textArea(100.f, 300.f);
1105   Size  layoutSize(98.f, 60.f);
1106   float positions[] =
1107     {
1108       0.f,
1109       -12.f,
1110       10.f,
1111       -9.f,
1112       20.f,
1113       -13.f,
1114       24.f,
1115       -13.f,
1116       27.f,
1117       -9.f,
1118       36.f,
1119       -9.f,
1120       48.f,
1121       -9.f,
1122       58.f,
1123       -9.f,
1124       65.f,
1125       -13.f,
1126       68.f,
1127       -13.f,
1128       77.f,
1129       -13.f,
1130       86.f,
1131       -9.f,
1132       0.f,
1133       -9.f,
1134       13.f,
1135       -9.f,
1136       23.f,
1137       -13.f,
1138       31.f,
1139       -9.f,
1140       41.f,
1141       -13.f,
1142       45.f,
1143       -13.f,
1144       48.f,
1145       -9.f,
1146       57.f,
1147       -9.f,
1148       69.f,
1149       -9.f,
1150       79.f,
1151       -9.f,
1152       85.f,
1153       -13.f,
1154       88.f,
1155       -13.f,
1156       0.f,
1157       -13.f,
1158       9.f,
1159       -9.f,
1160       19.f,
1161       -9.f,
1162       32.f,
1163       -9.f,
1164       41.f,
1165       -2.f,
1166     };
1167   struct LineRun line0 =
1168     {
1169       {0u, 12u},
1170       {0u, 12u},
1171       95.f,
1172       15.f,
1173       -5.f,
1174       0.f,
1175       0.f,
1176       0.f,
1177       false,
1178       false};
1179   struct LineRun line1 =
1180     {
1181       {12u, 12u},
1182       {12u, 12u},
1183       98.f,
1184       15.f,
1185       -5.f,
1186       0.f,
1187       0.f,
1188       0.f,
1189       false,
1190       false};
1191   struct LineRun line2 =
1192     {
1193       {24u, 5u},
1194       {24u, 5u},
1195       44.f,
1196       15.f,
1197       -5.f,
1198       0.f,
1199       0.f,
1200       0.f,
1201       false,
1202       false};
1203   Vector<LineRun> lines;
1204   lines.PushBack(line0);
1205   lines.PushBack(line1);
1206   lines.PushBack(line2);
1207
1208   LayoutTextData data =
1209     {
1210       "Layout a long word which doesn't fit in the width of the text area.",
1211       "Helloworlddemohelloworlddemo.",
1212       textArea,
1213       1u,
1214       fontDescriptionRuns.Begin(),
1215       layoutSize,
1216       29u,
1217       positions,
1218       3u,
1219       lines.Begin(),
1220       Layout::Engine::MULTI_LINE_BOX,
1221       0u,
1222       29u,
1223       false,
1224       DevelText::EllipsisPosition::END,
1225       true};
1226
1227   if(!LayoutTextTest(data))
1228   {
1229     tet_result(TET_FAIL);
1230   }
1231
1232   tet_result(TET_PASS);
1233   END_TEST;
1234 }
1235
1236 int UtcDaliTextLayoutMultilineText04(void)
1237 {
1238   ToolkitTestApplication application;
1239   tet_infoline(" UtcDaliTextLayoutMultilineText04");
1240
1241   // Layout simple text ending with a \n. It has to add a void line at the end.
1242
1243   const std::string fontFamily("TizenSans");
1244
1245   // Set a known font description
1246   FontDescriptionRun fontDescriptionRun;
1247   fontDescriptionRun.characterRun.characterIndex     = 0u;
1248   fontDescriptionRun.characterRun.numberOfCharacters = 13u;
1249   fontDescriptionRun.familyLength                    = fontFamily.size();
1250   fontDescriptionRun.familyName                      = new char[fontDescriptionRun.familyLength];
1251   memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength);
1252   fontDescriptionRun.familyDefined = true;
1253   fontDescriptionRun.weightDefined = false;
1254   fontDescriptionRun.widthDefined  = false;
1255   fontDescriptionRun.slantDefined  = false;
1256   fontDescriptionRun.sizeDefined   = false;
1257
1258   Vector<FontDescriptionRun> fontDescriptionRuns;
1259   fontDescriptionRuns.PushBack(fontDescriptionRun);
1260   Size  textArea(100.f, 300.f);
1261   Size  layoutSize(84.f, 40.f);
1262   float positions[] =
1263     {
1264       0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -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};
1265   struct LineRun line0 =
1266     {
1267       {0u, 13u},
1268       {0u, 13u},
1269       84.f,
1270       15.f,
1271       -5.f,
1272       0.f,
1273       0.f,
1274       false,
1275       false};
1276   struct LineRun line1 =
1277     {
1278       {13u, 0u},
1279       {13u, 0u},
1280       0.f,
1281       15.f,
1282       -5.f,
1283       0.f,
1284       0.f,
1285       0.f,
1286       false,
1287       false};
1288   Vector<LineRun> lines;
1289   lines.PushBack(line0);
1290   lines.PushBack(line1);
1291
1292   LayoutTextData data =
1293     {
1294       "Layout simple text ending with a \n.",
1295       "Hello world.\n",
1296       textArea,
1297       1u,
1298       fontDescriptionRuns.Begin(),
1299       layoutSize,
1300       13u,
1301       positions,
1302       2u,
1303       lines.Begin(),
1304       Layout::Engine::MULTI_LINE_BOX,
1305       0u,
1306       13u,
1307       false,
1308       DevelText::EllipsisPosition::END,
1309       true};
1310
1311   if(!LayoutTextTest(data))
1312   {
1313     tet_result(TET_FAIL);
1314   }
1315
1316   tet_result(TET_PASS);
1317   END_TEST;
1318 }
1319
1320 int UtcDaliTextLayoutMultilineText05(void)
1321 {
1322   ToolkitTestApplication application;
1323   tet_infoline(" UtcDaliTextLayoutMultilineText05");
1324
1325   // Layout simple text with one character with a different font size.
1326
1327   const std::string fontFamily("TizenSans");
1328
1329   // Set a known font description
1330   FontDescriptionRun fontDescriptionRun1;
1331   fontDescriptionRun1.characterRun.characterIndex     = 0u;
1332   fontDescriptionRun1.characterRun.numberOfCharacters = 6u;
1333   fontDescriptionRun1.familyLength                    = fontFamily.size();
1334   fontDescriptionRun1.familyName                      = new char[fontDescriptionRun1.familyLength];
1335   memcpy(fontDescriptionRun1.familyName, fontFamily.c_str(), fontDescriptionRun1.familyLength);
1336   fontDescriptionRun1.familyDefined = true;
1337   fontDescriptionRun1.weightDefined = false;
1338   fontDescriptionRun1.widthDefined  = false;
1339   fontDescriptionRun1.slantDefined  = false;
1340   fontDescriptionRun1.sizeDefined   = false;
1341
1342   FontDescriptionRun fontDescriptionRun2;
1343   fontDescriptionRun2.characterRun.characterIndex     = 6u;
1344   fontDescriptionRun2.characterRun.numberOfCharacters = 1u;
1345   fontDescriptionRun2.familyLength                    = fontFamily.size();
1346   fontDescriptionRun2.familyName                      = new char[fontDescriptionRun2.familyLength];
1347   memcpy(fontDescriptionRun2.familyName, fontFamily.c_str(), fontDescriptionRun2.familyLength);
1348   fontDescriptionRun2.size          = 1280u;
1349   fontDescriptionRun2.familyDefined = true;
1350   fontDescriptionRun2.weightDefined = false;
1351   fontDescriptionRun2.widthDefined  = false;
1352   fontDescriptionRun2.slantDefined  = false;
1353   fontDescriptionRun2.sizeDefined   = true;
1354
1355   FontDescriptionRun fontDescriptionRun3;
1356   fontDescriptionRun3.characterRun.characterIndex     = 7u;
1357   fontDescriptionRun3.characterRun.numberOfCharacters = 10u;
1358   fontDescriptionRun3.familyLength                    = fontFamily.size();
1359   fontDescriptionRun3.familyName                      = new char[fontDescriptionRun3.familyLength];
1360   memcpy(fontDescriptionRun3.familyName, fontFamily.c_str(), fontDescriptionRun3.familyLength);
1361   fontDescriptionRun3.familyDefined = true;
1362   fontDescriptionRun3.weightDefined = false;
1363   fontDescriptionRun3.widthDefined  = false;
1364   fontDescriptionRun3.slantDefined  = false;
1365   fontDescriptionRun3.sizeDefined   = false;
1366
1367   Vector<FontDescriptionRun> fontDescriptionRuns;
1368   fontDescriptionRuns.PushBack(fontDescriptionRun1);
1369   fontDescriptionRuns.PushBack(fontDescriptionRun2);
1370   fontDescriptionRuns.PushBack(fontDescriptionRun3);
1371   Size  textArea(100.f, 300.f);
1372   Size  layoutSize(89.f, 53.f);
1373   float positions[] =
1374     {
1375       0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -14.f, 60.f, -9.f, 70.f, -9.f, 76.f, -13.f, 80.f, -13.f, 89.f, -0.f, 0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -2.f};
1376   struct LineRun line0 =
1377     {
1378       {0u, 12u},
1379       {0u, 12u},
1380       89.f,
1381       25.f,
1382       -8.f,
1383       4.f,
1384       0.f,
1385       0.f,
1386       false,
1387       false};
1388   struct LineRun line1 =
1389     {
1390       {12u, 5u},
1391       {12u, 5u},
1392       44.f,
1393       15.f,
1394       -5.f,
1395       0.f,
1396       0.f,
1397       0.f,
1398       false,
1399       false};
1400   Vector<LineRun> lines;
1401   lines.PushBack(line0);
1402   lines.PushBack(line1);
1403
1404   LayoutTextData data =
1405     {
1406       "Layout simple text with one character with a different font size.",
1407       "Hello world demo.",
1408       textArea,
1409       3u,
1410       fontDescriptionRuns.Begin(),
1411       layoutSize,
1412       17u,
1413       positions,
1414       2u,
1415       lines.Begin(),
1416       Layout::Engine::MULTI_LINE_BOX,
1417       0u,
1418       17u,
1419       false,
1420       DevelText::EllipsisPosition::END,
1421       true};
1422
1423   if(!LayoutTextTest(data))
1424   {
1425     tet_result(TET_FAIL);
1426   }
1427
1428   tet_result(TET_PASS);
1429   END_TEST;
1430 }
1431
1432 int UtcDaliTextLayoutMultilineText06(void)
1433 {
1434   ToolkitTestApplication application;
1435   tet_infoline(" UtcDaliTextLayoutMultilineText06");
1436
1437   const std::string fontFamily("TizenSansHebrew");
1438
1439   // Set a known font description
1440   FontDescriptionRun fontDescriptionRun;
1441   fontDescriptionRun.characterRun.characterIndex     = 0u;
1442   fontDescriptionRun.characterRun.numberOfCharacters = 10u;
1443   fontDescriptionRun.familyLength                    = fontFamily.size();
1444   fontDescriptionRun.familyName                      = new char[fontDescriptionRun.familyLength];
1445   memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength);
1446   fontDescriptionRun.familyDefined = true;
1447   fontDescriptionRun.weightDefined = false;
1448   fontDescriptionRun.widthDefined  = false;
1449   fontDescriptionRun.slantDefined  = false;
1450   fontDescriptionRun.sizeDefined   = false;
1451
1452   Vector<FontDescriptionRun> fontDescriptionRuns;
1453   fontDescriptionRuns.PushBack(fontDescriptionRun);
1454
1455   Size  textArea(64.f, 100.f);
1456   Size  layoutSize(34.f, 40.f);
1457   float positions[] =
1458     {
1459       27.f, -13.f, 18.f, -10.f, 9.f, -10.f, 4.f, -10.f, 0.f, -0.f, 22.f, -10.f, 17.f, -10.f, 12.f, -10.f, 4.f, -10.f, 0.f, -10.f};
1460   struct LineRun line0 =
1461     {
1462       {0u, 5u},
1463       {0u, 5u},
1464       32.f,
1465       15.f,
1466       -5.f,
1467       5.f,
1468       0.f,
1469       0.f,
1470       true,
1471       false};
1472   struct LineRun line1 =
1473     {
1474       {5u, 5u},
1475       {5u, 5u},
1476       34.f,
1477       15.f,
1478       -5.f,
1479       0.f,
1480       0.f,
1481       0.f,
1482       true,
1483       false};
1484   Vector<LineRun> lines;
1485   lines.PushBack(line0);
1486   lines.PushBack(line1);
1487
1488   LayoutTextData data =
1489     {
1490       "Layout right to left text that doesn't fit in the text area after reordering.",
1491       "לכאן שנורו", // If this text is laid-out ltr the width is 64. When reordered, the length is 66. This might cause alignment issues.
1492       textArea,
1493       1u,
1494       fontDescriptionRuns.Begin(),
1495       layoutSize,
1496       10u,
1497       positions,
1498       2u,
1499       lines.Begin(),
1500       Layout::Engine::MULTI_LINE_BOX,
1501       0u,
1502       10u,
1503       false,
1504       DevelText::EllipsisPosition::END,
1505       true};
1506
1507   if(!LayoutTextTest(data))
1508   {
1509     tet_result(TET_FAIL);
1510   }
1511
1512   tet_result(TET_PASS);
1513   END_TEST;
1514 }
1515
1516 int UtcDaliTextLayoutMultilineText07(void)
1517 {
1518   ToolkitTestApplication application;
1519   tet_infoline(" UtcDaliTextLayoutMultilineText07");
1520
1521   const std::string fontFamily("TizenSansHebrew");
1522
1523   // Set a known font description
1524   FontDescriptionRun fontDescriptionRun;
1525   fontDescriptionRun.characterRun.characterIndex     = 0u;
1526   fontDescriptionRun.characterRun.numberOfCharacters = 9u;
1527   fontDescriptionRun.familyLength                    = fontFamily.size();
1528   fontDescriptionRun.familyName                      = new char[fontDescriptionRun.familyLength];
1529   memcpy(fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength);
1530   fontDescriptionRun.familyDefined = true;
1531   fontDescriptionRun.weightDefined = false;
1532   fontDescriptionRun.widthDefined  = false;
1533   fontDescriptionRun.slantDefined  = false;
1534   fontDescriptionRun.sizeDefined   = false;
1535
1536   Vector<FontDescriptionRun> fontDescriptionRuns;
1537   fontDescriptionRuns.PushBack(fontDescriptionRun);
1538
1539   Size  textArea(26.f, 100.f);
1540   Size  layoutSize(24.f, 60.f);
1541   float positions[] =
1542     {
1543       10.f, -10.f, 4.f, -10.f, 0.f, -10.f, 13.f, -10.f, 9.f, -10.f, 0.f, -13.f, 14.f, -10.f, 4.f, -10.f, 0.f, -10.f};
1544   struct LineRun line0 =
1545     {
1546       {0u, 3u},
1547       {0u, 3u},
1548       21.f,
1549       15.f,
1550       -5.f,
1551       0.f,
1552       0.f,
1553       0.f,
1554       true,
1555       false};
1556   struct LineRun line1 =
1557     {
1558       {3u, 3u},
1559       {3u, 3u},
1560       22.f,
1561       15.f,
1562       -5.f,
1563       0.f,
1564       0.f,
1565       0.f,
1566       true,
1567       false};
1568   struct LineRun line2 =
1569     {
1570       {6u, 3u},
1571       {6u, 3u},
1572       24.f,
1573       15.f,
1574       -5.f,
1575       0.f,
1576       0.f,
1577       0.f,
1578       true,
1579       false};
1580   Vector<LineRun> lines;
1581   lines.PushBack(line0);
1582   lines.PushBack(line1);
1583   lines.PushBack(line2);
1584
1585   LayoutTextData data =
1586     {
1587       "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.",
1588       "שנורולכאן", // 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.
1589       textArea,
1590       1u,
1591       fontDescriptionRuns.Begin(),
1592       layoutSize,
1593       9u,
1594       positions,
1595       3u,
1596       lines.Begin(),
1597       Layout::Engine::MULTI_LINE_BOX,
1598       0u,
1599       9u,
1600       false,
1601       DevelText::EllipsisPosition::END,
1602       true};
1603
1604   if(!LayoutTextTest(data))
1605   {
1606     tet_result(TET_FAIL);
1607   }
1608
1609   tet_result(TET_PASS);
1610   END_TEST;
1611 }
1612
1613 int UtcDaliTextUpdateLayout01(void)
1614 {
1615   ToolkitTestApplication application;
1616   tet_infoline(" UtcDaliTextUpdateLayout01");
1617
1618   // Layout some lines of bidirectional text. Update the paragraphs at the beginning.
1619
1620   const std::string fontLatin("TizenSans");
1621   const std::string fontHebrew("TizenSansHebrew");
1622   const std::string fontArabic("TizenSansArabic");
1623
1624   // Set a known font description
1625   FontDescriptionRun fontDescriptionRun01;
1626   fontDescriptionRun01.characterRun.characterIndex     = 0u;
1627   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
1628   fontDescriptionRun01.familyLength                    = fontLatin.size();
1629   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
1630   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
1631   fontDescriptionRun01.familyDefined = true;
1632   fontDescriptionRun01.weightDefined = false;
1633   fontDescriptionRun01.widthDefined  = false;
1634   fontDescriptionRun01.slantDefined  = false;
1635   fontDescriptionRun01.sizeDefined   = false;
1636
1637   // Set a known font description
1638   FontDescriptionRun fontDescriptionRun02;
1639   fontDescriptionRun02.characterRun.characterIndex     = 17u;
1640   fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
1641   fontDescriptionRun02.familyLength                    = fontHebrew.size();
1642   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
1643   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
1644   fontDescriptionRun02.familyDefined = true;
1645   fontDescriptionRun02.weightDefined = false;
1646   fontDescriptionRun02.widthDefined  = false;
1647   fontDescriptionRun02.slantDefined  = false;
1648   fontDescriptionRun02.sizeDefined   = false;
1649
1650   // Set a known font description
1651   FontDescriptionRun fontDescriptionRun03;
1652   fontDescriptionRun03.characterRun.characterIndex     = 26u;
1653   fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
1654   fontDescriptionRun03.familyLength                    = fontLatin.size();
1655   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
1656   memcpy(fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength);
1657   fontDescriptionRun03.familyDefined = true;
1658   fontDescriptionRun03.weightDefined = false;
1659   fontDescriptionRun03.widthDefined  = false;
1660   fontDescriptionRun03.slantDefined  = false;
1661   fontDescriptionRun03.sizeDefined   = false;
1662
1663   // Set a known font description
1664   FontDescriptionRun fontDescriptionRun04;
1665   fontDescriptionRun04.characterRun.characterIndex     = 28u;
1666   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
1667   fontDescriptionRun04.familyLength                    = fontArabic.size();
1668   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
1669   memcpy(fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength);
1670   fontDescriptionRun04.familyDefined = true;
1671   fontDescriptionRun04.weightDefined = false;
1672   fontDescriptionRun04.widthDefined  = false;
1673   fontDescriptionRun04.slantDefined  = false;
1674   fontDescriptionRun04.sizeDefined   = false;
1675
1676   // Set a known font description
1677   FontDescriptionRun fontDescriptionRun05;
1678   fontDescriptionRun05.characterRun.characterIndex     = 42u;
1679   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
1680   fontDescriptionRun05.familyLength                    = fontLatin.size();
1681   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
1682   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
1683   fontDescriptionRun05.familyDefined = true;
1684   fontDescriptionRun05.weightDefined = false;
1685   fontDescriptionRun05.widthDefined  = false;
1686   fontDescriptionRun05.slantDefined  = false;
1687   fontDescriptionRun05.sizeDefined   = false;
1688
1689   // Set a known font description
1690   FontDescriptionRun fontDescriptionRun06;
1691   fontDescriptionRun06.characterRun.characterIndex     = 54u;
1692   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
1693   fontDescriptionRun06.familyLength                    = fontHebrew.size();
1694   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
1695   memcpy(fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength);
1696   fontDescriptionRun06.familyDefined = true;
1697   fontDescriptionRun06.weightDefined = false;
1698   fontDescriptionRun06.widthDefined  = false;
1699   fontDescriptionRun06.slantDefined  = false;
1700   fontDescriptionRun06.sizeDefined   = false;
1701
1702   // Set a known font description
1703   FontDescriptionRun fontDescriptionRun07;
1704   fontDescriptionRun07.characterRun.characterIndex     = 64u;
1705   fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
1706   fontDescriptionRun07.familyLength                    = fontHebrew.size();
1707   fontDescriptionRun07.familyName                      = new char[fontDescriptionRun07.familyLength];
1708   memcpy(fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength);
1709   fontDescriptionRun07.familyDefined = true;
1710   fontDescriptionRun07.weightDefined = false;
1711   fontDescriptionRun07.widthDefined  = false;
1712   fontDescriptionRun07.slantDefined  = false;
1713   fontDescriptionRun07.sizeDefined   = false;
1714
1715   // Set a known font description
1716   FontDescriptionRun fontDescriptionRun08;
1717   fontDescriptionRun08.characterRun.characterIndex     = 74u;
1718   fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
1719   fontDescriptionRun08.familyLength                    = fontLatin.size();
1720   fontDescriptionRun08.familyName                      = new char[fontDescriptionRun08.familyLength];
1721   memcpy(fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength);
1722   fontDescriptionRun08.familyDefined = true;
1723   fontDescriptionRun08.weightDefined = false;
1724   fontDescriptionRun08.widthDefined  = false;
1725   fontDescriptionRun08.slantDefined  = false;
1726   fontDescriptionRun08.sizeDefined   = false;
1727
1728   // Set a known font description
1729   FontDescriptionRun fontDescriptionRun09;
1730   fontDescriptionRun09.characterRun.characterIndex     = 92u;
1731   fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
1732   fontDescriptionRun09.familyLength                    = fontLatin.size();
1733   fontDescriptionRun09.familyName                      = new char[fontDescriptionRun09.familyLength];
1734   memcpy(fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength);
1735   fontDescriptionRun09.familyDefined = true;
1736   fontDescriptionRun09.weightDefined = false;
1737   fontDescriptionRun09.widthDefined  = false;
1738   fontDescriptionRun09.slantDefined  = false;
1739   fontDescriptionRun09.sizeDefined   = false;
1740
1741   // Set a known font description
1742   FontDescriptionRun fontDescriptionRun10;
1743   fontDescriptionRun10.characterRun.characterIndex     = 104u;
1744   fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
1745   fontDescriptionRun10.familyLength                    = fontArabic.size();
1746   fontDescriptionRun10.familyName                      = new char[fontDescriptionRun10.familyLength];
1747   memcpy(fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength);
1748   fontDescriptionRun10.familyDefined = true;
1749   fontDescriptionRun10.weightDefined = false;
1750   fontDescriptionRun10.widthDefined  = false;
1751   fontDescriptionRun10.slantDefined  = false;
1752   fontDescriptionRun10.sizeDefined   = false;
1753
1754   // Set a known font description
1755   FontDescriptionRun fontDescriptionRun11;
1756   fontDescriptionRun11.characterRun.characterIndex     = 118u;
1757   fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
1758   fontDescriptionRun11.familyLength                    = fontHebrew.size();
1759   fontDescriptionRun11.familyName                      = new char[fontDescriptionRun11.familyLength];
1760   memcpy(fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength);
1761   fontDescriptionRun11.familyDefined = true;
1762   fontDescriptionRun11.weightDefined = false;
1763   fontDescriptionRun11.widthDefined  = false;
1764   fontDescriptionRun11.slantDefined  = false;
1765   fontDescriptionRun11.sizeDefined   = false;
1766
1767   // Set a known font description
1768   FontDescriptionRun fontDescriptionRun12;
1769   fontDescriptionRun12.characterRun.characterIndex     = 128u;
1770   fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
1771   fontDescriptionRun12.familyLength                    = fontLatin.size();
1772   fontDescriptionRun12.familyName                      = new char[fontDescriptionRun12.familyLength];
1773   memcpy(fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength);
1774   fontDescriptionRun12.familyDefined = true;
1775   fontDescriptionRun12.weightDefined = false;
1776   fontDescriptionRun12.widthDefined  = false;
1777   fontDescriptionRun12.slantDefined  = false;
1778   fontDescriptionRun12.sizeDefined   = false;
1779
1780   // Set a known font description
1781   FontDescriptionRun fontDescriptionRun13;
1782   fontDescriptionRun13.characterRun.characterIndex     = 145u;
1783   fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
1784   fontDescriptionRun13.familyLength                    = fontHebrew.size();
1785   fontDescriptionRun13.familyName                      = new char[fontDescriptionRun13.familyLength];
1786   memcpy(fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength);
1787   fontDescriptionRun13.familyDefined = true;
1788   fontDescriptionRun13.weightDefined = false;
1789   fontDescriptionRun13.widthDefined  = false;
1790   fontDescriptionRun13.slantDefined  = false;
1791   fontDescriptionRun13.sizeDefined   = false;
1792
1793   // Set a known font description
1794   FontDescriptionRun fontDescriptionRun14;
1795   fontDescriptionRun14.characterRun.characterIndex     = 154u;
1796   fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
1797   fontDescriptionRun14.familyLength                    = fontLatin.size();
1798   fontDescriptionRun14.familyName                      = new char[fontDescriptionRun14.familyLength];
1799   memcpy(fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength);
1800   fontDescriptionRun14.familyDefined = true;
1801   fontDescriptionRun14.weightDefined = false;
1802   fontDescriptionRun14.widthDefined  = false;
1803   fontDescriptionRun14.slantDefined  = false;
1804   fontDescriptionRun14.sizeDefined   = false;
1805
1806   // Set a known font description
1807   FontDescriptionRun fontDescriptionRun15;
1808   fontDescriptionRun15.characterRun.characterIndex     = 156u;
1809   fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
1810   fontDescriptionRun15.familyLength                    = fontHebrew.size();
1811   fontDescriptionRun15.familyName                      = new char[fontDescriptionRun15.familyLength];
1812   memcpy(fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength);
1813   fontDescriptionRun15.familyDefined = true;
1814   fontDescriptionRun15.weightDefined = false;
1815   fontDescriptionRun15.widthDefined  = false;
1816   fontDescriptionRun15.slantDefined  = false;
1817   fontDescriptionRun15.sizeDefined   = false;
1818
1819   // Set a known font description
1820   FontDescriptionRun fontDescriptionRun16;
1821   fontDescriptionRun16.characterRun.characterIndex     = 166u;
1822   fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
1823   fontDescriptionRun16.familyLength                    = fontLatin.size();
1824   fontDescriptionRun16.familyName                      = new char[fontDescriptionRun16.familyLength];
1825   memcpy(fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength);
1826   fontDescriptionRun16.familyDefined = true;
1827   fontDescriptionRun16.weightDefined = false;
1828   fontDescriptionRun16.widthDefined  = false;
1829   fontDescriptionRun16.slantDefined  = false;
1830   fontDescriptionRun16.sizeDefined   = false;
1831
1832   // Set a known font description
1833   FontDescriptionRun fontDescriptionRun17;
1834   fontDescriptionRun17.characterRun.characterIndex     = 178u;
1835   fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
1836   fontDescriptionRun17.familyLength                    = fontArabic.size();
1837   fontDescriptionRun17.familyName                      = new char[fontDescriptionRun17.familyLength];
1838   memcpy(fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength);
1839   fontDescriptionRun17.familyDefined = true;
1840   fontDescriptionRun17.weightDefined = false;
1841   fontDescriptionRun17.widthDefined  = false;
1842   fontDescriptionRun17.slantDefined  = false;
1843   fontDescriptionRun17.sizeDefined   = false;
1844
1845   Vector<FontDescriptionRun> fontDescriptionRuns;
1846   fontDescriptionRuns.PushBack(fontDescriptionRun01);
1847   fontDescriptionRuns.PushBack(fontDescriptionRun02);
1848   fontDescriptionRuns.PushBack(fontDescriptionRun03);
1849   fontDescriptionRuns.PushBack(fontDescriptionRun04);
1850   fontDescriptionRuns.PushBack(fontDescriptionRun05);
1851   fontDescriptionRuns.PushBack(fontDescriptionRun06);
1852   fontDescriptionRuns.PushBack(fontDescriptionRun07);
1853   fontDescriptionRuns.PushBack(fontDescriptionRun08);
1854   fontDescriptionRuns.PushBack(fontDescriptionRun09);
1855   fontDescriptionRuns.PushBack(fontDescriptionRun10);
1856   fontDescriptionRuns.PushBack(fontDescriptionRun11);
1857   fontDescriptionRuns.PushBack(fontDescriptionRun12);
1858   fontDescriptionRuns.PushBack(fontDescriptionRun13);
1859   fontDescriptionRuns.PushBack(fontDescriptionRun14);
1860   fontDescriptionRuns.PushBack(fontDescriptionRun15);
1861   fontDescriptionRuns.PushBack(fontDescriptionRun16);
1862   fontDescriptionRuns.PushBack(fontDescriptionRun17);
1863   Size  textArea(100.f, 300.f);
1864   Size  layoutSize(100.f, 380.f);
1865   float positions[] =
1866     {
1867       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
1868       0.f,
1869       -13.f,
1870       9.f,
1871       -9.f,
1872       19.f,
1873       -9.f,
1874       32.f,
1875       -9.f,
1876       41.f,
1877       -0.f,
1878       68.f,
1879       -10.f,
1880       59.f,
1881       -13.f,
1882       54.f,
1883       -10.f,
1884       45.f,
1885       -10.f,
1886       79.f,
1887       -0.f, //  12 ..  21
1888       23.f,
1889       -10.f,
1890       19.f,
1891       -10.f,
1892       10.f,
1893       -13.f,
1894       0.f,
1895       -10.f,
1896       32.f,
1897       -2.f,
1898       36.f,
1899       -12.f, //  22 ..  27
1900       58.f,
1901       -8.f,
1902       52.f,
1903       -6.f,
1904       45.f,
1905       -8.f,
1906       41.f,
1907       -7.f,
1908       39.f,
1909       -11.f,
1910       34.f,
1911       -0.f,
1912       30.f,
1913       -7.f,
1914       28.f,
1915       -11.f,
1916       23.f,
1917       -11.f,
1918       16.f,
1919       -8.f,
1920       15.f,
1921       -11.f,
1922       9.f,
1923       -11.f,
1924       4.f,
1925       -8.f,
1926       0.f,
1927       -0.f,
1928       4.f,
1929       -13.f,
1930       12.f,
1931       -9.f,
1932       22.f,
1933       -13.f,
1934       26.f,
1935       -13.f,
1936       29.f,
1937       -9.f,
1938       38.f,
1939       -0.f, //  28 ..  47
1940       42.f,
1941       -9.f,
1942       54.f,
1943       -9.f,
1944       64.f,
1945       -9.f,
1946       70.f,
1947       -13.f,
1948       73.f,
1949       -13.f,
1950       0.f,
1951       -0.f,
1952       59.f,
1953       -10.f,
1954       50.f,
1955       -13.f,
1956       46.f,
1957       -10.f,
1958       36.f,
1959       -10.f,
1960       32.f,
1961       -0.f, //  48 ..  58
1962       23.f,
1963       -10.f,
1964       19.f,
1965       -10.f,
1966       10.f,
1967       -13.f,
1968       0.f,
1969       -10.f,
1970       0.f,
1971       -0.f, //  59 ..  63
1972       63.f,
1973       -10.f,
1974       54.f,
1975       -13.f,
1976       50.f,
1977       -10.f,
1978       41.f,
1979       -10.f,
1980       36.f,
1981       -0.f,
1982       27.f,
1983       -10.f,
1984       23.f,
1985       -10.f,
1986       14.f,
1987       -13.f,
1988       4.f,
1989       -10.f,
1990       0.f,
1991       -0.f, //  64 ..  73
1992       4.f,
1993       -13.f,
1994       12.f,
1995       -9.f,
1996       22.f,
1997       -13.f,
1998       26.f,
1999       -13.f,
2000       29.f,
2001       -9.f,
2002       38.f,
2003       -0.f,
2004       42.f,
2005       -9.f,
2006       54.f,
2007       -9.f,
2008       64.f,
2009       -9.f,
2010       70.f,
2011       -13.f,
2012       73.f,
2013       -13.f,
2014       0.f,
2015       -0.f, //  74 ..  85
2016       4.f,
2017       -13.f,
2018       13.f,
2019       -9.f,
2020       23.f,
2021       -9.f,
2022       36.f,
2023       -9.f,
2024       0.f,
2025       -2.f,
2026       0.f,
2027       -12.f, //  86 ..  91
2028       0.f,
2029       -13.f,
2030       8.f,
2031       -9.f,
2032       18.f,
2033       -13.f,
2034       22.f,
2035       -13.f,
2036       25.f,
2037       -9.f,
2038       34.f,
2039       -0.f,
2040       38.f,
2041       -9.f,
2042       50.f,
2043       -9.f,
2044       60.f,
2045       -9.f,
2046       66.f,
2047       -13.f,
2048       69.f,
2049       -13.f,
2050       79.f,
2051       -0.f, //  92 .. 103
2052       92.f,
2053       -8.f,
2054       86.f,
2055       -6.f,
2056       79.f,
2057       -8.f,
2058       75.f,
2059       -7.f,
2060       73.f,
2061       -11.f,
2062       68.f,
2063       -0.f,
2064       64.f,
2065       -7.f,
2066       62.f,
2067       -11.f,
2068       57.f,
2069       -11.f,
2070       50.f,
2071       -8.f,
2072       49.f,
2073       -11.f,
2074       43.f,
2075       -11.f,
2076       38.f,
2077       -8.f,
2078       34.f,
2079       -0.f,
2080       23.f,
2081       -10.f,
2082       14.f,
2083       -13.f,
2084       10.f,
2085       -10.f,
2086       0.f,
2087       -10.f,
2088       99.f,
2089       -0.f, // 104 .. 122
2090       23.f,
2091       -10.f,
2092       19.f,
2093       -10.f,
2094       10.f,
2095       -13.f,
2096       0.f,
2097       -10.f,
2098       32.f,
2099       -0.f, // 123 .. 127
2100       0.f,
2101       -12.f,
2102       10.f,
2103       -9.f,
2104       20.f,
2105       -13.f,
2106       24.f,
2107       -13.f,
2108       27.f,
2109       -9.f,
2110       36.f,
2111       -0.f,
2112       40.f,
2113       -9.f,
2114       52.f,
2115       -9.f,
2116       62.f,
2117       -9.f,
2118       69.f,
2119       -13.f,
2120       72.f,
2121       -13.f,
2122       81.f,
2123       -0.f, // 128 .. 139
2124       0.f,
2125       -13.f,
2126       9.f,
2127       -9.f,
2128       19.f,
2129       -9.f,
2130       32.f,
2131       -9.f,
2132       41.f,
2133       -0.f,
2134       68.f,
2135       -10.f,
2136       59.f,
2137       -13.f,
2138       54.f,
2139       -10.f,
2140       45.f,
2141       -10.f,
2142       79.f,
2143       -0.f, // 140 .. 149
2144       23.f,
2145       -10.f,
2146       19.f,
2147       -10.f,
2148       10.f,
2149       -13.f,
2150       0.f,
2151       -10.f,
2152       32.f,
2153       -2.f,
2154       36.f,
2155       -12.f, // 150 .. 155
2156       63.f,
2157       -10.f,
2158       54.f,
2159       -13.f,
2160       50.f,
2161       -10.f,
2162       41.f,
2163       -10.f,
2164       36.f,
2165       -0.f,
2166       27.f,
2167       -10.f,
2168       23.f,
2169       -10.f,
2170       14.f,
2171       -13.f,
2172       4.f,
2173       -10.f,
2174       0.f,
2175       -0.f, // 156 .. 165
2176       4.f,
2177       -13.f,
2178       12.f,
2179       -9.f,
2180       22.f,
2181       -13.f,
2182       26.f,
2183       -13.f,
2184       29.f,
2185       -9.f,
2186       38.f,
2187       -0.f,
2188       42.f,
2189       -9.f,
2190       54.f,
2191       -9.f,
2192       64.f,
2193       -9.f,
2194       70.f,
2195       -13.f,
2196       73.f,
2197       -13.f,
2198       0.f,
2199       -0.f, // 166 .. 177
2200       54.f,
2201       -8.f,
2202       49.f,
2203       -6.f,
2204       41.f,
2205       -8.f,
2206       37.f,
2207       -7.f,
2208       35.f,
2209       -11.f,
2210       31.f,
2211       -0.f,
2212       26.f,
2213       -7.f,
2214       24.f,
2215       -11.f,
2216       19.f,
2217       -11.f,
2218       12.f,
2219       -8.f,
2220       11.f,
2221       -11.f,
2222       5.f,
2223       -11.f,
2224       0.f,
2225       -8.f,
2226       0.f,
2227       -0.f, // 178 .. 191
2228     };
2229
2230   struct LineRun line01 =
2231     {
2232       {0u, 12u},
2233       {0u, 12u},
2234       81.f,
2235       15.f,
2236       -5.f,
2237       4.f,
2238       0.f,
2239       0.f,
2240       false,
2241       false};
2242   struct LineRun line02 =
2243     {
2244       {12u, 10u},
2245       {12u, 10u},
2246       79.f,
2247       15.f,
2248       -5.f,
2249       5.f,
2250       0.f,
2251       0.f,
2252       false,
2253       false};
2254   struct LineRun line03 =
2255     {
2256       {22u, 6u},
2257       {22u, 6u},
2258       35.f,
2259       15.f,
2260       -5.f,
2261       0.f,
2262       0.f,
2263       0.f,
2264       false,
2265       false};
2266   struct LineRun line04 =
2267     {
2268       {28u, 14u},
2269       {28u, 14u},
2270       63.f,
2271       15.f,
2272       -5.f,
2273       4.f,
2274       0.f,
2275       0.f,
2276       true,
2277       false};
2278   struct LineRun line05 =
2279     {
2280       {42, 12u},
2281       {42, 12u},
2282       79.f,
2283       15.f,
2284       -5.f,
2285       4.f,
2286       0.f,
2287       0.f,
2288       true,
2289       false};
2290   struct LineRun line06 =
2291     {
2292       {54u, 10u},
2293       {54u, 10u},
2294       70.f,
2295       15.f,
2296       -5.f,
2297       0.f,
2298       0.f,
2299       0.f,
2300       false,
2301       false};
2302   struct LineRun line07 =
2303     {
2304       {64u, 10u},
2305       {64u, 10u},
2306       70.f,
2307       15.f,
2308       -5.f,
2309       5.f,
2310       0.f,
2311       0.f,
2312       true,
2313       false};
2314   struct LineRun line08 =
2315     {
2316       {74u, 12u},
2317       {74u, 12u},
2318       79.f,
2319       15.f,
2320       -5.f,
2321       4.f,
2322       0.f,
2323       0.f,
2324       true,
2325       false};
2326   struct LineRun line09 =
2327     {
2328       {86u, 6u},
2329       {86u, 6u},
2330       45.f,
2331       15.f,
2332       -5.f,
2333       0.f,
2334       0.f,
2335       0.f,
2336       false,
2337       false};
2338   struct LineRun line10 =
2339     {
2340       {92u, 12u},
2341       {92u, 12u},
2342       79.f,
2343       15.f,
2344       -5.f,
2345       4.f,
2346       0.f,
2347       0.f,
2348       false,
2349       false};
2350   struct LineRun line11 =
2351     {
2352       {104u, 19u},
2353       {104u, 19u},
2354       100.f,
2355       15.f,
2356       -5.f,
2357       5.f,
2358       0.f,
2359       0.f,
2360       false,
2361       false};
2362   struct LineRun line12 =
2363     {
2364       {123u, 5u},
2365       {123u, 5u},
2366       32.f,
2367       15.f,
2368       -5.f,
2369       0.f,
2370       0.f,
2371       0.f,
2372       false,
2373       false};
2374   struct LineRun line13 =
2375     {
2376       {128u, 12u},
2377       {128u, 12u},
2378       81.f,
2379       15.f,
2380       -5.f,
2381       4.f,
2382       0.f,
2383       0.f,
2384       false,
2385       false};
2386   struct LineRun line14 =
2387     {
2388       {140u, 10u},
2389       {140u, 10u},
2390       79.f,
2391       15.f,
2392       -5.f,
2393       5.f,
2394       0.f,
2395       0.f,
2396       false,
2397       false};
2398   struct LineRun line15 =
2399     {
2400       {150u, 6u},
2401       {150u, 6u},
2402       35.f,
2403       15.f,
2404       -5.f,
2405       0.f,
2406       0.f,
2407       0.f,
2408       false,
2409       false};
2410   struct LineRun line16 =
2411     {
2412       {156u, 10u},
2413       {156u, 10u},
2414       70.f,
2415       15.f,
2416       -5.f,
2417       5.f,
2418       0.f,
2419       0.f,
2420       true,
2421       false};
2422   struct LineRun line17 =
2423     {
2424       {166u, 12u},
2425       {166u, 12u},
2426       79.f,
2427       15.f,
2428       -5.f,
2429       4.f,
2430       0.f,
2431       0.f,
2432       false,
2433       false};
2434   struct LineRun line18 =
2435     {
2436       {178u, 14u},
2437       {178u, 14u},
2438       63.f,
2439       15.f,
2440       -5.f,
2441       0.f,
2442       0.f,
2443       0.f,
2444       false,
2445       false};
2446   struct LineRun line19 =
2447     {
2448       {192u, 0u},
2449       {192u, 0u},
2450       0.f,
2451       15.f,
2452       -5.f,
2453       0.f,
2454       0.f,
2455       0.f,
2456       false,
2457       false};
2458   Vector<LineRun> lines;
2459   lines.PushBack(line01);
2460   lines.PushBack(line02);
2461   lines.PushBack(line03);
2462   lines.PushBack(line04);
2463   lines.PushBack(line05);
2464   lines.PushBack(line06);
2465   lines.PushBack(line07);
2466   lines.PushBack(line08);
2467   lines.PushBack(line09);
2468   lines.PushBack(line10);
2469   lines.PushBack(line11);
2470   lines.PushBack(line12);
2471   lines.PushBack(line13);
2472   lines.PushBack(line14);
2473   lines.PushBack(line15);
2474   lines.PushBack(line16);
2475   lines.PushBack(line17);
2476   lines.PushBack(line18);
2477   lines.PushBack(line19);
2478
2479   LayoutTextData data =
2480     {
2481       "Layout bidirectional text.",
2482       "Hello world demo שלום עולם.\n"
2483       "مرحبا بالعالم hello world שלום עולם\n"
2484       "שלום עולם hello world demo.\n"
2485       "hello world مرحبا بالعالم שלום עולם\n"
2486       "Hello world demo שלום עולם.\n"
2487       "שלום עולם hello world مرحبا بالعالم\n",
2488       textArea,
2489       17u,
2490       fontDescriptionRuns.Begin(),
2491       layoutSize,
2492       192u,
2493       positions,
2494       19u,
2495       lines.Begin(),
2496       Layout::Engine::MULTI_LINE_BOX,
2497       0u,
2498       64u,
2499       false,
2500       DevelText::EllipsisPosition::END,
2501       true};
2502
2503   if(!LayoutTextTest(data))
2504   {
2505     tet_result(TET_FAIL);
2506   }
2507
2508   tet_result(TET_PASS);
2509   END_TEST;
2510 }
2511
2512 int UtcDaliTextUpdateLayout02(void)
2513 {
2514   ToolkitTestApplication application;
2515   tet_infoline(" UtcDaliTextUpdateLayout02");
2516
2517   // Layout some lines of bidirectional text. Update the paragraphs at the middle.
2518
2519   const std::string fontLatin("TizenSans");
2520   const std::string fontHebrew("TizenSansHebrew");
2521   const std::string fontArabic("TizenSansArabic");
2522
2523   // Set a known font description
2524   FontDescriptionRun fontDescriptionRun01;
2525   fontDescriptionRun01.characterRun.characterIndex     = 0u;
2526   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
2527   fontDescriptionRun01.familyLength                    = fontLatin.size();
2528   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
2529   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
2530   fontDescriptionRun01.familyDefined = true;
2531   fontDescriptionRun01.weightDefined = false;
2532   fontDescriptionRun01.widthDefined  = false;
2533   fontDescriptionRun01.slantDefined  = false;
2534   fontDescriptionRun01.sizeDefined   = false;
2535
2536   // Set a known font description
2537   FontDescriptionRun fontDescriptionRun02;
2538   fontDescriptionRun02.characterRun.characterIndex     = 17u;
2539   fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
2540   fontDescriptionRun02.familyLength                    = fontHebrew.size();
2541   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
2542   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
2543   fontDescriptionRun02.familyDefined = true;
2544   fontDescriptionRun02.weightDefined = false;
2545   fontDescriptionRun02.widthDefined  = false;
2546   fontDescriptionRun02.slantDefined  = false;
2547   fontDescriptionRun02.sizeDefined   = false;
2548
2549   // Set a known font description
2550   FontDescriptionRun fontDescriptionRun03;
2551   fontDescriptionRun03.characterRun.characterIndex     = 26u;
2552   fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
2553   fontDescriptionRun03.familyLength                    = fontLatin.size();
2554   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
2555   memcpy(fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength);
2556   fontDescriptionRun03.familyDefined = true;
2557   fontDescriptionRun03.weightDefined = false;
2558   fontDescriptionRun03.widthDefined  = false;
2559   fontDescriptionRun03.slantDefined  = false;
2560   fontDescriptionRun03.sizeDefined   = false;
2561
2562   // Set a known font description
2563   FontDescriptionRun fontDescriptionRun04;
2564   fontDescriptionRun04.characterRun.characterIndex     = 28u;
2565   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
2566   fontDescriptionRun04.familyLength                    = fontArabic.size();
2567   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
2568   memcpy(fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength);
2569   fontDescriptionRun04.familyDefined = true;
2570   fontDescriptionRun04.weightDefined = false;
2571   fontDescriptionRun04.widthDefined  = false;
2572   fontDescriptionRun04.slantDefined  = false;
2573   fontDescriptionRun04.sizeDefined   = false;
2574
2575   // Set a known font description
2576   FontDescriptionRun fontDescriptionRun05;
2577   fontDescriptionRun05.characterRun.characterIndex     = 42u;
2578   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
2579   fontDescriptionRun05.familyLength                    = fontLatin.size();
2580   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
2581   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
2582   fontDescriptionRun05.familyDefined = true;
2583   fontDescriptionRun05.weightDefined = false;
2584   fontDescriptionRun05.widthDefined  = false;
2585   fontDescriptionRun05.slantDefined  = false;
2586   fontDescriptionRun05.sizeDefined   = false;
2587
2588   // Set a known font description
2589   FontDescriptionRun fontDescriptionRun06;
2590   fontDescriptionRun06.characterRun.characterIndex     = 54u;
2591   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
2592   fontDescriptionRun06.familyLength                    = fontHebrew.size();
2593   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
2594   memcpy(fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength);
2595   fontDescriptionRun06.familyDefined = true;
2596   fontDescriptionRun06.weightDefined = false;
2597   fontDescriptionRun06.widthDefined  = false;
2598   fontDescriptionRun06.slantDefined  = false;
2599   fontDescriptionRun06.sizeDefined   = false;
2600
2601   // Set a known font description
2602   FontDescriptionRun fontDescriptionRun07;
2603   fontDescriptionRun07.characterRun.characterIndex     = 64u;
2604   fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
2605   fontDescriptionRun07.familyLength                    = fontHebrew.size();
2606   fontDescriptionRun07.familyName                      = new char[fontDescriptionRun07.familyLength];
2607   memcpy(fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength);
2608   fontDescriptionRun07.familyDefined = true;
2609   fontDescriptionRun07.weightDefined = false;
2610   fontDescriptionRun07.widthDefined  = false;
2611   fontDescriptionRun07.slantDefined  = false;
2612   fontDescriptionRun07.sizeDefined   = false;
2613
2614   // Set a known font description
2615   FontDescriptionRun fontDescriptionRun08;
2616   fontDescriptionRun08.characterRun.characterIndex     = 74u;
2617   fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
2618   fontDescriptionRun08.familyLength                    = fontLatin.size();
2619   fontDescriptionRun08.familyName                      = new char[fontDescriptionRun08.familyLength];
2620   memcpy(fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength);
2621   fontDescriptionRun08.familyDefined = true;
2622   fontDescriptionRun08.weightDefined = false;
2623   fontDescriptionRun08.widthDefined  = false;
2624   fontDescriptionRun08.slantDefined  = false;
2625   fontDescriptionRun08.sizeDefined   = false;
2626
2627   // Set a known font description
2628   FontDescriptionRun fontDescriptionRun09;
2629   fontDescriptionRun09.characterRun.characterIndex     = 92u;
2630   fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
2631   fontDescriptionRun09.familyLength                    = fontLatin.size();
2632   fontDescriptionRun09.familyName                      = new char[fontDescriptionRun09.familyLength];
2633   memcpy(fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength);
2634   fontDescriptionRun09.familyDefined = true;
2635   fontDescriptionRun09.weightDefined = false;
2636   fontDescriptionRun09.widthDefined  = false;
2637   fontDescriptionRun09.slantDefined  = false;
2638   fontDescriptionRun09.sizeDefined   = false;
2639
2640   // Set a known font description
2641   FontDescriptionRun fontDescriptionRun10;
2642   fontDescriptionRun10.characterRun.characterIndex     = 104u;
2643   fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
2644   fontDescriptionRun10.familyLength                    = fontArabic.size();
2645   fontDescriptionRun10.familyName                      = new char[fontDescriptionRun10.familyLength];
2646   memcpy(fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength);
2647   fontDescriptionRun10.familyDefined = true;
2648   fontDescriptionRun10.weightDefined = false;
2649   fontDescriptionRun10.widthDefined  = false;
2650   fontDescriptionRun10.slantDefined  = false;
2651   fontDescriptionRun10.sizeDefined   = false;
2652
2653   // Set a known font description
2654   FontDescriptionRun fontDescriptionRun11;
2655   fontDescriptionRun11.characterRun.characterIndex     = 118u;
2656   fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
2657   fontDescriptionRun11.familyLength                    = fontHebrew.size();
2658   fontDescriptionRun11.familyName                      = new char[fontDescriptionRun11.familyLength];
2659   memcpy(fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength);
2660   fontDescriptionRun11.familyDefined = true;
2661   fontDescriptionRun11.weightDefined = false;
2662   fontDescriptionRun11.widthDefined  = false;
2663   fontDescriptionRun11.slantDefined  = false;
2664   fontDescriptionRun11.sizeDefined   = false;
2665
2666   // Set a known font description
2667   FontDescriptionRun fontDescriptionRun12;
2668   fontDescriptionRun12.characterRun.characterIndex     = 128u;
2669   fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
2670   fontDescriptionRun12.familyLength                    = fontLatin.size();
2671   fontDescriptionRun12.familyName                      = new char[fontDescriptionRun12.familyLength];
2672   memcpy(fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength);
2673   fontDescriptionRun12.familyDefined = true;
2674   fontDescriptionRun12.weightDefined = false;
2675   fontDescriptionRun12.widthDefined  = false;
2676   fontDescriptionRun12.slantDefined  = false;
2677   fontDescriptionRun12.sizeDefined   = false;
2678
2679   // Set a known font description
2680   FontDescriptionRun fontDescriptionRun13;
2681   fontDescriptionRun13.characterRun.characterIndex     = 145u;
2682   fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
2683   fontDescriptionRun13.familyLength                    = fontHebrew.size();
2684   fontDescriptionRun13.familyName                      = new char[fontDescriptionRun13.familyLength];
2685   memcpy(fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength);
2686   fontDescriptionRun13.familyDefined = true;
2687   fontDescriptionRun13.weightDefined = false;
2688   fontDescriptionRun13.widthDefined  = false;
2689   fontDescriptionRun13.slantDefined  = false;
2690   fontDescriptionRun13.sizeDefined   = false;
2691
2692   // Set a known font description
2693   FontDescriptionRun fontDescriptionRun14;
2694   fontDescriptionRun14.characterRun.characterIndex     = 154u;
2695   fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
2696   fontDescriptionRun14.familyLength                    = fontLatin.size();
2697   fontDescriptionRun14.familyName                      = new char[fontDescriptionRun14.familyLength];
2698   memcpy(fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength);
2699   fontDescriptionRun14.familyDefined = true;
2700   fontDescriptionRun14.weightDefined = false;
2701   fontDescriptionRun14.widthDefined  = false;
2702   fontDescriptionRun14.slantDefined  = false;
2703   fontDescriptionRun14.sizeDefined   = false;
2704
2705   // Set a known font description
2706   FontDescriptionRun fontDescriptionRun15;
2707   fontDescriptionRun15.characterRun.characterIndex     = 156u;
2708   fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
2709   fontDescriptionRun15.familyLength                    = fontHebrew.size();
2710   fontDescriptionRun15.familyName                      = new char[fontDescriptionRun15.familyLength];
2711   memcpy(fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength);
2712   fontDescriptionRun15.familyDefined = true;
2713   fontDescriptionRun15.weightDefined = false;
2714   fontDescriptionRun15.widthDefined  = false;
2715   fontDescriptionRun15.slantDefined  = false;
2716   fontDescriptionRun15.sizeDefined   = false;
2717
2718   // Set a known font description
2719   FontDescriptionRun fontDescriptionRun16;
2720   fontDescriptionRun16.characterRun.characterIndex     = 166u;
2721   fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
2722   fontDescriptionRun16.familyLength                    = fontLatin.size();
2723   fontDescriptionRun16.familyName                      = new char[fontDescriptionRun16.familyLength];
2724   memcpy(fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength);
2725   fontDescriptionRun16.familyDefined = true;
2726   fontDescriptionRun16.weightDefined = false;
2727   fontDescriptionRun16.widthDefined  = false;
2728   fontDescriptionRun16.slantDefined  = false;
2729   fontDescriptionRun16.sizeDefined   = false;
2730
2731   // Set a known font description
2732   FontDescriptionRun fontDescriptionRun17;
2733   fontDescriptionRun17.characterRun.characterIndex     = 178u;
2734   fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
2735   fontDescriptionRun17.familyLength                    = fontArabic.size();
2736   fontDescriptionRun17.familyName                      = new char[fontDescriptionRun17.familyLength];
2737   memcpy(fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength);
2738   fontDescriptionRun17.familyDefined = true;
2739   fontDescriptionRun17.weightDefined = false;
2740   fontDescriptionRun17.widthDefined  = false;
2741   fontDescriptionRun17.slantDefined  = false;
2742   fontDescriptionRun17.sizeDefined   = false;
2743
2744   Vector<FontDescriptionRun> fontDescriptionRuns;
2745   fontDescriptionRuns.PushBack(fontDescriptionRun01);
2746   fontDescriptionRuns.PushBack(fontDescriptionRun02);
2747   fontDescriptionRuns.PushBack(fontDescriptionRun03);
2748   fontDescriptionRuns.PushBack(fontDescriptionRun04);
2749   fontDescriptionRuns.PushBack(fontDescriptionRun05);
2750   fontDescriptionRuns.PushBack(fontDescriptionRun06);
2751   fontDescriptionRuns.PushBack(fontDescriptionRun07);
2752   fontDescriptionRuns.PushBack(fontDescriptionRun08);
2753   fontDescriptionRuns.PushBack(fontDescriptionRun09);
2754   fontDescriptionRuns.PushBack(fontDescriptionRun10);
2755   fontDescriptionRuns.PushBack(fontDescriptionRun11);
2756   fontDescriptionRuns.PushBack(fontDescriptionRun12);
2757   fontDescriptionRuns.PushBack(fontDescriptionRun13);
2758   fontDescriptionRuns.PushBack(fontDescriptionRun14);
2759   fontDescriptionRuns.PushBack(fontDescriptionRun15);
2760   fontDescriptionRuns.PushBack(fontDescriptionRun16);
2761   fontDescriptionRuns.PushBack(fontDescriptionRun17);
2762   Size  textArea(100.f, 300.f);
2763   Size  layoutSize(100.f, 380.f);
2764   float positions[] =
2765     {
2766       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
2767       0.f,
2768       -13.f,
2769       9.f,
2770       -9.f,
2771       19.f,
2772       -9.f,
2773       32.f,
2774       -9.f,
2775       41.f,
2776       -0.f,
2777       68.f,
2778       -10.f,
2779       59.f,
2780       -13.f,
2781       54.f,
2782       -10.f,
2783       45.f,
2784       -10.f,
2785       79.f,
2786       -0.f, //  12 ..  21
2787       23.f,
2788       -10.f,
2789       19.f,
2790       -10.f,
2791       10.f,
2792       -13.f,
2793       0.f,
2794       -10.f,
2795       32.f,
2796       -2.f,
2797       36.f,
2798       -12.f, //  22 ..  27
2799       58.f,
2800       -8.f,
2801       52.f,
2802       -6.f,
2803       45.f,
2804       -8.f,
2805       41.f,
2806       -7.f,
2807       39.f,
2808       -11.f,
2809       34.f,
2810       -0.f,
2811       30.f,
2812       -7.f,
2813       28.f,
2814       -11.f,
2815       23.f,
2816       -11.f,
2817       16.f,
2818       -8.f,
2819       15.f,
2820       -11.f,
2821       9.f,
2822       -11.f,
2823       4.f,
2824       -8.f,
2825       0.f,
2826       -0.f,
2827       4.f,
2828       -13.f,
2829       12.f,
2830       -9.f,
2831       22.f,
2832       -13.f,
2833       26.f,
2834       -13.f,
2835       29.f,
2836       -9.f,
2837       38.f,
2838       -0.f, //  28 ..  47
2839       42.f,
2840       -9.f,
2841       54.f,
2842       -9.f,
2843       64.f,
2844       -9.f,
2845       70.f,
2846       -13.f,
2847       73.f,
2848       -13.f,
2849       0.f,
2850       -0.f,
2851       59.f,
2852       -10.f,
2853       50.f,
2854       -13.f,
2855       46.f,
2856       -10.f,
2857       36.f,
2858       -10.f,
2859       32.f,
2860       -0.f, //  48 ..  58
2861       23.f,
2862       -10.f,
2863       19.f,
2864       -10.f,
2865       10.f,
2866       -13.f,
2867       0.f,
2868       -10.f,
2869       0.f,
2870       -0.f, //  59 ..  63
2871       63.f,
2872       -10.f,
2873       54.f,
2874       -13.f,
2875       50.f,
2876       -10.f,
2877       41.f,
2878       -10.f,
2879       36.f,
2880       -0.f,
2881       27.f,
2882       -10.f,
2883       23.f,
2884       -10.f,
2885       14.f,
2886       -13.f,
2887       4.f,
2888       -10.f,
2889       0.f,
2890       -0.f, //  64 ..  73
2891       4.f,
2892       -13.f,
2893       12.f,
2894       -9.f,
2895       22.f,
2896       -13.f,
2897       26.f,
2898       -13.f,
2899       29.f,
2900       -9.f,
2901       38.f,
2902       -0.f,
2903       42.f,
2904       -9.f,
2905       54.f,
2906       -9.f,
2907       64.f,
2908       -9.f,
2909       70.f,
2910       -13.f,
2911       73.f,
2912       -13.f,
2913       0.f,
2914       -0.f, //  74 ..  85
2915       4.f,
2916       -13.f,
2917       13.f,
2918       -9.f,
2919       23.f,
2920       -9.f,
2921       36.f,
2922       -9.f,
2923       0.f,
2924       -2.f,
2925       0.f,
2926       -12.f, //  86 ..  91
2927       0.f,
2928       -13.f,
2929       8.f,
2930       -9.f,
2931       18.f,
2932       -13.f,
2933       22.f,
2934       -13.f,
2935       25.f,
2936       -9.f,
2937       34.f,
2938       -0.f,
2939       38.f,
2940       -9.f,
2941       50.f,
2942       -9.f,
2943       60.f,
2944       -9.f,
2945       66.f,
2946       -13.f,
2947       69.f,
2948       -13.f,
2949       79.f,
2950       -0.f, //  92 .. 103
2951       92.f,
2952       -8.f,
2953       86.f,
2954       -6.f,
2955       79.f,
2956       -8.f,
2957       75.f,
2958       -7.f,
2959       73.f,
2960       -11.f,
2961       68.f,
2962       -0.f,
2963       64.f,
2964       -7.f,
2965       62.f,
2966       -11.f,
2967       57.f,
2968       -11.f,
2969       50.f,
2970       -8.f,
2971       49.f,
2972       -11.f,
2973       43.f,
2974       -11.f,
2975       38.f,
2976       -8.f,
2977       34.f,
2978       -0.f,
2979       23.f,
2980       -10.f,
2981       14.f,
2982       -13.f,
2983       10.f,
2984       -10.f,
2985       0.f,
2986       -10.f,
2987       99.f,
2988       -0.f, // 104 .. 122
2989       23.f,
2990       -10.f,
2991       19.f,
2992       -10.f,
2993       10.f,
2994       -13.f,
2995       0.f,
2996       -10.f,
2997       32.f,
2998       -0.f, // 123 .. 127
2999       0.f,
3000       -12.f,
3001       10.f,
3002       -9.f,
3003       20.f,
3004       -13.f,
3005       24.f,
3006       -13.f,
3007       27.f,
3008       -9.f,
3009       36.f,
3010       -0.f,
3011       40.f,
3012       -9.f,
3013       52.f,
3014       -9.f,
3015       62.f,
3016       -9.f,
3017       69.f,
3018       -13.f,
3019       72.f,
3020       -13.f,
3021       81.f,
3022       -0.f, // 128 .. 139
3023       0.f,
3024       -13.f,
3025       9.f,
3026       -9.f,
3027       19.f,
3028       -9.f,
3029       32.f,
3030       -9.f,
3031       41.f,
3032       -0.f,
3033       68.f,
3034       -10.f,
3035       59.f,
3036       -13.f,
3037       54.f,
3038       -10.f,
3039       45.f,
3040       -10.f,
3041       79.f,
3042       -0.f, // 140 .. 149
3043       23.f,
3044       -10.f,
3045       19.f,
3046       -10.f,
3047       10.f,
3048       -13.f,
3049       0.f,
3050       -10.f,
3051       32.f,
3052       -2.f,
3053       36.f,
3054       -12.f, // 150 .. 155
3055       63.f,
3056       -10.f,
3057       54.f,
3058       -13.f,
3059       50.f,
3060       -10.f,
3061       41.f,
3062       -10.f,
3063       36.f,
3064       -0.f,
3065       27.f,
3066       -10.f,
3067       23.f,
3068       -10.f,
3069       14.f,
3070       -13.f,
3071       4.f,
3072       -10.f,
3073       0.f,
3074       -0.f, // 156 .. 165
3075       4.f,
3076       -13.f,
3077       12.f,
3078       -9.f,
3079       22.f,
3080       -13.f,
3081       26.f,
3082       -13.f,
3083       29.f,
3084       -9.f,
3085       38.f,
3086       -0.f,
3087       42.f,
3088       -9.f,
3089       54.f,
3090       -9.f,
3091       64.f,
3092       -9.f,
3093       70.f,
3094       -13.f,
3095       73.f,
3096       -13.f,
3097       0.f,
3098       -0.f, // 166 .. 177
3099       54.f,
3100       -8.f,
3101       49.f,
3102       -6.f,
3103       41.f,
3104       -8.f,
3105       37.f,
3106       -7.f,
3107       35.f,
3108       -11.f,
3109       31.f,
3110       -0.f,
3111       26.f,
3112       -7.f,
3113       24.f,
3114       -11.f,
3115       19.f,
3116       -11.f,
3117       12.f,
3118       -8.f,
3119       11.f,
3120       -11.f,
3121       5.f,
3122       -11.f,
3123       0.f,
3124       -8.f,
3125       0.f,
3126       -0.f, // 178 .. 191
3127     };
3128
3129   struct LineRun line01 =
3130     {
3131       {0u, 12u},
3132       {0u, 12u},
3133       81.f,
3134       15.f,
3135       -5.f,
3136       4.f,
3137       0.f,
3138       0.f,
3139       false,
3140       false};
3141   struct LineRun line02 =
3142     {
3143       {12u, 10u},
3144       {12u, 10u},
3145       79.f,
3146       15.f,
3147       -5.f,
3148       5.f,
3149       0.f,
3150       0.f,
3151       false,
3152       false};
3153   struct LineRun line03 =
3154     {
3155       {22u, 6u},
3156       {22u, 6u},
3157       35.f,
3158       15.f,
3159       -5.f,
3160       0.f,
3161       0.f,
3162       0.f,
3163       false,
3164       false};
3165   struct LineRun line04 =
3166     {
3167       {28u, 14u},
3168       {28u, 14u},
3169       63.f,
3170       15.f,
3171       -5.f,
3172       4.f,
3173       0.f,
3174       0.f,
3175       true,
3176       false};
3177   struct LineRun line05 =
3178     {
3179       {42u, 12u},
3180       {42u, 12u},
3181       79.f,
3182       15.f,
3183       -5.f,
3184       4.f,
3185       0.f,
3186       0.f,
3187       false,
3188       false};
3189   struct LineRun line06 =
3190     {
3191       {54u, 10u},
3192       {54u, 10u},
3193       70.f,
3194       15.f,
3195       -5.f,
3196       0.f,
3197       0.f,
3198       0.f,
3199       false,
3200       false};
3201   struct LineRun line07 =
3202     {
3203       {64u, 10u},
3204       {64u, 10u},
3205       70.f,
3206       15.f,
3207       -5.f,
3208       5.f,
3209       0.f,
3210       0.f,
3211       false,
3212       false};
3213   struct LineRun line08 =
3214     {
3215       {74u, 12u},
3216       {74u, 12u},
3217       79.f,
3218       15.f,
3219       -5.f,
3220       4.f,
3221       1.f,
3222       0.f,
3223       false,
3224       false};
3225   struct LineRun line09 =
3226     {
3227       {86u, 6u},
3228       {86u, 6u},
3229       45.f,
3230       15.f,
3231       -5.f,
3232       0.f,
3233       0.f,
3234       0.f,
3235       false,
3236       false};
3237   struct LineRun line10 =
3238     {
3239       {92u, 12u},
3240       {92u, 12u},
3241       79.f,
3242       15.f,
3243       -5.f,
3244       4.f,
3245       0.f,
3246       0.f,
3247       false,
3248       false};
3249   struct LineRun line11 =
3250     {
3251       {104u, 19u},
3252       {104u, 19u},
3253       100.f,
3254       15.f,
3255       -5.f,
3256       5.f,
3257       0.f,
3258       0.f,
3259       false,
3260       false};
3261   struct LineRun line12 =
3262     {
3263       {123u, 5u},
3264       {123u, 5u},
3265       32.f,
3266       15.f,
3267       -5.f,
3268       0.f,
3269       0.f,
3270       0.f,
3271       false,
3272       false};
3273   struct LineRun line13 =
3274     {
3275       {128u, 12u},
3276       {128u, 12u},
3277       81.f,
3278       15.f,
3279       -5.f,
3280       4.f,
3281       0.f,
3282       0.f,
3283       false,
3284       false};
3285   struct LineRun line14 =
3286     {
3287       {140u, 10u},
3288       {140u, 10u},
3289       79.f,
3290       15.f,
3291       -5.f,
3292       5.f,
3293       0.f,
3294       0.f,
3295       false,
3296       false};
3297   struct LineRun line15 =
3298     {
3299       {150u, 6u},
3300       {150u, 6u},
3301       35.f,
3302       15.f,
3303       -5.f,
3304       0.f,
3305       0.f,
3306       0.f,
3307       false,
3308       false};
3309   struct LineRun line16 =
3310     {
3311       {156u, 10u},
3312       {156u, 10u},
3313       70.f,
3314       15.f,
3315       -5.f,
3316       5.f,
3317       0.f,
3318       0.f,
3319       false,
3320       false};
3321   struct LineRun line17 =
3322     {
3323       {166u, 12u},
3324       {166u, 12u},
3325       79.f,
3326       15.f,
3327       -5.f,
3328       4.f,
3329       0.f,
3330       0.f,
3331       false,
3332       false};
3333   struct LineRun line18 =
3334     {
3335       {178u, 14u},
3336       {178u, 14u},
3337       63.f,
3338       15.f,
3339       -5.f,
3340       0.f,
3341       0.f,
3342       0.f,
3343       false,
3344       false};
3345   struct LineRun line19 =
3346     {
3347       {192u, 0u},
3348       {192u, 0u},
3349       0.f,
3350       15.f,
3351       -5.f,
3352       0.f,
3353       0.f,
3354       0.f,
3355       false,
3356       false};
3357   Vector<LineRun> lines;
3358   lines.PushBack(line01);
3359   lines.PushBack(line02);
3360   lines.PushBack(line03);
3361   lines.PushBack(line04);
3362   lines.PushBack(line05);
3363   lines.PushBack(line06);
3364   lines.PushBack(line07);
3365   lines.PushBack(line08);
3366   lines.PushBack(line09);
3367   lines.PushBack(line10);
3368   lines.PushBack(line11);
3369   lines.PushBack(line12);
3370   lines.PushBack(line13);
3371   lines.PushBack(line14);
3372   lines.PushBack(line15);
3373   lines.PushBack(line16);
3374   lines.PushBack(line17);
3375   lines.PushBack(line18);
3376   lines.PushBack(line19);
3377
3378   LayoutTextData data =
3379     {
3380       "Layout bidirectional text.",
3381       "Hello world demo שלום עולם.\n"
3382       "مرحبا بالعالم hello world שלום עולם\n"
3383       "שלום עולם hello world demo.\n"
3384       "hello world مرحبا بالعالم שלום עולם\n"
3385       "Hello world demo שלום עולם.\n"
3386       "שלום עולם hello world مرحبا بالعالم\n",
3387       textArea,
3388       17u,
3389       fontDescriptionRuns.Begin(),
3390       layoutSize,
3391       192u,
3392       positions,
3393       19u,
3394       lines.Begin(),
3395       Layout::Engine::MULTI_LINE_BOX,
3396       64u,
3397       64u,
3398       false,
3399       DevelText::EllipsisPosition::END,
3400       true};
3401
3402   if(!LayoutTextTest(data))
3403   {
3404     tet_result(TET_FAIL);
3405   }
3406
3407   tet_result(TET_PASS);
3408   END_TEST;
3409 }
3410
3411 int UtcDaliTextUpdateLayout03(void)
3412 {
3413   ToolkitTestApplication application;
3414   tet_infoline(" UtcDaliTextUpdateLayout03");
3415
3416   // Layout some lines of bidirectional text. Update the paragraphs at the middle.
3417
3418   const std::string fontLatin("TizenSans");
3419   const std::string fontHebrew("TizenSansHebrew");
3420   const std::string fontArabic("TizenSansArabic");
3421
3422   // Set a known font description
3423   FontDescriptionRun fontDescriptionRun01;
3424   fontDescriptionRun01.characterRun.characterIndex     = 0u;
3425   fontDescriptionRun01.characterRun.numberOfCharacters = 17u;
3426   fontDescriptionRun01.familyLength                    = fontLatin.size();
3427   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
3428   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
3429   fontDescriptionRun01.familyDefined = true;
3430   fontDescriptionRun01.weightDefined = false;
3431   fontDescriptionRun01.widthDefined  = false;
3432   fontDescriptionRun01.slantDefined  = false;
3433   fontDescriptionRun01.sizeDefined   = false;
3434
3435   // Set a known font description
3436   FontDescriptionRun fontDescriptionRun02;
3437   fontDescriptionRun02.characterRun.characterIndex     = 17u;
3438   fontDescriptionRun02.characterRun.numberOfCharacters = 9u;
3439   fontDescriptionRun02.familyLength                    = fontHebrew.size();
3440   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
3441   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
3442   fontDescriptionRun02.familyDefined = true;
3443   fontDescriptionRun02.weightDefined = false;
3444   fontDescriptionRun02.widthDefined  = false;
3445   fontDescriptionRun02.slantDefined  = false;
3446   fontDescriptionRun02.sizeDefined   = false;
3447
3448   // Set a known font description
3449   FontDescriptionRun fontDescriptionRun03;
3450   fontDescriptionRun03.characterRun.characterIndex     = 26u;
3451   fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
3452   fontDescriptionRun03.familyLength                    = fontLatin.size();
3453   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
3454   memcpy(fontDescriptionRun03.familyName, fontLatin.c_str(), fontDescriptionRun03.familyLength);
3455   fontDescriptionRun03.familyDefined = true;
3456   fontDescriptionRun03.weightDefined = false;
3457   fontDescriptionRun03.widthDefined  = false;
3458   fontDescriptionRun03.slantDefined  = false;
3459   fontDescriptionRun03.sizeDefined   = false;
3460
3461   // Set a known font description
3462   FontDescriptionRun fontDescriptionRun04;
3463   fontDescriptionRun04.characterRun.characterIndex     = 28u;
3464   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
3465   fontDescriptionRun04.familyLength                    = fontArabic.size();
3466   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
3467   memcpy(fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength);
3468   fontDescriptionRun04.familyDefined = true;
3469   fontDescriptionRun04.weightDefined = false;
3470   fontDescriptionRun04.widthDefined  = false;
3471   fontDescriptionRun04.slantDefined  = false;
3472   fontDescriptionRun04.sizeDefined   = false;
3473
3474   // Set a known font description
3475   FontDescriptionRun fontDescriptionRun05;
3476   fontDescriptionRun05.characterRun.characterIndex     = 42u;
3477   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
3478   fontDescriptionRun05.familyLength                    = fontLatin.size();
3479   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
3480   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
3481   fontDescriptionRun05.familyDefined = true;
3482   fontDescriptionRun05.weightDefined = false;
3483   fontDescriptionRun05.widthDefined  = false;
3484   fontDescriptionRun05.slantDefined  = false;
3485   fontDescriptionRun05.sizeDefined   = false;
3486
3487   // Set a known font description
3488   FontDescriptionRun fontDescriptionRun06;
3489   fontDescriptionRun06.characterRun.characterIndex     = 54u;
3490   fontDescriptionRun06.characterRun.numberOfCharacters = 10u;
3491   fontDescriptionRun06.familyLength                    = fontHebrew.size();
3492   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
3493   memcpy(fontDescriptionRun06.familyName, fontHebrew.c_str(), fontDescriptionRun06.familyLength);
3494   fontDescriptionRun06.familyDefined = true;
3495   fontDescriptionRun06.weightDefined = false;
3496   fontDescriptionRun06.widthDefined  = false;
3497   fontDescriptionRun06.slantDefined  = false;
3498   fontDescriptionRun06.sizeDefined   = false;
3499
3500   // Set a known font description
3501   FontDescriptionRun fontDescriptionRun07;
3502   fontDescriptionRun07.characterRun.characterIndex     = 64u;
3503   fontDescriptionRun07.characterRun.numberOfCharacters = 10u;
3504   fontDescriptionRun07.familyLength                    = fontHebrew.size();
3505   fontDescriptionRun07.familyName                      = new char[fontDescriptionRun07.familyLength];
3506   memcpy(fontDescriptionRun07.familyName, fontHebrew.c_str(), fontDescriptionRun07.familyLength);
3507   fontDescriptionRun07.familyDefined = true;
3508   fontDescriptionRun07.weightDefined = false;
3509   fontDescriptionRun07.widthDefined  = false;
3510   fontDescriptionRun07.slantDefined  = false;
3511   fontDescriptionRun07.sizeDefined   = false;
3512
3513   // Set a known font description
3514   FontDescriptionRun fontDescriptionRun08;
3515   fontDescriptionRun08.characterRun.characterIndex     = 74u;
3516   fontDescriptionRun08.characterRun.numberOfCharacters = 18u;
3517   fontDescriptionRun08.familyLength                    = fontLatin.size();
3518   fontDescriptionRun08.familyName                      = new char[fontDescriptionRun08.familyLength];
3519   memcpy(fontDescriptionRun08.familyName, fontLatin.c_str(), fontDescriptionRun08.familyLength);
3520   fontDescriptionRun08.familyDefined = true;
3521   fontDescriptionRun08.weightDefined = false;
3522   fontDescriptionRun08.widthDefined  = false;
3523   fontDescriptionRun08.slantDefined  = false;
3524   fontDescriptionRun08.sizeDefined   = false;
3525
3526   // Set a known font description
3527   FontDescriptionRun fontDescriptionRun09;
3528   fontDescriptionRun09.characterRun.characterIndex     = 92u;
3529   fontDescriptionRun09.characterRun.numberOfCharacters = 12u;
3530   fontDescriptionRun09.familyLength                    = fontLatin.size();
3531   fontDescriptionRun09.familyName                      = new char[fontDescriptionRun09.familyLength];
3532   memcpy(fontDescriptionRun09.familyName, fontLatin.c_str(), fontDescriptionRun09.familyLength);
3533   fontDescriptionRun09.familyDefined = true;
3534   fontDescriptionRun09.weightDefined = false;
3535   fontDescriptionRun09.widthDefined  = false;
3536   fontDescriptionRun09.slantDefined  = false;
3537   fontDescriptionRun09.sizeDefined   = false;
3538
3539   // Set a known font description
3540   FontDescriptionRun fontDescriptionRun10;
3541   fontDescriptionRun10.characterRun.characterIndex     = 104u;
3542   fontDescriptionRun10.characterRun.numberOfCharacters = 14u;
3543   fontDescriptionRun10.familyLength                    = fontArabic.size();
3544   fontDescriptionRun10.familyName                      = new char[fontDescriptionRun10.familyLength];
3545   memcpy(fontDescriptionRun10.familyName, fontArabic.c_str(), fontDescriptionRun10.familyLength);
3546   fontDescriptionRun10.familyDefined = true;
3547   fontDescriptionRun10.weightDefined = false;
3548   fontDescriptionRun10.widthDefined  = false;
3549   fontDescriptionRun10.slantDefined  = false;
3550   fontDescriptionRun10.sizeDefined   = false;
3551
3552   // Set a known font description
3553   FontDescriptionRun fontDescriptionRun11;
3554   fontDescriptionRun11.characterRun.characterIndex     = 118u;
3555   fontDescriptionRun11.characterRun.numberOfCharacters = 10u;
3556   fontDescriptionRun11.familyLength                    = fontHebrew.size();
3557   fontDescriptionRun11.familyName                      = new char[fontDescriptionRun11.familyLength];
3558   memcpy(fontDescriptionRun11.familyName, fontHebrew.c_str(), fontDescriptionRun11.familyLength);
3559   fontDescriptionRun11.familyDefined = true;
3560   fontDescriptionRun11.weightDefined = false;
3561   fontDescriptionRun11.widthDefined  = false;
3562   fontDescriptionRun11.slantDefined  = false;
3563   fontDescriptionRun11.sizeDefined   = false;
3564
3565   // Set a known font description
3566   FontDescriptionRun fontDescriptionRun12;
3567   fontDescriptionRun12.characterRun.characterIndex     = 128u;
3568   fontDescriptionRun12.characterRun.numberOfCharacters = 17u;
3569   fontDescriptionRun12.familyLength                    = fontLatin.size();
3570   fontDescriptionRun12.familyName                      = new char[fontDescriptionRun12.familyLength];
3571   memcpy(fontDescriptionRun12.familyName, fontLatin.c_str(), fontDescriptionRun12.familyLength);
3572   fontDescriptionRun12.familyDefined = true;
3573   fontDescriptionRun12.weightDefined = false;
3574   fontDescriptionRun12.widthDefined  = false;
3575   fontDescriptionRun12.slantDefined  = false;
3576   fontDescriptionRun12.sizeDefined   = false;
3577
3578   // Set a known font description
3579   FontDescriptionRun fontDescriptionRun13;
3580   fontDescriptionRun13.characterRun.characterIndex     = 145u;
3581   fontDescriptionRun13.characterRun.numberOfCharacters = 9u;
3582   fontDescriptionRun13.familyLength                    = fontHebrew.size();
3583   fontDescriptionRun13.familyName                      = new char[fontDescriptionRun13.familyLength];
3584   memcpy(fontDescriptionRun13.familyName, fontHebrew.c_str(), fontDescriptionRun13.familyLength);
3585   fontDescriptionRun13.familyDefined = true;
3586   fontDescriptionRun13.weightDefined = false;
3587   fontDescriptionRun13.widthDefined  = false;
3588   fontDescriptionRun13.slantDefined  = false;
3589   fontDescriptionRun13.sizeDefined   = false;
3590
3591   // Set a known font description
3592   FontDescriptionRun fontDescriptionRun14;
3593   fontDescriptionRun14.characterRun.characterIndex     = 154u;
3594   fontDescriptionRun14.characterRun.numberOfCharacters = 2u;
3595   fontDescriptionRun14.familyLength                    = fontLatin.size();
3596   fontDescriptionRun14.familyName                      = new char[fontDescriptionRun14.familyLength];
3597   memcpy(fontDescriptionRun14.familyName, fontLatin.c_str(), fontDescriptionRun14.familyLength);
3598   fontDescriptionRun14.familyDefined = true;
3599   fontDescriptionRun14.weightDefined = false;
3600   fontDescriptionRun14.widthDefined  = false;
3601   fontDescriptionRun14.slantDefined  = false;
3602   fontDescriptionRun14.sizeDefined   = false;
3603
3604   // Set a known font description
3605   FontDescriptionRun fontDescriptionRun15;
3606   fontDescriptionRun15.characterRun.characterIndex     = 156u;
3607   fontDescriptionRun15.characterRun.numberOfCharacters = 10u;
3608   fontDescriptionRun15.familyLength                    = fontHebrew.size();
3609   fontDescriptionRun15.familyName                      = new char[fontDescriptionRun15.familyLength];
3610   memcpy(fontDescriptionRun15.familyName, fontHebrew.c_str(), fontDescriptionRun15.familyLength);
3611   fontDescriptionRun15.familyDefined = true;
3612   fontDescriptionRun15.weightDefined = false;
3613   fontDescriptionRun15.widthDefined  = false;
3614   fontDescriptionRun15.slantDefined  = false;
3615   fontDescriptionRun15.sizeDefined   = false;
3616
3617   // Set a known font description
3618   FontDescriptionRun fontDescriptionRun16;
3619   fontDescriptionRun16.characterRun.characterIndex     = 166u;
3620   fontDescriptionRun16.characterRun.numberOfCharacters = 12u;
3621   fontDescriptionRun16.familyLength                    = fontLatin.size();
3622   fontDescriptionRun16.familyName                      = new char[fontDescriptionRun16.familyLength];
3623   memcpy(fontDescriptionRun16.familyName, fontLatin.c_str(), fontDescriptionRun16.familyLength);
3624   fontDescriptionRun16.familyDefined = true;
3625   fontDescriptionRun16.weightDefined = false;
3626   fontDescriptionRun16.widthDefined  = false;
3627   fontDescriptionRun16.slantDefined  = false;
3628   fontDescriptionRun16.sizeDefined   = false;
3629
3630   // Set a known font description
3631   FontDescriptionRun fontDescriptionRun17;
3632   fontDescriptionRun17.characterRun.characterIndex     = 178u;
3633   fontDescriptionRun17.characterRun.numberOfCharacters = 14u;
3634   fontDescriptionRun17.familyLength                    = fontArabic.size();
3635   fontDescriptionRun17.familyName                      = new char[fontDescriptionRun17.familyLength];
3636   memcpy(fontDescriptionRun17.familyName, fontArabic.c_str(), fontDescriptionRun17.familyLength);
3637   fontDescriptionRun17.familyDefined = true;
3638   fontDescriptionRun17.weightDefined = false;
3639   fontDescriptionRun17.widthDefined  = false;
3640   fontDescriptionRun17.slantDefined  = false;
3641   fontDescriptionRun17.sizeDefined   = false;
3642
3643   Vector<FontDescriptionRun> fontDescriptionRuns;
3644   fontDescriptionRuns.PushBack(fontDescriptionRun01);
3645   fontDescriptionRuns.PushBack(fontDescriptionRun02);
3646   fontDescriptionRuns.PushBack(fontDescriptionRun03);
3647   fontDescriptionRuns.PushBack(fontDescriptionRun04);
3648   fontDescriptionRuns.PushBack(fontDescriptionRun05);
3649   fontDescriptionRuns.PushBack(fontDescriptionRun06);
3650   fontDescriptionRuns.PushBack(fontDescriptionRun07);
3651   fontDescriptionRuns.PushBack(fontDescriptionRun08);
3652   fontDescriptionRuns.PushBack(fontDescriptionRun09);
3653   fontDescriptionRuns.PushBack(fontDescriptionRun10);
3654   fontDescriptionRuns.PushBack(fontDescriptionRun11);
3655   fontDescriptionRuns.PushBack(fontDescriptionRun12);
3656   fontDescriptionRuns.PushBack(fontDescriptionRun13);
3657   fontDescriptionRuns.PushBack(fontDescriptionRun14);
3658   fontDescriptionRuns.PushBack(fontDescriptionRun15);
3659   fontDescriptionRuns.PushBack(fontDescriptionRun16);
3660   fontDescriptionRuns.PushBack(fontDescriptionRun17);
3661   Size  textArea(100.f, 300.f);
3662   Size  layoutSize(100.f, 380.f);
3663   float positions[] =
3664     {
3665       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
3666       0.f,
3667       -13.f,
3668       9.f,
3669       -9.f,
3670       19.f,
3671       -9.f,
3672       32.f,
3673       -9.f,
3674       41.f,
3675       -0.f,
3676       68.f,
3677       -10.f,
3678       59.f,
3679       -13.f,
3680       54.f,
3681       -10.f,
3682       45.f,
3683       -10.f,
3684       79.f,
3685       -0.f, //  12 ..  21
3686       23.f,
3687       -10.f,
3688       19.f,
3689       -10.f,
3690       10.f,
3691       -13.f,
3692       0.f,
3693       -10.f,
3694       32.f,
3695       -2.f,
3696       36.f,
3697       -12.f, //  22 ..  27
3698       58.f,
3699       -8.f,
3700       52.f,
3701       -6.f,
3702       45.f,
3703       -8.f,
3704       41.f,
3705       -7.f,
3706       39.f,
3707       -11.f,
3708       34.f,
3709       -0.f,
3710       30.f,
3711       -7.f,
3712       28.f,
3713       -11.f,
3714       23.f,
3715       -11.f,
3716       16.f,
3717       -8.f,
3718       15.f,
3719       -11.f,
3720       9.f,
3721       -11.f,
3722       4.f,
3723       -8.f,
3724       0.f,
3725       -0.f,
3726       4.f,
3727       -13.f,
3728       12.f,
3729       -9.f,
3730       22.f,
3731       -13.f,
3732       26.f,
3733       -13.f,
3734       29.f,
3735       -9.f,
3736       38.f,
3737       -0.f, //  28 ..  47
3738       42.f,
3739       -9.f,
3740       54.f,
3741       -9.f,
3742       64.f,
3743       -9.f,
3744       70.f,
3745       -13.f,
3746       73.f,
3747       -13.f,
3748       0.f,
3749       -0.f,
3750       59.f,
3751       -10.f,
3752       50.f,
3753       -13.f,
3754       46.f,
3755       -10.f,
3756       36.f,
3757       -10.f,
3758       32.f,
3759       -0.f, //  48 ..  58
3760       23.f,
3761       -10.f,
3762       19.f,
3763       -10.f,
3764       10.f,
3765       -13.f,
3766       0.f,
3767       -10.f,
3768       0.f,
3769       -0.f, //  59 ..  63
3770       63.f,
3771       -10.f,
3772       54.f,
3773       -13.f,
3774       50.f,
3775       -10.f,
3776       41.f,
3777       -10.f,
3778       36.f,
3779       -0.f,
3780       27.f,
3781       -10.f,
3782       23.f,
3783       -10.f,
3784       14.f,
3785       -13.f,
3786       4.f,
3787       -10.f,
3788       0.f,
3789       -0.f, //  64 ..  73
3790       4.f,
3791       -13.f,
3792       12.f,
3793       -9.f,
3794       22.f,
3795       -13.f,
3796       26.f,
3797       -13.f,
3798       29.f,
3799       -9.f,
3800       38.f,
3801       -0.f,
3802       42.f,
3803       -9.f,
3804       54.f,
3805       -9.f,
3806       64.f,
3807       -9.f,
3808       70.f,
3809       -13.f,
3810       73.f,
3811       -13.f,
3812       0.f,
3813       -0.f, //  74 ..  85
3814       4.f,
3815       -13.f,
3816       13.f,
3817       -9.f,
3818       23.f,
3819       -9.f,
3820       36.f,
3821       -9.f,
3822       0.f,
3823       -2.f,
3824       0.f,
3825       -12.f, //  86 ..  91
3826       0.f,
3827       -13.f,
3828       8.f,
3829       -9.f,
3830       18.f,
3831       -13.f,
3832       22.f,
3833       -13.f,
3834       25.f,
3835       -9.f,
3836       34.f,
3837       -0.f,
3838       38.f,
3839       -9.f,
3840       50.f,
3841       -9.f,
3842       60.f,
3843       -9.f,
3844       66.f,
3845       -13.f,
3846       69.f,
3847       -13.f,
3848       79.f,
3849       -0.f, //  92 .. 103
3850       92.f,
3851       -8.f,
3852       86.f,
3853       -6.f,
3854       79.f,
3855       -8.f,
3856       75.f,
3857       -7.f,
3858       73.f,
3859       -11.f,
3860       68.f,
3861       -0.f,
3862       64.f,
3863       -7.f,
3864       62.f,
3865       -11.f,
3866       57.f,
3867       -11.f,
3868       50.f,
3869       -8.f,
3870       49.f,
3871       -11.f,
3872       43.f,
3873       -11.f,
3874       38.f,
3875       -8.f,
3876       34.f,
3877       -0.f,
3878       23.f,
3879       -10.f,
3880       14.f,
3881       -13.f,
3882       10.f,
3883       -10.f,
3884       0.f,
3885       -10.f,
3886       99.f,
3887       -0.f, // 104 .. 122
3888       23.f,
3889       -10.f,
3890       19.f,
3891       -10.f,
3892       10.f,
3893       -13.f,
3894       0.f,
3895       -10.f,
3896       32.f,
3897       -0.f, // 123 .. 127
3898       0.f,
3899       -12.f,
3900       10.f,
3901       -9.f,
3902       20.f,
3903       -13.f,
3904       24.f,
3905       -13.f,
3906       27.f,
3907       -9.f,
3908       36.f,
3909       -0.f,
3910       40.f,
3911       -9.f,
3912       52.f,
3913       -9.f,
3914       62.f,
3915       -9.f,
3916       69.f,
3917       -13.f,
3918       72.f,
3919       -13.f,
3920       81.f,
3921       -0.f, // 128 .. 139
3922       0.f,
3923       -13.f,
3924       9.f,
3925       -9.f,
3926       19.f,
3927       -9.f,
3928       32.f,
3929       -9.f,
3930       41.f,
3931       -0.f,
3932       68.f,
3933       -10.f,
3934       59.f,
3935       -13.f,
3936       54.f,
3937       -10.f,
3938       45.f,
3939       -10.f,
3940       79.f,
3941       -0.f, // 140 .. 149
3942       23.f,
3943       -10.f,
3944       19.f,
3945       -10.f,
3946       10.f,
3947       -13.f,
3948       0.f,
3949       -10.f,
3950       32.f,
3951       -2.f,
3952       36.f,
3953       -12.f, // 150 .. 155
3954       63.f,
3955       -10.f,
3956       54.f,
3957       -13.f,
3958       50.f,
3959       -10.f,
3960       41.f,
3961       -10.f,
3962       36.f,
3963       -0.f,
3964       27.f,
3965       -10.f,
3966       23.f,
3967       -10.f,
3968       14.f,
3969       -13.f,
3970       4.f,
3971       -10.f,
3972       0.f,
3973       -0.f, // 156 .. 165
3974       4.f,
3975       -13.f,
3976       12.f,
3977       -9.f,
3978       22.f,
3979       -13.f,
3980       26.f,
3981       -13.f,
3982       29.f,
3983       -9.f,
3984       38.f,
3985       -0.f,
3986       42.f,
3987       -9.f,
3988       54.f,
3989       -9.f,
3990       64.f,
3991       -9.f,
3992       70.f,
3993       -13.f,
3994       73.f,
3995       -13.f,
3996       0.f,
3997       -0.f, // 166 .. 177
3998       54.f,
3999       -8.f,
4000       49.f,
4001       -6.f,
4002       41.f,
4003       -8.f,
4004       37.f,
4005       -7.f,
4006       35.f,
4007       -11.f,
4008       31.f,
4009       -0.f,
4010       26.f,
4011       -7.f,
4012       24.f,
4013       -11.f,
4014       19.f,
4015       -11.f,
4016       12.f,
4017       -8.f,
4018       11.f,
4019       -11.f,
4020       5.f,
4021       -11.f,
4022       0.f,
4023       -8.f,
4024       0.f,
4025       -0.f, // 178 .. 191
4026     };
4027
4028   struct LineRun line01 =
4029     {
4030       {0u, 12u},
4031       {0u, 12u},
4032       81.f,
4033       15.f,
4034       -5.f,
4035       4.f,
4036       0.f,
4037       0.f,
4038       false,
4039       false};
4040   struct LineRun line02 =
4041     {
4042       {12u, 10u},
4043       {12u, 10u},
4044       79.f,
4045       15.f,
4046       -5.f,
4047       5.f,
4048       0.f,
4049       0.f,
4050       false,
4051       false};
4052   struct LineRun line03 =
4053     {
4054       {22u, 6u},
4055       {22u, 6u},
4056       35.f,
4057       15.f,
4058       -5.f,
4059       0.f,
4060       0.f,
4061       0.f,
4062       false,
4063       false};
4064   struct LineRun line04 =
4065     {
4066       {28u, 14u},
4067       {28u, 14u},
4068       63.f,
4069       15.f,
4070       -5.f,
4071       4.f,
4072       0.f,
4073       0.f,
4074       false,
4075       false};
4076   struct LineRun line05 =
4077     {
4078       {42u, 12u},
4079       {42u, 12u},
4080       79.f,
4081       15.f,
4082       -5.f,
4083       4.f,
4084       0.f,
4085       0.f,
4086       false,
4087       false};
4088   struct LineRun line06 =
4089     {
4090       {54u, 10u},
4091       {54u, 10u},
4092       70.f,
4093       15.f,
4094       -5.f,
4095       0.f,
4096       0.f,
4097       0.f,
4098       false,
4099       false};
4100   struct LineRun line07 =
4101     {
4102       {64u, 10u},
4103       {64u, 10u},
4104       70.f,
4105       15.f,
4106       -5.f,
4107       5.f,
4108       0.f,
4109       0.f,
4110       false,
4111       false};
4112   struct LineRun line08 =
4113     {
4114       {74u, 12u},
4115       {74u, 12u},
4116       79.f,
4117       15.f,
4118       -5.f,
4119       4.f,
4120       1.f,
4121       0.f,
4122       false,
4123       false};
4124   struct LineRun line09 =
4125     {
4126       {86u, 6u},
4127       {86u, 6u},
4128       45.f,
4129       15.f,
4130       -5.f,
4131       0.f,
4132       0.f,
4133       0.f,
4134       false,
4135       false};
4136   struct LineRun line10 =
4137     {
4138       {92u, 12u},
4139       {92u, 12u},
4140       79.f,
4141       15.f,
4142       -5.f,
4143       4.f,
4144       0.f,
4145       0.f,
4146       false,
4147       false};
4148   struct LineRun line11 =
4149     {
4150       {104u, 19u},
4151       {104u, 19u},
4152       100.f,
4153       15.f,
4154       -5.f,
4155       5.f,
4156       0.f,
4157       0.f,
4158       false,
4159       false};
4160   struct LineRun line12 =
4161     {
4162       {123u, 5u},
4163       {123u, 5u},
4164       32.f,
4165       15.f,
4166       -5.f,
4167       0.f,
4168       0.f,
4169       0.f,
4170       false,
4171       false};
4172   struct LineRun line13 =
4173     {
4174       {128u, 12u},
4175       {128u, 12u},
4176       81.f,
4177       15.f,
4178       -5.f,
4179       4.f,
4180       0.f,
4181       0.f,
4182       false,
4183       false};
4184   struct LineRun line14 =
4185     {
4186       {140u, 10u},
4187       {140u, 10u},
4188       79.f,
4189       15.f,
4190       -5.f,
4191       5.f,
4192       0.f,
4193       0.f,
4194       false,
4195       false};
4196   struct LineRun line15 =
4197     {
4198       {150u, 6u},
4199       {150u, 6u},
4200       35.f,
4201       15.f,
4202       -5.f,
4203       0.f,
4204       0.f,
4205       0.f,
4206       false,
4207       false};
4208   struct LineRun line16 =
4209     {
4210       {156u, 10u},
4211       {156u, 10u},
4212       70.f,
4213       15.f,
4214       -5.f,
4215       5.f,
4216       0.f,
4217       0.f,
4218       false,
4219       false};
4220   struct LineRun line17 =
4221     {
4222       {166u, 12u},
4223       {166u, 12u},
4224       79.f,
4225       15.f,
4226       -5.f,
4227       4.f,
4228       0.f,
4229       0.f,
4230       false,
4231       false};
4232   struct LineRun line18 =
4233     {
4234       {178u, 14u},
4235       {178u, 14u},
4236       63.f,
4237       15.f,
4238       -5.f,
4239       0.f,
4240       0.f,
4241       0.f,
4242       false,
4243       false};
4244   struct LineRun line19 =
4245     {
4246       {192u, 0u},
4247       {192u, 0u},
4248       0.f,
4249       15.f,
4250       -5.f,
4251       0.f,
4252       0.f,
4253       0.f,
4254       false,
4255       false};
4256   Vector<LineRun> lines;
4257   lines.PushBack(line01);
4258   lines.PushBack(line02);
4259   lines.PushBack(line03);
4260   lines.PushBack(line04);
4261   lines.PushBack(line05);
4262   lines.PushBack(line06);
4263   lines.PushBack(line07);
4264   lines.PushBack(line08);
4265   lines.PushBack(line09);
4266   lines.PushBack(line10);
4267   lines.PushBack(line11);
4268   lines.PushBack(line12);
4269   lines.PushBack(line13);
4270   lines.PushBack(line14);
4271   lines.PushBack(line15);
4272   lines.PushBack(line16);
4273   lines.PushBack(line17);
4274   lines.PushBack(line18);
4275   lines.PushBack(line19);
4276
4277   LayoutTextData data =
4278     {
4279       "Layout bidirectional text.",
4280       "Hello world demo שלום עולם.\n"
4281       "مرحبا بالعالم hello world שלום עולם\n"
4282       "שלום עולם hello world demo.\n"
4283       "hello world مرحبا بالعالم שלום עולם\n"
4284       "Hello world demo שלום עולם.\n"
4285       "שלום עולם hello world مرحبا بالعالم\n",
4286       textArea,
4287       17u,
4288       fontDescriptionRuns.Begin(),
4289       layoutSize,
4290       192u,
4291       positions,
4292       19u,
4293       lines.Begin(),
4294       Layout::Engine::MULTI_LINE_BOX,
4295       128u,
4296       64u,
4297       false,
4298       DevelText::EllipsisPosition::END,
4299       true};
4300
4301   if(!LayoutTextTest(data))
4302   {
4303     tet_result(TET_FAIL);
4304   }
4305
4306   tet_result(TET_PASS);
4307   END_TEST;
4308 }
4309
4310 int UtcDaliTextLayoutEllipsis01(void)
4311 {
4312   ToolkitTestApplication application;
4313   tet_infoline(" UtcDaliTextLayoutEllipsis01");
4314
4315   // Layout single-line LTR text with ellipsis.
4316
4317   const std::string fontLatin("TizenSans");
4318
4319   // Set a known font description
4320   FontDescriptionRun fontDescriptionRun01;
4321   fontDescriptionRun01.characterRun.characterIndex     = 0u;
4322   fontDescriptionRun01.characterRun.numberOfCharacters = 51u;
4323   fontDescriptionRun01.familyLength                    = fontLatin.size();
4324   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
4325   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
4326   fontDescriptionRun01.familyDefined = true;
4327   fontDescriptionRun01.weightDefined = false;
4328   fontDescriptionRun01.widthDefined  = false;
4329   fontDescriptionRun01.slantDefined  = false;
4330   fontDescriptionRun01.sizeDefined   = false;
4331
4332   Vector<FontDescriptionRun> fontDescriptionRuns;
4333   fontDescriptionRuns.PushBack(fontDescriptionRun01);
4334
4335   struct LineRun line01 =
4336     {
4337       {0u, 13u},
4338       {0u, 13u},
4339       93.f,
4340       15.f,
4341       -5.f,
4342       0.f,
4343       0.f,
4344       0.f,
4345       false,
4346       true};
4347   Vector<LineRun> lines;
4348   lines.PushBack(line01);
4349
4350   float positions[] =
4351     {
4352       0.f,
4353       -12.f,
4354       10.f,
4355       -9.f,
4356       20.f,
4357       -13.f,
4358       24.f,
4359       -13.f,
4360       27.f,
4361       -9.f,
4362       36.f,
4363       -0.f,
4364       40.f,
4365       -9.f,
4366       52.f,
4367       -9.f,
4368       62.f,
4369       -9.f,
4370       69.f,
4371       -13.f,
4372       72.f,
4373       -13.f,
4374       81.f,
4375       -0.f,
4376       85.f,
4377       -13.f,
4378     };
4379
4380   Size textArea(100.f, 50.f);
4381   Size layoutSize(100.f, 20.f);
4382
4383   LayoutTextData data =
4384     {
4385       "Layout single-line LTR text with ellipsis.",
4386       "Hello world demo hello world demo hello world demo.",
4387       textArea,
4388       1u,
4389       fontDescriptionRuns.Begin(),
4390       layoutSize,
4391       13u,
4392       positions,
4393       1u,
4394       lines.Begin(),
4395       Layout::Engine::SINGLE_LINE_BOX,
4396       0u,
4397       51u,
4398       true,
4399       DevelText::EllipsisPosition::END,
4400       true};
4401
4402   if(!LayoutTextTest(data))
4403   {
4404     tet_result(TET_FAIL);
4405   }
4406
4407   tet_result(TET_PASS);
4408   END_TEST;
4409 }
4410
4411 int UtcDaliTextLayoutEllipsis02(void)
4412 {
4413   ToolkitTestApplication application;
4414   tet_infoline(" UtcDaliTextLayoutEllipsis02");
4415
4416   // Layout multi-line LTR text with ellipsis.
4417
4418   const std::string fontLatin("TizenSans");
4419
4420   // Set a known font description
4421   FontDescriptionRun fontDescriptionRun01;
4422   fontDescriptionRun01.characterRun.characterIndex     = 0u;
4423   fontDescriptionRun01.characterRun.numberOfCharacters = 51u;
4424   fontDescriptionRun01.familyLength                    = fontLatin.size();
4425   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
4426   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
4427   fontDescriptionRun01.familyDefined = true;
4428   fontDescriptionRun01.weightDefined = false;
4429   fontDescriptionRun01.widthDefined  = false;
4430   fontDescriptionRun01.slantDefined  = false;
4431   fontDescriptionRun01.sizeDefined   = false;
4432
4433   Vector<FontDescriptionRun> fontDescriptionRuns;
4434   fontDescriptionRuns.PushBack(fontDescriptionRun01);
4435
4436   struct LineRun line01 =
4437     {
4438       {0u, 12u},
4439       {0u, 12u},
4440       81.f,
4441       15.f,
4442       -5.f,
4443       4.f,
4444       0.f,
4445       0.f,
4446       false,
4447       false};
4448   struct LineRun line02 =
4449     {
4450       {12u, 12u},
4451       {12u, 12u},
4452       95.f,
4453       15.f,
4454       -5.f,
4455       0.f,
4456       0.f,
4457       0.f,
4458       false,
4459       true};
4460   Vector<LineRun> lines;
4461   lines.PushBack(line01);
4462   lines.PushBack(line02);
4463
4464   float positions[] =
4465     {
4466       0.f,
4467       -12.f,
4468       10.f,
4469       -9.f,
4470       20.f,
4471       -13.f,
4472       24.f,
4473       -13.f,
4474       27.f,
4475       -9.f,
4476       36.f,
4477       -0.f,
4478       40.f,
4479       -9.f,
4480       52.f,
4481       -9.f,
4482       62.f,
4483       -9.f,
4484       69.f,
4485       -13.f,
4486       72.f,
4487       -13.f,
4488       81.f,
4489       -0.f,
4490       0.f,
4491       -13.f,
4492       9.f,
4493       -9.f,
4494       19.f,
4495       -9.f,
4496       32.f,
4497       -9.f,
4498       41.f,
4499       -0.f,
4500       46.f,
4501       -13.f,
4502       54.f,
4503       -9.f,
4504       64.f,
4505       -13.f,
4506       68.f,
4507       -13.f,
4508       71.f,
4509       -9.f,
4510       80.f,
4511       -0.f,
4512       84.f,
4513       -9.f,
4514     };
4515
4516   Size textArea(100.f, 50.f);
4517   Size layoutSize(100.f, 40.f);
4518
4519   LayoutTextData data =
4520     {
4521       "Layout multi-line LTR text with ellipsis.",
4522       "Hello world demo hello world demo hello world demo.",
4523       textArea,
4524       1u,
4525       fontDescriptionRuns.Begin(),
4526       layoutSize,
4527       24u,
4528       positions,
4529       2u,
4530       lines.Begin(),
4531       Layout::Engine::MULTI_LINE_BOX,
4532       0u,
4533       51u,
4534       true,
4535       DevelText::EllipsisPosition::END,
4536       true};
4537
4538   if(!LayoutTextTest(data))
4539   {
4540     tet_result(TET_FAIL);
4541   }
4542
4543   tet_result(TET_PASS);
4544   END_TEST;
4545 }
4546
4547 int UtcDaliTextLayoutEllipsis03(void)
4548 {
4549   ToolkitTestApplication application;
4550   tet_infoline(" UtcDaliTextLayoutEllipsis03");
4551
4552   // Layout single-line RTL text with ellipsis.
4553
4554   const std::string fontHebrew("TizenSansHebrew");
4555   const std::string fontArabic("TizenSansArabic");
4556
4557   // Set a known font description
4558   FontDescriptionRun fontDescriptionRun01;
4559   fontDescriptionRun01.characterRun.characterIndex     = 0u;
4560   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
4561   fontDescriptionRun01.familyLength                    = fontHebrew.size();
4562   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
4563   memcpy(fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength);
4564   fontDescriptionRun01.familyDefined = true;
4565   fontDescriptionRun01.weightDefined = false;
4566   fontDescriptionRun01.widthDefined  = false;
4567   fontDescriptionRun01.slantDefined  = false;
4568   fontDescriptionRun01.sizeDefined   = false;
4569
4570   FontDescriptionRun fontDescriptionRun02;
4571   fontDescriptionRun02.characterRun.characterIndex     = 10u;
4572   fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
4573   fontDescriptionRun02.familyLength                    = fontArabic.size();
4574   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
4575   memcpy(fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength);
4576   fontDescriptionRun02.familyDefined = true;
4577   fontDescriptionRun02.weightDefined = false;
4578   fontDescriptionRun02.widthDefined  = false;
4579   fontDescriptionRun02.slantDefined  = false;
4580   fontDescriptionRun02.sizeDefined   = false;
4581
4582   FontDescriptionRun fontDescriptionRun03;
4583   fontDescriptionRun03.characterRun.characterIndex     = 24u;
4584   fontDescriptionRun03.characterRun.numberOfCharacters = 10u;
4585   fontDescriptionRun03.familyLength                    = fontHebrew.size();
4586   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
4587   memcpy(fontDescriptionRun03.familyName, fontHebrew.c_str(), fontDescriptionRun03.familyLength);
4588   fontDescriptionRun03.familyDefined = true;
4589   fontDescriptionRun03.weightDefined = false;
4590   fontDescriptionRun03.widthDefined  = false;
4591   fontDescriptionRun03.slantDefined  = false;
4592   fontDescriptionRun03.sizeDefined   = false;
4593
4594   FontDescriptionRun fontDescriptionRun04;
4595   fontDescriptionRun04.characterRun.characterIndex     = 34u;
4596   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
4597   fontDescriptionRun04.familyLength                    = fontArabic.size();
4598   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
4599   memcpy(fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength);
4600   fontDescriptionRun04.familyDefined = true;
4601   fontDescriptionRun04.weightDefined = false;
4602   fontDescriptionRun04.widthDefined  = false;
4603   fontDescriptionRun04.slantDefined  = false;
4604   fontDescriptionRun04.sizeDefined   = false;
4605
4606   FontDescriptionRun fontDescriptionRun05;
4607   fontDescriptionRun05.characterRun.characterIndex     = 48u;
4608   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
4609   fontDescriptionRun05.familyLength                    = fontHebrew.size();
4610   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
4611   memcpy(fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength);
4612   fontDescriptionRun05.familyDefined = true;
4613   fontDescriptionRun05.weightDefined = false;
4614   fontDescriptionRun05.widthDefined  = false;
4615   fontDescriptionRun05.slantDefined  = false;
4616   fontDescriptionRun05.sizeDefined   = false;
4617
4618   FontDescriptionRun fontDescriptionRun06;
4619   fontDescriptionRun06.characterRun.characterIndex     = 58u;
4620   fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
4621   fontDescriptionRun06.familyLength                    = fontArabic.size();
4622   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
4623   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
4624   fontDescriptionRun06.familyDefined = true;
4625   fontDescriptionRun06.weightDefined = false;
4626   fontDescriptionRun06.widthDefined  = false;
4627   fontDescriptionRun06.slantDefined  = false;
4628   fontDescriptionRun06.sizeDefined   = false;
4629
4630   Vector<FontDescriptionRun> fontDescriptionRuns;
4631   fontDescriptionRuns.PushBack(fontDescriptionRun01);
4632   fontDescriptionRuns.PushBack(fontDescriptionRun02);
4633   fontDescriptionRuns.PushBack(fontDescriptionRun03);
4634   fontDescriptionRuns.PushBack(fontDescriptionRun04);
4635   fontDescriptionRuns.PushBack(fontDescriptionRun05);
4636   fontDescriptionRuns.PushBack(fontDescriptionRun06);
4637
4638   struct LineRun line01 =
4639     {
4640       {0u, 14u},
4641       {0u, 14u},
4642       98.f,
4643       15.f,
4644       -5.f,
4645       0.f,
4646       0.f,
4647       0.f,
4648       false,
4649       true};
4650   Vector<LineRun> lines;
4651   lines.PushBack(line01);
4652
4653   float positions[] =
4654     {
4655       87.f,
4656       -10.f,
4657       79.f,
4658       -13.f,
4659       74.f,
4660       -10.f,
4661       65.f,
4662       -10.f,
4663       60.f,
4664       -0.f,
4665       51.f,
4666       -10.f,
4667       47.f,
4668       -10.f,
4669       38.f,
4670       -13.f,
4671       29.f,
4672       -10.f,
4673       24.f,
4674       -0.f,
4675       17.f,
4676       -8.f,
4677       12.f,
4678       -6.f,
4679       4.f,
4680       -8.f,
4681       0.f,
4682       -7.f,
4683       78.f,
4684       -11.f,
4685       73.f,
4686       -0.f,
4687     };
4688
4689   Size textArea(100.f, 50.f);
4690   Size layoutSize(100.f, 20.f);
4691
4692   LayoutTextData data =
4693     {
4694       "Layout single-line RTL text with ellipsis.",
4695       "שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم.",
4696       textArea,
4697       6u,
4698       fontDescriptionRuns.Begin(),
4699       layoutSize,
4700       16u,
4701       positions,
4702       1u,
4703       lines.Begin(),
4704       Layout::Engine::SINGLE_LINE_BOX,
4705       0u,
4706       72u,
4707       true,
4708       DevelText::EllipsisPosition::END,
4709       true};
4710
4711   if(!LayoutTextTest(data))
4712   {
4713     tet_result(TET_FAIL);
4714   }
4715
4716   tet_result(TET_PASS);
4717   END_TEST;
4718 }
4719
4720 int UtcDaliTextLayoutEllipsis04(void)
4721 {
4722   ToolkitTestApplication application;
4723   tet_infoline(" UtcDaliTextLayoutEllipsis04");
4724
4725   // Layout multi-line RTL text with ellipsis.
4726
4727   const std::string fontHebrew("TizenSansHebrew");
4728   const std::string fontArabic("TizenSansArabic");
4729
4730   // Set a known font description
4731   FontDescriptionRun fontDescriptionRun01;
4732   fontDescriptionRun01.characterRun.characterIndex     = 0u;
4733   fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
4734   fontDescriptionRun01.familyLength                    = fontHebrew.size();
4735   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
4736   memcpy(fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength);
4737   fontDescriptionRun01.familyDefined = true;
4738   fontDescriptionRun01.weightDefined = false;
4739   fontDescriptionRun01.widthDefined  = false;
4740   fontDescriptionRun01.slantDefined  = false;
4741   fontDescriptionRun01.sizeDefined   = false;
4742
4743   FontDescriptionRun fontDescriptionRun02;
4744   fontDescriptionRun02.characterRun.characterIndex     = 10u;
4745   fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
4746   fontDescriptionRun02.familyLength                    = fontArabic.size();
4747   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
4748   memcpy(fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength);
4749   fontDescriptionRun02.familyDefined = true;
4750   fontDescriptionRun02.weightDefined = false;
4751   fontDescriptionRun02.widthDefined  = false;
4752   fontDescriptionRun02.slantDefined  = false;
4753   fontDescriptionRun02.sizeDefined   = false;
4754
4755   FontDescriptionRun fontDescriptionRun03;
4756   fontDescriptionRun03.characterRun.characterIndex     = 24u;
4757   fontDescriptionRun03.characterRun.numberOfCharacters = 10u;
4758   fontDescriptionRun03.familyLength                    = fontHebrew.size();
4759   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
4760   memcpy(fontDescriptionRun03.familyName, fontHebrew.c_str(), fontDescriptionRun03.familyLength);
4761   fontDescriptionRun03.familyDefined = true;
4762   fontDescriptionRun03.weightDefined = false;
4763   fontDescriptionRun03.widthDefined  = false;
4764   fontDescriptionRun03.slantDefined  = false;
4765   fontDescriptionRun03.sizeDefined   = false;
4766
4767   FontDescriptionRun fontDescriptionRun04;
4768   fontDescriptionRun04.characterRun.characterIndex     = 34u;
4769   fontDescriptionRun04.characterRun.numberOfCharacters = 14u;
4770   fontDescriptionRun04.familyLength                    = fontArabic.size();
4771   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
4772   memcpy(fontDescriptionRun04.familyName, fontArabic.c_str(), fontDescriptionRun04.familyLength);
4773   fontDescriptionRun04.familyDefined = true;
4774   fontDescriptionRun04.weightDefined = false;
4775   fontDescriptionRun04.widthDefined  = false;
4776   fontDescriptionRun04.slantDefined  = false;
4777   fontDescriptionRun04.sizeDefined   = false;
4778
4779   FontDescriptionRun fontDescriptionRun05;
4780   fontDescriptionRun05.characterRun.characterIndex     = 48u;
4781   fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
4782   fontDescriptionRun05.familyLength                    = fontHebrew.size();
4783   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
4784   memcpy(fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength);
4785   fontDescriptionRun05.familyDefined = true;
4786   fontDescriptionRun05.weightDefined = false;
4787   fontDescriptionRun05.widthDefined  = false;
4788   fontDescriptionRun05.slantDefined  = false;
4789   fontDescriptionRun05.sizeDefined   = false;
4790
4791   FontDescriptionRun fontDescriptionRun06;
4792   fontDescriptionRun06.characterRun.characterIndex     = 58u;
4793   fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
4794   fontDescriptionRun06.familyLength                    = fontArabic.size();
4795   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
4796   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
4797   fontDescriptionRun06.familyDefined = true;
4798   fontDescriptionRun06.weightDefined = false;
4799   fontDescriptionRun06.widthDefined  = false;
4800   fontDescriptionRun06.slantDefined  = false;
4801   fontDescriptionRun06.sizeDefined   = false;
4802
4803   Vector<FontDescriptionRun> fontDescriptionRuns;
4804   fontDescriptionRuns.PushBack(fontDescriptionRun01);
4805   fontDescriptionRuns.PushBack(fontDescriptionRun02);
4806   fontDescriptionRuns.PushBack(fontDescriptionRun03);
4807   fontDescriptionRuns.PushBack(fontDescriptionRun04);
4808   fontDescriptionRuns.PushBack(fontDescriptionRun05);
4809   fontDescriptionRuns.PushBack(fontDescriptionRun06);
4810
4811   struct LineRun line01 =
4812     {
4813       {0u, 10u},
4814       {0u, 10u},
4815       70.f,
4816       15.f,
4817       -5.f,
4818       5.f,
4819       0.f,
4820       0.f,
4821       false,
4822       false};
4823   struct LineRun line02 =
4824     {
4825       {10u, 19u},
4826       {10u, 19u},
4827       99.f,
4828       15.f,
4829       -5.f,
4830       5.f,
4831       0.f,
4832       0.f,
4833       false,
4834       true};
4835   Vector<LineRun> lines;
4836   lines.PushBack(line01);
4837   lines.PushBack(line02);
4838
4839   float positions[] =
4840     {
4841       63.f,
4842       -10.f,
4843       54.f,
4844       -13.f,
4845       50.f,
4846       -10.f,
4847       41.f,
4848       -10.f,
4849       36.f,
4850       -0.f,
4851       27.f,
4852       -10.f,
4853       23.f,
4854       -10.f,
4855       14.f,
4856       -13.f,
4857       4.f,
4858       -10.f,
4859       0.f,
4860       -0.f,
4861       96.f,
4862       -8.f,
4863       91.f,
4864       -6.f,
4865       83.f,
4866       -8.f,
4867       79.f,
4868       -7.f,
4869       78.f,
4870       -11.f,
4871       73.f,
4872       -0.f,
4873       68.f,
4874       -7.f,
4875       67.f,
4876       -11.f,
4877       61.f,
4878       -11.f,
4879       55.f,
4880       -8.f,
4881       53.f,
4882       -11.f,
4883       47.f,
4884       -11.f,
4885       42.f,
4886       -8.f,
4887       38.f,
4888       -0.f,
4889       27.f,
4890       -10.f,
4891       18.f,
4892       -13.f,
4893       14.f,
4894       -10.f,
4895       4.f,
4896       -10.f,
4897       0.f,
4898       -0.f,
4899       92.f,
4900       -10.f,
4901       88.f,
4902       -10.f,
4903       79.f,
4904       -13.f,
4905       70.f,
4906       -10.f,
4907       65.f,
4908       -0.f,
4909     };
4910
4911   Size textArea(100.f, 50.f);
4912   Size layoutSize(100.f, 40.f);
4913
4914   LayoutTextData data =
4915     {
4916       "Layout multi-line RTL text with ellipsis.",
4917       "שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم.",
4918       textArea,
4919       6u,
4920       fontDescriptionRuns.Begin(),
4921       layoutSize,
4922       34u,
4923       positions,
4924       2u,
4925       lines.Begin(),
4926       Layout::Engine::MULTI_LINE_BOX,
4927       0u,
4928       72u,
4929       true,
4930       DevelText::EllipsisPosition::END,
4931       true};
4932
4933   if(!LayoutTextTest(data))
4934   {
4935     tet_result(TET_FAIL);
4936   }
4937
4938   tet_result(TET_PASS);
4939   END_TEST;
4940 }
4941
4942 int UtcDaliTextLayoutEllipsis05(void)
4943 {
4944   ToolkitTestApplication application;
4945   tet_infoline(" UtcDaliTextLayoutEllipsis05");
4946
4947   const std::string fontLatin("TizenSans");
4948
4949   // Set a known font description
4950   FontDescriptionRun fontDescriptionRun01;
4951   fontDescriptionRun01.characterRun.characterIndex     = 0u;
4952   fontDescriptionRun01.characterRun.numberOfCharacters = 51u;
4953   fontDescriptionRun01.familyLength                    = fontLatin.size();
4954   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
4955   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
4956   fontDescriptionRun01.familyDefined = true;
4957   fontDescriptionRun01.weightDefined = false;
4958   fontDescriptionRun01.widthDefined  = false;
4959   fontDescriptionRun01.slantDefined  = false;
4960   fontDescriptionRun01.sizeDefined   = false;
4961
4962   Vector<FontDescriptionRun> fontDescriptionRuns;
4963   fontDescriptionRuns.PushBack(fontDescriptionRun01);
4964
4965   struct LineRun line01 =
4966     {
4967       {0u, 11u},
4968       {0u, 11u},
4969       80.f,
4970       15.f,
4971       -5.f,
4972       0.f,
4973       0.f,
4974       0.f,
4975       false,
4976       true};
4977   Vector<LineRun> lines;
4978   lines.PushBack(line01);
4979
4980   float positions[] =
4981     {
4982       0.f, -12.f};
4983
4984   Size textArea(100.f, 19.f);
4985   Size layoutSize(100.f, 20.f);
4986
4987   LayoutTextData data =
4988     {
4989       "Not enough height.",
4990       "Hello world",
4991       textArea,
4992       1u,
4993       fontDescriptionRuns.Begin(),
4994       layoutSize,
4995       1u,
4996       positions,
4997       1u,
4998       lines.Begin(),
4999       Layout::Engine::MULTI_LINE_BOX,
5000       0u,
5001       11u,
5002       true,
5003       DevelText::EllipsisPosition::END,
5004       true};
5005
5006   if(!LayoutTextTest(data))
5007   {
5008     tet_result(TET_FAIL);
5009   }
5010
5011   tet_result(TET_PASS);
5012   END_TEST;
5013 }
5014
5015 int UtcDaliTextAlign01(void)
5016 {
5017   ToolkitTestApplication application;
5018   tet_infoline(" UtcDaliTextAlign01");
5019
5020   // Calculate text alignment.
5021
5022   const std::string fontLatin("TizenSans");
5023   const std::string fontHebrew("TizenSansHebrew");
5024   const std::string fontArabic("TizenSansArabic");
5025
5026   // Set a known font description
5027   FontDescriptionRun fontDescriptionRun01;
5028   fontDescriptionRun01.characterRun.characterIndex     = 0u;
5029   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
5030   fontDescriptionRun01.familyLength                    = fontLatin.size();
5031   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
5032   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
5033   fontDescriptionRun01.familyDefined = true;
5034   fontDescriptionRun01.weightDefined = false;
5035   fontDescriptionRun01.widthDefined  = false;
5036   fontDescriptionRun01.slantDefined  = false;
5037   fontDescriptionRun01.sizeDefined   = false;
5038
5039   FontDescriptionRun fontDescriptionRun02;
5040   fontDescriptionRun02.characterRun.characterIndex     = 12u;
5041   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
5042   fontDescriptionRun02.familyLength                    = fontHebrew.size();
5043   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
5044   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
5045   fontDescriptionRun02.familyDefined = true;
5046   fontDescriptionRun02.weightDefined = false;
5047   fontDescriptionRun02.widthDefined  = false;
5048   fontDescriptionRun02.slantDefined  = false;
5049   fontDescriptionRun02.sizeDefined   = false;
5050
5051   FontDescriptionRun fontDescriptionRun03;
5052   fontDescriptionRun03.characterRun.characterIndex     = 22u;
5053   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
5054   fontDescriptionRun03.familyLength                    = fontArabic.size();
5055   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
5056   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
5057   fontDescriptionRun03.familyDefined = true;
5058   fontDescriptionRun03.weightDefined = false;
5059   fontDescriptionRun03.widthDefined  = false;
5060   fontDescriptionRun03.slantDefined  = false;
5061   fontDescriptionRun03.sizeDefined   = false;
5062
5063   FontDescriptionRun fontDescriptionRun04;
5064   fontDescriptionRun04.characterRun.characterIndex     = 36u;
5065   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
5066   fontDescriptionRun04.familyLength                    = fontLatin.size();
5067   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
5068   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
5069   fontDescriptionRun04.familyDefined = true;
5070   fontDescriptionRun04.weightDefined = false;
5071   fontDescriptionRun04.widthDefined  = false;
5072   fontDescriptionRun04.slantDefined  = false;
5073   fontDescriptionRun04.sizeDefined   = false;
5074
5075   FontDescriptionRun fontDescriptionRun05;
5076   fontDescriptionRun05.characterRun.characterIndex     = 48u;
5077   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
5078   fontDescriptionRun05.familyLength                    = fontLatin.size();
5079   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
5080   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
5081   fontDescriptionRun05.familyDefined = true;
5082   fontDescriptionRun05.weightDefined = false;
5083   fontDescriptionRun05.widthDefined  = false;
5084   fontDescriptionRun05.slantDefined  = false;
5085   fontDescriptionRun05.sizeDefined   = false;
5086
5087   FontDescriptionRun fontDescriptionRun06;
5088   fontDescriptionRun06.characterRun.characterIndex     = 60u;
5089   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
5090   fontDescriptionRun06.familyLength                    = fontArabic.size();
5091   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
5092   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
5093   fontDescriptionRun06.familyDefined = true;
5094   fontDescriptionRun06.weightDefined = false;
5095   fontDescriptionRun06.widthDefined  = false;
5096   fontDescriptionRun06.slantDefined  = false;
5097   fontDescriptionRun06.sizeDefined   = false;
5098
5099   Vector<FontDescriptionRun> fontDescriptionRuns;
5100   fontDescriptionRuns.PushBack(fontDescriptionRun01);
5101   fontDescriptionRuns.PushBack(fontDescriptionRun02);
5102   fontDescriptionRuns.PushBack(fontDescriptionRun03);
5103   fontDescriptionRuns.PushBack(fontDescriptionRun04);
5104   fontDescriptionRuns.PushBack(fontDescriptionRun05);
5105   fontDescriptionRuns.PushBack(fontDescriptionRun06);
5106
5107   float positions[] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
5108
5109   Size      textArea(100.f, 300.f);
5110   AlignData data =
5111     {
5112       "Begin alignment for the first paragraph.",
5113       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
5114       textArea,
5115       6u,
5116       fontDescriptionRuns.Begin(),
5117       Text::HorizontalAlignment::BEGIN,
5118       Text::VerticalAlignment::TOP,
5119       0u,
5120       22u,
5121       6u,
5122       positions,
5123       Dali::LayoutDirection::LEFT_TO_RIGHT,
5124       false};
5125
5126   if(!AlignTest(data))
5127   {
5128     tet_result(TET_FAIL);
5129   }
5130
5131   tet_result(TET_PASS);
5132   END_TEST;
5133 }
5134
5135 int UtcDaliTextAlign02(void)
5136 {
5137   ToolkitTestApplication application;
5138   tet_infoline(" UtcDaliTextAlign02");
5139
5140   // Calculate text alignment.
5141
5142   const std::string fontLatin("TizenSans");
5143   const std::string fontHebrew("TizenSansHebrew");
5144   const std::string fontArabic("TizenSansArabic");
5145
5146   // Set a known font description
5147   FontDescriptionRun fontDescriptionRun01;
5148   fontDescriptionRun01.characterRun.characterIndex     = 0u;
5149   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
5150   fontDescriptionRun01.familyLength                    = fontLatin.size();
5151   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
5152   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
5153   fontDescriptionRun01.familyDefined = true;
5154   fontDescriptionRun01.weightDefined = false;
5155   fontDescriptionRun01.widthDefined  = false;
5156   fontDescriptionRun01.slantDefined  = false;
5157   fontDescriptionRun01.sizeDefined   = false;
5158
5159   FontDescriptionRun fontDescriptionRun02;
5160   fontDescriptionRun02.characterRun.characterIndex     = 12u;
5161   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
5162   fontDescriptionRun02.familyLength                    = fontHebrew.size();
5163   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
5164   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
5165   fontDescriptionRun02.familyDefined = true;
5166   fontDescriptionRun02.weightDefined = false;
5167   fontDescriptionRun02.widthDefined  = false;
5168   fontDescriptionRun02.slantDefined  = false;
5169   fontDescriptionRun02.sizeDefined   = false;
5170
5171   FontDescriptionRun fontDescriptionRun03;
5172   fontDescriptionRun03.characterRun.characterIndex     = 22u;
5173   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
5174   fontDescriptionRun03.familyLength                    = fontArabic.size();
5175   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
5176   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
5177   fontDescriptionRun03.familyDefined = true;
5178   fontDescriptionRun03.weightDefined = false;
5179   fontDescriptionRun03.widthDefined  = false;
5180   fontDescriptionRun03.slantDefined  = false;
5181   fontDescriptionRun03.sizeDefined   = false;
5182
5183   FontDescriptionRun fontDescriptionRun04;
5184   fontDescriptionRun04.characterRun.characterIndex     = 36u;
5185   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
5186   fontDescriptionRun04.familyLength                    = fontLatin.size();
5187   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
5188   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
5189   fontDescriptionRun04.familyDefined = true;
5190   fontDescriptionRun04.weightDefined = false;
5191   fontDescriptionRun04.widthDefined  = false;
5192   fontDescriptionRun04.slantDefined  = false;
5193   fontDescriptionRun04.sizeDefined   = false;
5194
5195   FontDescriptionRun fontDescriptionRun05;
5196   fontDescriptionRun05.characterRun.characterIndex     = 48u;
5197   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
5198   fontDescriptionRun05.familyLength                    = fontLatin.size();
5199   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
5200   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
5201   fontDescriptionRun05.familyDefined = true;
5202   fontDescriptionRun05.weightDefined = false;
5203   fontDescriptionRun05.widthDefined  = false;
5204   fontDescriptionRun05.slantDefined  = false;
5205   fontDescriptionRun05.sizeDefined   = false;
5206
5207   FontDescriptionRun fontDescriptionRun06;
5208   fontDescriptionRun06.characterRun.characterIndex     = 60u;
5209   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
5210   fontDescriptionRun06.familyLength                    = fontArabic.size();
5211   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
5212   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
5213   fontDescriptionRun06.familyDefined = true;
5214   fontDescriptionRun06.weightDefined = false;
5215   fontDescriptionRun06.widthDefined  = false;
5216   fontDescriptionRun06.slantDefined  = false;
5217   fontDescriptionRun06.sizeDefined   = false;
5218
5219   Vector<FontDescriptionRun> fontDescriptionRuns;
5220   fontDescriptionRuns.PushBack(fontDescriptionRun01);
5221   fontDescriptionRuns.PushBack(fontDescriptionRun02);
5222   fontDescriptionRuns.PushBack(fontDescriptionRun03);
5223   fontDescriptionRuns.PushBack(fontDescriptionRun04);
5224   fontDescriptionRuns.PushBack(fontDescriptionRun05);
5225   fontDescriptionRuns.PushBack(fontDescriptionRun06);
5226
5227   float positions[] = {0.f, 0.f, 33.f, 19.f, 0.f, 0.f};
5228
5229   Size      textArea(100.f, 300.f);
5230   AlignData data =
5231     {
5232       "Begin alignment for the mid paragraph.",
5233       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
5234       textArea,
5235       6u,
5236       fontDescriptionRuns.Begin(),
5237       Text::HorizontalAlignment::BEGIN,
5238       Text::VerticalAlignment::TOP,
5239       22u,
5240       26u,
5241       6u,
5242       positions,
5243       Dali::LayoutDirection::LEFT_TO_RIGHT,
5244       false};
5245
5246   if(!AlignTest(data))
5247   {
5248     tet_result(TET_FAIL);
5249   }
5250
5251   tet_result(TET_PASS);
5252   END_TEST;
5253 }
5254
5255 int UtcDaliTextAlign03(void)
5256 {
5257   ToolkitTestApplication application;
5258   tet_infoline(" UtcDaliTextAlign03");
5259
5260   // Calculate text alignment.
5261
5262   const std::string fontLatin("TizenSans");
5263   const std::string fontHebrew("TizenSansHebrew");
5264   const std::string fontArabic("TizenSansArabic");
5265
5266   // Set a known font description
5267   FontDescriptionRun fontDescriptionRun01;
5268   fontDescriptionRun01.characterRun.characterIndex     = 0u;
5269   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
5270   fontDescriptionRun01.familyLength                    = fontLatin.size();
5271   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
5272   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
5273   fontDescriptionRun01.familyDefined = true;
5274   fontDescriptionRun01.weightDefined = false;
5275   fontDescriptionRun01.widthDefined  = false;
5276   fontDescriptionRun01.slantDefined  = false;
5277   fontDescriptionRun01.sizeDefined   = false;
5278
5279   FontDescriptionRun fontDescriptionRun02;
5280   fontDescriptionRun02.characterRun.characterIndex     = 12u;
5281   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
5282   fontDescriptionRun02.familyLength                    = fontHebrew.size();
5283   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
5284   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
5285   fontDescriptionRun02.familyDefined = true;
5286   fontDescriptionRun02.weightDefined = false;
5287   fontDescriptionRun02.widthDefined  = false;
5288   fontDescriptionRun02.slantDefined  = false;
5289   fontDescriptionRun02.sizeDefined   = false;
5290
5291   FontDescriptionRun fontDescriptionRun03;
5292   fontDescriptionRun03.characterRun.characterIndex     = 22u;
5293   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
5294   fontDescriptionRun03.familyLength                    = fontArabic.size();
5295   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
5296   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
5297   fontDescriptionRun03.familyDefined = true;
5298   fontDescriptionRun03.weightDefined = false;
5299   fontDescriptionRun03.widthDefined  = false;
5300   fontDescriptionRun03.slantDefined  = false;
5301   fontDescriptionRun03.sizeDefined   = false;
5302
5303   FontDescriptionRun fontDescriptionRun04;
5304   fontDescriptionRun04.characterRun.characterIndex     = 36u;
5305   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
5306   fontDescriptionRun04.familyLength                    = fontLatin.size();
5307   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
5308   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
5309   fontDescriptionRun04.familyDefined = true;
5310   fontDescriptionRun04.weightDefined = false;
5311   fontDescriptionRun04.widthDefined  = false;
5312   fontDescriptionRun04.slantDefined  = false;
5313   fontDescriptionRun04.sizeDefined   = false;
5314
5315   FontDescriptionRun fontDescriptionRun05;
5316   fontDescriptionRun05.characterRun.characterIndex     = 48u;
5317   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
5318   fontDescriptionRun05.familyLength                    = fontLatin.size();
5319   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
5320   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
5321   fontDescriptionRun05.familyDefined = true;
5322   fontDescriptionRun05.weightDefined = false;
5323   fontDescriptionRun05.widthDefined  = false;
5324   fontDescriptionRun05.slantDefined  = false;
5325   fontDescriptionRun05.sizeDefined   = false;
5326
5327   FontDescriptionRun fontDescriptionRun06;
5328   fontDescriptionRun06.characterRun.characterIndex     = 60u;
5329   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
5330   fontDescriptionRun06.familyLength                    = fontArabic.size();
5331   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
5332   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
5333   fontDescriptionRun06.familyDefined = true;
5334   fontDescriptionRun06.weightDefined = false;
5335   fontDescriptionRun06.widthDefined  = false;
5336   fontDescriptionRun06.slantDefined  = false;
5337   fontDescriptionRun06.sizeDefined   = false;
5338
5339   Vector<FontDescriptionRun> fontDescriptionRuns;
5340   fontDescriptionRuns.PushBack(fontDescriptionRun01);
5341   fontDescriptionRuns.PushBack(fontDescriptionRun02);
5342   fontDescriptionRuns.PushBack(fontDescriptionRun03);
5343   fontDescriptionRuns.PushBack(fontDescriptionRun04);
5344   fontDescriptionRuns.PushBack(fontDescriptionRun05);
5345   fontDescriptionRuns.PushBack(fontDescriptionRun06);
5346
5347   float positions[] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
5348
5349   Size      textArea(100.f, 300.f);
5350   AlignData data =
5351     {
5352       "Begin alignment for the last paragraph.",
5353       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
5354       textArea,
5355       6u,
5356       fontDescriptionRuns.Begin(),
5357       Text::HorizontalAlignment::BEGIN,
5358       Text::VerticalAlignment::TOP,
5359       48u,
5360       26u,
5361       6u,
5362       positions,
5363       Dali::LayoutDirection::LEFT_TO_RIGHT,
5364       false};
5365
5366   if(!AlignTest(data))
5367   {
5368     tet_result(TET_FAIL);
5369   }
5370
5371   tet_result(TET_PASS);
5372   END_TEST;
5373 }
5374
5375 int UtcDaliTextAlign04(void)
5376 {
5377   ToolkitTestApplication application;
5378   tet_infoline(" UtcDaliTextAlign04");
5379
5380   // Calculate text alignment.
5381
5382   const std::string fontLatin("TizenSans");
5383   const std::string fontHebrew("TizenSansHebrew");
5384   const std::string fontArabic("TizenSansArabic");
5385
5386   // Set a known font description
5387   FontDescriptionRun fontDescriptionRun01;
5388   fontDescriptionRun01.characterRun.characterIndex     = 0u;
5389   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
5390   fontDescriptionRun01.familyLength                    = fontLatin.size();
5391   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
5392   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
5393   fontDescriptionRun01.familyDefined = true;
5394   fontDescriptionRun01.weightDefined = false;
5395   fontDescriptionRun01.widthDefined  = false;
5396   fontDescriptionRun01.slantDefined  = false;
5397   fontDescriptionRun01.sizeDefined   = false;
5398
5399   FontDescriptionRun fontDescriptionRun02;
5400   fontDescriptionRun02.characterRun.characterIndex     = 12u;
5401   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
5402   fontDescriptionRun02.familyLength                    = fontHebrew.size();
5403   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
5404   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
5405   fontDescriptionRun02.familyDefined = true;
5406   fontDescriptionRun02.weightDefined = false;
5407   fontDescriptionRun02.widthDefined  = false;
5408   fontDescriptionRun02.slantDefined  = false;
5409   fontDescriptionRun02.sizeDefined   = false;
5410
5411   FontDescriptionRun fontDescriptionRun03;
5412   fontDescriptionRun03.characterRun.characterIndex     = 22u;
5413   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
5414   fontDescriptionRun03.familyLength                    = fontArabic.size();
5415   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
5416   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
5417   fontDescriptionRun03.familyDefined = true;
5418   fontDescriptionRun03.weightDefined = false;
5419   fontDescriptionRun03.widthDefined  = false;
5420   fontDescriptionRun03.slantDefined  = false;
5421   fontDescriptionRun03.sizeDefined   = false;
5422
5423   FontDescriptionRun fontDescriptionRun04;
5424   fontDescriptionRun04.characterRun.characterIndex     = 36u;
5425   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
5426   fontDescriptionRun04.familyLength                    = fontLatin.size();
5427   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
5428   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
5429   fontDescriptionRun04.familyDefined = true;
5430   fontDescriptionRun04.weightDefined = false;
5431   fontDescriptionRun04.widthDefined  = false;
5432   fontDescriptionRun04.slantDefined  = false;
5433   fontDescriptionRun04.sizeDefined   = false;
5434
5435   FontDescriptionRun fontDescriptionRun05;
5436   fontDescriptionRun05.characterRun.characterIndex     = 48u;
5437   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
5438   fontDescriptionRun05.familyLength                    = fontLatin.size();
5439   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
5440   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
5441   fontDescriptionRun05.familyDefined = true;
5442   fontDescriptionRun05.weightDefined = false;
5443   fontDescriptionRun05.widthDefined  = false;
5444   fontDescriptionRun05.slantDefined  = false;
5445   fontDescriptionRun05.sizeDefined   = false;
5446
5447   FontDescriptionRun fontDescriptionRun06;
5448   fontDescriptionRun06.characterRun.characterIndex     = 60u;
5449   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
5450   fontDescriptionRun06.familyLength                    = fontArabic.size();
5451   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
5452   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
5453   fontDescriptionRun06.familyDefined = true;
5454   fontDescriptionRun06.weightDefined = false;
5455   fontDescriptionRun06.widthDefined  = false;
5456   fontDescriptionRun06.slantDefined  = false;
5457   fontDescriptionRun06.sizeDefined   = false;
5458
5459   Vector<FontDescriptionRun> fontDescriptionRuns;
5460   fontDescriptionRuns.PushBack(fontDescriptionRun01);
5461   fontDescriptionRuns.PushBack(fontDescriptionRun02);
5462   fontDescriptionRuns.PushBack(fontDescriptionRun03);
5463   fontDescriptionRuns.PushBack(fontDescriptionRun04);
5464   fontDescriptionRuns.PushBack(fontDescriptionRun05);
5465   fontDescriptionRuns.PushBack(fontDescriptionRun06);
5466
5467   float positions[] = {9.f, 15.f, 0.f, 0.f, 0.f, 0.f};
5468
5469   Size      textArea(100.f, 300.f);
5470   AlignData data =
5471     {
5472       "Center alignment for the first paragraph.",
5473       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
5474       textArea,
5475       6u,
5476       fontDescriptionRuns.Begin(),
5477       Text::HorizontalAlignment::CENTER,
5478       Text::VerticalAlignment::TOP,
5479       0u,
5480       22u,
5481       6u,
5482       positions,
5483       Dali::LayoutDirection::LEFT_TO_RIGHT,
5484       false};
5485
5486   if(!AlignTest(data))
5487   {
5488     tet_result(TET_FAIL);
5489   }
5490
5491   tet_result(TET_PASS);
5492   END_TEST;
5493 }
5494
5495 int UtcDaliTextAlign05(void)
5496 {
5497   ToolkitTestApplication application;
5498   tet_infoline(" UtcDaliTextAlign05");
5499
5500   // Calculate text alignment.
5501
5502   const std::string fontLatin("TizenSans");
5503   const std::string fontHebrew("TizenSansHebrew");
5504   const std::string fontArabic("TizenSansArabic");
5505
5506   // Set a known font description
5507   FontDescriptionRun fontDescriptionRun01;
5508   fontDescriptionRun01.characterRun.characterIndex     = 0u;
5509   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
5510   fontDescriptionRun01.familyLength                    = fontLatin.size();
5511   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
5512   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
5513   fontDescriptionRun01.familyDefined = true;
5514   fontDescriptionRun01.weightDefined = false;
5515   fontDescriptionRun01.widthDefined  = false;
5516   fontDescriptionRun01.slantDefined  = false;
5517   fontDescriptionRun01.sizeDefined   = false;
5518
5519   FontDescriptionRun fontDescriptionRun02;
5520   fontDescriptionRun02.characterRun.characterIndex     = 12u;
5521   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
5522   fontDescriptionRun02.familyLength                    = fontHebrew.size();
5523   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
5524   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
5525   fontDescriptionRun02.familyDefined = true;
5526   fontDescriptionRun02.weightDefined = false;
5527   fontDescriptionRun02.widthDefined  = false;
5528   fontDescriptionRun02.slantDefined  = false;
5529   fontDescriptionRun02.sizeDefined   = false;
5530
5531   FontDescriptionRun fontDescriptionRun03;
5532   fontDescriptionRun03.characterRun.characterIndex     = 22u;
5533   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
5534   fontDescriptionRun03.familyLength                    = fontArabic.size();
5535   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
5536   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
5537   fontDescriptionRun03.familyDefined = true;
5538   fontDescriptionRun03.weightDefined = false;
5539   fontDescriptionRun03.widthDefined  = false;
5540   fontDescriptionRun03.slantDefined  = false;
5541   fontDescriptionRun03.sizeDefined   = false;
5542
5543   FontDescriptionRun fontDescriptionRun04;
5544   fontDescriptionRun04.characterRun.characterIndex     = 36u;
5545   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
5546   fontDescriptionRun04.familyLength                    = fontLatin.size();
5547   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
5548   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
5549   fontDescriptionRun04.familyDefined = true;
5550   fontDescriptionRun04.weightDefined = false;
5551   fontDescriptionRun04.widthDefined  = false;
5552   fontDescriptionRun04.slantDefined  = false;
5553   fontDescriptionRun04.sizeDefined   = false;
5554
5555   FontDescriptionRun fontDescriptionRun05;
5556   fontDescriptionRun05.characterRun.characterIndex     = 48u;
5557   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
5558   fontDescriptionRun05.familyLength                    = fontLatin.size();
5559   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
5560   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
5561   fontDescriptionRun05.familyDefined = true;
5562   fontDescriptionRun05.weightDefined = false;
5563   fontDescriptionRun05.widthDefined  = false;
5564   fontDescriptionRun05.slantDefined  = false;
5565   fontDescriptionRun05.sizeDefined   = false;
5566
5567   FontDescriptionRun fontDescriptionRun06;
5568   fontDescriptionRun06.characterRun.characterIndex     = 60u;
5569   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
5570   fontDescriptionRun06.familyLength                    = fontArabic.size();
5571   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
5572   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
5573   fontDescriptionRun06.familyDefined = true;
5574   fontDescriptionRun06.weightDefined = false;
5575   fontDescriptionRun06.widthDefined  = false;
5576   fontDescriptionRun06.slantDefined  = false;
5577   fontDescriptionRun06.sizeDefined   = false;
5578
5579   Vector<FontDescriptionRun> fontDescriptionRuns;
5580   fontDescriptionRuns.PushBack(fontDescriptionRun01);
5581   fontDescriptionRuns.PushBack(fontDescriptionRun02);
5582   fontDescriptionRuns.PushBack(fontDescriptionRun03);
5583   fontDescriptionRuns.PushBack(fontDescriptionRun04);
5584   fontDescriptionRuns.PushBack(fontDescriptionRun05);
5585   fontDescriptionRuns.PushBack(fontDescriptionRun06);
5586
5587   float positions[] = {0.f, 0.f, 14.f, 9.f, 0.f, 0.f};
5588
5589   Size      textArea(100.f, 300.f);
5590   AlignData data =
5591     {
5592       "Center alignment for the mid paragraph.",
5593       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
5594       textArea,
5595       6u,
5596       fontDescriptionRuns.Begin(),
5597       Text::HorizontalAlignment::CENTER,
5598       Text::VerticalAlignment::TOP,
5599       22u,
5600       26u,
5601       6u,
5602       positions,
5603       Dali::LayoutDirection::LEFT_TO_RIGHT,
5604       false};
5605
5606   if(!AlignTest(data))
5607   {
5608     tet_result(TET_FAIL);
5609   }
5610
5611   tet_result(TET_PASS);
5612   END_TEST;
5613 }
5614
5615 int UtcDaliTextAlign06(void)
5616 {
5617   ToolkitTestApplication application;
5618   tet_infoline(" UtcDaliTextAlign06");
5619
5620   // Calculate text alignment.
5621
5622   const std::string fontLatin("TizenSans");
5623   const std::string fontHebrew("TizenSansHebrew");
5624   const std::string fontArabic("TizenSansArabic");
5625
5626   // Set a known font description
5627   FontDescriptionRun fontDescriptionRun01;
5628   fontDescriptionRun01.characterRun.characterIndex     = 0u;
5629   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
5630   fontDescriptionRun01.familyLength                    = fontLatin.size();
5631   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
5632   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
5633   fontDescriptionRun01.familyDefined = true;
5634   fontDescriptionRun01.weightDefined = false;
5635   fontDescriptionRun01.widthDefined  = false;
5636   fontDescriptionRun01.slantDefined  = false;
5637   fontDescriptionRun01.sizeDefined   = false;
5638
5639   FontDescriptionRun fontDescriptionRun02;
5640   fontDescriptionRun02.characterRun.characterIndex     = 12u;
5641   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
5642   fontDescriptionRun02.familyLength                    = fontHebrew.size();
5643   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
5644   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
5645   fontDescriptionRun02.familyDefined = true;
5646   fontDescriptionRun02.weightDefined = false;
5647   fontDescriptionRun02.widthDefined  = false;
5648   fontDescriptionRun02.slantDefined  = false;
5649   fontDescriptionRun02.sizeDefined   = false;
5650
5651   FontDescriptionRun fontDescriptionRun03;
5652   fontDescriptionRun03.characterRun.characterIndex     = 22u;
5653   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
5654   fontDescriptionRun03.familyLength                    = fontArabic.size();
5655   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
5656   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
5657   fontDescriptionRun03.familyDefined = true;
5658   fontDescriptionRun03.weightDefined = false;
5659   fontDescriptionRun03.widthDefined  = false;
5660   fontDescriptionRun03.slantDefined  = false;
5661   fontDescriptionRun03.sizeDefined   = false;
5662
5663   FontDescriptionRun fontDescriptionRun04;
5664   fontDescriptionRun04.characterRun.characterIndex     = 36u;
5665   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
5666   fontDescriptionRun04.familyLength                    = fontLatin.size();
5667   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
5668   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
5669   fontDescriptionRun04.familyDefined = true;
5670   fontDescriptionRun04.weightDefined = false;
5671   fontDescriptionRun04.widthDefined  = false;
5672   fontDescriptionRun04.slantDefined  = false;
5673   fontDescriptionRun04.sizeDefined   = false;
5674
5675   FontDescriptionRun fontDescriptionRun05;
5676   fontDescriptionRun05.characterRun.characterIndex     = 48u;
5677   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
5678   fontDescriptionRun05.familyLength                    = fontLatin.size();
5679   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
5680   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
5681   fontDescriptionRun05.familyDefined = true;
5682   fontDescriptionRun05.weightDefined = false;
5683   fontDescriptionRun05.widthDefined  = false;
5684   fontDescriptionRun05.slantDefined  = false;
5685   fontDescriptionRun05.sizeDefined   = false;
5686
5687   FontDescriptionRun fontDescriptionRun06;
5688   fontDescriptionRun06.characterRun.characterIndex     = 60u;
5689   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
5690   fontDescriptionRun06.familyLength                    = fontArabic.size();
5691   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
5692   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
5693   fontDescriptionRun06.familyDefined = true;
5694   fontDescriptionRun06.weightDefined = false;
5695   fontDescriptionRun06.widthDefined  = false;
5696   fontDescriptionRun06.slantDefined  = false;
5697   fontDescriptionRun06.sizeDefined   = false;
5698
5699   Vector<FontDescriptionRun> fontDescriptionRuns;
5700   fontDescriptionRuns.PushBack(fontDescriptionRun01);
5701   fontDescriptionRuns.PushBack(fontDescriptionRun02);
5702   fontDescriptionRuns.PushBack(fontDescriptionRun03);
5703   fontDescriptionRuns.PushBack(fontDescriptionRun04);
5704   fontDescriptionRuns.PushBack(fontDescriptionRun05);
5705   fontDescriptionRuns.PushBack(fontDescriptionRun06);
5706
5707   float positions[] = {0.f, 0.f, 0.f, 0.f, 9.f, 16.f};
5708
5709   Size      textArea(100.f, 300.f);
5710   AlignData data =
5711     {
5712       "Center alignment for the last paragraph.",
5713       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
5714       textArea,
5715       6u,
5716       fontDescriptionRuns.Begin(),
5717       Text::HorizontalAlignment::CENTER,
5718       Text::VerticalAlignment::TOP,
5719       48u,
5720       26u,
5721       6u,
5722       positions,
5723       Dali::LayoutDirection::LEFT_TO_RIGHT,
5724       false};
5725
5726   if(!AlignTest(data))
5727   {
5728     tet_result(TET_FAIL);
5729   }
5730
5731   tet_result(TET_PASS);
5732   END_TEST;
5733 }
5734
5735 int UtcDaliTextAlign07(void)
5736 {
5737   ToolkitTestApplication application;
5738   tet_infoline(" UtcDaliTextAlign07");
5739
5740   // Calculate text alignment.
5741
5742   const std::string fontLatin("TizenSans");
5743   const std::string fontHebrew("TizenSansHebrew");
5744   const std::string fontArabic("TizenSansArabic");
5745
5746   // Set a known font description
5747   FontDescriptionRun fontDescriptionRun01;
5748   fontDescriptionRun01.characterRun.characterIndex     = 0u;
5749   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
5750   fontDescriptionRun01.familyLength                    = fontLatin.size();
5751   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
5752   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
5753   fontDescriptionRun01.familyDefined = true;
5754   fontDescriptionRun01.weightDefined = false;
5755   fontDescriptionRun01.widthDefined  = false;
5756   fontDescriptionRun01.slantDefined  = false;
5757   fontDescriptionRun01.sizeDefined   = false;
5758
5759   FontDescriptionRun fontDescriptionRun02;
5760   fontDescriptionRun02.characterRun.characterIndex     = 12u;
5761   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
5762   fontDescriptionRun02.familyLength                    = fontHebrew.size();
5763   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
5764   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
5765   fontDescriptionRun02.familyDefined = true;
5766   fontDescriptionRun02.weightDefined = false;
5767   fontDescriptionRun02.widthDefined  = false;
5768   fontDescriptionRun02.slantDefined  = false;
5769   fontDescriptionRun02.sizeDefined   = false;
5770
5771   FontDescriptionRun fontDescriptionRun03;
5772   fontDescriptionRun03.characterRun.characterIndex     = 22u;
5773   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
5774   fontDescriptionRun03.familyLength                    = fontArabic.size();
5775   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
5776   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
5777   fontDescriptionRun03.familyDefined = true;
5778   fontDescriptionRun03.weightDefined = false;
5779   fontDescriptionRun03.widthDefined  = false;
5780   fontDescriptionRun03.slantDefined  = false;
5781   fontDescriptionRun03.sizeDefined   = false;
5782
5783   FontDescriptionRun fontDescriptionRun04;
5784   fontDescriptionRun04.characterRun.characterIndex     = 36u;
5785   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
5786   fontDescriptionRun04.familyLength                    = fontLatin.size();
5787   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
5788   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
5789   fontDescriptionRun04.familyDefined = true;
5790   fontDescriptionRun04.weightDefined = false;
5791   fontDescriptionRun04.widthDefined  = false;
5792   fontDescriptionRun04.slantDefined  = false;
5793   fontDescriptionRun04.sizeDefined   = false;
5794
5795   FontDescriptionRun fontDescriptionRun05;
5796   fontDescriptionRun05.characterRun.characterIndex     = 48u;
5797   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
5798   fontDescriptionRun05.familyLength                    = fontLatin.size();
5799   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
5800   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
5801   fontDescriptionRun05.familyDefined = true;
5802   fontDescriptionRun05.weightDefined = false;
5803   fontDescriptionRun05.widthDefined  = false;
5804   fontDescriptionRun05.slantDefined  = false;
5805   fontDescriptionRun05.sizeDefined   = false;
5806
5807   FontDescriptionRun fontDescriptionRun06;
5808   fontDescriptionRun06.characterRun.characterIndex     = 60u;
5809   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
5810   fontDescriptionRun06.familyLength                    = fontArabic.size();
5811   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
5812   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
5813   fontDescriptionRun06.familyDefined = true;
5814   fontDescriptionRun06.weightDefined = false;
5815   fontDescriptionRun06.widthDefined  = false;
5816   fontDescriptionRun06.slantDefined  = false;
5817   fontDescriptionRun06.sizeDefined   = false;
5818
5819   Vector<FontDescriptionRun> fontDescriptionRuns;
5820   fontDescriptionRuns.PushBack(fontDescriptionRun01);
5821   fontDescriptionRuns.PushBack(fontDescriptionRun02);
5822   fontDescriptionRuns.PushBack(fontDescriptionRun03);
5823   fontDescriptionRuns.PushBack(fontDescriptionRun04);
5824   fontDescriptionRuns.PushBack(fontDescriptionRun05);
5825   fontDescriptionRuns.PushBack(fontDescriptionRun06);
5826
5827   float positions[] = {19.f, 30.f, 0.f, 0.f, 0.f, 0.f};
5828
5829   Size      textArea(100.f, 300.f);
5830   AlignData data =
5831     {
5832       "End alignment for the first paragraph.",
5833       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
5834       textArea,
5835       6u,
5836       fontDescriptionRuns.Begin(),
5837       Text::HorizontalAlignment::END,
5838       Text::VerticalAlignment::TOP,
5839       0u,
5840       22u,
5841       6u,
5842       positions,
5843       Dali::LayoutDirection::LEFT_TO_RIGHT,
5844       false};
5845
5846   if(!AlignTest(data))
5847   {
5848     tet_result(TET_FAIL);
5849   }
5850
5851   tet_result(TET_PASS);
5852   END_TEST;
5853 }
5854
5855 int UtcDaliTextAlign08(void)
5856 {
5857   ToolkitTestApplication application;
5858   tet_infoline(" UtcDaliTextAlign08");
5859
5860   // Calculate text alignment.
5861
5862   const std::string fontLatin("TizenSans");
5863   const std::string fontHebrew("TizenSansHebrew");
5864   const std::string fontArabic("TizenSansArabic");
5865
5866   // Set a known font description
5867   FontDescriptionRun fontDescriptionRun01;
5868   fontDescriptionRun01.characterRun.characterIndex     = 0u;
5869   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
5870   fontDescriptionRun01.familyLength                    = fontLatin.size();
5871   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
5872   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
5873   fontDescriptionRun01.familyDefined = true;
5874   fontDescriptionRun01.weightDefined = false;
5875   fontDescriptionRun01.widthDefined  = false;
5876   fontDescriptionRun01.slantDefined  = false;
5877   fontDescriptionRun01.sizeDefined   = false;
5878
5879   FontDescriptionRun fontDescriptionRun02;
5880   fontDescriptionRun02.characterRun.characterIndex     = 12u;
5881   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
5882   fontDescriptionRun02.familyLength                    = fontHebrew.size();
5883   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
5884   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
5885   fontDescriptionRun02.familyDefined = true;
5886   fontDescriptionRun02.weightDefined = false;
5887   fontDescriptionRun02.widthDefined  = false;
5888   fontDescriptionRun02.slantDefined  = false;
5889   fontDescriptionRun02.sizeDefined   = false;
5890
5891   FontDescriptionRun fontDescriptionRun03;
5892   fontDescriptionRun03.characterRun.characterIndex     = 22u;
5893   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
5894   fontDescriptionRun03.familyLength                    = fontArabic.size();
5895   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
5896   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
5897   fontDescriptionRun03.familyDefined = true;
5898   fontDescriptionRun03.weightDefined = false;
5899   fontDescriptionRun03.widthDefined  = false;
5900   fontDescriptionRun03.slantDefined  = false;
5901   fontDescriptionRun03.sizeDefined   = false;
5902
5903   FontDescriptionRun fontDescriptionRun04;
5904   fontDescriptionRun04.characterRun.characterIndex     = 36u;
5905   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
5906   fontDescriptionRun04.familyLength                    = fontLatin.size();
5907   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
5908   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
5909   fontDescriptionRun04.familyDefined = true;
5910   fontDescriptionRun04.weightDefined = false;
5911   fontDescriptionRun04.widthDefined  = false;
5912   fontDescriptionRun04.slantDefined  = false;
5913   fontDescriptionRun04.sizeDefined   = false;
5914
5915   FontDescriptionRun fontDescriptionRun05;
5916   fontDescriptionRun05.characterRun.characterIndex     = 48u;
5917   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
5918   fontDescriptionRun05.familyLength                    = fontLatin.size();
5919   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
5920   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
5921   fontDescriptionRun05.familyDefined = true;
5922   fontDescriptionRun05.weightDefined = false;
5923   fontDescriptionRun05.widthDefined  = false;
5924   fontDescriptionRun05.slantDefined  = false;
5925   fontDescriptionRun05.sizeDefined   = false;
5926
5927   FontDescriptionRun fontDescriptionRun06;
5928   fontDescriptionRun06.characterRun.characterIndex     = 60u;
5929   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
5930   fontDescriptionRun06.familyLength                    = fontArabic.size();
5931   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
5932   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
5933   fontDescriptionRun06.familyDefined = true;
5934   fontDescriptionRun06.weightDefined = false;
5935   fontDescriptionRun06.widthDefined  = false;
5936   fontDescriptionRun06.slantDefined  = false;
5937   fontDescriptionRun06.sizeDefined   = false;
5938
5939   Vector<FontDescriptionRun> fontDescriptionRuns;
5940   fontDescriptionRuns.PushBack(fontDescriptionRun01);
5941   fontDescriptionRuns.PushBack(fontDescriptionRun02);
5942   fontDescriptionRuns.PushBack(fontDescriptionRun03);
5943   fontDescriptionRuns.PushBack(fontDescriptionRun04);
5944   fontDescriptionRuns.PushBack(fontDescriptionRun05);
5945   fontDescriptionRuns.PushBack(fontDescriptionRun06);
5946
5947   float positions[] = {0.f, 0.f, -4.f, 0.f, 0.f, 0.f};
5948
5949   Size      textArea(100.f, 300.f);
5950   AlignData data =
5951     {
5952       "End alignment for the mid paragraph.",
5953       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
5954       textArea,
5955       6u,
5956       fontDescriptionRuns.Begin(),
5957       Text::HorizontalAlignment::END,
5958       Text::VerticalAlignment::TOP,
5959       22u,
5960       26u,
5961       6u,
5962       positions,
5963       Dali::LayoutDirection::LEFT_TO_RIGHT,
5964       false};
5965
5966   if(!AlignTest(data))
5967   {
5968     tet_result(TET_FAIL);
5969   }
5970
5971   tet_result(TET_PASS);
5972   END_TEST;
5973 }
5974
5975 int UtcDaliTextAlign09(void)
5976 {
5977   ToolkitTestApplication application;
5978   tet_infoline(" UtcDaliTextAlign09");
5979
5980   // Calculate text alignment.
5981
5982   const std::string fontLatin("TizenSans");
5983   const std::string fontHebrew("TizenSansHebrew");
5984   const std::string fontArabic("TizenSansArabic");
5985
5986   // Set a known font description
5987   FontDescriptionRun fontDescriptionRun01;
5988   fontDescriptionRun01.characterRun.characterIndex     = 0u;
5989   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
5990   fontDescriptionRun01.familyLength                    = fontLatin.size();
5991   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
5992   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
5993   fontDescriptionRun01.familyDefined = true;
5994   fontDescriptionRun01.weightDefined = false;
5995   fontDescriptionRun01.widthDefined  = false;
5996   fontDescriptionRun01.slantDefined  = false;
5997   fontDescriptionRun01.sizeDefined   = false;
5998
5999   FontDescriptionRun fontDescriptionRun02;
6000   fontDescriptionRun02.characterRun.characterIndex     = 12u;
6001   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
6002   fontDescriptionRun02.familyLength                    = fontHebrew.size();
6003   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
6004   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
6005   fontDescriptionRun02.familyDefined = true;
6006   fontDescriptionRun02.weightDefined = false;
6007   fontDescriptionRun02.widthDefined  = false;
6008   fontDescriptionRun02.slantDefined  = false;
6009   fontDescriptionRun02.sizeDefined   = false;
6010
6011   FontDescriptionRun fontDescriptionRun03;
6012   fontDescriptionRun03.characterRun.characterIndex     = 22u;
6013   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
6014   fontDescriptionRun03.familyLength                    = fontArabic.size();
6015   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
6016   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
6017   fontDescriptionRun03.familyDefined = true;
6018   fontDescriptionRun03.weightDefined = false;
6019   fontDescriptionRun03.widthDefined  = false;
6020   fontDescriptionRun03.slantDefined  = false;
6021   fontDescriptionRun03.sizeDefined   = false;
6022
6023   FontDescriptionRun fontDescriptionRun04;
6024   fontDescriptionRun04.characterRun.characterIndex     = 36u;
6025   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
6026   fontDescriptionRun04.familyLength                    = fontLatin.size();
6027   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
6028   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
6029   fontDescriptionRun04.familyDefined = true;
6030   fontDescriptionRun04.weightDefined = false;
6031   fontDescriptionRun04.widthDefined  = false;
6032   fontDescriptionRun04.slantDefined  = false;
6033   fontDescriptionRun04.sizeDefined   = false;
6034
6035   FontDescriptionRun fontDescriptionRun05;
6036   fontDescriptionRun05.characterRun.characterIndex     = 48u;
6037   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
6038   fontDescriptionRun05.familyLength                    = fontLatin.size();
6039   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
6040   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
6041   fontDescriptionRun05.familyDefined = true;
6042   fontDescriptionRun05.weightDefined = false;
6043   fontDescriptionRun05.widthDefined  = false;
6044   fontDescriptionRun05.slantDefined  = false;
6045   fontDescriptionRun05.sizeDefined   = false;
6046
6047   FontDescriptionRun fontDescriptionRun06;
6048   fontDescriptionRun06.characterRun.characterIndex     = 60u;
6049   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
6050   fontDescriptionRun06.familyLength                    = fontArabic.size();
6051   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
6052   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
6053   fontDescriptionRun06.familyDefined = true;
6054   fontDescriptionRun06.weightDefined = false;
6055   fontDescriptionRun06.widthDefined  = false;
6056   fontDescriptionRun06.slantDefined  = false;
6057   fontDescriptionRun06.sizeDefined   = false;
6058
6059   Vector<FontDescriptionRun> fontDescriptionRuns;
6060   fontDescriptionRuns.PushBack(fontDescriptionRun01);
6061   fontDescriptionRuns.PushBack(fontDescriptionRun02);
6062   fontDescriptionRuns.PushBack(fontDescriptionRun03);
6063   fontDescriptionRuns.PushBack(fontDescriptionRun04);
6064   fontDescriptionRuns.PushBack(fontDescriptionRun05);
6065   fontDescriptionRuns.PushBack(fontDescriptionRun06);
6066
6067   float positions[] = {0.f, 0.f, 0.f, 0.f, 19.f, 33.f};
6068
6069   Size      textArea(100.f, 300.f);
6070   AlignData data =
6071     {
6072       "End alignment for the last paragraph.",
6073       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
6074       textArea,
6075       6u,
6076       fontDescriptionRuns.Begin(),
6077       Text::HorizontalAlignment::END,
6078       Text::VerticalAlignment::TOP,
6079       48u,
6080       26u,
6081       6u,
6082       positions,
6083       Dali::LayoutDirection::LEFT_TO_RIGHT,
6084       false};
6085
6086   if(!AlignTest(data))
6087   {
6088     tet_result(TET_FAIL);
6089   }
6090
6091   tet_result(TET_PASS);
6092   END_TEST;
6093 }
6094
6095 int UtcDaliTextAlign10(void)
6096 {
6097   ToolkitTestApplication application;
6098   tet_infoline(" UtcDaliTextAlign10");
6099
6100   // Calculate text alignment.
6101
6102   const std::string fontLatin("TizenSans");
6103   const std::string fontHebrew("TizenSansHebrew");
6104   const std::string fontArabic("TizenSansArabic");
6105
6106   // Set a known font description
6107   FontDescriptionRun fontDescriptionRun01;
6108   fontDescriptionRun01.characterRun.characterIndex     = 0u;
6109   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
6110   fontDescriptionRun01.familyLength                    = fontLatin.size();
6111   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
6112   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
6113   fontDescriptionRun01.familyDefined = true;
6114   fontDescriptionRun01.weightDefined = false;
6115   fontDescriptionRun01.widthDefined  = false;
6116   fontDescriptionRun01.slantDefined  = false;
6117   fontDescriptionRun01.sizeDefined   = false;
6118
6119   FontDescriptionRun fontDescriptionRun02;
6120   fontDescriptionRun02.characterRun.characterIndex     = 12u;
6121   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
6122   fontDescriptionRun02.familyLength                    = fontHebrew.size();
6123   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
6124   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
6125   fontDescriptionRun02.familyDefined = true;
6126   fontDescriptionRun02.weightDefined = false;
6127   fontDescriptionRun02.widthDefined  = false;
6128   fontDescriptionRun02.slantDefined  = false;
6129   fontDescriptionRun02.sizeDefined   = false;
6130
6131   FontDescriptionRun fontDescriptionRun03;
6132   fontDescriptionRun03.characterRun.characterIndex     = 22u;
6133   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
6134   fontDescriptionRun03.familyLength                    = fontArabic.size();
6135   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
6136   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
6137   fontDescriptionRun03.familyDefined = true;
6138   fontDescriptionRun03.weightDefined = false;
6139   fontDescriptionRun03.widthDefined  = false;
6140   fontDescriptionRun03.slantDefined  = false;
6141   fontDescriptionRun03.sizeDefined   = false;
6142
6143   FontDescriptionRun fontDescriptionRun04;
6144   fontDescriptionRun04.characterRun.characterIndex     = 36u;
6145   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
6146   fontDescriptionRun04.familyLength                    = fontLatin.size();
6147   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
6148   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
6149   fontDescriptionRun04.familyDefined = true;
6150   fontDescriptionRun04.weightDefined = false;
6151   fontDescriptionRun04.widthDefined  = false;
6152   fontDescriptionRun04.slantDefined  = false;
6153   fontDescriptionRun04.sizeDefined   = false;
6154
6155   FontDescriptionRun fontDescriptionRun05;
6156   fontDescriptionRun05.characterRun.characterIndex     = 48u;
6157   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
6158   fontDescriptionRun05.familyLength                    = fontLatin.size();
6159   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
6160   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
6161   fontDescriptionRun05.familyDefined = true;
6162   fontDescriptionRun05.weightDefined = false;
6163   fontDescriptionRun05.widthDefined  = false;
6164   fontDescriptionRun05.slantDefined  = false;
6165   fontDescriptionRun05.sizeDefined   = false;
6166
6167   FontDescriptionRun fontDescriptionRun06;
6168   fontDescriptionRun06.characterRun.characterIndex     = 60u;
6169   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
6170   fontDescriptionRun06.familyLength                    = fontArabic.size();
6171   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
6172   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
6173   fontDescriptionRun06.familyDefined = true;
6174   fontDescriptionRun06.weightDefined = false;
6175   fontDescriptionRun06.widthDefined  = false;
6176   fontDescriptionRun06.slantDefined  = false;
6177   fontDescriptionRun06.sizeDefined   = false;
6178
6179   Vector<FontDescriptionRun> fontDescriptionRuns;
6180   fontDescriptionRuns.PushBack(fontDescriptionRun01);
6181   fontDescriptionRuns.PushBack(fontDescriptionRun02);
6182   fontDescriptionRuns.PushBack(fontDescriptionRun03);
6183   fontDescriptionRuns.PushBack(fontDescriptionRun04);
6184   fontDescriptionRuns.PushBack(fontDescriptionRun05);
6185   fontDescriptionRuns.PushBack(fontDescriptionRun06);
6186
6187   float positions[] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
6188
6189   Size      textArea(100.f, 300.f);
6190   AlignData data =
6191     {
6192       "Begin alignment for the first paragraph.",
6193       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
6194       textArea,
6195       6u,
6196       fontDescriptionRuns.Begin(),
6197       Text::HorizontalAlignment::END,
6198       Text::VerticalAlignment::TOP,
6199       0u,
6200       22u,
6201       6u,
6202       positions,
6203       Dali::LayoutDirection::RIGHT_TO_LEFT,
6204       true};
6205
6206   if(!AlignTest(data))
6207   {
6208     tet_result(TET_FAIL);
6209   }
6210
6211   tet_result(TET_PASS);
6212   END_TEST;
6213 }
6214
6215 int UtcDaliTextAlign11(void)
6216 {
6217   ToolkitTestApplication application;
6218   tet_infoline(" UtcDaliTextAlign11");
6219
6220   // Calculate text alignment.
6221
6222   const std::string fontLatin("TizenSans");
6223   const std::string fontHebrew("TizenSansHebrew");
6224   const std::string fontArabic("TizenSansArabic");
6225
6226   // Set a known font description
6227   FontDescriptionRun fontDescriptionRun01;
6228   fontDescriptionRun01.characterRun.characterIndex     = 0u;
6229   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
6230   fontDescriptionRun01.familyLength                    = fontLatin.size();
6231   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
6232   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
6233   fontDescriptionRun01.familyDefined = true;
6234   fontDescriptionRun01.weightDefined = false;
6235   fontDescriptionRun01.widthDefined  = false;
6236   fontDescriptionRun01.slantDefined  = false;
6237   fontDescriptionRun01.sizeDefined   = false;
6238
6239   FontDescriptionRun fontDescriptionRun02;
6240   fontDescriptionRun02.characterRun.characterIndex     = 12u;
6241   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
6242   fontDescriptionRun02.familyLength                    = fontHebrew.size();
6243   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
6244   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
6245   fontDescriptionRun02.familyDefined = true;
6246   fontDescriptionRun02.weightDefined = false;
6247   fontDescriptionRun02.widthDefined  = false;
6248   fontDescriptionRun02.slantDefined  = false;
6249   fontDescriptionRun02.sizeDefined   = false;
6250
6251   FontDescriptionRun fontDescriptionRun03;
6252   fontDescriptionRun03.characterRun.characterIndex     = 22u;
6253   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
6254   fontDescriptionRun03.familyLength                    = fontArabic.size();
6255   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
6256   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
6257   fontDescriptionRun03.familyDefined = true;
6258   fontDescriptionRun03.weightDefined = false;
6259   fontDescriptionRun03.widthDefined  = false;
6260   fontDescriptionRun03.slantDefined  = false;
6261   fontDescriptionRun03.sizeDefined   = false;
6262
6263   FontDescriptionRun fontDescriptionRun04;
6264   fontDescriptionRun04.characterRun.characterIndex     = 36u;
6265   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
6266   fontDescriptionRun04.familyLength                    = fontLatin.size();
6267   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
6268   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
6269   fontDescriptionRun04.familyDefined = true;
6270   fontDescriptionRun04.weightDefined = false;
6271   fontDescriptionRun04.widthDefined  = false;
6272   fontDescriptionRun04.slantDefined  = false;
6273   fontDescriptionRun04.sizeDefined   = false;
6274
6275   FontDescriptionRun fontDescriptionRun05;
6276   fontDescriptionRun05.characterRun.characterIndex     = 48u;
6277   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
6278   fontDescriptionRun05.familyLength                    = fontLatin.size();
6279   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
6280   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
6281   fontDescriptionRun05.familyDefined = true;
6282   fontDescriptionRun05.weightDefined = false;
6283   fontDescriptionRun05.widthDefined  = false;
6284   fontDescriptionRun05.slantDefined  = false;
6285   fontDescriptionRun05.sizeDefined   = false;
6286
6287   FontDescriptionRun fontDescriptionRun06;
6288   fontDescriptionRun06.characterRun.characterIndex     = 60u;
6289   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
6290   fontDescriptionRun06.familyLength                    = fontArabic.size();
6291   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
6292   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
6293   fontDescriptionRun06.familyDefined = true;
6294   fontDescriptionRun06.weightDefined = false;
6295   fontDescriptionRun06.widthDefined  = false;
6296   fontDescriptionRun06.slantDefined  = false;
6297   fontDescriptionRun06.sizeDefined   = false;
6298
6299   Vector<FontDescriptionRun> fontDescriptionRuns;
6300   fontDescriptionRuns.PushBack(fontDescriptionRun01);
6301   fontDescriptionRuns.PushBack(fontDescriptionRun02);
6302   fontDescriptionRuns.PushBack(fontDescriptionRun03);
6303   fontDescriptionRuns.PushBack(fontDescriptionRun04);
6304   fontDescriptionRuns.PushBack(fontDescriptionRun05);
6305   fontDescriptionRuns.PushBack(fontDescriptionRun06);
6306
6307   float positions[] = {19.f, 30.f, 33.f, 0.f, 0.f, 0.f};
6308
6309   Size      textArea(100.f, 300.f);
6310   AlignData data =
6311     {
6312       "End alignment for the last paragraph.",
6313       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
6314       textArea,
6315       6u,
6316       fontDescriptionRuns.Begin(),
6317       Text::HorizontalAlignment::END,
6318       Text::VerticalAlignment::TOP,
6319       0u,
6320       26u,
6321       6u,
6322       positions,
6323       Dali::LayoutDirection::LEFT_TO_RIGHT,
6324       true};
6325
6326   if(!AlignTest(data))
6327   {
6328     tet_result(TET_FAIL);
6329   }
6330
6331   tet_result(TET_PASS);
6332   END_TEST;
6333 }
6334
6335 int UtcDaliTextAlign12(void)
6336 {
6337   ToolkitTestApplication application;
6338   tet_infoline(" UtcDaliTextAlign12");
6339
6340   // Calculate text alignment.
6341
6342   const std::string fontLatin("TizenSans");
6343   const std::string fontHebrew("TizenSansHebrew");
6344   const std::string fontArabic("TizenSansArabic");
6345
6346   // Set a known font description
6347   FontDescriptionRun fontDescriptionRun01;
6348   fontDescriptionRun01.characterRun.characterIndex     = 0u;
6349   fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
6350   fontDescriptionRun01.familyLength                    = fontLatin.size();
6351   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
6352   memcpy(fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength);
6353   fontDescriptionRun01.familyDefined = true;
6354   fontDescriptionRun01.weightDefined = false;
6355   fontDescriptionRun01.widthDefined  = false;
6356   fontDescriptionRun01.slantDefined  = false;
6357   fontDescriptionRun01.sizeDefined   = false;
6358
6359   FontDescriptionRun fontDescriptionRun02;
6360   fontDescriptionRun02.characterRun.characterIndex     = 12u;
6361   fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
6362   fontDescriptionRun02.familyLength                    = fontHebrew.size();
6363   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
6364   memcpy(fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength);
6365   fontDescriptionRun02.familyDefined = true;
6366   fontDescriptionRun02.weightDefined = false;
6367   fontDescriptionRun02.widthDefined  = false;
6368   fontDescriptionRun02.slantDefined  = false;
6369   fontDescriptionRun02.sizeDefined   = false;
6370
6371   FontDescriptionRun fontDescriptionRun03;
6372   fontDescriptionRun03.characterRun.characterIndex     = 22u;
6373   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
6374   fontDescriptionRun03.familyLength                    = fontArabic.size();
6375   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
6376   memcpy(fontDescriptionRun03.familyName, fontArabic.c_str(), fontDescriptionRun03.familyLength);
6377   fontDescriptionRun03.familyDefined = true;
6378   fontDescriptionRun03.weightDefined = false;
6379   fontDescriptionRun03.widthDefined  = false;
6380   fontDescriptionRun03.slantDefined  = false;
6381   fontDescriptionRun03.sizeDefined   = false;
6382
6383   FontDescriptionRun fontDescriptionRun04;
6384   fontDescriptionRun04.characterRun.characterIndex     = 36u;
6385   fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
6386   fontDescriptionRun04.familyLength                    = fontLatin.size();
6387   fontDescriptionRun04.familyName                      = new char[fontDescriptionRun04.familyLength];
6388   memcpy(fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength);
6389   fontDescriptionRun04.familyDefined = true;
6390   fontDescriptionRun04.weightDefined = false;
6391   fontDescriptionRun04.widthDefined  = false;
6392   fontDescriptionRun04.slantDefined  = false;
6393   fontDescriptionRun04.sizeDefined   = false;
6394
6395   FontDescriptionRun fontDescriptionRun05;
6396   fontDescriptionRun05.characterRun.characterIndex     = 48u;
6397   fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
6398   fontDescriptionRun05.familyLength                    = fontLatin.size();
6399   fontDescriptionRun05.familyName                      = new char[fontDescriptionRun05.familyLength];
6400   memcpy(fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength);
6401   fontDescriptionRun05.familyDefined = true;
6402   fontDescriptionRun05.weightDefined = false;
6403   fontDescriptionRun05.widthDefined  = false;
6404   fontDescriptionRun05.slantDefined  = false;
6405   fontDescriptionRun05.sizeDefined   = false;
6406
6407   FontDescriptionRun fontDescriptionRun06;
6408   fontDescriptionRun06.characterRun.characterIndex     = 60u;
6409   fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
6410   fontDescriptionRun06.familyLength                    = fontArabic.size();
6411   fontDescriptionRun06.familyName                      = new char[fontDescriptionRun06.familyLength];
6412   memcpy(fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength);
6413   fontDescriptionRun06.familyDefined = true;
6414   fontDescriptionRun06.weightDefined = false;
6415   fontDescriptionRun06.widthDefined  = false;
6416   fontDescriptionRun06.slantDefined  = false;
6417   fontDescriptionRun06.sizeDefined   = false;
6418
6419   Vector<FontDescriptionRun> fontDescriptionRuns;
6420   fontDescriptionRuns.PushBack(fontDescriptionRun01);
6421   fontDescriptionRuns.PushBack(fontDescriptionRun02);
6422   fontDescriptionRuns.PushBack(fontDescriptionRun03);
6423   fontDescriptionRuns.PushBack(fontDescriptionRun04);
6424   fontDescriptionRuns.PushBack(fontDescriptionRun05);
6425   fontDescriptionRuns.PushBack(fontDescriptionRun06);
6426
6427   float positions[] = {0.f, 0.f, 0.f, 0.f, 0.f, 0.f};
6428
6429   Size      textArea(100.f, 300.f);
6430   AlignData data =
6431     {
6432       "Begin alignment for the first paragraph.",
6433       "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
6434       textArea,
6435       6u,
6436       fontDescriptionRuns.Begin(),
6437       Text::HorizontalAlignment::BEGIN,
6438       Text::VerticalAlignment::TOP,
6439       48u,
6440       26u,
6441       6u,
6442       positions,
6443       Dali::LayoutDirection::LEFT_TO_RIGHT,
6444       true};
6445
6446   if(!AlignTest(data))
6447   {
6448     tet_result(TET_FAIL);
6449   }
6450
6451   tet_result(TET_PASS);
6452   END_TEST;
6453 }
6454
6455 int UtcDaliTextLayoutSetGetDefaultLineSpacing(void)
6456 {
6457   ToolkitTestApplication application;
6458   tet_infoline(" UtcDaliTextLayoutSetGetDefaultLineSpacing");
6459
6460   Layout::Engine engine;
6461   DALI_TEST_EQUALS(0.f, engine.GetDefaultLineSpacing(), Math::MACHINE_EPSILON_1000, TEST_LOCATION);
6462
6463   engine.SetDefaultLineSpacing(10.f);
6464   DALI_TEST_EQUALS(10.f, engine.GetDefaultLineSpacing(), Math::MACHINE_EPSILON_1000, TEST_LOCATION);
6465
6466   tet_result(TET_PASS);
6467   END_TEST;
6468 }
6469
6470 int UtcDaliTextLayoutGetGlyphMetrics(void)
6471 {
6472   tet_infoline(" UtcDaliTextLayoutGetGlyphMetrics");
6473
6474   // Test retrieving metrics from group of characters
6475
6476   const std::string fontFamily("TizenSansHindi");
6477
6478   // Set a known font description
6479   FontDescriptionRun fontDescriptionRun01;
6480   fontDescriptionRun01.characterRun.characterIndex     = 0u;
6481   fontDescriptionRun01.characterRun.numberOfCharacters = 2u;
6482   fontDescriptionRun01.familyLength                    = fontFamily.size();
6483   fontDescriptionRun01.familyName                      = new char[fontDescriptionRun01.familyLength];
6484   memcpy(fontDescriptionRun01.familyName, fontFamily.c_str(), fontDescriptionRun01.familyLength);
6485   fontDescriptionRun01.familyDefined = true;
6486   fontDescriptionRun01.weightDefined = false;
6487   fontDescriptionRun01.widthDefined  = false;
6488   fontDescriptionRun01.slantDefined  = false;
6489   fontDescriptionRun01.sizeDefined   = false;
6490
6491   // Set a known font description
6492   FontDescriptionRun fontDescriptionRun02;
6493   fontDescriptionRun02.characterRun.characterIndex     = 0u;
6494   fontDescriptionRun02.characterRun.numberOfCharacters = 2u;
6495   fontDescriptionRun02.familyLength                    = fontFamily.size();
6496   fontDescriptionRun02.familyName                      = new char[fontDescriptionRun02.familyLength];
6497   memcpy(fontDescriptionRun02.familyName, fontFamily.c_str(), fontDescriptionRun02.familyLength);
6498   fontDescriptionRun02.familyDefined = true;
6499   fontDescriptionRun02.weightDefined = false;
6500   fontDescriptionRun02.widthDefined  = false;
6501   fontDescriptionRun02.slantDefined  = false;
6502   fontDescriptionRun02.sizeDefined   = false;
6503
6504   // Set a known font description
6505   FontDescriptionRun fontDescriptionRun03;
6506   fontDescriptionRun03.characterRun.characterIndex     = 0u;
6507   fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
6508   fontDescriptionRun03.familyLength                    = fontFamily.size();
6509   fontDescriptionRun03.familyName                      = new char[fontDescriptionRun03.familyLength];
6510   memcpy(fontDescriptionRun03.familyName, fontFamily.c_str(), fontDescriptionRun03.familyLength);
6511   fontDescriptionRun03.familyDefined = true;
6512   fontDescriptionRun03.weightDefined = false;
6513   fontDescriptionRun03.widthDefined  = false;
6514   fontDescriptionRun03.slantDefined  = false;
6515   fontDescriptionRun03.sizeDefined   = false;
6516
6517   Vector<FontDescriptionRun> fontDescriptionRuns01;
6518   fontDescriptionRuns01.PushBack(fontDescriptionRun01);
6519
6520   Vector<FontDescriptionRun> fontDescriptionRuns02;
6521   fontDescriptionRuns02.PushBack(fontDescriptionRun02);
6522
6523   Vector<FontDescriptionRun> fontDescriptionRuns03;
6524   fontDescriptionRuns03.PushBack(fontDescriptionRun03);
6525
6526   // Set a text area.
6527   Size textArea(100.f, 100.f);
6528
6529   // Group: second glyph doesn't exceed the width of the first glyph
6530   float positions01[] = {0.f, -11.f};
6531
6532   struct LineRun line01 =
6533     {
6534       {0u, 1u},
6535       {0u, 1u},
6536       11.f,
6537       15.f,
6538       -5.f,
6539       0.f,
6540       0.f,
6541       0.f,
6542       false,
6543       false};
6544   Vector<LineRun> lines01;
6545   lines01.PushBack(line01);
6546
6547   Size layoutSize01 = Vector2(11.f, 20.f);
6548
6549   // Group: second glyph doesn't exceed the width of the first glyph
6550   float positions02[] = {
6551     0.f,
6552     -11.f,
6553     7.f,
6554     -15.f,
6555   };
6556
6557   struct LineRun line02 =
6558     {
6559       {0u, 2u},
6560       {0u, 2u},
6561       16.f,
6562       15.f,
6563       -5.f,
6564       0.f,
6565       0.f,
6566       0.f,
6567       false,
6568       false};
6569   Vector<LineRun> lines02;
6570   lines02.PushBack(line02);
6571
6572   Size layoutSize02 = Vector2(16.f, 20.f);
6573
6574   // Group: second glyph doesn't exceed the width of the first glyph
6575   float positions03[] = {0.f, -11.f, 2.f, -15.f};
6576
6577   struct LineRun line03 =
6578     {
6579       {0u, 2u},
6580       {0u, 2u},
6581       11.f,
6582       15.f,
6583       -5.f,
6584       0.f,
6585       0.f,
6586       0.f,
6587       false,
6588       false};
6589   Vector<LineRun> lines03;
6590   lines03.PushBack(line03);
6591
6592   Size layoutSize03 = Vector2(11.f, 20.f);
6593
6594   /////////////////////////////
6595
6596   struct LayoutTextData data[] =
6597     {
6598       {"Single glyph",
6599        "प",
6600        textArea,
6601        1u,
6602        fontDescriptionRuns01.Begin(),
6603        layoutSize01,
6604        1u,
6605        positions01,
6606        1u,
6607        lines01.Begin(),
6608        Layout::Engine::SINGLE_LINE_BOX,
6609        0u,
6610        1u,
6611        false,
6612        DevelText::EllipsisPosition::END,
6613        true},
6614       {"Group: second glyph exceeds the width of the first glyph",
6615        "पो",
6616        textArea,
6617        1u,
6618        fontDescriptionRuns02.Begin(),
6619        layoutSize02,
6620        2u,
6621        positions02,
6622        1u,
6623        lines02.Begin(),
6624        Layout::Engine::SINGLE_LINE_BOX,
6625        0u,
6626        2u,
6627        false,
6628        DevelText::EllipsisPosition::END,
6629        true},
6630       {"Group: second glyph doesn't exceed the width of the first glyph",
6631        "पे",
6632        textArea,
6633        1u,
6634        fontDescriptionRuns03.Begin(),
6635        layoutSize03,
6636        2u,
6637        positions03,
6638        1u,
6639        lines03.Begin(),
6640        Layout::Engine::SINGLE_LINE_BOX,
6641        0u,
6642        2u,
6643        false,
6644        DevelText::EllipsisPosition::END,
6645        true}};
6646   const unsigned int numberOfTests = sizeof(data) / sizeof(LayoutTextData);
6647
6648   for(unsigned int index = 0u; index < numberOfTests; ++index)
6649   {
6650     ToolkitTestApplication application;
6651     if(!LayoutTextTest(data[index]))
6652     {
6653       tet_result(TET_FAIL);
6654     }
6655   }
6656
6657   tet_result(TET_PASS);
6658   END_TEST;
6659 }