Updates for const->constexpr
[platform/core/uifw/dali-toolkit.git] / automated-tests / src / dali-toolkit-internal / utc-Dali-Text-Layout.cpp
old mode 100644 (file)
new mode 100755 (executable)
index f6c58db..05226d4
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2017 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2019 Samsung Electronics Co., Ltd.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -62,7 +62,7 @@ void Print( const LineRun& line )
 {
   std::cout << "        glyph run, index : " << line.glyphRun.glyphIndex << ", num glyphs : " << line.glyphRun.numberOfGlyphs << std::endl;
   std::cout << "    character run, index : " << line.characterRun.characterIndex << ", num chars : " << line.characterRun.numberOfCharacters << std::endl;
-  std::cout << "                   width : " << line.width << std::endl;
+  std::cout << "                   width : " << floor(line.width) << std::endl;
   std::cout << "                ascender : " << line.ascender << std::endl;
   std::cout << "               descender : " << line.descender << std::endl;
   std::cout << "             extraLength : " << line.extraLength << std::endl;
@@ -84,10 +84,10 @@ bool LayoutTextTest( const LayoutTextData& data )
   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
+  fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHindiRegular.ttf" );
 
   // 1) Create the model.
-  LogicalModelPtr logicalModel;
-  VisualModelPtr visualModel;
+  ModelPtr textModel;
   MetricsPtr metrics;
   Size layoutSize;
 
@@ -100,16 +100,18 @@ bool LayoutTextTest( const LayoutTextData& data )
   }
 
   LayoutOptions options;
-  options.reorder = false;
   options.align = false;
   CreateTextModel( data.text,
                    data.textArea,
                    fontDescriptionRuns,
                    options,
                    layoutSize,
-                   logicalModel,
-                   visualModel,
-                   metrics );
+                   textModel,
+                   metrics,
+                   false );
+
+  LogicalModelPtr logicalModel = textModel->mLogicalModel;
+  VisualModelPtr visualModel = textModel->mVisualModel;
 
   // 2) Clear the layout.
   Vector<LineRun>& lines = visualModel->mLines;
@@ -156,21 +158,12 @@ bool LayoutTextTest( const LayoutTextData& data )
   engine.SetMetrics( metrics );
   engine.SetLayout( data.layout );
 
-  const Length totalNumberOfGlyphs = visualModel->mGlyphs.Count();
-
+  textModel->mHorizontalAlignment = Text::HorizontalAlignment::BEGIN;
+  textModel->mLineWrapMode = LineWrap::WORD;
+  textModel->mIgnoreSpacesAfterText = true;
+  textModel->mMatchSystemLanguageDirection = false;
   Layout::Parameters layoutParameters( data.textArea,
-                                       logicalModel->mText.Begin(),
-                                       logicalModel->mLineBreakInfo.Begin(),
-                                       logicalModel->mWordBreakInfo.Begin(),
-                                       ( 0u != logicalModel->mCharacterDirections.Count() ) ? logicalModel->mCharacterDirections.Begin() : NULL,
-                                       visualModel->mGlyphs.Begin(),
-                                       visualModel->mGlyphsToCharacters.Begin(),
-                                       visualModel->mCharactersPerGlyph.Begin(),
-                                       visualModel->mCharactersToGlyph.Begin(),
-                                       visualModel->mGlyphsPerCharacter.Begin(),
-                                       totalNumberOfGlyphs,
-                                       Text::HorizontalAlignment::BEGIN,
-                                       Text::LineWrap::WORD );
+                                       textModel );
 
   layoutParameters.isLastNewParagraph = isLastNewParagraph;
 
@@ -182,11 +175,11 @@ bool LayoutTextTest( const LayoutTextData& data )
 
   layoutSize = Vector2::ZERO;
 
+  bool isAutoScroll = false;
   const bool updated = engine.LayoutText( layoutParameters,
-                                          glyphPositions,
-                                          lines,
                                           layoutSize,
-                                          data.ellipsis );
+                                          data.ellipsis,
+                                          isAutoScroll );
 
   // 4) Compare the results.
 
@@ -206,7 +199,7 @@ bool LayoutTextTest( const LayoutTextData& data )
   {
     const Vector2& position = *( glyphPositions.Begin() + index );
 
-    if( fabsf( position.x - *( data.positions + 2u * index ) ) > Math::MACHINE_EPSILON_1000 )
+    if( fabsf( std::round( position.x ) - *( data.positions + 2u * index ) ) > Math::MACHINE_EPSILON_1000 )
     {
       std::cout << "  Different position for glyph " << index << " x : " << position.x << ", expected : " << *( data.positions + 2u * index ) << std::endl;
       return false;
@@ -263,7 +256,7 @@ bool LayoutTextTest( const LayoutTextData& data )
       return false;
     }
 
-    if( fabsf( line.width - expectedLine.width ) > Math::MACHINE_EPSILON_1 )
+    if( fabsf( floor( line.width ) - expectedLine.width ) > Math::MACHINE_EPSILON_1 )
     {
       std::cout << "  Different line info for line : " << index << std::endl;
       Print( line );
@@ -317,115 +310,6 @@ bool LayoutTextTest( const LayoutTextData& data )
 
 //////////////////////////////////////////////////////////
 
-struct ReLayoutRightToLeftLinesData
-{
-  std::string         description;
-  std::string         text;
-  Size                textArea;
-  unsigned int        numberOfFonts;
-  FontDescriptionRun* fontDescriptions;
-  unsigned int        totalNumberOfGlyphs;
-  float*              positions;
-  unsigned int        startIndex;
-  unsigned int        numberOfCharacters;
-};
-
-bool ReLayoutRightToLeftLinesTest( const ReLayoutRightToLeftLinesData& data )
-{
-  // Load some fonts.
-  TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get();
-  fontClient.SetDpi( 96u, 96u );
-
-  char* pathNamePtr = get_current_dir_name();
-  const std::string pathName( pathNamePtr );
-  free( pathNamePtr );
-
-  fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansRegular.ttf" );
-  fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansHebrewRegular.ttf" );
-  fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
-
-  // 1) Create the model.
-  LogicalModelPtr logicalModel;
-  VisualModelPtr visualModel;
-  MetricsPtr metrics;
-  Size layoutSize;
-
-  Vector<FontDescriptionRun> fontDescriptionRuns;
-  if( 0u != data.numberOfFonts )
-  {
-    fontDescriptionRuns.Insert( fontDescriptionRuns.End(),
-                                data.fontDescriptions,
-                                data.fontDescriptions + data.numberOfFonts );
-  }
-
-  LayoutOptions options;
-  options.reorder = false;
-  options.align = false;
-  CreateTextModel( data.text,
-                   data.textArea,
-                   fontDescriptionRuns,
-                   options,
-                   layoutSize,
-                   logicalModel,
-                   visualModel,
-                   metrics );
-
-  // 2) Call the ReLayoutRightToLeftLines() method.
-  Layout::Engine engine;
-  engine.SetMetrics( metrics );
-
-  Layout::Parameters layoutParameters( data.textArea,
-                                       logicalModel->mText.Begin(),
-                                       logicalModel->mLineBreakInfo.Begin(),
-                                       logicalModel->mWordBreakInfo.Begin(),
-                                       ( 0u != logicalModel->mCharacterDirections.Count() ) ? logicalModel->mCharacterDirections.Begin() : NULL,
-                                       visualModel->mGlyphs.Begin(),
-                                       visualModel->mGlyphsToCharacters.Begin(),
-                                       visualModel->mCharactersPerGlyph.Begin(),
-                                       visualModel->mCharactersToGlyph.Begin(),
-                                       visualModel->mGlyphsPerCharacter.Begin(),
-                                       visualModel->mGlyphs.Count(),
-                                       Text::HorizontalAlignment::BEGIN,
-                                       Text::LineWrap::WORD );
-
-  layoutParameters.numberOfBidirectionalInfoRuns = logicalModel->mBidirectionalLineInfo.Count();
-  layoutParameters.lineBidirectionalInfoRunsBuffer = logicalModel->mBidirectionalLineInfo.Begin();
-
-  engine.ReLayoutRightToLeftLines( layoutParameters,
-                                   data.startIndex,
-                                   data.numberOfCharacters,
-                                   visualModel->mGlyphPositions );
-
-  // 3) Compare the results.
-  Vector<Vector2>& glyphPositions = visualModel->mGlyphPositions;
-
-  if( data.totalNumberOfGlyphs != visualModel->mGlyphs.Count() )
-  {
-    std::cout << "  Different number of glyphs : " << visualModel->mGlyphs.Count() << ", expected : " << data.totalNumberOfGlyphs << std::endl;
-    return false;
-  }
-
-  for( unsigned int index = 0u; index < data.totalNumberOfGlyphs; ++index )
-  {
-    const Vector2& position = *( glyphPositions.Begin() + index );
-
-    if( fabsf( position.x - *( data.positions + 2u * index ) ) > Math::MACHINE_EPSILON_1000 )
-    {
-      std::cout << "  Different position for glyph " << index << " x : " << position.x << ", expected : " << *( data.positions + 2u * index ) << std::endl;
-      return false;
-    }
-    if( fabsf( position.y - *( data.positions + 2u * index + 1u ) ) > Math::MACHINE_EPSILON_1000 )
-    {
-      std::cout << "  Different position for glyph " << index << " y : " << position.y << ", expected : " << *( data.positions + 2u * index + 1u ) << std::endl;
-      return false;
-    }
-  }
-
-  return true;
-}
-
-//////////////////////////////////////////////////////////
-
 struct AlignData
 {
   std::string                       description;
@@ -439,6 +323,8 @@ struct AlignData
   unsigned int                      numberOfCharacters;
   unsigned int                      numberOfLines;
   float*                            lineOffsets;
+  Dali::LayoutDirection::Type       layoutDirection;
+  bool                              matchSystemLanguageDirection;
 };
 
 bool AlignTest( const AlignData& data )
@@ -456,8 +342,7 @@ bool AlignTest( const AlignData& data )
   fontClient.GetFontId( pathName + DEFAULT_FONT_DIR + "/tizen/TizenSansArabicRegular.ttf" );
 
   // 1) Create the model.
-  LogicalModelPtr logicalModel;
-  VisualModelPtr visualModel;
+  ModelPtr textModel;
   MetricsPtr metrics;
   Size layoutSize;
 
@@ -476,9 +361,12 @@ bool AlignTest( const AlignData& data )
                    fontDescriptionRuns,
                    options,
                    layoutSize,
-                   logicalModel,
-                   visualModel,
-                   metrics );
+                   textModel,
+                   metrics,
+                   false );
+
+  LogicalModelPtr logicalModel = textModel->mLogicalModel;
+  VisualModelPtr visualModel = textModel->mVisualModel;
 
   // Call the Align method.
   Layout::Engine engine;
@@ -490,7 +378,9 @@ bool AlignTest( const AlignData& data )
                 data.numberOfCharacters,
                 data.horizontalAlignment,
                 visualModel->mLines,
-                alignmentOffset );
+                alignmentOffset,
+                data.layoutDirection,
+                data.matchSystemLanguageDirection );
 
   // Compare results.
   if( data.numberOfLines != visualModel->mLines.Count() )
@@ -510,7 +400,6 @@ bool AlignTest( const AlignData& data )
       return false;
     }
   }
-
   return true;
 }
 
@@ -531,6 +420,7 @@ bool AlignTest( const AlignData& data )
 // UtcDaliTextLayoutMultilineText03
 // UtcDaliTextLayoutMultilineText04
 // UtcDaliTextLayoutMultilineText05
+// UtcDaliTextLayoutMultilineText06
 // UtcDaliTextUpdateLayout01
 // UtcDaliTextUpdateLayout02
 // UtcDaliTextUpdateLayout03
@@ -578,7 +468,7 @@ int UtcDaliTextLayoutSetGetCursorWidth(void)
 
   Layout::Engine engine;
 
-  DALI_TEST_EQUALS( 1, engine.GetCursorWidth(), TEST_LOCATION );
+  DALI_TEST_EQUALS( 0, engine.GetCursorWidth(), TEST_LOCATION );
 
   engine.SetCursorWidth( 2 );
   DALI_TEST_EQUALS( 2, engine.GetCursorWidth(), TEST_LOCATION );
@@ -701,15 +591,16 @@ int UtcDaliTextLayoutSmallTextArea02(void)
   Vector<FontDescriptionRun> fontDescriptionRuns;
   fontDescriptionRuns.PushBack( fontDescriptionRun );
   Size textArea(1.f, 1.f);
-  Size layoutSize(80.f, 20.f);
-  float positions[] = { 1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f };
+  Size layoutSize(81.f, 19.f);
+  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 };
   struct LineRun line =
   {
     { 0u, 11u },
     { 0u, 11u },
-    80.f,
+    81.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -784,14 +675,14 @@ int UtcDaliTextLayoutMultilineText01(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun1 );
   fontDescriptionRuns.PushBack( fontDescriptionRun2 );
   Size textArea(100.f, 300.f);
-  Size layoutSize(95.f, 97.f);
+  Size layoutSize(97.f, 95.f);
   float positions[] =
   {
-    1.f, -12.f, 12.f,  -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f,  -0.f, 40.f, -9.f, 51.f,  -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
-    0.f, -13.f, 10.f,  -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -3.f, 42.f, -12.f,
-    1.f, -12.f,  9.f,  -9.f, 17.f,  -9.f, 27.f,  -9.f, 36.f, -9.f, 45.f, -11.f, 51.f, -0.f,
-    1.f, -12.f, 11.f, -12.f, 15.f, -12.f, 26.f,  -9.f, 35.f, -9.f, 41.f,  -9.f, 50.f, -9.f, 59.f, -11.f, 65.f, -0.f,
-    1.f, -12.f,  5.f, -12.f,  9.f,  -9.f, 19.f,  -9.f, 28.f, -9.f, 35.f,  -0.f, 41.f, -9.f, 50.f, -12.f, 54.f, -0.f, 59.f, -11.f, 66.f,  -9.f, 75.f, -9.f, 83.f, -11.f, 91.f, -2.f
+    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,  9.f,  -9.f, 18.f,  -9.f, 28.f,  -9.f, 38.f, -9.f, 47.f, -11.f, 53.f, -0.f,
+    0.f, -12.f, 10.f, -12.f, 15.f, -12.f, 26.f,  -9.f, 35.f, -9.f, 42.f,  -9.f, 52.f, -9.f, 61.f, -11.f, 67.f, -0.f,
+    0.f, -12.f,  4.f, -12.f,  9.f,  -9.f, 19.f,  -9.f, 29.f, -9.f, 36.f,  -0.f, 42.f, -9.f, 52.f, -12.f, 57.f, -0.f, 62.f, -11.f, 69.f,  -9.f, 79.f, -9.f, 87.f, -11.f, 95.f, -2.f
   };
   struct LineRun line0 =
   {
@@ -799,8 +690,9 @@ int UtcDaliTextLayoutMultilineText01(void)
     { 0u, 12u },
     81.f,
     15.f,
-    -5.f,
-    3.f,
+    -4.f,
+    4.f,
+    0.f,
     0.f,
     false,
     false
@@ -809,9 +701,10 @@ int UtcDaliTextLayoutMultilineText01(void)
   {
     { 12u, 6u },
     { 12u, 6u },
-    43.f,
+    44.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -821,10 +714,11 @@ int UtcDaliTextLayoutMultilineText01(void)
   {
     { 18u, 7u },
     { 18u, 7u },
-    52.f,
+    53.f,
     15.f,
     -4.f,
-    5.f,
+    6.f,
+    0.f,
     0.f,
     false,
     false
@@ -836,7 +730,8 @@ int UtcDaliTextLayoutMultilineText01(void)
     66.f,
     15.f,
     -4.f,
-    5.f,
+    6.f,
+    0.f,
     0.f,
     false,
     false
@@ -845,11 +740,12 @@ int UtcDaliTextLayoutMultilineText01(void)
   {
     { 34u, 14u },
     { 35u, 14u },
-    95.f,
+    97.f,
     15.f,
     -4.f,
     0.f,
     0.f,
+    0.f,
     false,
     false
   };
@@ -978,15 +874,15 @@ int UtcDaliTextLayoutMultilineText02(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun4 );
   fontDescriptionRuns.PushBack( fontDescriptionRun5 );
   Size textArea(100.f, 300.f);
-  Size layoutSize(81.f, 120.f);
+  Size layoutSize(81.f, 114.f);
   float positions[] =
   {
-    1.f, -12.f, 12.f,  -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f,  -0.f, 40.f,  -9.f, 51.f,  -9.f, 61.f,  -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
-    0.f, -13.f, 10.f,  -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f,  -0.f,
-    1.f, -10.f,  9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
-    1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f,  -0.f,
-    1.f, -13.f, 10.f,  -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f,  -0.f, 38.f,  -9.f, 49.f,  -9.f, 59.f,  -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
-    0.f, -13.f, 10.f,  -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -3.f,
+    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
+    0.f, -13.f,  9.f,  -9.f, 19.f,  -9.f, 32.f,  -9.f, 41.f, -0.f, 69.f, -10.f, 60.f, -13.f, 54.f, -10.f, 46.f, -10.f, 79.f,  -0.f,                           // 12 .. 21
+    23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -2.f, 35.f, -12.f,                                                                                // 22 .. 27
+    63.f, -10.f, 54.f, -13.f, 49.f, -10.f, 41.f, -10.f, 35.f, -0.f, 27.f, -10.f, 22.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f,  -0.f,                            // 28 .. 37
+    4.f, -13.f,  12.f,  -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f,  -0.f, 42.f,  -9.f, 54.f,  -9.f, 64.f,  -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f,  // 38 .. 49
+    4.f, -13.f,  13.f,  -9.f, 23.f,  -9.f, 36.f,  -9.f, 0.f, -2.f,                                                                                            // 50 .. 54
   };
   struct LineRun line0 =
   {
@@ -994,8 +890,9 @@ int UtcDaliTextLayoutMultilineText02(void)
     { 0u, 12u },
     81.f,
     15.f,
-    -5.f,
-    3.f,
+    -4.f,
+    4.f,
+    0.f,
     0.f,
     false,
     false
@@ -1004,10 +901,11 @@ int UtcDaliTextLayoutMultilineText02(void)
   {
     { 12u, 10u },
     { 12u, 10u },
-    76.f,
+    79.f,
     15.f,
-    -5.f,
-    4.f,
+    -4.f,
+    5.f,
+    0.f,
     0.f,
     false,
     false
@@ -1018,7 +916,8 @@ int UtcDaliTextLayoutMultilineText02(void)
     { 22u, 6u },
     34.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -1028,10 +927,11 @@ int UtcDaliTextLayoutMultilineText02(void)
   {
     { 28u, 10u },
     { 28u, 10u },
-    67.f,
+    69.f,
     15.f,
-    -5.f,
-    4.f,
+    -4.f,
+    5.f,
+    0.f,
     0.f,
     false,
     false
@@ -1042,8 +942,9 @@ int UtcDaliTextLayoutMultilineText02(void)
     { 38u, 12u },
     79.f,
     15.f,
-    -5.f,
-    3.f,
+    -4.f,
+    4.f,
+    0.f,
     0.f,
     false,
     false
@@ -1052,9 +953,10 @@ int UtcDaliTextLayoutMultilineText02(void)
   {
     { 50u, 5u },
     { 50u, 5u },
-    43.f,
+    45.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -1122,20 +1024,21 @@ int UtcDaliTextLayoutMultilineText03(void)
   Vector<FontDescriptionRun> fontDescriptionRuns;
   fontDescriptionRuns.PushBack( fontDescriptionRun );
   Size textArea(100.f, 300.f);
-  Size layoutSize(96.f, 60.f);
+  Size layoutSize(98.f, 57.f);
   float positions[] =
   {
-    1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f,  -9.f, 36.f,  -9.f, 47.f, -9.f, 57.f, -9.f, 63.f, -13.f, 66.f, -13.f, 75.f, -13.f, 85.f,  -9.f,
-    1.f,  -9.f, 13.f, -9.f, 23.f, -13.f, 32.f,  -9.f, 40.f, -13.f, 44.f, -13.f, 47.f, -9.f, 56.f, -9.f, 67.f,  -9.f, 77.f,  -9.f, 83.f, -13.f, 86.f, -13.f,
-    0.f, -13.f, 10.f, -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f,  -3.f,
+    0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f,  -9.f, 36.f,  -9.f, 48.f, -9.f, 58.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -13.f, 86.f,  -9.f,
+    0.f,  -9.f, 13.f, -9.f, 23.f, -13.f, 31.f,  -9.f, 41.f, -13.f, 45.f, -13.f, 48.f, -9.f, 57.f, -9.f, 69.f,  -9.f, 79.f,  -9.f, 85.f, -13.f, 88.f, -13.f,
+    0.f, -13.f,  9.f, -9.f, 19.f,  -9.f, 32.f,  -9.f, 41.f,  -2.f,
   };
   struct LineRun line0 =
   {
     { 0u, 12u },
     { 0u, 12u },
-    94.f,
+    95.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -1145,9 +1048,10 @@ int UtcDaliTextLayoutMultilineText03(void)
   {
     { 12u, 12u },
     { 12u, 12u },
-    96.f,
+    98.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -1157,9 +1061,10 @@ int UtcDaliTextLayoutMultilineText03(void)
   {
     { 24u, 5u },
     { 24u, 5u },
-    43.f,
+    44.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -1223,18 +1128,18 @@ int UtcDaliTextLayoutMultilineText04(void)
   Vector<FontDescriptionRun> fontDescriptionRuns;
   fontDescriptionRuns.PushBack( fontDescriptionRun );
   Size textArea(100.f, 300.f);
-  Size layoutSize(83.f, 40.f);
+  Size layoutSize(84.f, 38.f);
   float positions[] =
   {
-    1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -3.f, 82.f, -12.f
+    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
   };
   struct LineRun line0 =
   {
     { 0u, 13u },
     { 0u, 13u },
-    83.f,
+    84.f,
     15.f,
-    -5.f,
+    -4.f,
     0.f,
     0.f,
     false,
@@ -1246,7 +1151,8 @@ int UtcDaliTextLayoutMultilineText04(void)
     { 13u, 0u },
     0.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -1336,21 +1242,22 @@ int UtcDaliTextLayoutMultilineText05(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun2 );
   fontDescriptionRuns.PushBack( fontDescriptionRun3 );
   Size textArea(100.f, 300.f);
-  Size layoutSize(88.f, 53.f);
+  Size layoutSize(89.f, 51.f);
   float positions[] =
   {
-    1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -14.f, 59.f, -9.f, 69.f, -9.f, 75.f, -13.f, 78.f, -13.f, 87.f, -0.f,
-    0.f, -13.f, 10.f, -9.f, 18.f,  -9.f, 30.f,  -9.f, 39.f, -3.f
+    0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -14.f, 60.f, -9.f, 71.f, -9.f, 77.f, -13.f, 80.f, -13.f, 89.f, -0.f,
+    0.f, -13.f,  9.f, -9.f, 19.f,  -9.f, 32.f,  -9.f, 41.f, -2.f
   };
   struct LineRun line0 =
   {
     { 0u, 12u },
     { 0u, 12u },
-    88.f,
+    89.f,
     25.f,
-    -8.f,
+    -7.f,
     4.f,
     0.f,
+    0.f,
     false,
     false
   };
@@ -1358,9 +1265,10 @@ int UtcDaliTextLayoutMultilineText05(void)
   {
     { 12u, 5u },
     { 12u, 5u },
-    43.f,
+    44.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -1398,6 +1306,197 @@ int UtcDaliTextLayoutMultilineText05(void)
   END_TEST;
 }
 
+int UtcDaliTextLayoutMultilineText06(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliTextLayoutMultilineText06");
+
+  const std::string fontFamily( "TizenSansHebrew" );
+
+  // Set a known font description
+  FontDescriptionRun fontDescriptionRun;
+  fontDescriptionRun.characterRun.characterIndex = 0u;
+  fontDescriptionRun.characterRun.numberOfCharacters = 10u;
+  fontDescriptionRun.familyLength = fontFamily.size();
+  fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
+  memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
+  fontDescriptionRun.familyDefined = true;
+  fontDescriptionRun.weightDefined = false;
+  fontDescriptionRun.widthDefined = false;
+  fontDescriptionRun.slantDefined = false;
+  fontDescriptionRun.sizeDefined = false;
+
+  Vector<FontDescriptionRun> fontDescriptionRuns;
+  fontDescriptionRuns.PushBack( fontDescriptionRun );
+
+  Size textArea(64.f, 100.f);
+  Size layoutSize(33.f, 38.f);
+  float positions[] =
+  {
+    28.f, -13.f, 18.f, -10.f, 9.f, -10.f, 4.f, -10.f, 0.f, -0.f,
+    23.f, -10.f, 18.f, -10.f, 12.f, -10.f, 4.f, -10.f, 0.f, -10.f
+  };
+  struct LineRun line0 =
+  {
+    { 0u, 5u },
+    { 0u, 5u },
+    32.f,
+    15.f,
+    -4.f,
+    5.f,
+    0.f,
+    0.f,
+    true,
+    false
+  };
+  struct LineRun line1 =
+  {
+    { 5u, 5u },
+    { 5u, 5u },
+    33.f,
+    15.f,
+    -4.f,
+    0.f,
+    0.f,
+    0.f,
+    true,
+    false
+  };
+  Vector<LineRun> lines;
+  lines.PushBack( line0 );
+  lines.PushBack( line1 );
+
+  LayoutTextData data =
+  {
+    "Layout right to left text that doesn't fit in the text area after reordering.",
+    "לכאן שנורו", // If this text is laid-out ltr the width is 64. When reordered, the length is 66. This might cause alignment issues.
+    textArea,
+    1u,
+    fontDescriptionRuns.Begin(),
+    layoutSize,
+    10u,
+    positions,
+    2u,
+    lines.Begin(),
+    Layout::Engine::MULTI_LINE_BOX,
+    0u,
+    10u,
+    false,
+    true
+  };
+
+  if( !LayoutTextTest( data ) )
+  {
+    tet_result(TET_FAIL);
+  }
+
+  tet_result(TET_PASS);
+  END_TEST;
+}
+
+int UtcDaliTextLayoutMultilineText07(void)
+{
+  ToolkitTestApplication application;
+  tet_infoline(" UtcDaliTextLayoutMultilineText07");
+
+  const std::string fontFamily( "TizenSansHebrew" );
+
+  // Set a known font description
+  FontDescriptionRun fontDescriptionRun;
+  fontDescriptionRun.characterRun.characterIndex = 0u;
+  fontDescriptionRun.characterRun.numberOfCharacters = 9u;
+  fontDescriptionRun.familyLength = fontFamily.size();
+  fontDescriptionRun.familyName = new char[fontDescriptionRun.familyLength];
+  memcpy( fontDescriptionRun.familyName, fontFamily.c_str(), fontDescriptionRun.familyLength );
+  fontDescriptionRun.familyDefined = true;
+  fontDescriptionRun.weightDefined = false;
+  fontDescriptionRun.widthDefined = false;
+  fontDescriptionRun.slantDefined = false;
+  fontDescriptionRun.sizeDefined = false;
+
+  Vector<FontDescriptionRun> fontDescriptionRuns;
+  fontDescriptionRuns.PushBack( fontDescriptionRun );
+
+  Size textArea(26.f, 100.f);
+  Size layoutSize(23.f, 57.f);
+  float positions[] =
+  {
+    11.f, -10.f, 5.f, -10.f, 0.f, -10.f,
+    12.f, -10.f, 8.f, -10.f, 0.f, -13.f,
+    14.f, -10.f, 4.f, -10.f, 0.f, -10.f
+  };
+  struct LineRun line0 =
+  {
+    { 0u, 3u },
+    { 0u, 3u },
+    20.f,
+    15.f,
+    -4.f,
+    0.f,
+    0.f,
+    0.f,
+    true,
+    false
+  };
+  struct LineRun line1 =
+  {
+    { 3u, 3u },
+    { 3u, 3u },
+    22.f,
+    15.f,
+    -4.f,
+    0.f,
+    0.f,
+    0.f,
+    true,
+    false
+  };
+  struct LineRun line2 =
+  {
+    { 6u, 3u },
+    { 6u, 3u },
+    23.f,
+    15.f,
+    -4.f,
+    0.f,
+    0.f,
+    0.f,
+    true,
+    false
+  };
+  Vector<LineRun> lines;
+  lines.PushBack( line0 );
+  lines.PushBack( line1 );
+  lines.PushBack( line2 );
+
+  LayoutTextData data =
+  {
+    "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.",
+    "שנורולכאן", // 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.
+    textArea,
+    1u,
+    fontDescriptionRuns.Begin(),
+    layoutSize,
+    9u,
+    positions,
+    3u,
+    lines.Begin(),
+    Layout::Engine::MULTI_LINE_BOX,
+    0u,
+    9u,
+    false,
+    true
+  };
+
+  if( !LayoutTextTest( data ) )
+  {
+    tet_result(TET_FAIL);
+  }
+
+  tet_result(TET_PASS);
+  END_TEST;
+}
+
 int UtcDaliTextUpdateLayout01(void)
 {
   ToolkitTestApplication application;
@@ -1649,27 +1748,27 @@ int UtcDaliTextUpdateLayout01(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun16 );
   fontDescriptionRuns.PushBack( fontDescriptionRun17 );
   Size textArea(100.f, 300.f);
-  Size layoutSize(92.f, 380.f);
+  Size layoutSize(100.f, 361.f);
   float positions[] =
   {
-    1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
-    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
-    0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -13.f, 68.f, -9.f, 76.f, -13.f, 80.f, -13.f, 83.f, -9.f, 92.f, -0.f,
-    0.f, -9.f, 11.f, -9.f, 21.f, -9.f, 27.f, -13.f, 30.f, -13.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
-    1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
-    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
-    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
-    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
-    0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
-    1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
-    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
-    1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
-    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
-    0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f,
+    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
+    0.f, -13.f,  9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 69.f, -10.f, 60.f, -13.f, 54.f, -10.f, 46.f, -10.f, 79.f, -0.f,                                                                                                                             //  12 ..  21
+    23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -2.f, 35.f, -12.f,                                                                                                                                                                              //  22 ..  27
+    58.f, -8.f, 52.f, -6.f, 45.f, -8.f, 41.f, -7.f, 39.f, -11.f, 34.f, -0.f, 30.f, -7.f, 28.f, -11.f, 23.f, -11.f, 16.f, -8.f, 15.f, -11.f, 9.f, -11.f, 4.f, -8.f, 0.f, -0.f, 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f,   //  28 ..  47
+    42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, 59.f, -10.f, 50.f, -13.f, 45.f, -10.f, 36.f, -10.f, 31.f, -0.f,                                                                                                                 //  48 ..  58
+    23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 0.f, -0.f,                                                                                                                                                                                            //  59 ..  63
+    63.f, -10.f, 54.f, -13.f, 49.f, -10.f, 41.f, -10.f, 35.f, -0.f, 27.f, -10.f, 22.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f,                                                                                                                           //  64 ..  73
+    4.f, -13.f,  12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f,                                                                                                     //  74 ..  85
+    4.f, -13.f,  13.f, -9.f, 23.f, -9.f, 36.f, -9.f, 0.f, -2.f, 0.f, -12.f,                                                                                                                                                                                 //  86 ..  91
+    0.f, -13.f,  8.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 79.f, -0.f,                                                                                                     //  92 .. 103
+    91.f, -8.f, 85.f, -6.f, 78.f, -8.f, 74.f, -7.f, 72.f, -11.f, 67.f, -0.f, 63.f, -7.f, 61.f, -11.f, 56.f, -11.f, 49.f, -8.f, 48.f, -11.f, 42.f, -11.f, 37.f, -8.f, 33.f, -0.f, 23.f, -10.f, 14.f, -13.f, 9.f, -10.f, 0.f, -10.f, 98.f, -0.f,              // 104 .. 122
+    23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -0.f,                                                                                                                                                                                           // 123 .. 127
+    0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f,                                                                                                     // 128 .. 139
+    0.f, -13.f,  9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 69.f, -10.f, 60.f, -13.f, 54.f, -10.f, 46.f, -10.f, 79.f, -0.f,                                                                                                                             // 140 .. 149
+    23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -2.f, 35.f, -12.f,                                                                                                                                                                              // 150 .. 155
+    63.f, -10.f, 54.f, -13.f, 49.f, -10.f, 41.f, -10.f, 35.f, -0.f, 27.f, -10.f, 22.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f,                                                                                                                           // 156 .. 165
+    4.f, -13.f,  12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f,                                                                                                     // 166 .. 177
+    54.f, -8.f, 49.f, -6.f, 41.f, -8.f, 37.f, -7.f, 35.f, -11.f, 31.f, -0.f, 26.f, -7.f, 24.f, -11.f, 19.f, -11.f, 12.f, -8.f, 11.f, -11.f, 5.f, -11.f, 0.f, -8.f, 0.f, -0.f,                                                                               // 178 .. 191
   };
 
   struct LineRun line01 =
@@ -1678,8 +1777,9 @@ int UtcDaliTextUpdateLayout01(void)
     { 0u, 12u },
     81.f,
     15.f,
-    -5.f,
-    3.f,
+    -4.f,
+    4.f,
+    0.f,
     0.f,
     false,
     false
@@ -1688,10 +1788,11 @@ int UtcDaliTextUpdateLayout01(void)
   {
     { 12u, 10u },
     { 12u, 10u },
-    76.f,
+    79.f,
     15.f,
-    -5.f,
-    4.f,
+    -4.f,
+    5.f,
+    0.f,
     0.f,
     false,
     false
@@ -1702,7 +1803,8 @@ int UtcDaliTextUpdateLayout01(void)
     { 22u, 6u },
     34.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -1710,35 +1812,38 @@ int UtcDaliTextUpdateLayout01(void)
   };
   struct LineRun line04 =
   {
-    { 28u, 20u },
-    { 28u, 20u },
-    92.f,
+    { 28u, 14u },
+    { 28u, 14u },
+    63.f,
     15.f,
-    -5.f,
+    -4.f,
     4.f,
     0.f,
-    false,
+    0.f,
+    true,
     false
   };
   struct LineRun line05 =
   {
-    { 48u, 11u },
-    { 48u, 11u },
-    76.f,
+    { 42, 12u },
+    { 42, 12u },
+    79.f,
     15.f,
-    -5.f,
+    -4.f,
     4.f,
     0.f,
-    false,
+    0.f,
+    true,
     false
   };
   struct LineRun line06 =
   {
-    { 59u, 5u },
-    { 59u, 5u },
-    31.f,
+    { 54u, 10u },
+    { 54u, 10u },
+    69.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -1748,12 +1853,13 @@ int UtcDaliTextUpdateLayout01(void)
   {
     { 64u, 10u },
     { 64u, 10u },
-    67.f,
+    69.f,
     15.f,
-    -5.f,
-    4.f,
+    -4.f,
+    5.f,
     0.f,
-    false,
+    0.f,
+    true,
     false
   };
   struct LineRun line08 =
@@ -1762,19 +1868,21 @@ int UtcDaliTextUpdateLayout01(void)
     { 74u, 12u },
     79.f,
     15.f,
-    -5.f,
-    3.f,
+    -4.f,
+    4.f,
     0.f,
-    false,
+    0.f,
+    true,
     false
   };
   struct LineRun line09 =
   {
     { 86u, 6u },
     { 86u, 6u },
-    43.f,
+    45.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -1784,11 +1892,12 @@ int UtcDaliTextUpdateLayout01(void)
   {
     { 92u, 12u },
     { 92u, 12u },
-    78.f,
+    79.f,
     15.f,
-    -5.f,
+    -4.f,
     4.f,
     0.f,
+    0.f,
     false,
     false
   };
@@ -1796,10 +1905,11 @@ int UtcDaliTextUpdateLayout01(void)
   {
     { 104u, 19u },
     { 104u, 19u },
-    90.f,
+    100.f,
     15.f,
-    -5.f,
-    4.f,
+    -4.f,
+    5.f,
+    0.f,
     0.f,
     false,
     false
@@ -1810,7 +1920,8 @@ int UtcDaliTextUpdateLayout01(void)
     { 123u, 5u },
     31.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -1822,8 +1933,9 @@ int UtcDaliTextUpdateLayout01(void)
     { 128u, 12u },
     81.f,
     15.f,
-    -5.f,
-    3.f,
+    -4.f,
+    4.f,
+    0.f,
     0.f,
     false,
     false
@@ -1832,10 +1944,11 @@ int UtcDaliTextUpdateLayout01(void)
   {
     { 140u, 10u },
     { 140u, 10u },
-    76.f,
+    79.f,
     15.f,
-    -5.f,
-    4.f,
+    -4.f,
+    5.f,
+    0.f,
     0.f,
     false,
     false
@@ -1846,7 +1959,8 @@ int UtcDaliTextUpdateLayout01(void)
     { 150u, 6u },
     34.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -1856,12 +1970,13 @@ int UtcDaliTextUpdateLayout01(void)
   {
     { 156u, 10u },
     { 156u, 10u },
-    67.f,
+    69.f,
     15.f,
-    -5.f,
-    4.f,
+    -4.f,
+    5.f,
     0.f,
-    false,
+    0.f,
+    true,
     false
   };
   struct LineRun line17 =
@@ -1870,9 +1985,10 @@ int UtcDaliTextUpdateLayout01(void)
     { 166u, 12u },
     79.f,
     15.f,
-    -5.f,
+    -4.f,
     4.f,
     0.f,
+    0.f,
     false,
     false
   };
@@ -1880,9 +1996,10 @@ int UtcDaliTextUpdateLayout01(void)
   {
     { 178u, 14u },
     { 178u, 14u },
-    55.f,
+    63.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -1894,7 +2011,8 @@ int UtcDaliTextUpdateLayout01(void)
     { 192u, 0u },
     0.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -2205,27 +2323,27 @@ int UtcDaliTextUpdateLayout02(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun16 );
   fontDescriptionRuns.PushBack( fontDescriptionRun17 );
   Size textArea(100.f, 300.f);
-  Size layoutSize(92.f, 380.f);
+  Size layoutSize(100.f, 361.f);
   float positions[] =
   {
-    1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
-    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
-    0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -13.f, 68.f, -9.f, 76.f, -13.f, 80.f, -13.f, 83.f, -9.f, 92.f, -0.f,
-    0.f, -9.f, 11.f, -9.f, 21.f, -9.f, 27.f, -13.f, 30.f, -13.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
-    1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
-    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
-    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
-    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
-    0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
-    1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
-    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
-    1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
-    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
-    0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f,
+    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
+    0.f, -13.f,  9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 69.f, -10.f, 60.f, -13.f, 54.f, -10.f, 46.f, -10.f, 79.f, -0.f,                                                                                                                             //  12 ..  21
+    23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -2.f, 35.f, -12.f,                                                                                                                                                                              //  22 ..  27
+    58.f, -8.f, 52.f, -6.f, 45.f, -8.f, 41.f, -7.f, 39.f, -11.f, 34.f, -0.f, 30.f, -7.f, 28.f, -11.f, 23.f, -11.f, 16.f, -8.f, 15.f, -11.f, 9.f, -11.f, 4.f, -8.f, 0.f, -0.f, 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f,   //  28 ..  47
+    42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, 59.f, -10.f, 50.f, -13.f, 45.f, -10.f, 36.f, -10.f, 31.f, -0.f,                                                                                                                 //  48 ..  58
+    23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 0.f, -0.f,                                                                                                                                                                                            //  59 ..  63
+    63.f, -10.f, 54.f, -13.f, 49.f, -10.f, 41.f, -10.f, 35.f, -0.f, 27.f, -10.f, 22.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f,                                                                                                                           //  64 ..  73
+    4.f, -13.f,  12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f,                                                                                                     //  74 ..  85
+    4.f, -13.f,  13.f, -9.f, 23.f, -9.f, 36.f, -9.f, 0.f, -2.f, 0.f, -12.f,                                                                                                                                                                                 //  86 ..  91
+    0.f, -13.f,  8.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 79.f, -0.f,                                                                                                     //  92 .. 103
+    91.f, -8.f, 85.f, -6.f, 78.f, -8.f, 74.f, -7.f, 72.f, -11.f, 67.f, -0.f, 63.f, -7.f, 61.f, -11.f, 56.f, -11.f, 49.f, -8.f, 48.f, -11.f, 42.f, -11.f, 37.f, -8.f, 33.f, -0.f, 23.f, -10.f, 14.f, -13.f, 9.f, -10.f, 0.f, -10.f, 98.f, -0.f,             // 104 .. 122
+    23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -0.f,                                                                                                                                                                                           // 123 .. 127
+    0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f,                                                                                                     // 128 .. 139
+    0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 69.f, -10.f, 60.f, -13.f, 54.f, -10.f, 46.f, -10.f, 79.f, -0.f,                                                                                                                             // 140 .. 149
+    23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -2.f, 35.f, -12.f,                                                                                                                                                                              // 150 .. 155
+    63.f, -10.f, 54.f, -13.f, 49.f, -10.f, 41.f, -10.f, 35.f, -0.f, 27.f, -10.f, 22.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f,                                                                                                                           // 156 .. 165
+    4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f,                                                                                                     // 166 .. 177
+    54.f, -8.f, 49.f, -6.f, 41.f, -8.f, 37.f, -7.f, 35.f, -11.f, 31.f, -0.f, 26.f, -7.f, 24.f, -11.f, 19.f, -11.f, 12.f, -8.f, 11.f, -11.f, 5.f, -11.f, 0.f, -8.f, 0.f, -0.f,                                                                               // 178 .. 191
   };
 
   struct LineRun line01 =
@@ -2234,8 +2352,9 @@ int UtcDaliTextUpdateLayout02(void)
     { 0u, 12u },
     81.f,
     15.f,
-    -5.f,
-    3.f,
+    -4.f,
+    4.f,
+    0.f,
     0.f,
     false,
     false
@@ -2244,10 +2363,11 @@ int UtcDaliTextUpdateLayout02(void)
   {
     { 12u, 10u },
     { 12u, 10u },
-    76.f,
+    79.f,
     15.f,
-    -5.f,
-    4.f,
+    -4.f,
+    5.f,
+    0.f,
     0.f,
     false,
     false
@@ -2258,7 +2378,8 @@ int UtcDaliTextUpdateLayout02(void)
     { 22u, 6u },
     34.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -2266,35 +2387,38 @@ int UtcDaliTextUpdateLayout02(void)
   };
   struct LineRun line04 =
   {
-    { 28u, 20u },
-    { 28u, 20u },
-    92.f,
+    { 28u, 14u },
+    { 28u, 14u },
+    63.f,
     15.f,
-    -5.f,
+    -4.f,
     4.f,
     0.f,
-    false,
+    0.f,
+    true,
     false
   };
   struct LineRun line05 =
   {
-    { 48u, 11u },
-    { 48u, 11u },
-    76.f,
+    { 42u, 12u },
+    { 42u, 12u },
+    79.f,
     15.f,
-    -5.f,
+    -4.f,
     4.f,
     0.f,
+    0.f,
     false,
     false
   };
   struct LineRun line06 =
   {
-    { 59u, 5u },
-    { 59u, 5u },
-    31.f,
+    { 54u, 10u },
+    { 54u, 10u },
+    69.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -2304,10 +2428,11 @@ int UtcDaliTextUpdateLayout02(void)
   {
     { 64u, 10u },
     { 64u, 10u },
-    67.f,
+    69.f,
     15.f,
-    -5.f,
-    4.f,
+    -4.f,
+    5.f,
+    0.f,
     0.f,
     false,
     false
@@ -2318,8 +2443,9 @@ int UtcDaliTextUpdateLayout02(void)
     { 74u, 12u },
     79.f,
     15.f,
-    -5.f,
-    3.f,
+    -4.f,
+    4.f,
+    1.f,
     0.f,
     false,
     false
@@ -2328,9 +2454,10 @@ int UtcDaliTextUpdateLayout02(void)
   {
     { 86u, 6u },
     { 86u, 6u },
-    43.f,
+    45.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -2340,11 +2467,12 @@ int UtcDaliTextUpdateLayout02(void)
   {
     { 92u, 12u },
     { 92u, 12u },
-    78.f,
+    79.f,
     15.f,
-    -5.f,
+    -4.f,
     4.f,
     0.f,
+    0.f,
     false,
     false
   };
@@ -2352,10 +2480,11 @@ int UtcDaliTextUpdateLayout02(void)
   {
     { 104u, 19u },
     { 104u, 19u },
-    90.f,
+    100.f,
     15.f,
-    -5.f,
-    4.f,
+    -4.f,
+    5.f,
+    0.f,
     0.f,
     false,
     false
@@ -2366,7 +2495,8 @@ int UtcDaliTextUpdateLayout02(void)
     { 123u, 5u },
     31.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -2378,8 +2508,9 @@ int UtcDaliTextUpdateLayout02(void)
     { 128u, 12u },
     81.f,
     15.f,
-    -5.f,
-    3.f,
+    -4.f,
+    4.f,
+    0.f,
     0.f,
     false,
     false
@@ -2388,10 +2519,11 @@ int UtcDaliTextUpdateLayout02(void)
   {
     { 140u, 10u },
     { 140u, 10u },
-    76.f,
+    79.f,
     15.f,
-    -5.f,
-    4.f,
+    -4.f,
+    5.f,
+    0.f,
     0.f,
     false,
     false
@@ -2402,7 +2534,8 @@ int UtcDaliTextUpdateLayout02(void)
     { 150u, 6u },
     34.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -2412,10 +2545,11 @@ int UtcDaliTextUpdateLayout02(void)
   {
     { 156u, 10u },
     { 156u, 10u },
-    67.f,
+    69.f,
     15.f,
-    -5.f,
-    4.f,
+    -4.f,
+    5.f,
+    0.f,
     0.f,
     false,
     false
@@ -2426,9 +2560,10 @@ int UtcDaliTextUpdateLayout02(void)
     { 166u, 12u },
     79.f,
     15.f,
-    -5.f,
+    -4.f,
     4.f,
     0.f,
+    0.f,
     false,
     false
   };
@@ -2436,9 +2571,10 @@ int UtcDaliTextUpdateLayout02(void)
   {
     { 178u, 14u },
     { 178u, 14u },
-    55.f,
+    63.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -2450,7 +2586,8 @@ int UtcDaliTextUpdateLayout02(void)
     { 192u, 0u },
     0.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -2761,27 +2898,27 @@ int UtcDaliTextUpdateLayout03(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun16 );
   fontDescriptionRuns.PushBack( fontDescriptionRun17 );
   Size textArea(100.f, 300.f);
-  Size layoutSize(92.f, 380.f);
+  Size layoutSize(100.f, 361.f);
   float positions[] =
   {
-    1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
-    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
-    0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -13.f, 68.f, -9.f, 76.f, -13.f, 80.f, -13.f, 83.f, -9.f, 92.f, -0.f,
-    0.f, -9.f, 11.f, -9.f, 21.f, -9.f, 27.f, -13.f, 30.f, -13.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
-    1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
-    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
-    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -3.f, 42.f, -12.f,
-    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
-    0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
-    1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
-    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -10.f, 55.f, -13.f, 62.f, -10.f, 67.f, -10.f, 75.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -3.f, 33.f, -12.f,
-    1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f,
-    1.f, -13.f, 10.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 49.f, -9.f, 59.f, -9.f, 65.f, -13.f, 68.f, -13.f, 77.f, -0.f,
-    0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f,
+    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
+    0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 69.f, -10.f, 60.f, -13.f, 54.f, -10.f, 46.f, -10.f, 79.f, -0.f,                                                                                                                              //  12 ..  21
+    23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -2.f, 35.f, -12.f,                                                                                                                                                                             //  22 ..  27
+    58.f, -8.f, 52.f, -6.f, 45.f, -8.f, 41.f, -7.f, 39.f, -11.f, 34.f, -0.f, 30.f, -7.f, 28.f, -11.f, 23.f, -11.f, 16.f, -8.f, 15.f, -11.f, 9.f, -11.f, 4.f, -8.f, 0.f, -0.f, 4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f,     //  28 ..  47
+    42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f, 59.f, -10.f, 50.f, -13.f, 45.f, -10.f, 36.f, -10.f, 31.f, -0.f,                                                                                                                //  48 ..  58
+    23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 0.f, -0.f,                                                                                                                                                                                           //  59 ..  63
+    63.f, -10.f, 54.f, -13.f, 49.f, -10.f, 41.f, -10.f, 35.f, -0.f, 27.f, -10.f, 22.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f,                                                                                                                           //  64 ..  73
+    4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f,                                                                                                      //  74 ..  85
+    4.f, -13.f, 13.f, -9.f, 23.f, -9.f, 36.f, -9.f, 0.f, -2.f, 0.f, -12.f,                                                                                                                                                                                  //  86 ..  91
+    0.f, -13.f, 8.f, -9.f, 18.f, -13.f, 22.f, -13.f, 25.f, -9.f, 34.f, -0.f, 38.f, -9.f, 50.f, -9.f, 60.f, -9.f, 66.f, -13.f, 69.f, -13.f, 79.f, -0.f,                                                                                                      //  92 .. 103
+    91.f, -8.f, 85.f, -6.f, 78.f, -8.f, 74.f, -7.f, 72.f, -11.f, 67.f, -0.f, 63.f, -7.f, 61.f, -11.f, 56.f, -11.f, 49.f, -8.f, 48.f, -11.f, 42.f, -11.f, 37.f, -8.f, 33.f, -0.f, 23.f, -10.f, 14.f, -13.f, 9.f, -10.f, 0.f, -10.f, 98.f, -0.f,              // 104 .. 122
+    23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -0.f,                                                                                                                                                                                          // 123 .. 127
+    0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f,                                                                                                     // 128 .. 139
+    0.f, -13.f, 9.f, -9.f, 19.f, -9.f, 32.f, -9.f, 41.f, -0.f, 69.f, -10.f, 60.f, -13.f, 54.f, -10.f, 46.f, -10.f, 79.f, -0.f,                                                                                                                              // 140 .. 149
+    23.f, -10.f, 18.f, -10.f, 10.f, -13.f, 0.f, -10.f, 31.f, -2.f, 35.f, -12.f,                                                                                                                                                                             // 150 .. 155
+    63.f, -10.f, 54.f, -13.f, 49.f, -10.f, 41.f, -10.f, 35.f, -0.f, 27.f, -10.f, 22.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f,                                                                                                                           // 156 .. 165
+    4.f, -13.f, 12.f, -9.f, 22.f, -13.f, 26.f, -13.f, 29.f, -9.f, 38.f, -0.f, 42.f, -9.f, 54.f, -9.f, 64.f, -9.f, 70.f, -13.f, 73.f, -13.f, 0.f, -0.f,                                                                                                      // 166 .. 177
+    54.f, -8.f, 49.f, -6.f, 41.f, -8.f, 37.f, -7.f, 35.f, -11.f, 31.f, -0.f, 26.f, -7.f, 24.f, -11.f, 19.f, -11.f, 12.f, -8.f, 11.f, -11.f, 5.f, -11.f, 0.f, -8.f, 0.f, -0.f,                                                                               // 178 .. 191
   };
 
   struct LineRun line01 =
@@ -2790,8 +2927,9 @@ int UtcDaliTextUpdateLayout03(void)
     { 0u, 12u },
     81.f,
     15.f,
-    -5.f,
-    3.f,
+    -4.f,
+    4.f,
+    0.f,
     0.f,
     false,
     false
@@ -2800,10 +2938,11 @@ int UtcDaliTextUpdateLayout03(void)
   {
     { 12u, 10u },
     { 12u, 10u },
-    76.f,
+    79.f,
     15.f,
-    -5.f,
-    4.f,
+    -4.f,
+    5.f,
+    0.f,
     0.f,
     false,
     false
@@ -2814,7 +2953,8 @@ int UtcDaliTextUpdateLayout03(void)
     { 22u, 6u },
     34.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -2822,35 +2962,38 @@ int UtcDaliTextUpdateLayout03(void)
   };
   struct LineRun line04 =
   {
-    { 28u, 20u },
-    { 28u, 20u },
-    92.f,
+    { 28u, 14u },
+    { 28u, 14u },
+    63.f,
     15.f,
-    -5.f,
+    -4.f,
     4.f,
     0.f,
+    0.f,
     false,
     false
   };
   struct LineRun line05 =
   {
-    { 48u, 11u },
-    { 48u, 11u },
-    76.f,
+    { 42u, 12u },
+    { 42u, 12u },
+    79.f,
     15.f,
-    -5.f,
+    -4.f,
     4.f,
     0.f,
+    0.f,
     false,
     false
   };
   struct LineRun line06 =
   {
-    { 59u, 5u },
-    { 59u, 5u },
-    31.f,
+    { 54u, 10u },
+    { 54u, 10u },
+    69.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -2860,10 +3003,11 @@ int UtcDaliTextUpdateLayout03(void)
   {
     { 64u, 10u },
     { 64u, 10u },
-    67.f,
+    69.f,
     15.f,
-    -5.f,
-    4.f,
+    -4.f,
+    5.f,
+    0.f,
     0.f,
     false,
     false
@@ -2874,8 +3018,9 @@ int UtcDaliTextUpdateLayout03(void)
     { 74u, 12u },
     79.f,
     15.f,
-    -5.f,
-    3.f,
+    -4.f,
+    4.f,
+    1.f,
     0.f,
     false,
     false
@@ -2884,9 +3029,10 @@ int UtcDaliTextUpdateLayout03(void)
   {
     { 86u, 6u },
     { 86u, 6u },
-    43.f,
+    45.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -2896,11 +3042,12 @@ int UtcDaliTextUpdateLayout03(void)
   {
     { 92u, 12u },
     { 92u, 12u },
-    78.f,
+    79.f,
     15.f,
-    -5.f,
+    -4.f,
     4.f,
     0.f,
+    0.f,
     false,
     false
   };
@@ -2908,10 +3055,11 @@ int UtcDaliTextUpdateLayout03(void)
   {
     { 104u, 19u },
     { 104u, 19u },
-    90.f,
+    100.f,
     15.f,
-    -5.f,
-    4.f,
+    -4.f,
+    5.f,
+    0.f,
     0.f,
     false,
     false
@@ -2922,7 +3070,8 @@ int UtcDaliTextUpdateLayout03(void)
     { 123u, 5u },
     31.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -2934,8 +3083,9 @@ int UtcDaliTextUpdateLayout03(void)
     { 128u, 12u },
     81.f,
     15.f,
-    -5.f,
-    3.f,
+    -4.f,
+    4.f,
+    0.f,
     0.f,
     false,
     false
@@ -2944,10 +3094,11 @@ int UtcDaliTextUpdateLayout03(void)
   {
     { 140u, 10u },
     { 140u, 10u },
-    76.f,
+    79.f,
     15.f,
-    -5.f,
-    4.f,
+    -4.f,
+    5.f,
+    0.f,
     0.f,
     false,
     false
@@ -2958,7 +3109,8 @@ int UtcDaliTextUpdateLayout03(void)
     { 150u, 6u },
     34.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -2968,10 +3120,11 @@ int UtcDaliTextUpdateLayout03(void)
   {
     { 156u, 10u },
     { 156u, 10u },
-    67.f,
+    69.f,
     15.f,
-    -5.f,
-    4.f,
+    -4.f,
+    5.f,
+    0.f,
     0.f,
     false,
     false
@@ -2982,9 +3135,10 @@ int UtcDaliTextUpdateLayout03(void)
     { 166u, 12u },
     79.f,
     15.f,
-    -5.f,
+    -4.f,
     4.f,
     0.f,
+    0.f,
     false,
     false
   };
@@ -2992,9 +3146,10 @@ int UtcDaliTextUpdateLayout03(void)
   {
     { 178u, 14u },
     { 178u, 14u },
-    55.f,
+    63.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -3006,7 +3161,8 @@ int UtcDaliTextUpdateLayout03(void)
     { 192u, 0u },
     0.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -3097,7 +3253,8 @@ int UtcDaliTextLayoutEllipsis01(void)
     { 0u, 13u },
     93.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -3108,11 +3265,11 @@ int UtcDaliTextLayoutEllipsis01(void)
 
   float positions[] =
   {
-    1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f, 83.f, -13.f,
+    0.f, -12.f, 10.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 52.f, -9.f, 62.f, -9.f, 69.f, -13.f, 72.f, -13.f, 81.f, -0.f, 85.f, -13.f,
   };
 
   Size textArea( 100.f, 50.f );
-  Size layoutSize( 100.f, 20.f );
+  Size layoutSize( 100.f, 19.f );
 
   LayoutTextData data =
   {
@@ -3173,8 +3330,9 @@ int UtcDaliTextLayoutEllipsis02(void)
     { 0u, 12u },
     81.f,
     15.f,
-    -5.f,
-    3.f,
+    -4.f,
+    4.f,
+    0.f,
     0.f,
     false,
     false
@@ -3183,9 +3341,10 @@ int UtcDaliTextLayoutEllipsis02(void)
   {
     { 12u, 12u },
     { 12u, 12u },
-    93.f,
+    95.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -3197,12 +3356,12 @@ int UtcDaliTextLayoutEllipsis02(void)
 
   float positions[] =
   {
-    1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f, 79.f, -0.f,
-    0.f, -13.f, 10.f, -9.f, 18.f, -9.f, 30.f, -9.f, 39.f, -0.f, 44.f, -13.f, 53.f, -9.f, 61.f, -13.f, 65.f, -13.f, 68.f, -9.f, 77.f, -0.f, 81.f, -9.f,
+    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, -0.f, 46.f, -13.f, 54.f, -9.f, 64.f, -13.f, 68.f, -13.f, 71.f, -9.f, 80.f, -0.f, 84.f, -9.f,
   };
 
   Size textArea( 100.f, 50.f );
-  Size layoutSize( 100.f, 40.f );
+  Size layoutSize( 100.f, 38.f );
 
   LayoutTextData data =
   {
@@ -3325,11 +3484,12 @@ int UtcDaliTextLayoutEllipsis03(void)
 
   struct LineRun line01 =
   {
-    { 0u, 16u },
-    { 0u, 16u },
-    95.f,
+    { 0u, 14u },
+    { 0u, 14u },
+    97.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
@@ -3340,11 +3500,11 @@ int UtcDaliTextLayoutEllipsis03(void)
 
   float positions[] =
   {
-    1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f, 69.f, -8.f, 76.f, -6.f, 81.f, -7.f, 87.f, -7.f, 92.f, -11.f, 94.f, -0.f,
+    88.f, -10.f, 80.f, -13.f, 74.f, -10.f, 66.f, -10.f, 60.f, -0.f, 52.f, -10.f, 47.f, -10.f, 39.f, -13.f, 30.f, -10.f, 24.f, -0.f, 17.f, -8.f, 12.f, -6.f, 4.f, -8.f, 0.f, -7.f, 77.f, -11.f, 72.f, -0.f,
   };
 
   Size textArea( 100.f, 50.f );
-  Size layoutSize( 100.f, 20.f );
+  Size layoutSize( 100.f, 19.f );
 
   LayoutTextData data =
   {
@@ -3467,24 +3627,26 @@ int UtcDaliTextLayoutEllipsis04(void)
 
   struct LineRun line01 =
   {
-    { 0u, 16u },
-    { 0u, 16u },
-    96.f,
+    { 0u, 10u },
+    { 0u, 10u },
+    69.f,
     15.f,
-    -5.f,
-    3.f,
+    -4.f,
+    5.f,
+    0.f,
     0.f,
     false,
     false
   };
   struct LineRun line02 =
   {
-    { 16u, 18u },
-    { 16u, 18u },
-    97.f,
+    { 10u, 19u },
+    { 10u, 19u },
+    99.f,
     15.f,
-    -5.f,
-    4.f,
+    -4.f,
+    5.f,
+    0.f,
     0.f,
     false,
     true
@@ -3495,16 +3657,16 @@ int UtcDaliTextLayoutEllipsis04(void)
 
   float positions[] =
   {
-    1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f, 69.f, -8.f, 76.f, -6.f, 81.f, -7.f, 87.f, -7.f, 92.f, -11.f, 94.f, -0.f,
-    0.f, -7.f, 5.f, -11.f, 6.f, -11.f, 10.f, -8.f, 17.f, -11.f, 18.f, -11.f, 22.f, -8.f, 28.f, -0.f, 32.f, -10.f, 43.f, -13.f, 50.f, -10.f, 55.f, -10.f, 63.f, -0.f, 68.f, -10.f, 76.f, -10.f, 81.f, -13.f, 89.f, -10.f, 97.f, -0.f,
+    63.f, -10.f, 54.f, -13.f, 49.f, -10.f, 41.f, -10.f, 35.f, -0.f, 27.f, -10.f, 22.f, -10.f, 14.f, -13.f, 4.f, -10.f, 0.f, -0.f, 95.f, -8.f, 90.f, -6.f, 82.f, -8.f, 78.f, -7.f, 77.f, -11.f, 72.f, -0.f,
+    67.f, -7.f, 66.f, -11.f, 60.f, -11.f, 54.f, -8.f, 52.f, -11.f, 46.f, -11.f, 41.f, -8.f, 37.f, -0.f, 27.f, -10.f, 18.f, -13.f, 13.f, -10.f, 4.f, -10.f, 0.f, -0.f, 93.f, -10.f, 88.f, -10.f, 80.f, -13.f, 71.f, -10.f, 65.f, -0.f,
   };
 
   Size textArea( 100.f, 50.f );
-  Size layoutSize( 100.f, 40.f );
+  Size layoutSize( 100.f, 38.f );
 
   LayoutTextData data =
   {
-    "Layout single-line RTL text with ellipsis.",
+    "Layout multi-line RTL text with ellipsis.",
     "שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم שלום עולם مرحبا بالعالم.",
     textArea,
     6u,
@@ -3557,24 +3719,25 @@ int UtcDaliTextLayoutEllipsis05(void)
   {
     { 0u, 11u },
     { 0u, 11u },
-    80.f,
+    81.f,
     15.f,
-    -5.f,
+    -4.f,
+    0.f,
     0.f,
     0.f,
     false,
-    true
+    false
   };
   Vector<LineRun> lines;
   lines.PushBack( line01 );
 
   float positions[] =
   {
-    1.f, -12.f
+    0.f, -12.f
   };
 
   Size textArea( 100.f, 19.f );
-  Size layoutSize( 100.f, 20.f );
+  Size layoutSize( 81.f, 19.f );
 
   LayoutTextData data =
   {
@@ -3604,77 +3767,24 @@ int UtcDaliTextLayoutEllipsis05(void)
   END_TEST;
 }
 
-int UtcDaliTextReorderLayout01(void)
+int UtcDaliTextAlign01(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliTextReorderLayout01");
+  tet_infoline(" UtcDaliTextAlign01");
 
-  // Reorder lines. No right to left characters.
+  // Calculate text alignment.
 
   const std::string fontLatin( "TizenSans" );
-
-  // Set a known font description
-  FontDescriptionRun fontDescriptionRun01;
-  fontDescriptionRun01.characterRun.characterIndex = 0u;
-  fontDescriptionRun01.characterRun.numberOfCharacters = 11u;
-  fontDescriptionRun01.familyLength = fontLatin.size();
-  fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
-  memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
-  fontDescriptionRun01.familyDefined = true;
-  fontDescriptionRun01.weightDefined = false;
-  fontDescriptionRun01.widthDefined = false;
-  fontDescriptionRun01.slantDefined = false;
-  fontDescriptionRun01.sizeDefined = false;
-
-  Vector<FontDescriptionRun> fontDescriptionRuns;
-  fontDescriptionRuns.PushBack( fontDescriptionRun01 );
-
-  float positions[] =
-  {
-    1.f, -12.f, 12.f, -9.f, 20.f, -13.f, 24.f, -13.f, 27.f, -9.f, 36.f, -0.f, 40.f, -9.f, 51.f, -9.f, 61.f, -9.f, 67.f, -13.f, 70.f, -13.f,
-  };
-
-  Size textArea( 100.f, 300.f );
-
-  ReLayoutRightToLeftLinesData data =
-  {
-    "Text with no right to left text.",
-    "Hello world",
-    textArea,
-    1u,
-    fontDescriptionRuns.Begin(),
-    11u,
-    positions,
-    0u,
-    11u
-  };
-
-  if( !ReLayoutRightToLeftLinesTest( data ) )
-  {
-    tet_result(TET_FAIL);
-  }
-
-  tet_result(TET_PASS);
-  END_TEST;
-}
-
-int UtcDaliTextReorderLayout02(void)
-{
-  ToolkitTestApplication application;
-  tet_infoline(" UtcDaliTextReorderLayout02");
-
-  // Reorder lines of the first paragraph.
-
   const std::string fontHebrew( "TizenSansHebrew" );
   const std::string fontArabic( "TizenSansArabic" );
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun01;
   fontDescriptionRun01.characterRun.characterIndex = 0u;
-  fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
-  fontDescriptionRun01.familyLength = fontHebrew.size();
+  fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun01.familyLength = fontLatin.size();
   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
-  memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength );
+  memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
   fontDescriptionRun01.familyDefined = true;
   fontDescriptionRun01.weightDefined = false;
   fontDescriptionRun01.widthDefined = false;
@@ -3682,11 +3792,11 @@ int UtcDaliTextReorderLayout02(void)
   fontDescriptionRun01.sizeDefined = false;
 
   FontDescriptionRun fontDescriptionRun02;
-  fontDescriptionRun02.characterRun.characterIndex = 10u;
-  fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
-  fontDescriptionRun02.familyLength = fontArabic.size();
+  fontDescriptionRun02.characterRun.characterIndex = 12u;
+  fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
+  fontDescriptionRun02.familyLength = fontHebrew.size();
   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
-  memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength );
+  memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
   fontDescriptionRun02.familyDefined = true;
   fontDescriptionRun02.weightDefined = false;
   fontDescriptionRun02.widthDefined = false;
@@ -3694,7 +3804,7 @@ int UtcDaliTextReorderLayout02(void)
   fontDescriptionRun02.sizeDefined = false;
 
   FontDescriptionRun fontDescriptionRun03;
-  fontDescriptionRun03.characterRun.characterIndex = 24u;
+  fontDescriptionRun03.characterRun.characterIndex = 22u;
   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
   fontDescriptionRun03.familyLength = fontArabic.size();
   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
@@ -3706,11 +3816,11 @@ int UtcDaliTextReorderLayout02(void)
   fontDescriptionRun03.sizeDefined = false;
 
   FontDescriptionRun fontDescriptionRun04;
-  fontDescriptionRun04.characterRun.characterIndex = 38u;
-  fontDescriptionRun04.characterRun.numberOfCharacters = 10u;
-  fontDescriptionRun04.familyLength = fontHebrew.size();
+  fontDescriptionRun04.characterRun.characterIndex = 36u;
+  fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun04.familyLength = fontLatin.size();
   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
-  memcpy( fontDescriptionRun04.familyName, fontHebrew.c_str(), fontDescriptionRun04.familyLength );
+  memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
   fontDescriptionRun04.familyDefined = true;
   fontDescriptionRun04.weightDefined = false;
   fontDescriptionRun04.widthDefined = false;
@@ -3719,10 +3829,10 @@ int UtcDaliTextReorderLayout02(void)
 
   FontDescriptionRun fontDescriptionRun05;
   fontDescriptionRun05.characterRun.characterIndex = 48u;
-  fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
-  fontDescriptionRun05.familyLength = fontHebrew.size();
+  fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun05.familyLength = fontLatin.size();
   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
-  memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
+  memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
   fontDescriptionRun05.familyDefined = true;
   fontDescriptionRun05.weightDefined = false;
   fontDescriptionRun05.widthDefined = false;
@@ -3730,8 +3840,8 @@ int UtcDaliTextReorderLayout02(void)
   fontDescriptionRun05.sizeDefined = false;
 
   FontDescriptionRun fontDescriptionRun06;
-  fontDescriptionRun06.characterRun.characterIndex = 58u;
-  fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
+  fontDescriptionRun06.characterRun.characterIndex = 60u;
+  fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
   fontDescriptionRun06.familyLength = fontArabic.size();
   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
@@ -3749,34 +3859,27 @@ int UtcDaliTextReorderLayout02(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
 
-  float positions[] =
-  {
-    87.f, -10.f, 79.f, -13.f, 74.f, -10.f, 66.f, -10.f, 61.f, -0.f, 53.f, -10.f, 48.f, -10.f, 41.f, -13.f, 32.f, -10.f, 27.f, -0.f, 20.f, -8.f, 15.f, -6.f, 8.f, -7.f, 5.f, -7.f, 4.f, -11.f, 0.f, -0.f,
-    23.f, -7.f, 22.f, -11.f, 17.f, -11.f, 12.f, -8.f, 10.f, -11.f, 5.f, -11.f, 0.f, -8.f, 0.f, -0.f,
-    0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
-    1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f, 69.f, -8.f, 76.f, -6.f, 81.f, -7.f, 87.f, -7.f, 92.f, -11.f, 94.f, -0.f,
-    0.f, -7.f, 5.f, -11.f, 6.f, -11.f, 10.f, -8.f, 17.f, -11.f, 18.f, -11.f, 22.f, -8.f, 30.f, -2.f,
-  };
+  float positions[] = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f };
 
   Size textArea( 100.f, 300.f );
-
-  ReLayoutRightToLeftLinesData data =
+  AlignData data =
   {
-    "Paragraphs with right to left text.",
-    "שלום עולם مرحبا بالعالم\n"
-    "مرحبا بالعالم שלום עולם\n"
-    "שלום עולם مرحبا بالعالم.",
+    "Begin alignment for the first paragraph.",
+    "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
     textArea,
     6u,
     fontDescriptionRuns.Begin(),
-    72u,
-    positions,
+    Text::HorizontalAlignment::BEGIN,
+    Text::VerticalAlignment::TOP,
     0u,
-    24u
+    22u,
+    6u,
+    positions,
+    Dali::LayoutDirection::LEFT_TO_RIGHT,
+    false
   };
 
-  if( !ReLayoutRightToLeftLinesTest( data ) )
+  if( !AlignTest( data ) )
   {
     tet_result(TET_FAIL);
   }
@@ -3785,23 +3888,24 @@ int UtcDaliTextReorderLayout02(void)
   END_TEST;
 }
 
-int UtcDaliTextReorderLayout03(void)
+int UtcDaliTextAlign02(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliTextReorderLayout03");
+  tet_infoline(" UtcDaliTextAlign02");
 
-  // Reorder lines of the mid paragraph.
+  // Calculate text alignment.
 
+  const std::string fontLatin( "TizenSans" );
   const std::string fontHebrew( "TizenSansHebrew" );
   const std::string fontArabic( "TizenSansArabic" );
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun01;
   fontDescriptionRun01.characterRun.characterIndex = 0u;
-  fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
-  fontDescriptionRun01.familyLength = fontHebrew.size();
+  fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun01.familyLength = fontLatin.size();
   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
-  memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength );
+  memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
   fontDescriptionRun01.familyDefined = true;
   fontDescriptionRun01.weightDefined = false;
   fontDescriptionRun01.widthDefined = false;
@@ -3809,11 +3913,11 @@ int UtcDaliTextReorderLayout03(void)
   fontDescriptionRun01.sizeDefined = false;
 
   FontDescriptionRun fontDescriptionRun02;
-  fontDescriptionRun02.characterRun.characterIndex = 10u;
-  fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
-  fontDescriptionRun02.familyLength = fontArabic.size();
+  fontDescriptionRun02.characterRun.characterIndex = 12u;
+  fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
+  fontDescriptionRun02.familyLength = fontHebrew.size();
   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
-  memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength );
+  memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
   fontDescriptionRun02.familyDefined = true;
   fontDescriptionRun02.weightDefined = false;
   fontDescriptionRun02.widthDefined = false;
@@ -3821,7 +3925,7 @@ int UtcDaliTextReorderLayout03(void)
   fontDescriptionRun02.sizeDefined = false;
 
   FontDescriptionRun fontDescriptionRun03;
-  fontDescriptionRun03.characterRun.characterIndex = 24u;
+  fontDescriptionRun03.characterRun.characterIndex = 22u;
   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
   fontDescriptionRun03.familyLength = fontArabic.size();
   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
@@ -3833,11 +3937,11 @@ int UtcDaliTextReorderLayout03(void)
   fontDescriptionRun03.sizeDefined = false;
 
   FontDescriptionRun fontDescriptionRun04;
-  fontDescriptionRun04.characterRun.characterIndex = 38u;
-  fontDescriptionRun04.characterRun.numberOfCharacters = 10u;
-  fontDescriptionRun04.familyLength = fontHebrew.size();
+  fontDescriptionRun04.characterRun.characterIndex = 36u;
+  fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun04.familyLength = fontLatin.size();
   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
-  memcpy( fontDescriptionRun04.familyName, fontHebrew.c_str(), fontDescriptionRun04.familyLength );
+  memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
   fontDescriptionRun04.familyDefined = true;
   fontDescriptionRun04.weightDefined = false;
   fontDescriptionRun04.widthDefined = false;
@@ -3846,10 +3950,10 @@ int UtcDaliTextReorderLayout03(void)
 
   FontDescriptionRun fontDescriptionRun05;
   fontDescriptionRun05.characterRun.characterIndex = 48u;
-  fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
-  fontDescriptionRun05.familyLength = fontHebrew.size();
+  fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun05.familyLength = fontLatin.size();
   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
-  memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
+  memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
   fontDescriptionRun05.familyDefined = true;
   fontDescriptionRun05.weightDefined = false;
   fontDescriptionRun05.widthDefined = false;
@@ -3857,8 +3961,8 @@ int UtcDaliTextReorderLayout03(void)
   fontDescriptionRun05.sizeDefined = false;
 
   FontDescriptionRun fontDescriptionRun06;
-  fontDescriptionRun06.characterRun.characterIndex = 58u;
-  fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
+  fontDescriptionRun06.characterRun.characterIndex = 60u;
+  fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
   fontDescriptionRun06.familyLength = fontArabic.size();
   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
@@ -3876,34 +3980,27 @@ int UtcDaliTextReorderLayout03(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
 
-  float positions[] =
-  {
-    1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f, 69.f, -8.f, 76.f, -6.f, 81.f, -7.f, 87.f, -7.f, 92.f, -11.f, 94.f, -0.f,
-    0.f, -7.f,  5.f, -11.f, 6.f, -11.f, 10.f, -8.f, 17.f, -11.f, 18.f, -11.f, 22.f, -8.f, 28.f, -0.f,
-    86.f, -8.f, 81.f, -6.f, 74.f, -7.f, 71.f, -7.f, 70.f, -11.f, 66.f, -0.f, 62.f, -7.f, 61.f, -11.f, 56.f, -11.f, 51.f, -8.f, 49.f, -11.f, 44.f, -11.f, 39.f, -8.f, 36.f, -0.f, 26.f, -10.f, 18.f, -13.f, 13.f, -10.f, 5.f, -10.f, 0.f, -0.f,
-    22.f, -10.f, 17.f, -10.f, 10.f, -13.f, 1.f, -10.f, 0.f, -0.f,
-    1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f, 69.f, -8.f, 76.f, -6.f, 81.f, -7.f, 87.f, -7.f, 92.f, -11.f, 94.f, -0.f,
-    0.f, -7.f, 5.f, -11.f, 6.f, -11.f, 10.f, -8.f, 17.f, -11.f, 18.f, -11.f, 22.f, -8.f, 30.f, -2.f,
-  };
+  float positions[] = { 0.f, 0.f, 33.f, 19.f, 0.f, 0.f };
 
   Size textArea( 100.f, 300.f );
-
-  ReLayoutRightToLeftLinesData data =
+  AlignData data =
   {
-    "Paragraphs with right to left text.",
-    "שלום עולם مرحبا بالعالم\n"
-    "مرحبا بالعالم שלום עולם\n"
-    "שלום עולם مرحبا بالعالم.",
+    "Begin alignment for the mid paragraph.",
+    "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
     textArea,
     6u,
     fontDescriptionRuns.Begin(),
-    72u,
+    Text::HorizontalAlignment::BEGIN,
+    Text::VerticalAlignment::TOP,
+    22u,
+    26u,
+    6u,
     positions,
-    24u,
-    24u
+    Dali::LayoutDirection::LEFT_TO_RIGHT,
+    false
   };
 
-  if( !ReLayoutRightToLeftLinesTest( data ) )
+  if( !AlignTest( data ) )
   {
     tet_result(TET_FAIL);
   }
@@ -3912,23 +4009,24 @@ int UtcDaliTextReorderLayout03(void)
   END_TEST;
 }
 
-int UtcDaliTextReorderLayout04(void)
+int UtcDaliTextAlign03(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliTextReorderLayout04");
+  tet_infoline(" UtcDaliTextAlign03");
 
-  // Reorder lines of the last paragraph.
+  // Calculate text alignment.
 
+  const std::string fontLatin( "TizenSans" );
   const std::string fontHebrew( "TizenSansHebrew" );
   const std::string fontArabic( "TizenSansArabic" );
 
   // Set a known font description
   FontDescriptionRun fontDescriptionRun01;
   fontDescriptionRun01.characterRun.characterIndex = 0u;
-  fontDescriptionRun01.characterRun.numberOfCharacters = 10u;
-  fontDescriptionRun01.familyLength = fontHebrew.size();
+  fontDescriptionRun01.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun01.familyLength = fontLatin.size();
   fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
-  memcpy( fontDescriptionRun01.familyName, fontHebrew.c_str(), fontDescriptionRun01.familyLength );
+  memcpy( fontDescriptionRun01.familyName, fontLatin.c_str(), fontDescriptionRun01.familyLength );
   fontDescriptionRun01.familyDefined = true;
   fontDescriptionRun01.weightDefined = false;
   fontDescriptionRun01.widthDefined = false;
@@ -3936,11 +4034,11 @@ int UtcDaliTextReorderLayout04(void)
   fontDescriptionRun01.sizeDefined = false;
 
   FontDescriptionRun fontDescriptionRun02;
-  fontDescriptionRun02.characterRun.characterIndex = 10u;
-  fontDescriptionRun02.characterRun.numberOfCharacters = 14u;
-  fontDescriptionRun02.familyLength = fontArabic.size();
+  fontDescriptionRun02.characterRun.characterIndex = 12u;
+  fontDescriptionRun02.characterRun.numberOfCharacters = 10u;
+  fontDescriptionRun02.familyLength = fontHebrew.size();
   fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
-  memcpy( fontDescriptionRun02.familyName, fontArabic.c_str(), fontDescriptionRun02.familyLength );
+  memcpy( fontDescriptionRun02.familyName, fontHebrew.c_str(), fontDescriptionRun02.familyLength );
   fontDescriptionRun02.familyDefined = true;
   fontDescriptionRun02.weightDefined = false;
   fontDescriptionRun02.widthDefined = false;
@@ -3948,7 +4046,7 @@ int UtcDaliTextReorderLayout04(void)
   fontDescriptionRun02.sizeDefined = false;
 
   FontDescriptionRun fontDescriptionRun03;
-  fontDescriptionRun03.characterRun.characterIndex = 24u;
+  fontDescriptionRun03.characterRun.characterIndex = 22u;
   fontDescriptionRun03.characterRun.numberOfCharacters = 14u;
   fontDescriptionRun03.familyLength = fontArabic.size();
   fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
@@ -3960,11 +4058,11 @@ int UtcDaliTextReorderLayout04(void)
   fontDescriptionRun03.sizeDefined = false;
 
   FontDescriptionRun fontDescriptionRun04;
-  fontDescriptionRun04.characterRun.characterIndex = 38u;
-  fontDescriptionRun04.characterRun.numberOfCharacters = 10u;
-  fontDescriptionRun04.familyLength = fontHebrew.size();
+  fontDescriptionRun04.characterRun.characterIndex = 36u;
+  fontDescriptionRun04.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun04.familyLength = fontLatin.size();
   fontDescriptionRun04.familyName = new char[fontDescriptionRun04.familyLength];
-  memcpy( fontDescriptionRun04.familyName, fontHebrew.c_str(), fontDescriptionRun04.familyLength );
+  memcpy( fontDescriptionRun04.familyName, fontLatin.c_str(), fontDescriptionRun04.familyLength );
   fontDescriptionRun04.familyDefined = true;
   fontDescriptionRun04.weightDefined = false;
   fontDescriptionRun04.widthDefined = false;
@@ -3973,10 +4071,10 @@ int UtcDaliTextReorderLayout04(void)
 
   FontDescriptionRun fontDescriptionRun05;
   fontDescriptionRun05.characterRun.characterIndex = 48u;
-  fontDescriptionRun05.characterRun.numberOfCharacters = 10u;
-  fontDescriptionRun05.familyLength = fontHebrew.size();
+  fontDescriptionRun05.characterRun.numberOfCharacters = 12u;
+  fontDescriptionRun05.familyLength = fontLatin.size();
   fontDescriptionRun05.familyName = new char[fontDescriptionRun05.familyLength];
-  memcpy( fontDescriptionRun05.familyName, fontHebrew.c_str(), fontDescriptionRun05.familyLength );
+  memcpy( fontDescriptionRun05.familyName, fontLatin.c_str(), fontDescriptionRun05.familyLength );
   fontDescriptionRun05.familyDefined = true;
   fontDescriptionRun05.weightDefined = false;
   fontDescriptionRun05.widthDefined = false;
@@ -3984,8 +4082,8 @@ int UtcDaliTextReorderLayout04(void)
   fontDescriptionRun05.sizeDefined = false;
 
   FontDescriptionRun fontDescriptionRun06;
-  fontDescriptionRun06.characterRun.characterIndex = 58u;
-  fontDescriptionRun06.characterRun.numberOfCharacters = 15u;
+  fontDescriptionRun06.characterRun.characterIndex = 60u;
+  fontDescriptionRun06.characterRun.numberOfCharacters = 14u;
   fontDescriptionRun06.familyLength = fontArabic.size();
   fontDescriptionRun06.familyName = new char[fontDescriptionRun06.familyLength];
   memcpy( fontDescriptionRun06.familyName, fontArabic.c_str(), fontDescriptionRun06.familyLength );
@@ -4003,34 +4101,27 @@ int UtcDaliTextReorderLayout04(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
 
-  float positions[] =
-  {
-    1.f, -10.f, 12.f, -13.f, 19.f, -10.f, 24.f, -10.f, 32.f, -0.f, 37.f, -10.f, 45.f, -10.f, 50.f, -13.f, 58.f, -10.f, 66.f, -0.f, 69.f, -8.f, 76.f, -6.f, 81.f, -7.f, 87.f, -7.f, 92.f, -11.f, 94.f, -0.f,
-    0.f, -7.f, 5.f, -11.f, 6.f, -11.f, 10.f, -8.f, 17.f, -11.f, 18.f, -11.f, 22.f, -8.f, 28.f, -0.f,
-    0.f, -8.f, 7.f, -6.f, 12.f, -7.f, 18.f, -7.f, 23.f, -11.f, 25.f, -0.f, 27.f, -7.f, 32.f, -11.f, 33.f, -11.f, 37.f, -8.f, 44.f, -11.f, 45.f, -11.f, 49.f, -8.f, 55.f, -0.f, 59.f, -10.f, 70.f, -13.f, 77.f, -10.f, 82.f, -10.f, 90.f, -0.f,
-    1.f, -10.f, 9.f, -10.f, 14.f, -13.f, 22.f, -10.f, 30.f, -0.f,
-    87.f, -10.f, 79.f, -13.f, 74.f, -10.f, 66.f, -10.f, 61.f, -0.f, 53.f, -10.f, 48.f, -10.f, 41.f, -13.f, 32.f, -10.f, 27.f, -0.f, 20.f, -8.f, 15.f, -6.f, 8.f, -7.f, 5.f, -7.f, 4.f, -11.f, 0.f, -0.f,
-    28.f, -7.f, 27.f, -11.f, 22.f, -11.f, 17.f, -8.f, 15.f, -11.f, 10.f, -11.f, 5.f, -8.f, 2.f, -2.f,
-  };
+  float positions[] = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f };
 
   Size textArea( 100.f, 300.f );
-
-  ReLayoutRightToLeftLinesData data =
+  AlignData data =
   {
-    "Paragraphs with right to left text.",
-    "שלום עולם مرحبا بالعالم\n"
-    "مرحبا بالعالم שלום עולם\n"
-    "שלום עולם مرحبا بالعالم.",
+    "Begin alignment for the last paragraph.",
+    "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
     textArea,
     6u,
     fontDescriptionRuns.Begin(),
-    72u,
-    positions,
+    Text::HorizontalAlignment::BEGIN,
+    Text::VerticalAlignment::TOP,
     48u,
-    24u
+    26u,
+    6u,
+    positions,
+    Dali::LayoutDirection::LEFT_TO_RIGHT,
+    false
   };
 
-  if( !ReLayoutRightToLeftLinesTest( data ) )
+  if( !AlignTest( data ) )
   {
     tet_result(TET_FAIL);
   }
@@ -4039,10 +4130,10 @@ int UtcDaliTextReorderLayout04(void)
   END_TEST;
 }
 
-int UtcDaliTextAlign01(void)
+int UtcDaliTextAlign04(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliTextAlign01");
+  tet_infoline(" UtcDaliTextAlign04");
 
   // Calculate text alignment.
 
@@ -4131,22 +4222,24 @@ int UtcDaliTextAlign01(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
 
-  float positions[] = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f };
+  float positions[] = { 9.f, 15.f, 0.f, 0.f, 0.f, 0.f };
 
   Size textArea( 100.f, 300.f );
   AlignData data =
   {
-    "Begin alignment for the first paragraph.",
+    "Center alignment for the first paragraph.",
     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
     textArea,
     6u,
     fontDescriptionRuns.Begin(),
-    Text::HorizontalAlignment::BEGIN,
+    Text::HorizontalAlignment::CENTER,
     Text::VerticalAlignment::TOP,
     0u,
     22u,
     6u,
-    positions
+    positions,
+    Dali::LayoutDirection::LEFT_TO_RIGHT,
+    false
   };
 
   if( !AlignTest( data ) )
@@ -4158,10 +4251,10 @@ int UtcDaliTextAlign01(void)
   END_TEST;
 }
 
-int UtcDaliTextAlign02(void)
+int UtcDaliTextAlign05(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliTextAlign02");
+  tet_infoline(" UtcDaliTextAlign05");
 
   // Calculate text alignment.
 
@@ -4250,22 +4343,24 @@ int UtcDaliTextAlign02(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
 
-  float positions[] = { 0.f, 0.f, 2.f, 60.f, 0.f, 0.f };
+  float positions[] = { 0.f, 0.f, 14.f, 9.f, 0.f, 0.f };
 
   Size textArea( 100.f, 300.f );
   AlignData data =
   {
-    "Begin alignment for the mid paragraph.",
+    "Center alignment for the mid paragraph.",
     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
     textArea,
     6u,
     fontDescriptionRuns.Begin(),
-    Text::HorizontalAlignment::BEGIN,
+    Text::HorizontalAlignment::CENTER,
     Text::VerticalAlignment::TOP,
     22u,
     26u,
     6u,
-    positions
+    positions,
+    Dali::LayoutDirection::LEFT_TO_RIGHT,
+    false
   };
 
   if( !AlignTest( data ) )
@@ -4277,10 +4372,10 @@ int UtcDaliTextAlign02(void)
   END_TEST;
 }
 
-int UtcDaliTextAlign03(void)
+int UtcDaliTextAlign06(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliTextAlign03");
+  tet_infoline(" UtcDaliTextAlign06");
 
   // Calculate text alignment.
 
@@ -4369,22 +4464,24 @@ int UtcDaliTextAlign03(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
 
-  float positions[] = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f };
+  float positions[] = { 0.f, 0.f, 0.f, 0.f, 9.f, 17.f };
 
   Size textArea( 100.f, 300.f );
   AlignData data =
   {
-    "Begin alignment for the last paragraph.",
+    "Center alignment for the last paragraph.",
     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
     textArea,
     6u,
     fontDescriptionRuns.Begin(),
-    Text::HorizontalAlignment::BEGIN,
+    Text::HorizontalAlignment::CENTER,
     Text::VerticalAlignment::TOP,
     48u,
     26u,
     6u,
-    positions
+    positions,
+    Dali::LayoutDirection::LEFT_TO_RIGHT,
+    false
   };
 
   if( !AlignTest( data ) )
@@ -4396,10 +4493,10 @@ int UtcDaliTextAlign03(void)
   END_TEST;
 }
 
-int UtcDaliTextAlign04(void)
+int UtcDaliTextAlign07(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliTextAlign04");
+  tet_infoline(" UtcDaliTextAlign07");
 
   // Calculate text alignment.
 
@@ -4488,22 +4585,24 @@ int UtcDaliTextAlign04(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
 
-  float positions[] = { 10.f, 16.f, 0.f, 0.f, 0.f, 0.f };
+  float positions[] = { 19.f, 31.f, 0.f, 0.f, 0.f, 0.f };
 
   Size textArea( 100.f, 300.f );
   AlignData data =
   {
-    "Center alignment for the first paragraph.",
+    "End alignment for the first paragraph.",
     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
     textArea,
     6u,
     fontDescriptionRuns.Begin(),
-    Text::HorizontalAlignment::CENTER,
+    Text::HorizontalAlignment::END,
     Text::VerticalAlignment::TOP,
     0u,
     22u,
     6u,
-    positions
+    positions,
+    Dali::LayoutDirection::LEFT_TO_RIGHT,
+    false
   };
 
   if( !AlignTest( data ) )
@@ -4515,10 +4614,10 @@ int UtcDaliTextAlign04(void)
   END_TEST;
 }
 
-int UtcDaliTextAlign05(void)
+int UtcDaliTextAlign08(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliTextAlign05");
+  tet_infoline(" UtcDaliTextAlign08");
 
   // Calculate text alignment.
 
@@ -4607,22 +4706,24 @@ int UtcDaliTextAlign05(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
 
-  float positions[] = { 0.f, 0.f, -1.f, 30.f, 0.f, 0.f };
+  float positions[] = { 0.f, 0.f, -4.f, 0.f, 0.f, 0.f };
 
   Size textArea( 100.f, 300.f );
   AlignData data =
   {
-    "Center alignment for the mid paragraph.",
+    "End alignment for the mid paragraph.",
     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
     textArea,
     6u,
     fontDescriptionRuns.Begin(),
-    Text::HorizontalAlignment::CENTER,
+    Text::HorizontalAlignment::END,
     Text::VerticalAlignment::TOP,
     22u,
     26u,
     6u,
-    positions
+    positions,
+    Dali::LayoutDirection::LEFT_TO_RIGHT,
+    false
   };
 
   if( !AlignTest( data ) )
@@ -4634,10 +4735,10 @@ int UtcDaliTextAlign05(void)
   END_TEST;
 }
 
-int UtcDaliTextAlign06(void)
+int UtcDaliTextAlign09(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliTextAlign06");
+  tet_infoline(" UtcDaliTextAlign09");
 
   // Calculate text alignment.
 
@@ -4726,22 +4827,24 @@ int UtcDaliTextAlign06(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
 
-  float positions[] = { 0.f, 0.f, 0.f, 0.f, 10.f, 20.f };
+  float positions[] = { 0.f, 0.f, 0.f, 0.f, 19.f, 34.f };
 
   Size textArea( 100.f, 300.f );
   AlignData data =
   {
-    "Center alignment for the last paragraph.",
+    "End alignment for the last paragraph.",
     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
     textArea,
     6u,
     fontDescriptionRuns.Begin(),
-    Text::HorizontalAlignment::CENTER,
+    Text::HorizontalAlignment::END,
     Text::VerticalAlignment::TOP,
     48u,
     26u,
     6u,
-    positions
+    positions,
+    Dali::LayoutDirection::LEFT_TO_RIGHT,
+    false
   };
 
   if( !AlignTest( data ) )
@@ -4753,10 +4856,10 @@ int UtcDaliTextAlign06(void)
   END_TEST;
 }
 
-int UtcDaliTextAlign07(void)
+int UtcDaliTextAlign10(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliTextAlign07");
+  tet_infoline(" UtcDaliTextAlign10");
 
   // Calculate text alignment.
 
@@ -4845,12 +4948,12 @@ int UtcDaliTextAlign07(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
 
-  float positions[] = { 20.f, 33.f, 0.f, 0.f, 0.f, 0.f };
+  float positions[] = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f };
 
   Size textArea( 100.f, 300.f );
   AlignData data =
   {
-    "End alignment for the first paragraph.",
+    "Begin alignment for the first paragraph.",
     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
     textArea,
     6u,
@@ -4860,7 +4963,9 @@ int UtcDaliTextAlign07(void)
     0u,
     22u,
     6u,
-    positions
+    positions,
+    Dali::LayoutDirection::RIGHT_TO_LEFT,
+    true
   };
 
   if( !AlignTest( data ) )
@@ -4872,10 +4977,10 @@ int UtcDaliTextAlign07(void)
   END_TEST;
 }
 
-int UtcDaliTextAlign08(void)
+int UtcDaliTextAlign11(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliTextAlign08");
+  tet_infoline(" UtcDaliTextAlign11");
 
   // Calculate text alignment.
 
@@ -4964,22 +5069,24 @@ int UtcDaliTextAlign08(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
 
-  float positions[] = { 0.f, 0.f, -4.f, 0.f, 0.f, 0.f };
+  float positions[] = { 19.f, 31.f, 33.f, 0.f, 0.f, 0.f };
 
   Size textArea( 100.f, 300.f );
   AlignData data =
   {
-    "End alignment for the mid paragraph.",
+    "End alignment for the last paragraph.",
     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
     textArea,
     6u,
     fontDescriptionRuns.Begin(),
     Text::HorizontalAlignment::END,
     Text::VerticalAlignment::TOP,
-    22u,
+    0u,
     26u,
     6u,
-    positions
+    positions,
+    Dali::LayoutDirection::LEFT_TO_RIGHT,
+    true
   };
 
   if( !AlignTest( data ) )
@@ -4991,10 +5098,10 @@ int UtcDaliTextAlign08(void)
   END_TEST;
 }
 
-int UtcDaliTextAlign09(void)
+int UtcDaliTextAlign12(void)
 {
   ToolkitTestApplication application;
-  tet_infoline(" UtcDaliTextAlign09");
+  tet_infoline(" UtcDaliTextAlign12");
 
   // Calculate text alignment.
 
@@ -5083,22 +5190,24 @@ int UtcDaliTextAlign09(void)
   fontDescriptionRuns.PushBack( fontDescriptionRun05 );
   fontDescriptionRuns.PushBack( fontDescriptionRun06 );
 
-  float positions[] = { 0.f, 0.f, 0.f, 0.f, 20.f, 40.f };
+  float positions[] = { 0.f, 0.f, 0.f, 0.f, 0.f, 0.f };
 
   Size textArea( 100.f, 300.f );
   AlignData data =
   {
-    "End alignment for the last paragraph.",
+    "Begin alignment for the first paragraph.",
     "Hello world שלום עולם\nمرحبا بالعالم Hello world\nHello world مرحبا بالعالم.",
     textArea,
     6u,
     fontDescriptionRuns.Begin(),
-    Text::HorizontalAlignment::END,
+    Text::HorizontalAlignment::BEGIN,
     Text::VerticalAlignment::TOP,
     48u,
     26u,
     6u,
-    positions
+    positions,
+    Dali::LayoutDirection::LEFT_TO_RIGHT,
+    true
   };
 
   if( !AlignTest( data ) )
@@ -5124,3 +5233,197 @@ int UtcDaliTextLayoutSetGetDefaultLineSpacing(void)
   tet_result(TET_PASS);
   END_TEST;
 }
+
+int UtcDaliTextLayoutGetGlyphMetrics(void)
+{
+  tet_infoline(" UtcDaliTextLayoutGetGlyphMetrics");
+
+  // Test retrieving metrics from group of characters
+
+  const std::string fontFamily( "TizenSansHindi" );
+
+  // Set a known font description
+  FontDescriptionRun fontDescriptionRun01;
+  fontDescriptionRun01.characterRun.characterIndex = 0u;
+  fontDescriptionRun01.characterRun.numberOfCharacters = 2u;
+  fontDescriptionRun01.familyLength = fontFamily.size();
+  fontDescriptionRun01.familyName = new char[fontDescriptionRun01.familyLength];
+  memcpy( fontDescriptionRun01.familyName, fontFamily.c_str(), fontDescriptionRun01.familyLength );
+  fontDescriptionRun01.familyDefined = true;
+  fontDescriptionRun01.weightDefined = false;
+  fontDescriptionRun01.widthDefined = false;
+  fontDescriptionRun01.slantDefined = false;
+  fontDescriptionRun01.sizeDefined = false;
+
+  // Set a known font description
+  FontDescriptionRun fontDescriptionRun02;
+  fontDescriptionRun02.characterRun.characterIndex = 0u;
+  fontDescriptionRun02.characterRun.numberOfCharacters = 2u;
+  fontDescriptionRun02.familyLength = fontFamily.size();
+  fontDescriptionRun02.familyName = new char[fontDescriptionRun02.familyLength];
+  memcpy( fontDescriptionRun02.familyName, fontFamily.c_str(), fontDescriptionRun02.familyLength );
+  fontDescriptionRun02.familyDefined = true;
+  fontDescriptionRun02.weightDefined = false;
+  fontDescriptionRun02.widthDefined = false;
+  fontDescriptionRun02.slantDefined = false;
+  fontDescriptionRun02.sizeDefined = false;
+
+  // Set a known font description
+  FontDescriptionRun fontDescriptionRun03;
+  fontDescriptionRun03.characterRun.characterIndex = 0u;
+  fontDescriptionRun03.characterRun.numberOfCharacters = 2u;
+  fontDescriptionRun03.familyLength = fontFamily.size();
+  fontDescriptionRun03.familyName = new char[fontDescriptionRun03.familyLength];
+  memcpy( fontDescriptionRun03.familyName, fontFamily.c_str(), fontDescriptionRun03.familyLength );
+  fontDescriptionRun03.familyDefined = true;
+  fontDescriptionRun03.weightDefined = false;
+  fontDescriptionRun03.widthDefined = false;
+  fontDescriptionRun03.slantDefined = false;
+  fontDescriptionRun03.sizeDefined = false;
+
+  Vector<FontDescriptionRun> fontDescriptionRuns01;
+  fontDescriptionRuns01.PushBack( fontDescriptionRun01 );
+
+  Vector<FontDescriptionRun> fontDescriptionRuns02;
+  fontDescriptionRuns02.PushBack( fontDescriptionRun02 );
+
+  Vector<FontDescriptionRun> fontDescriptionRuns03;
+  fontDescriptionRuns03.PushBack( fontDescriptionRun03 );
+
+  // Set a text area.
+  Size textArea(100.f, 100.f);
+
+
+  // Group: second glyph doesn't exceed the width of the first glyph
+  float positions01[] = { 0.f, -11.f };
+
+  struct LineRun line01 =
+  {
+    { 0u, 1u },
+    { 0u, 1u },
+    11.f,
+    15.f,
+    -4.f,
+    0.f,
+    0.f,
+    0.f,
+    false,
+    false
+  };
+  Vector<LineRun> lines01;
+  lines01.PushBack( line01 );
+
+  Size layoutSize01 = Vector2(11.f, 19.f);
+
+  // Group: second glyph doesn't exceed the width of the first glyph
+  float positions02[] = { 0.f, -11.f, 7.f, -15.f, };
+
+  struct LineRun line02 =
+  {
+    { 0u, 2u },
+    { 0u, 2u },
+    16.f,
+    15.f,
+    -4.f,
+    0.f,
+    0.f,
+    0.f,
+    false,
+    false
+  };
+  Vector<LineRun> lines02;
+  lines02.PushBack( line02 );
+
+  Size layoutSize02 = Vector2(16.f, 19.f);
+
+  // Group: second glyph doesn't exceed the width of the first glyph
+  float positions03[] = { 0.f, -11.f , 2.f, -15.f };
+
+  struct LineRun line03 =
+  {
+    { 0u, 2u },
+    { 0u, 2u },
+    11.f,
+    15.f,
+    -4.f,
+    0.f,
+    0.f,
+    0.f,
+    false,
+    false
+  };
+  Vector<LineRun> lines03;
+  lines03.PushBack( line03 );
+
+  Size layoutSize03 = Vector2(11.f, 19.f);
+
+ /////////////////////////////
+
+  struct LayoutTextData data[] =
+  {
+    {
+      "Single glyph",
+      "प",
+      textArea,
+      1u,
+      fontDescriptionRuns01.Begin(),
+      layoutSize01,
+      1u,
+      positions01,
+      1u,
+      lines01.Begin(),
+      Layout::Engine::SINGLE_LINE_BOX,
+      0u,
+      1u,
+      false,
+      true
+    },
+    {
+      "Group: second glyph exceeds the width of the first glyph",
+      "पो",
+      textArea,
+      1u,
+      fontDescriptionRuns02.Begin(),
+      layoutSize02,
+      2u,
+      positions02,
+      1u,
+      lines02.Begin(),
+      Layout::Engine::SINGLE_LINE_BOX,
+      0u,
+      2u,
+      false,
+      true
+    },
+   {
+      "Group: second glyph doesn't exceed the width of the first glyph",
+      "पे",
+      textArea,
+      1u,
+      fontDescriptionRuns03.Begin(),
+      layoutSize03,
+      2u,
+      positions03,
+      1u,
+      lines03.Begin(),
+      Layout::Engine::SINGLE_LINE_BOX,
+      0u,
+      2u,
+      false,
+      true
+    }
+  };
+  const unsigned int numberOfTests = sizeof(data)/sizeof(LayoutTextData);
+
+  for( unsigned int index = 0u; index < numberOfTests; ++index )
+  {
+    ToolkitTestApplication application;
+    if( !LayoutTextTest( data[index] ) )
+    {
+      tet_result(TET_FAIL);
+    }
+  }
+
+  tet_result(TET_PASS);
+  END_TEST;
+}