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