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