Merge "[AT-SPI] Add API for blocking automatic Bridge initialization" into devel...
[platform/core/uifw/dali-adaptor.git] / dali / internal / text / text-abstraction / font-client-plugin-impl.cpp
old mode 100755 (executable)
new mode 100644 (file)
index a53fd1b..60deca8
@@ -1,5 +1,5 @@
 /*
- * Copyright (c) 2019 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2021 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.
 // INTERNAL INCLUDES
 #include <dali/devel-api/text-abstraction/font-list.h>
 
-#include <dali/public-api/common/dali-vector.h>
-#include <dali/public-api/common/vector-wrapper.h>
+#include <dali/devel-api/adaptor-framework/image-loading.h>
 #include <dali/integration-api/debug.h>
 #include <dali/integration-api/platform-abstraction.h>
-#include <dali/internal/text/text-abstraction/font-client-helper.h>
-#include <dali/internal/imaging/common/image-operations.h>
 #include <dali/internal/adaptor/common/adaptor-impl.h>
-#include <dali/devel-api/adaptor-framework/image-loading.h>
+#include <dali/internal/imaging/common/image-operations.h>
+#include <dali/internal/text/text-abstraction/font-client-helper.h>
+#include <dali/public-api/common/dali-vector.h>
+#include <dali/public-api/common/vector-wrapper.h>
 
 // EXTERNAL INCLUDES
 #include <fontconfig/fontconfig.h>
+#include <algorithm>
+#include <iterator>
 
 namespace
 {
-
 #if defined(DEBUG_ENABLED)
 Dali::Integration::Log::Filter* gLogFilter = Dali::Integration::Log::Filter::New(Debug::NoLogging, false, "LOG_FONT_CLIENT");
 #endif
@@ -43,13 +44,13 @@ Dali::Integration::Log::Filter* gLogFilter = Dali::Integration::Log::Filter::New
 /**
  * Conversion from Fractional26.6 to float
  */
-const float FROM_266 = 1.0f / 64.0f;
+const float FROM_266        = 1.0f / 64.0f;
 const float POINTS_PER_INCH = 72.f;
 
-const std::string DEFAULT_FONT_FAMILY_NAME( "Tizen" );
-const int DEFAULT_FONT_WIDTH  = 100; // normal
-const int DEFAULT_FONT_WEIGHT =  80; // normal
-const int DEFAULT_FONT_SLANT  =   0; // normal
+const std::string DEFAULT_FONT_FAMILY_NAME("Tizen");
+const int         DEFAULT_FONT_WIDTH  = 100; // normal
+const int         DEFAULT_FONT_WEIGHT = 80;  // normal
+const int         DEFAULT_FONT_SLANT  = 0;   // normal
 
 const uint32_t ELLIPSIS_CHARACTER = 0x2026;
 
@@ -65,8 +66,8 @@ const uint32_t ELLIPSIS_CHARACTER = 0x2026;
 // EXPANDED       125
 // EXTRA_EXPANDED 150
 // ULTRA_EXPANDED 200
-const int FONT_WIDTH_TYPE_TO_INT[] = { -1, 50, 63, 75, 87, 100, 113, 125, 150, 200 };
-const unsigned int NUM_FONT_WIDTH_TYPE = sizeof( FONT_WIDTH_TYPE_TO_INT ) / sizeof( int );
+const int          FONT_WIDTH_TYPE_TO_INT[] = {-1, 50, 63, 75, 87, 100, 113, 125, 150, 200};
+const unsigned int NUM_FONT_WIDTH_TYPE      = sizeof(FONT_WIDTH_TYPE_TO_INT) / sizeof(int);
 
 // NONE                       -1  --> DEFAULT_FONT_WEIGHT (NORMAL) will be used.
 // THIN                        0
@@ -80,31 +81,27 @@ const unsigned int NUM_FONT_WIDTH_TYPE = sizeof( FONT_WIDTH_TYPE_TO_INT ) / size
 // BOLD                      200
 // ULTRA_BOLD, EXTRA_BOLD    205
 // BLACK, HEAVY, EXTRA_BLACK 210
-const int FONT_WEIGHT_TYPE_TO_INT[] = { -1, 0, 40, 50, 55, 75, 80, 100, 180, 200, 205, 210 };
-const unsigned int NUM_FONT_WEIGHT_TYPE = sizeof( FONT_WEIGHT_TYPE_TO_INT ) / sizeof( int );
+const int          FONT_WEIGHT_TYPE_TO_INT[] = {-1, 0, 40, 50, 55, 75, 80, 100, 180, 200, 205, 210};
+const unsigned int NUM_FONT_WEIGHT_TYPE      = sizeof(FONT_WEIGHT_TYPE_TO_INT) / sizeof(int);
 
 // NONE             -1 --> DEFAULT_FONT_SLANT (NORMAL) will be used.
 // NORMAL, ROMAN     0
 // ITALIC          100
 // OBLIQUE         110
-const int FONT_SLANT_TYPE_TO_INT[] = { -1, 0, 100, 110 };
-const unsigned int NUM_FONT_SLANT_TYPE = sizeof( FONT_SLANT_TYPE_TO_INT ) / sizeof( int );
+const int          FONT_SLANT_TYPE_TO_INT[] = {-1, 0, 100, 110};
+const unsigned int NUM_FONT_SLANT_TYPE      = sizeof(FONT_SLANT_TYPE_TO_INT) / sizeof(int);
 
 } // namespace
 
-
-
 using Dali::Vector;
+using namespace std;
 
 namespace Dali
 {
-
 namespace TextAbstraction
 {
-
 namespace Internal
 {
-
 /**
  * @brief Returns the FontWidth's enum index for the given width value.
  *
@@ -112,9 +109,9 @@ namespace Internal
  *
  * @return The FontWidth's enum index.
  */
-FontWidth::Type IntToWidthType( int width )
+FontWidth::Type IntToWidthType(int width)
 {
-  return static_cast<FontWidth::Type>( ValueToIndex( width, FONT_WIDTH_TYPE_TO_INT, NUM_FONT_WIDTH_TYPE - 1u ) );
+  return static_cast<FontWidth::Type>(ValueToIndex(width, FONT_WIDTH_TYPE_TO_INT, NUM_FONT_WIDTH_TYPE - 1u));
 }
 
 /**
@@ -124,9 +121,9 @@ FontWidth::Type IntToWidthType( int width )
  *
  * @return The FontWeight's enum index.
  */
-FontWeight::Type IntToWeightType( int weight )
+FontWeight::Type IntToWeightType(int weight)
 {
-  return static_cast<FontWeight::Type>( ValueToIndex( weight, FONT_WEIGHT_TYPE_TO_INT, NUM_FONT_WEIGHT_TYPE - 1u ) );
+  return static_cast<FontWeight::Type>(ValueToIndex(weight, FONT_WEIGHT_TYPE_TO_INT, NUM_FONT_WEIGHT_TYPE - 1u));
 }
 
 /**
@@ -136,9 +133,9 @@ FontWeight::Type IntToWeightType( int weight )
  *
  * @return The FontSlant's enum index.
  */
-FontSlant::Type IntToSlantType( int slant )
+FontSlant::Type IntToSlantType(int slant)
 {
-  return static_cast<FontSlant::Type>( ValueToIndex( slant, FONT_SLANT_TYPE_TO_INT, NUM_FONT_SLANT_TYPE - 1u ) );
+  return static_cast<FontSlant::Type>(ValueToIndex(slant, FONT_SLANT_TYPE_TO_INT, NUM_FONT_SLANT_TYPE - 1u));
 }
 
 /**
@@ -146,136 +143,259 @@ FontSlant::Type IntToSlantType( int slant )
  *
  * @param[in] characterSets The vector of character sets.
  */
-void DestroyCharacterSets( CharacterSetList& characterSets )
+void DestroyCharacterSets(CharacterSetList& characterSets)
 {
-  for( auto& item : characterSets )
+  for(auto& item : characterSets)
   {
-    FcCharSetDestroy( item );
+    if(item)
+    {
+      FcCharSetDestroy(item);
+    }
   }
 }
 
-FontClient::Plugin::FallbackCacheItem::FallbackCacheItem( FontDescription&& font, FontList* fallbackFonts, CharacterSetList* characterSets )
-: fontDescription{ std::move( font ) },
-  fallbackFonts{ fallbackFonts },
-  characterSets{ characterSets }
+/**
+ * @brief Check if @p ftFace and @p requestedPointSize produces block that fit into atlas block
+ *
+ * @param[in/out] ftFace Face type object.
+ * @param[in] horizontalDpi The horizontal dpi.
+ * @param[in] verticalDpi The vertical dpi.
+ * @param[in] maxSizeFitInAtlas The maximum size of block to fit into atlas
+ * @param[in] requestedPointSize The requested point-size.
+ * @return whether the  ftFace's block can fit into atlas
+ */
+bool IsFitIntoAtlas(FT_Face& ftFace, int& error, const unsigned int& horizontalDpi, const unsigned int& verticalDpi, const Size& maxSizeFitInAtlas, const uint32_t& requestedPointSize)
 {
+  bool isFit = false;
+
+  error = FT_Set_Char_Size(ftFace,
+                      0,
+                      requestedPointSize,
+                      horizontalDpi,
+                      verticalDpi);
+
+  if( error == FT_Err_Ok)
+  {
+    //Check width and height of block for requestedPointSize
+    //If the width or height is greater than the maximum-size then decrement by one unit of point-size.
+    if( static_cast<float>(ftFace->size->metrics.height) * FROM_266 <= maxSizeFitInAtlas.height
+      && (static_cast<float>(ftFace->size->metrics.ascender)-static_cast<float>(ftFace->size->metrics.descender))* FROM_266 <= maxSizeFitInAtlas.width)
+    {
+      isFit = true;
+    }
+  }
+
+  return isFit;
 }
 
-FontClient::Plugin::FontDescriptionCacheItem::FontDescriptionCacheItem( const FontDescription& fontDescription,
-                                                                        FontDescriptionId index )
-: fontDescription{ fontDescription },
-  index{ index }
+/**
+ * @brief Search on proper @p requestedPointSize that produces block that fit into atlas block considering on @p ftFace, @p horizontalDpi, and @p verticalDpi
+ *
+ * @param[in/out] ftFace Face type object.
+ * @param[in] horizontalDpi The horizontal dpi.
+ * @param[in] verticalDpi The vertical dpi.
+ * @param[in] maxSizeFitInAtlas The maximum size of block to fit into atlas
+ * @param[in/out] requestedPointSize The requested point-size.
+ * @return FreeType error code. 0 means success when requesting the nominal size (in points).
+ */
+int SearchOnProperPointSize(FT_Face& ftFace, const unsigned int& horizontalDpi, const unsigned int& verticalDpi, const Size& maxSizeFitInAtlas, uint32_t& requestedPointSize)
+{
+  //To improve performance of sequential search. This code is applying Exponential search then followed by Binary search.
+  const uint32_t& pointSizePerOneUnit = TextAbstraction::FontClient::NUMBER_OF_POINTS_PER_ONE_UNIT_OF_POINT_SIZE;
+  bool canFitInAtlas;
+  int error; // FreeType error code.
+
+  canFitInAtlas = IsFitIntoAtlas(ftFace, error, horizontalDpi, verticalDpi, maxSizeFitInAtlas, requestedPointSize);
+  if(FT_Err_Ok != error)
+  {
+    return error;
+  }
+
+  if(!canFitInAtlas)
+  {
+    //Exponential search
+    uint32_t exponentialDecrement = 1;
+
+    while(!canFitInAtlas && requestedPointSize > pointSizePerOneUnit*exponentialDecrement)
+    {
+      requestedPointSize-=(pointSizePerOneUnit*exponentialDecrement);
+      canFitInAtlas = IsFitIntoAtlas(ftFace, error, horizontalDpi, verticalDpi, maxSizeFitInAtlas, requestedPointSize);
+      if(FT_Err_Ok != error)
+      {
+        return error;
+      }
+
+      exponentialDecrement*=2;
+    }
+
+    //Binary search
+    uint32_t minPointSize;
+    uint32_t maxPointSize;
+
+    if(canFitInAtlas)
+    {
+      exponentialDecrement/=2;
+      minPointSize = requestedPointSize;
+      maxPointSize = requestedPointSize + (pointSizePerOneUnit*exponentialDecrement);
+    }
+    else
+    {
+      minPointSize = 0;
+      maxPointSize = requestedPointSize;
+    }
+
+    while(minPointSize < maxPointSize)
+    {
+      requestedPointSize = ((maxPointSize/pointSizePerOneUnit - minPointSize/pointSizePerOneUnit)/2) * pointSizePerOneUnit + minPointSize;
+      canFitInAtlas = IsFitIntoAtlas(ftFace, error, horizontalDpi, verticalDpi, maxSizeFitInAtlas, requestedPointSize);
+      if(FT_Err_Ok != error)
+      {
+        return error;
+      }
+
+      if(canFitInAtlas)
+      {
+        if(minPointSize == requestedPointSize)
+        {
+          //Found targeted point-size
+          return error;
+        }
+
+        minPointSize = requestedPointSize;
+      }
+      else
+      {
+        maxPointSize = requestedPointSize;
+      }
+    }
+  }
+
+  return error;
+}
+
+
+FontClient::Plugin::FallbackCacheItem::FallbackCacheItem(FontDescription&& font, FontList* fallbackFonts, CharacterSetList* characterSets)
+: fontDescription{std::move(font)},
+  fallbackFonts{fallbackFonts},
+  characterSets{characterSets}
 {
 }
 
-FontClient::Plugin::FontDescriptionCacheItem::FontDescriptionCacheItem( FontDescription&& fontDescription,
-                                                                        FontDescriptionId index )
-: fontDescription{ std::move( fontDescription ) },
-  index{ index }
+FontClient::Plugin::FontDescriptionCacheItem::FontDescriptionCacheItem(const FontDescription& fontDescription,
+                                                                       FontDescriptionId      index)
+: fontDescription{fontDescription},
+  index{index}
 {
 }
 
-FontClient::Plugin::FontDescriptionSizeCacheItem::FontDescriptionSizeCacheItem( FontDescriptionId validatedFontId,
-                                                                                PointSize26Dot6 requestedPointSize,
-                                                                                FontId fontId )
-: validatedFontId( validatedFontId ),
-  requestedPointSize( requestedPointSize ),
-  fontId( fontId )
+FontClient::Plugin::FontDescriptionCacheItem::FontDescriptionCacheItem(FontDescription&& fontDescription,
+                                                                       FontDescriptionId index)
+: fontDescription{std::move(fontDescription)},
+  index{index}
 {
 }
 
-FontClient::Plugin::FontFaceCacheItem::FontFaceCacheItem( FT_Face ftFace,
-                                                          const FontPath& path,
-                                                          PointSize26Dot6 requestedPointSize,
-                                                          FaceIndex face,
-                                                          const FontMetrics& metrics )
-: mFreeTypeFace( ftFace ),
-  mPath( path ),
-  mRequestedPointSize( requestedPointSize ),
-  mFaceIndex( face ),
-  mMetrics( metrics ),
-  mCharacterSet( nullptr ),
-  mFixedSizeIndex( 0 ),
-  mFixedWidthPixels( 0.f ),
-  mFixedHeightPixels( 0.f ),
-  mVectorFontId( 0u ),
-  mFontId( 0u ),
-  mIsFixedSizeBitmap( false ),
-  mHasColorTables( false )
+FontClient::Plugin::FontDescriptionSizeCacheItem::FontDescriptionSizeCacheItem(FontDescriptionId validatedFontId,
+                                                                               PointSize26Dot6   requestedPointSize,
+                                                                               FontId            fontId)
+: validatedFontId(validatedFontId),
+  requestedPointSize(requestedPointSize),
+  fontId(fontId)
 {
 }
 
-FontClient::Plugin::FontFaceCacheItem::FontFaceCacheItem( FT_Face ftFace,
-                                                          const FontPath& path,
-                                                          PointSize26Dot6 requestedPointSize,
-                                                          FaceIndex face,
-                                                          const FontMetrics& metrics,
-                                                          int fixedSizeIndex,
-                                                          float fixedWidth,
-                                                          float fixedHeight,
-                                                          bool hasColorTables )
-: mFreeTypeFace( ftFace ),
-  mPath( path ),
-  mRequestedPointSize( requestedPointSize ),
-  mFaceIndex( face ),
-  mMetrics( metrics ),
-  mCharacterSet( nullptr ),
-  mFixedSizeIndex( fixedSizeIndex ),
-  mFixedWidthPixels( fixedWidth ),
-  mFixedHeightPixels( fixedHeight ),
-  mVectorFontId( 0u ),
-  mFontId( 0u ),
-  mIsFixedSizeBitmap( true ),
-  mHasColorTables( hasColorTables )
+FontClient::Plugin::FontFaceCacheItem::FontFaceCacheItem(FT_Face            ftFace,
+                                                         const FontPath&    path,
+                                                         PointSize26Dot6    requestedPointSize,
+                                                         FaceIndex          face,
+                                                         const FontMetrics& metrics)
+: mFreeTypeFace(ftFace),
+  mPath(path),
+  mRequestedPointSize(requestedPointSize),
+  mFaceIndex(face),
+  mMetrics(metrics),
+  mCharacterSet(nullptr),
+  mFixedSizeIndex(0),
+  mFixedWidthPixels(0.f),
+  mFixedHeightPixels(0.f),
+  mVectorFontId(0u),
+  mFontId(0u),
+  mIsFixedSizeBitmap(false),
+  mHasColorTables(false)
 {
 }
 
-FontClient::Plugin::Plugin( unsigned int horizontalDpi,
-                            unsigned int verticalDpi )
-: mFreeTypeLibrary( nullptr ),
-  mDpiHorizontal( horizontalDpi ),
-  mDpiVertical( verticalDpi ),
+FontClient::Plugin::FontFaceCacheItem::FontFaceCacheItem(FT_Face            ftFace,
+                                                         const FontPath&    path,
+                                                         PointSize26Dot6    requestedPointSize,
+                                                         FaceIndex          face,
+                                                         const FontMetrics& metrics,
+                                                         int                fixedSizeIndex,
+                                                         float              fixedWidth,
+                                                         float              fixedHeight,
+                                                         bool               hasColorTables)
+: mFreeTypeFace(ftFace),
+  mPath(path),
+  mRequestedPointSize(requestedPointSize),
+  mFaceIndex(face),
+  mMetrics(metrics),
+  mCharacterSet(nullptr),
+  mFixedSizeIndex(fixedSizeIndex),
+  mFixedWidthPixels(fixedWidth),
+  mFixedHeightPixels(fixedHeight),
+  mVectorFontId(0u),
+  mFontId(0u),
+  mIsFixedSizeBitmap(true),
+  mHasColorTables(hasColorTables)
+{
+}
+
+FontClient::Plugin::Plugin(unsigned int horizontalDpi,
+                           unsigned int verticalDpi)
+: mFreeTypeLibrary(nullptr),
+  mDpiHorizontal(horizontalDpi),
+  mDpiVertical(verticalDpi),
   mDefaultFontDescription(),
   mSystemFonts(),
   mDefaultFonts(),
   mFontIdCache(),
   mFontFaceCache(),
   mValidatedFontCache(),
-  mFontDescriptionCache( 1u ),
+  mFontDescriptionCache(),
   mCharacterSetCache(),
   mFontDescriptionSizeCache(),
-  mVectorFontCache( nullptr ),
+  mVectorFontCache(nullptr),
   mEllipsisCache(),
   mEmbeddedItemCache(),
-  mDefaultFontDescriptionCached( false )
-{
-  mCharacterSetCache.Resize( 1u );
+  mDefaultFontDescriptionCached(false),
+  mIsAtlasLimitationEnabled(TextAbstraction::FontClient::DEFAULT_ATLAS_LIMITATION_ENABLED),
+  mCurrentMaximumBlockSizeFitInAtlas(TextAbstraction::FontClient::MAX_SIZE_FIT_IN_ATLAS)
 
-  int error = FT_Init_FreeType( &mFreeTypeLibrary );
-  if( FT_Err_Ok != error )
+{
+  int error = FT_Init_FreeType(&mFreeTypeLibrary);
+  if(FT_Err_Ok != error)
   {
-    DALI_LOG_INFO( gLogFilter, Debug::General, "FreeType Init error: %d\n", error );
+    DALI_LOG_INFO(gLogFilter, Debug::General, "FreeType Init error: %d\n", error);
   }
 
 #ifdef ENABLE_VECTOR_BASED_TEXT_RENDERING
-  mVectorFontCache = new VectorFontCache( mFreeTypeLibrary );
+  mVectorFontCache = new VectorFontCache(mFreeTypeLibrary);
 #endif
-
 }
 
 FontClient::Plugin::~Plugin()
 {
-  ClearFallbackCache( mFallbackCache );
+  ClearFallbackCache(mFallbackCache);
 
   // Free the resources allocated by the FcCharSet objects.
-  DestroyCharacterSets( mDefaultFontCharacterSets );
-  DestroyCharacterSets( mCharacterSetCache );
+  DestroyCharacterSets(mDefaultFontCharacterSets);
+  DestroyCharacterSets(mCharacterSetCache);
   ClearCharacterSetFromFontFaceCache();
 
 #ifdef ENABLE_VECTOR_BASED_TEXT_RENDERING
   delete mVectorFontCache;
 #endif
-  FT_Done_FreeType( mFreeTypeLibrary );
+  FT_Done_FreeType(mFreeTypeLibrary);
 }
 
 void FontClient::Plugin::ClearCache()
@@ -285,10 +405,10 @@ void FontClient::Plugin::ClearCache()
   mSystemFonts.clear();
   mDefaultFonts.clear();
 
-  DestroyCharacterSets( mDefaultFontCharacterSets );
+  DestroyCharacterSets(mDefaultFontCharacterSets);
   mDefaultFontCharacterSets.Clear();
 
-  ClearFallbackCache( mFallbackCache );
+  ClearFallbackCache(mFallbackCache);
   mFallbackCache.clear();
 
   mFontIdCache.Clear();
@@ -298,11 +418,9 @@ void FontClient::Plugin::ClearCache()
 
   mValidatedFontCache.clear();
   mFontDescriptionCache.clear();
-  mFontDescriptionCache.resize( 1u );
 
-  DestroyCharacterSets( mCharacterSetCache );
+  DestroyCharacterSets(mCharacterSetCache);
   mCharacterSetCache.Clear();
-  mCharacterSetCache.Resize( 1u );
 
   mFontDescriptionSizeCache.clear();
 
@@ -314,11 +432,11 @@ void FontClient::Plugin::ClearCache()
   mDefaultFontDescriptionCached = false;
 }
 
-void FontClient::Plugin::SetDpi( unsigned int horizontalDpi,
-                                 unsigned int verticalDpi )
+void FontClient::Plugin::SetDpi(unsigned int horizontalDpi,
+                                unsigned int verticalDpi)
 {
   mDpiHorizontal = horizontalDpi;
-  mDpiVertical = verticalDpi;
+  mDpiVertical   = verticalDpi;
 }
 
 void FontClient::Plugin::ResetSystemDefaults()
@@ -326,125 +444,125 @@ void FontClient::Plugin::ResetSystemDefaults()
   mDefaultFontDescriptionCached = false;
 }
 
-void FontClient::Plugin::SetFontList( const FontDescription& fontDescription, FontList& fontList, CharacterSetList& characterSetList )
+void FontClient::Plugin::SetFontList(const FontDescription& fontDescription, FontList& fontList, CharacterSetList& characterSetList)
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::SetFontList\n" );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  description; family : [%s]\n", fontDescription.family.c_str() );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[fontDescription.width] );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[fontDescription.weight] );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[fontDescription.slant] );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::SetFontList\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  description; family : [%s]\n", fontDescription.family.c_str());
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[fontDescription.width]);
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[fontDescription.weight]);
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[fontDescription.slant]);
 
   fontList.clear();
 
-  FcPattern* fontFamilyPattern = CreateFontFamilyPattern( fontDescription ); // Creates a pattern that needs to be destroyed by calling FcPatternDestroy.
+  FcPattern* fontFamilyPattern = CreateFontFamilyPattern(fontDescription); // Creates a pattern that needs to be destroyed by calling FcPatternDestroy.
 
   FcResult result = FcResultMatch;
 
   // Match the pattern.
-  FcFontSet* fontSet = FcFontSort( nullptr /* use default configure */,
-                                   fontFamilyPattern,
-                                   false /* don't trim */,
-                                   nullptr,
-                                   &result ); // FcFontSort creates a font set that needs to be destroyed by calling FcFontSetDestroy.
+  FcFontSet* fontSet = FcFontSort(nullptr /* use default configure */,
+                                  fontFamilyPattern,
+                                  false /* don't trim */,
+                                  nullptr,
+                                  &result); // FcFontSort creates a font set that needs to be destroyed by calling FcFontSetDestroy.
 
-  if( nullptr != fontSet )
+  if(nullptr != fontSet)
   {
-    DALI_LOG_INFO( gLogFilter, Debug::General, "  number of fonts found : [%d]\n", fontSet->nfont );
+    DALI_LOG_INFO(gLogFilter, Debug::General, "  number of fonts found : [%d]\n", fontSet->nfont);
     // Reserve some space to avoid reallocations.
-    fontList.reserve( fontSet->nfont );
+    fontList.reserve(fontSet->nfont);
 
-    for( int i = 0u; i < fontSet->nfont; ++i )
+    for(int i = 0u; i < fontSet->nfont; ++i)
     {
       FcPattern* fontPattern = fontSet->fonts[i];
 
       FontPath path;
 
       // Skip fonts with no path
-      if( GetFcString( fontPattern, FC_FILE, path ) )
+      if(GetFcString(fontPattern, FC_FILE, path))
       {
         // Retrieve the character set. Need to call FcCharSetDestroy to free the resources.
         FcCharSet* characterSet = nullptr;
-        FcPatternGetCharSet( fontPattern, FC_CHARSET, 0u, &characterSet );
+        FcPatternGetCharSet(fontPattern, FC_CHARSET, 0u, &characterSet);
 
         // Increase the reference counter of the character set.
-        characterSetList.PushBack( FcCharSetCopy( characterSet ) );
+        characterSetList.PushBack(FcCharSetCopy(characterSet));
 
-        fontList.push_back( FontDescription() );
+        fontList.push_back(FontDescription());
         FontDescription& newFontDescription = fontList.back();
 
-        newFontDescription.path = std::move( path );
+        newFontDescription.path = std::move(path);
 
-        int width = 0;
+        int width  = 0;
         int weight = 0;
-        int slant = 0;
-        GetFcString( fontPattern, FC_FAMILY, newFontDescription.family );
-        GetFcInt( fontPattern, FC_WIDTH, width );
-        GetFcInt( fontPattern, FC_WEIGHT, weight );
-        GetFcInt( fontPattern, FC_SLANT, slant );
-        newFontDescription.width = IntToWidthType( width );
-        newFontDescription.weight = IntToWeightType( weight );
-        newFontDescription.slant = IntToSlantType( slant );
-
-        DALI_LOG_INFO( gLogFilter, Debug::Verbose, "  description; family : [%s]\n", newFontDescription.family.c_str() );
-        DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                 path : [%s]\n", newFontDescription.path.c_str() );
-        DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[newFontDescription.width] );
-        DALI_LOG_INFO( gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[newFontDescription.weight] );
-        DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[newFontDescription.slant] );
+        int slant  = 0;
+        GetFcString(fontPattern, FC_FAMILY, newFontDescription.family);
+        GetFcInt(fontPattern, FC_WIDTH, width);
+        GetFcInt(fontPattern, FC_WEIGHT, weight);
+        GetFcInt(fontPattern, FC_SLANT, slant);
+        newFontDescription.width  = IntToWidthType(width);
+        newFontDescription.weight = IntToWeightType(weight);
+        newFontDescription.slant  = IntToSlantType(slant);
+
+        DALI_LOG_INFO(gLogFilter, Debug::Verbose, "  description; family : [%s]\n", newFontDescription.family.c_str());
+        DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                 path : [%s]\n", newFontDescription.path.c_str());
+        DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[newFontDescription.width]);
+        DALI_LOG_INFO(gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[newFontDescription.weight]);
+        DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[newFontDescription.slant]);
       }
     }
 
     // Destroys the font set created by FcFontSort.
-    FcFontSetDestroy( fontSet );
+    FcFontSetDestroy(fontSet);
   }
   else
   {
-    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "  No fonts found.\n" );
+    DALI_LOG_INFO(gLogFilter, Debug::Verbose, "  No fonts found.\n");
   }
 
   // Destroys the pattern created by FcPatternCreate in CreateFontFamilyPattern.
-  FcPatternDestroy( fontFamilyPattern );
+  FcPatternDestroy(fontFamilyPattern);
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::SetFontList\n" );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::SetFontList\n");
 }
 
-void FontClient::Plugin::GetDefaultFonts( FontList& defaultFonts )
+void FontClient::Plugin::GetDefaultFonts(FontList& defaultFonts)
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::GetDefaultFonts\n" );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::GetDefaultFonts\n");
 
-  if( mDefaultFonts.empty() )
+  if(mDefaultFonts.empty())
   {
     FontDescription fontDescription;
-    fontDescription.family = DEFAULT_FONT_FAMILY_NAME;  // todo This could be set to the Platform font
-    fontDescription.width = IntToWidthType( DEFAULT_FONT_WIDTH );
-    fontDescription.weight = IntToWeightType( DEFAULT_FONT_WEIGHT );
-    fontDescription.slant = IntToSlantType( DEFAULT_FONT_SLANT );
-    SetFontList( fontDescription, mDefaultFonts, mDefaultFontCharacterSets );
+    fontDescription.family = DEFAULT_FONT_FAMILY_NAME; // todo This could be set to the Platform font
+    fontDescription.width  = IntToWidthType(DEFAULT_FONT_WIDTH);
+    fontDescription.weight = IntToWeightType(DEFAULT_FONT_WEIGHT);
+    fontDescription.slant  = IntToSlantType(DEFAULT_FONT_SLANT);
+    SetFontList(fontDescription, mDefaultFonts, mDefaultFontCharacterSets);
   }
 
   defaultFonts = mDefaultFonts;
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  number of default fonts : [%d]\n", mDefaultFonts.size() );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::GetDefaultFonts\n" );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  number of default fonts : [%d]\n", mDefaultFonts.size());
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::GetDefaultFonts\n");
 }
 
-void FontClient::Plugin::GetDefaultPlatformFontDescription( FontDescription& fontDescription )
+void FontClient::Plugin::GetDefaultPlatformFontDescription(FontDescription& fontDescription)
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::GetDefaultPlatformFontDescription\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::GetDefaultPlatformFontDescription\n");
 
-  if( !mDefaultFontDescriptionCached )
+  if(!mDefaultFontDescriptionCached)
   {
     // Clear any font config stored info in the caches.
 
     // Decrease the reference counter and eventually free the resources allocated by FcCharSet objects.
-    DestroyCharacterSets( mDefaultFontCharacterSets );
-    DestroyCharacterSets( mCharacterSetCache );
+    DestroyCharacterSets(mDefaultFontCharacterSets);
+    DestroyCharacterSets(mCharacterSetCache);
     mDefaultFontCharacterSets.Clear();
     mCharacterSetCache.Clear();
 
-    for( auto& item : mFallbackCache )
+    for(auto& item : mFallbackCache)
     {
       // Decrease the reference counter and eventually free the resources allocated by FcCharSet objects.
-      DestroyCharacterSets( *item.characterSets );
+      DestroyCharacterSets(*item.characterSets);
 
       delete item.characterSets;
       item.characterSets = nullptr;
@@ -458,44 +576,44 @@ void FontClient::Plugin::GetDefaultPlatformFontDescription( FontDescription& fon
 
     FcPattern* matchPattern = FcPatternCreate(); // Creates a pattern that needs to be destroyed by calling FcPatternDestroy.
 
-    if( nullptr != matchPattern )
+    if(nullptr != matchPattern)
     {
-      FcConfigSubstitute( nullptr, matchPattern, FcMatchPattern );
-      FcDefaultSubstitute( matchPattern );
+      FcConfigSubstitute(nullptr, matchPattern, FcMatchPattern);
+      FcDefaultSubstitute(matchPattern);
 
       FcCharSet* characterSet = nullptr;
-      MatchFontDescriptionToPattern( matchPattern, mDefaultFontDescription, &characterSet );
+      MatchFontDescriptionToPattern(matchPattern, mDefaultFontDescription, &characterSet);
       // Decrease the reference counter of the character set as it's not stored.
-      FcCharSetDestroy( characterSet );
+      FcCharSetDestroy(characterSet);
 
       // Destroys the pattern created.
-      FcPatternDestroy( matchPattern );
+      FcPatternDestroy(matchPattern);
     }
 
     // Create again the character sets as they are not valid after FcInitReinitialize()
 
-    for( const auto& description : mDefaultFonts )
+    for(const auto& description : mDefaultFonts)
     {
-      mDefaultFontCharacterSets.PushBack( FcCharSetCopy( CreateCharacterSetFromDescription( description ) ) );
+      mDefaultFontCharacterSets.PushBack(FcCharSetCopy(CreateCharacterSetFromDescription(description)));
     }
 
-    for( const auto& description : mFontDescriptionCache )
+    for(const auto& description : mFontDescriptionCache)
     {
-      mCharacterSetCache.PushBack( FcCharSetCopy( CreateCharacterSetFromDescription( description ) ) );
+      mCharacterSetCache.PushBack(FcCharSetCopy(CreateCharacterSetFromDescription(description)));
     }
 
-    for( auto& item : mFallbackCache )
+    for(auto& item : mFallbackCache)
     {
-      if( nullptr != item.fallbackFonts )
+      if(nullptr != item.fallbackFonts)
       {
-        if( nullptr == item.characterSets )
+        if(nullptr == item.characterSets)
         {
           item.characterSets = new CharacterSetList;
         }
 
-        for( const auto& description : *( item.fallbackFonts ) )
+        for(const auto& description : *(item.fallbackFonts))
         {
-          item.characterSets->PushBack( FcCharSetCopy( CreateCharacterSetFromDescription( description ) ) );
+          item.characterSets->PushBack(FcCharSetCopy(CreateCharacterSetFromDescription(description)));
         }
       }
     }
@@ -509,54 +627,54 @@ void FontClient::Plugin::GetDefaultPlatformFontDescription( FontDescription& fon
   fontDescription.weight = mDefaultFontDescription.weight;
   fontDescription.slant  = mDefaultFontDescription.slant;
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  description; family : [%s]\n", fontDescription.family.c_str() );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                 path : [%s]\n", fontDescription.path.c_str() );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[fontDescription.width] );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[fontDescription.weight] );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[fontDescription.slant] );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::GetDefaultPlatformFontDescription\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  description; family : [%s]\n", fontDescription.family.c_str());
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                 path : [%s]\n", fontDescription.path.c_str());
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[fontDescription.width]);
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[fontDescription.weight]);
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[fontDescription.slant]);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::GetDefaultPlatformFontDescription\n");
 }
 
-void FontClient::Plugin::GetSystemFonts( FontList& systemFonts )
+void FontClient::Plugin::GetSystemFonts(FontList& systemFonts)
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::GetSystemFonts\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::GetSystemFonts\n");
 
-  if( mSystemFonts.empty() )
+  if(mSystemFonts.empty())
   {
     InitSystemFonts();
   }
 
   systemFonts = mSystemFonts;
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  number of system fonts : [%d]\n", mSystemFonts.size() );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::GetSystemFonts\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  number of system fonts : [%d]\n", mSystemFonts.size());
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::GetSystemFonts\n");
 }
 
-void FontClient::Plugin::GetDescription( FontId id,
-                                         FontDescription& fontDescription ) const
+void FontClient::Plugin::GetDescription(FontId           id,
+                                        FontDescription& fontDescription) const
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::GetDescription\n");
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  font id : %d\n", id );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::GetDescription\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  font id : %d\n", id);
   const FontId index = id - 1u;
 
-  if( ( id > 0u ) && ( index < mFontIdCache.Count() ) )
+  if((id > 0u) && (index < mFontIdCache.Count()))
   {
     const FontIdCacheItem& fontIdCacheItem = mFontIdCache[index];
-    switch( fontIdCacheItem.type )
+    switch(fontIdCacheItem.type)
     {
       case FontDescription::FACE_FONT:
       {
-        for( const auto& item : mFontDescriptionSizeCache )
+        for(const auto& item : mFontDescriptionSizeCache)
         {
-          if( item.fontId == fontIdCacheItem.id )
+          if(item.fontId == fontIdCacheItem.id)
           {
-            fontDescription = *( mFontDescriptionCache.begin() + item.validatedFontId );
-
-            DALI_LOG_INFO( gLogFilter, Debug::General, "  description; family : [%s]\n", fontDescription.family.c_str() );
-            DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                 path : [%s]\n", fontDescription.path.c_str() );
-            DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[fontDescription.width] );
-            DALI_LOG_INFO( gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[fontDescription.weight] );
-            DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[fontDescription.slant] );
-            DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::GetDescription\n");
+            fontDescription = *(mFontDescriptionCache.begin() + item.validatedFontId - 1u);
+
+            DALI_LOG_INFO(gLogFilter, Debug::General, "  description; family : [%s]\n", fontDescription.family.c_str());
+            DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                 path : [%s]\n", fontDescription.path.c_str());
+            DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[fontDescription.width]);
+            DALI_LOG_INFO(gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[fontDescription.weight]);
+            DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[fontDescription.slant]);
+            DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::GetDescription\n");
             return;
           }
         }
@@ -564,7 +682,7 @@ void FontClient::Plugin::GetDescription( FontId id,
       }
       case FontDescription::BITMAP_FONT:
       {
-        fontDescription.type = FontDescription::BITMAP_FONT;
+        fontDescription.type   = FontDescription::BITMAP_FONT;
         fontDescription.family = mBitmapFontCache[fontIdCacheItem.id].font.name;
         break;
       }
@@ -577,28 +695,28 @@ void FontClient::Plugin::GetDescription( FontId id,
     }
   }
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  No description found for the font ID %d\n", id );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::GetDescription\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  No description found for the font ID %d\n", id);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::GetDescription\n");
 }
 
-PointSize26Dot6 FontClient::Plugin::GetPointSize( FontId id )
+PointSize26Dot6 FontClient::Plugin::GetPointSize(FontId id)
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::GetPointSize\n");
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  font id : %d\n", id );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::GetPointSize\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  font id : %d\n", id);
   const FontId index = id - 1u;
 
-  if( ( id > 0u ) &&
-      ( index < mFontIdCache.Count() ) )
+  if((id > 0u) &&
+     (index < mFontIdCache.Count()))
   {
     const FontIdCacheItem& fontIdCacheItem = mFontIdCache[index];
 
-    switch( fontIdCacheItem.type )
+    switch(fontIdCacheItem.type)
     {
       case FontDescription::FACE_FONT:
       {
-        DALI_LOG_INFO( gLogFilter, Debug::General, "  point size : %d\n", ( *( mFontFaceCache.begin() + fontIdCacheItem.id ) ).mRequestedPointSize );
-        DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::GetPointSize\n");
-        return ( *( mFontFaceCache.begin() + fontIdCacheItem.id ) ).mRequestedPointSize;
+        DALI_LOG_INFO(gLogFilter, Debug::General, "  point size : %d\n", (*(mFontFaceCache.begin() + fontIdCacheItem.id)).mRequestedPointSize);
+        DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::GetPointSize\n");
+        return (*(mFontFaceCache.begin() + fontIdCacheItem.id)).mRequestedPointSize;
       }
       case FontDescription::BITMAP_FONT:
       {
@@ -612,24 +730,24 @@ PointSize26Dot6 FontClient::Plugin::GetPointSize( FontId id )
   }
   else
   {
-    DALI_LOG_INFO( gLogFilter, Debug::General, "  Invalid font ID %d\n", id );
+    DALI_LOG_INFO(gLogFilter, Debug::General, "  Invalid font ID %d\n", id);
   }
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  default point size : %d\n", TextAbstraction::FontClient::DEFAULT_POINT_SIZE );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::GetPointSize\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  default point size : %d\n", TextAbstraction::FontClient::DEFAULT_POINT_SIZE);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::GetPointSize\n");
   return TextAbstraction::FontClient::DEFAULT_POINT_SIZE;
 }
 
-bool FontClient::Plugin::IsCharacterSupportedByFont( FontId fontId, Character character )
+bool FontClient::Plugin::IsCharacterSupportedByFont(FontId fontId, Character character)
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::IsCharacterSupportedByFont\n");
-  DALI_LOG_INFO( gLogFilter, Debug::General, "    font id : %d\n", fontId );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  character : %p\n", character );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::IsCharacterSupportedByFont\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "    font id : %d\n", fontId);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  character : %p\n", character);
 
-  if( ( fontId < 1u ) || ( fontId > mFontIdCache.Count() ) )
+  if((fontId < 1u) || (fontId > mFontIdCache.Count()))
   {
-    DALI_LOG_INFO( gLogFilter, Debug::General, "  Invalid font id. Number of items in the cache: %d\n",mFontIdCache.Count());
-    DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::IsCharacterSupportedByFont\n");
+    DALI_LOG_INFO(gLogFilter, Debug::General, "  Invalid font id. Number of items in the cache: %d\n", mFontIdCache.Count());
+    DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::IsCharacterSupportedByFont\n");
     return false;
   }
 
@@ -639,40 +757,40 @@ bool FontClient::Plugin::IsCharacterSupportedByFont( FontId fontId, Character ch
 
   const FontIdCacheItem& fontIdCacheItem = mFontIdCache[fontId];
 
-  switch( fontIdCacheItem.type )
+  switch(fontIdCacheItem.type)
   {
     case FontDescription::FACE_FONT:
     {
-      if( fontIdCacheItem.id < mFontFaceCache.size() )
+      if(fontIdCacheItem.id < mFontFaceCache.size())
       {
         FontFaceCacheItem& cacheItem = mFontFaceCache[fontIdCacheItem.id];
 
-        if( nullptr == cacheItem.mCharacterSet )
+        if(nullptr == cacheItem.mCharacterSet)
         {
           // Create again the character set.
           // It can be null if the ResetSystemDefaults() method has been called.
 
           FontDescription description;
-          description.path = cacheItem.mPath;
-          description.family = std::move( FontFamily( cacheItem.mFreeTypeFace->family_name ) );
+          description.path   = cacheItem.mPath;
+          description.family = std::move(FontFamily(cacheItem.mFreeTypeFace->family_name));
           description.weight = FontWeight::NONE;
-          description.width = FontWidth::NONE;
-          description.slant = FontSlant::NONE;
+          description.width  = FontWidth::NONE;
+          description.slant  = FontSlant::NONE;
 
           // Note FreeType doesn't give too much info to build a proper font style.
-          if( cacheItem.mFreeTypeFace->style_flags & FT_STYLE_FLAG_ITALIC )
+          if(cacheItem.mFreeTypeFace->style_flags & FT_STYLE_FLAG_ITALIC)
           {
             description.slant = FontSlant::ITALIC;
           }
-          if( cacheItem.mFreeTypeFace->style_flags & FT_STYLE_FLAG_BOLD )
+          if(cacheItem.mFreeTypeFace->style_flags & FT_STYLE_FLAG_BOLD)
           {
             description.weight = FontWeight::BOLD;
           }
 
-          cacheItem.mCharacterSet = FcCharSetCopy( CreateCharacterSetFromDescription( description ) );
+          cacheItem.mCharacterSet = FcCharSetCopy(CreateCharacterSetFromDescription(description));
         }
 
-        isSupported = FcCharSetHasChar( cacheItem.mCharacterSet, character );
+        isSupported = FcCharSetHasChar(cacheItem.mCharacterSet, character);
       }
       break;
     }
@@ -680,9 +798,9 @@ bool FontClient::Plugin::IsCharacterSupportedByFont( FontId fontId, Character ch
     {
       const BitmapFont& bitmapFont = mBitmapFontCache[fontIdCacheItem.id].font;
 
-      for( const auto& glyph : bitmapFont.glyphs )
+      for(const auto& glyph : bitmapFont.glyphs)
       {
-        if( glyph.utf32 == character )
+        if(glyph.utf32 == character)
         {
           isSupported = true;
           break;
@@ -696,126 +814,125 @@ bool FontClient::Plugin::IsCharacterSupportedByFont( FontId fontId, Character ch
     }
   }
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  is supported : %s\n", (isSupported ? "true" : "false") );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::IsCharacterSupportedByFont\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  is supported : %s\n", (isSupported ? "true" : "false"));
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::IsCharacterSupportedByFont\n");
   return isSupported;
 }
 
-FontId FontClient::Plugin::FindFontForCharacter( const FontList& fontList,
-                                                 const CharacterSetList& characterSetList,
-                                                 Character character,
-                                                 PointSize26Dot6 requestedPointSize,
-                                                 bool preferColor )
+FontId FontClient::Plugin::FindFontForCharacter(const FontList&         fontList,
+                                                const CharacterSetList& characterSetList,
+                                                Character               character,
+                                                PointSize26Dot6         requestedPointSize,
+                                                bool                    preferColor)
 {
-  DALI_ASSERT_DEBUG( ( fontList.size() == characterSetList.Count() ) && "FontClient::Plugin::FindFontForCharacter. Different number of fonts and character sets." );
+  DALI_ASSERT_DEBUG((fontList.size() == characterSetList.Count()) && "FontClient::Plugin::FindFontForCharacter. Different number of fonts and character sets.");
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::FindFontForCharacter\n" );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "           character : %p\n", character );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  requestedPointSize : %d\n", requestedPointSize );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "         preferColor : %s\n", ( preferColor ? "true" : "false" ) );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::FindFontForCharacter\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "           character : %p\n", character);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  requestedPointSize : %d\n", requestedPointSize);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "         preferColor : %s\n", (preferColor ? "true" : "false"));
 
-  FontId fontId = 0u;
-  bool foundColor = false;
+  FontId fontId     = 0u;
+  bool   foundColor = false;
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  number of fonts : %d\n", fontList.size() );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  number of fonts : %d\n", fontList.size());
 
   // Traverse the list of fonts.
   // Check for each font if supports the character.
-  for( unsigned int index = 0u, numberOfFonts = fontList.size(); index < numberOfFonts; ++index )
+  for(unsigned int index = 0u, numberOfFonts = fontList.size(); index < numberOfFonts; ++index)
   {
-    const FontDescription& description = fontList[index];
+    const FontDescription& description  = fontList[index];
     const FcCharSet* const characterSet = characterSetList[index];
 
-    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "  description; family : [%s]\n", description.family.c_str() );
-    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                 path : [%s]\n", description.path.c_str() );
-    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[description.width] );
-    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[description.weight] );
-    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[description.slant] );
+    DALI_LOG_INFO(gLogFilter, Debug::Verbose, "  description; family : [%s]\n", description.family.c_str());
+    DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                 path : [%s]\n", description.path.c_str());
+    DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[description.width]);
+    DALI_LOG_INFO(gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[description.weight]);
+    DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[description.slant]);
 
     bool foundInRanges = false;
-    if( nullptr != characterSet )
+    if(nullptr != characterSet)
     {
-      foundInRanges = FcCharSetHasChar( characterSet, character );
+      foundInRanges = FcCharSetHasChar(characterSet, character);
     }
 
-    if( foundInRanges )
+    if(foundInRanges)
     {
-      fontId = GetFontId( description,
-                          requestedPointSize,
-                          0u );
+      fontId = GetFontId(description,
+                         requestedPointSize,
+                         0u);
 
-      DALI_LOG_INFO( gLogFilter, Debug::Verbose, "     font id : %d\n", fontId );
+      DALI_LOG_INFO(gLogFilter, Debug::Verbose, "     font id : %d\n", fontId);
 
-      if( preferColor )
+      if(preferColor)
       {
-        if( ( fontId > 0 ) &&
-            ( fontId - 1u < mFontIdCache.Count() ) )
+        if((fontId > 0) &&
+           (fontId - 1u < mFontIdCache.Count()))
         {
           const FontFaceCacheItem& item = mFontFaceCache[mFontIdCache[fontId - 1u].id];
 
           foundColor = item.mHasColorTables;
         }
 
-        DALI_LOG_INFO( gLogFilter, Debug::Verbose, "  foundColor : %s\n", ( foundColor ? "true" : "false" ) );
+        DALI_LOG_INFO(gLogFilter, Debug::Verbose, "  foundColor : %s\n", (foundColor ? "true" : "false"));
       }
 
       // Keep going unless we prefer a different (color) font.
-      if( !preferColor || foundColor )
+      if(!preferColor || foundColor)
       {
         break;
       }
     }
   }
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  font id : %d\n", fontId );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::FindFontForCharacter\n" );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  font id : %d\n", fontId);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::FindFontForCharacter\n");
   return fontId;
 }
 
-FontId FontClient::Plugin::FindDefaultFont( Character charcode,
-                                            PointSize26Dot6 requestedPointSize,
-                                            bool preferColor )
+FontId FontClient::Plugin::FindDefaultFont(Character       charcode,
+                                           PointSize26Dot6 requestedPointSize,
+                                           bool            preferColor)
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::FindDefaultFont\n" );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "           character : %p\n", charcode );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  requestedPointSize : %d\n", requestedPointSize );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "         preferColor : %s\n", ( preferColor ? "true" : "false" ) );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::FindDefaultFont\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "           character : %p\n", charcode);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  requestedPointSize : %d\n", requestedPointSize);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "         preferColor : %s\n", (preferColor ? "true" : "false"));
 
   FontId fontId(0);
 
   // Create the list of default fonts if it has not been created.
-  if( mDefaultFonts.empty() )
+  if(mDefaultFonts.empty())
   {
     FontDescription fontDescription;
     fontDescription.family = DEFAULT_FONT_FAMILY_NAME;
-    fontDescription.width = IntToWidthType( DEFAULT_FONT_WIDTH );
-    fontDescription.weight = IntToWeightType( DEFAULT_FONT_WEIGHT );
-    fontDescription.slant = IntToSlantType( DEFAULT_FONT_SLANT );
+    fontDescription.width  = IntToWidthType(DEFAULT_FONT_WIDTH);
+    fontDescription.weight = IntToWeightType(DEFAULT_FONT_WEIGHT);
+    fontDescription.slant  = IntToSlantType(DEFAULT_FONT_SLANT);
 
-    SetFontList( fontDescription, mDefaultFonts, mDefaultFontCharacterSets );
+    SetFontList(fontDescription, mDefaultFonts, mDefaultFontCharacterSets);
   }
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "  number of default fonts : %d\n", mDefaultFonts.size() );
-
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "  number of default fonts : %d\n", mDefaultFonts.size());
 
   // Traverse the list of default fonts.
   // Check for each default font if supports the character.
-  fontId = FindFontForCharacter( mDefaultFonts, mDefaultFontCharacterSets, charcode, requestedPointSize, preferColor );
+  fontId = FindFontForCharacter(mDefaultFonts, mDefaultFontCharacterSets, charcode, requestedPointSize, preferColor);
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  font id : %d\n", fontId );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::FindDefaultFont\n" );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  font id : %d\n", fontId);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::FindDefaultFont\n");
 
   return fontId;
 }
 
-FontId FontClient::Plugin::FindFallbackFont( Character charcode,
-                                             const FontDescription& preferredFontDescription,
-                                             PointSize26Dot6 requestedPointSize,
-                                             bool preferColor )
+FontId FontClient::Plugin::FindFallbackFont(Character              charcode,
+                                            const FontDescription& preferredFontDescription,
+                                            PointSize26Dot6        requestedPointSize,
+                                            bool                   preferColor)
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::FindFallbackFont\n" );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "           character : %p\n", charcode );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  requestedPointSize : %d\n", requestedPointSize );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "         preferColor : %s\n", ( preferColor ? "true" : "false" ) );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::FindFallbackFont\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "           character : %p\n", charcode);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  requestedPointSize : %d\n", requestedPointSize);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "         preferColor : %s\n", (preferColor ? "true" : "false"));
 
   // The font id to be returned.
   FontId fontId = 0u;
@@ -824,82 +941,97 @@ FontId FontClient::Plugin::FindFallbackFont( Character charcode,
 
   // Fill the font description with the preferred font description and complete with the defaults.
   fontDescription.family = preferredFontDescription.family.empty() ? DEFAULT_FONT_FAMILY_NAME : preferredFontDescription.family;
-  fontDescription.weight = ( ( FontWeight::NONE == preferredFontDescription.weight ) ? IntToWeightType( DEFAULT_FONT_WEIGHT ) : preferredFontDescription.weight );
-  fontDescription.width = ( ( FontWidth::NONE == preferredFontDescription.width ) ? IntToWidthType( DEFAULT_FONT_WIDTH ) : preferredFontDescription.width );
-  fontDescription.slant = ( ( FontSlant::NONE == preferredFontDescription.slant ) ? IntToSlantType( DEFAULT_FONT_SLANT ) : preferredFontDescription.slant );
+  fontDescription.weight = ((FontWeight::NONE == preferredFontDescription.weight) ? IntToWeightType(DEFAULT_FONT_WEIGHT) : preferredFontDescription.weight);
+  fontDescription.width  = ((FontWidth::NONE == preferredFontDescription.width) ? IntToWidthType(DEFAULT_FONT_WIDTH) : preferredFontDescription.width);
+  fontDescription.slant  = ((FontSlant::NONE == preferredFontDescription.slant) ? IntToSlantType(DEFAULT_FONT_SLANT) : preferredFontDescription.slant);
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  preferredFontDescription --> fontDescription\n" );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  [%s] --> [%s]\n", preferredFontDescription.family.c_str(), fontDescription.family.c_str() );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "  [%s] --> [%s]\n", FontWeight::Name[preferredFontDescription.weight], FontWeight::Name[fontDescription.weight] );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "  [%s] --> [%s]\n", FontWidth::Name[preferredFontDescription.width], FontWidth::Name[fontDescription.width] );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "  [%s] --> [%s]\n", FontSlant::Name[preferredFontDescription.slant], FontSlant::Name[fontDescription.slant] );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  preferredFontDescription --> fontDescription\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  [%s] --> [%s]\n", preferredFontDescription.family.c_str(), fontDescription.family.c_str());
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "  [%s] --> [%s]\n", FontWeight::Name[preferredFontDescription.weight], FontWeight::Name[fontDescription.weight]);
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "  [%s] --> [%s]\n", FontWidth::Name[preferredFontDescription.width], FontWidth::Name[fontDescription.width]);
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "  [%s] --> [%s]\n", FontSlant::Name[preferredFontDescription.slant], FontSlant::Name[fontDescription.slant]);
 
   // Check first if the font's description has been queried before.
-  FontList* fontList = nullptr;
+  FontList*         fontList         = nullptr;
   CharacterSetList* characterSetList = nullptr;
 
-  if( !FindFallbackFontList( fontDescription, fontList, characterSetList ) )
+  if(!FindFallbackFontList(fontDescription, fontList, characterSetList))
   {
-    fontList = new FontList;
+    fontList         = new FontList;
     characterSetList = new CharacterSetList;
 
-    SetFontList( fontDescription, *fontList, *characterSetList );
+    SetFontList(fontDescription, *fontList, *characterSetList);
+#ifdef __APPLE__
+    FontDescription appleColorEmoji;
+    appleColorEmoji.family = "Apple Color Emoji";
+    appleColorEmoji.width  = fontDescription.width;
+    appleColorEmoji.weight = fontDescription.weight;
+    appleColorEmoji.slant  = fontDescription.slant;
+    FontList         emojiFontList;
+    CharacterSetList emojiCharSetList;
+    SetFontList(appleColorEmoji, emojiFontList, emojiCharSetList);
+
+    std::move(fontList->begin(), fontList->end(), std::back_inserter(emojiFontList));
+    emojiCharSetList.Insert(emojiCharSetList.End(), characterSetList->Begin(), characterSetList->End());
+    *fontList         = std::move(emojiFontList);
+    *characterSetList = std::move(emojiCharSetList);
+#endif
 
     // Add the font-list to the cache.
-    mFallbackCache.push_back( std::move( FallbackCacheItem( std::move( fontDescription ), fontList, characterSetList ) ) );
+    mFallbackCache.push_back(std::move(FallbackCacheItem(std::move(fontDescription), fontList, characterSetList)));
   }
 
-  if( fontList && characterSetList )
+  if(fontList && characterSetList)
   {
-    fontId = FindFontForCharacter( *fontList, *characterSetList, charcode, requestedPointSize, preferColor );
+    fontId = FindFontForCharacter(*fontList, *characterSetList, charcode, requestedPointSize, preferColor);
   }
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  font id : %d\n", fontId );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::FindFallbackFont\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  font id : %d\n", fontId);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::FindFallbackFont\n");
   return fontId;
 }
 
-FontId FontClient::Plugin::GetFontId( const FontPath& path,
-                                      PointSize26Dot6 requestedPointSize,
-                                      FaceIndex faceIndex,
-                                      bool cacheDescription )
+FontId FontClient::Plugin::GetFontId(const FontPath& path,
+                                     PointSize26Dot6 requestedPointSize,
+                                     FaceIndex       faceIndex,
+                                     bool            cacheDescription)
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::GetFontId\n" );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "                path : [%s]\n", path.c_str() );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  requestedPointSize : %d\n", requestedPointSize );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::GetFontId\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "                path : [%s]\n", path.c_str());
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  requestedPointSize : %d\n", requestedPointSize);
 
   FontId id = 0u;
 
-  if( nullptr != mFreeTypeLibrary )
+  if(nullptr != mFreeTypeLibrary)
   {
     FontId foundId = 0u;
-    if( FindFont( path, requestedPointSize, faceIndex, foundId ) )
+    if(FindFont(path, requestedPointSize, faceIndex, foundId))
     {
       id = foundId;
     }
     else
     {
-      id = CreateFont( path, requestedPointSize, faceIndex, cacheDescription );
+      id = CreateFont(path, requestedPointSize, faceIndex, cacheDescription);
     }
   }
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  font id : %d\n", id );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::GetFontId\n" );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  font id : %d\n", id);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::GetFontId\n");
 
   return id;
 }
 
-FontId FontClient::Plugin::GetFontId( const FontDescription& fontDescription,
-                                      PointSize26Dot6 requestedPointSize,
-                                      FaceIndex faceIndex )
+FontId FontClient::Plugin::GetFontId(const FontDescription& fontDescription,
+                                     PointSize26Dot6        requestedPointSize,
+                                     FaceIndex              faceIndex)
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::GetFontId\n" );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  description; family : [%s]\n", fontDescription.family.c_str() );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                 path : [%s]\n", fontDescription.path.c_str() );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[fontDescription.width] );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[fontDescription.weight] );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[fontDescription.slant] );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "   requestedPointSize : %d\n", requestedPointSize );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::GetFontId\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  description; family : [%s]\n", fontDescription.family.c_str());
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                 path : [%s]\n", fontDescription.path.c_str());
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[fontDescription.width]);
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[fontDescription.weight]);
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[fontDescription.slant]);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "   requestedPointSize : %d\n", requestedPointSize);
 
   // This method uses three vectors which caches:
   // * The bitmap font cache
@@ -923,7 +1055,7 @@ FontId FontClient::Plugin::GetFontId( const FontDescription& fontDescription,
   FontId fontId = 0u;
 
   // Check first if the font description matches with a previously loaded bitmap font.
-  if( FindBitmapFont( fontDescription.family, fontId ) )
+  if(FindBitmapFont(fontDescription.family, fontId))
   {
     return fontId;
   }
@@ -931,51 +1063,51 @@ FontId FontClient::Plugin::GetFontId( const FontDescription& fontDescription,
   // Check if the font's description have been validated before.
   FontDescriptionId validatedFontId = 0u;
 
-  if( !FindValidatedFont( fontDescription,
-                          validatedFontId ) )
+  if(!FindValidatedFont(fontDescription,
+                        validatedFontId))
   {
     // Use font config to validate the font's description.
-    ValidateFont( fontDescription,
-                  validatedFontId );
+    ValidateFont(fontDescription,
+                 validatedFontId);
   }
 
   FontId fontFaceId = 0u;
   // Check if exists a pair 'validatedFontId, requestedPointSize' in the cache.
-  if( !FindFont( validatedFontId, requestedPointSize, fontFaceId ) )
+  if(!FindFont(validatedFontId, requestedPointSize, fontFaceId))
   {
     // Retrieve the font file name path.
-    const FontDescription& description = *( mFontDescriptionCache.begin() + validatedFontId );
+    const FontDescription& description = *(mFontDescriptionCache.begin() + validatedFontId - 1u);
 
     // Retrieve the font id. Do not cache the description as it has been already cached.
-    fontId = GetFontId( description.path,
-                        requestedPointSize,
-                        faceIndex,
-                        false );
+    fontId = GetFontId(description.path,
+                       requestedPointSize,
+                       faceIndex,
+                       false);
 
-    fontFaceId = mFontIdCache[fontId-1u].id;
-    mFontFaceCache[fontFaceId].mCharacterSet = FcCharSetCopy( mCharacterSetCache[validatedFontId] );
+    fontFaceId                               = mFontIdCache[fontId - 1u].id;
+    mFontFaceCache[fontFaceId].mCharacterSet = FcCharSetCopy(mCharacterSetCache[validatedFontId - 1u]);
 
     // Cache the pair 'validatedFontId, requestedPointSize' to improve the following queries.
-    mFontDescriptionSizeCache.push_back( FontDescriptionSizeCacheItem( validatedFontId,
-                                                                       requestedPointSize,
-                                                                       fontFaceId ) );
+    mFontDescriptionSizeCache.push_back(FontDescriptionSizeCacheItem(validatedFontId,
+                                                                     requestedPointSize,
+                                                                     fontFaceId));
   }
   else
   {
     fontId = mFontFaceCache[fontFaceId].mFontId + 1u;
   }
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  font id : %d\n", fontId );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::GetFontId\n" );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  font id : %d\n", fontId);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::GetFontId\n");
 
   return fontId;
 }
 
-FontId FontClient::Plugin::GetFontId( const BitmapFont& bitmapFont )
+FontId FontClient::Plugin::GetFontId(const BitmapFont& bitmapFont)
 {
-  for( const auto& item : mBitmapFontCache )
+  for(const auto& item : mBitmapFontCache)
   {
-    if( bitmapFont.name == item.font.name )
+    if(bitmapFont.name == item.font.name)
     {
       return item.id + 1u;
     }
@@ -983,119 +1115,119 @@ FontId FontClient::Plugin::GetFontId( const BitmapFont& bitmapFont )
 
   BitmapFontCacheItem bitmapFontCacheItem;
   bitmapFontCacheItem.font = bitmapFont;
-  bitmapFontCacheItem.id = mFontIdCache.Count();
+  bitmapFontCacheItem.id   = mFontIdCache.Count();
 
   // Resize the vector with the pixel buffers.
-  bitmapFontCacheItem.pixelBuffers.resize( bitmapFont.glyphs.size() );
+  bitmapFontCacheItem.pixelBuffers.resize(bitmapFont.glyphs.size());
 
   // Traverse all the glyphs and load the pixel buffer of those with ascender and descender equal to zero.
   unsigned int index = 0u;
-  for( auto& glyph : bitmapFontCacheItem.font.glyphs )
+  for(auto& glyph : bitmapFontCacheItem.font.glyphs)
   {
     Devel::PixelBuffer& pixelBuffer = bitmapFontCacheItem.pixelBuffers[index];
 
-    if( EqualsZero( glyph.ascender ) && EqualsZero( glyph.descender ) )
+    if(EqualsZero(glyph.ascender) && EqualsZero(glyph.descender))
     {
       // Load the glyph.
-      pixelBuffer = LoadImageFromFile( glyph.url );
+      pixelBuffer = LoadImageFromFile(glyph.url);
 
-      if( pixelBuffer )
+      if(pixelBuffer)
       {
         glyph.ascender = static_cast<float>(pixelBuffer.GetHeight());
       }
     }
 
-    bitmapFontCacheItem.font.ascender = std::max( glyph.ascender, bitmapFontCacheItem.font.ascender );
-    bitmapFontCacheItem.font.descender = std::min( glyph.descender, bitmapFontCacheItem.font.descender );
+    bitmapFontCacheItem.font.ascender  = std::max(glyph.ascender, bitmapFontCacheItem.font.ascender);
+    bitmapFontCacheItem.font.descender = std::min(glyph.descender, bitmapFontCacheItem.font.descender);
 
     ++index;
   }
 
   FontIdCacheItem fontIdCacheItem;
   fontIdCacheItem.type = FontDescription::BITMAP_FONT;
-  fontIdCacheItem.id = mBitmapFontCache.size();
+  fontIdCacheItem.id   = mBitmapFontCache.size();
 
-  mBitmapFontCache.push_back( std::move( bitmapFontCacheItem ) );
-  mFontIdCache.PushBack( fontIdCacheItem );
+  mBitmapFontCache.push_back(std::move(bitmapFontCacheItem));
+  mFontIdCache.PushBack(fontIdCacheItem);
 
   return bitmapFontCacheItem.id + 1u;
 }
 
-void FontClient::Plugin::ValidateFont( const FontDescription& fontDescription,
-                                       FontDescriptionId& validatedFontId )
+void FontClient::Plugin::ValidateFont(const FontDescription& fontDescription,
+                                      FontDescriptionId&     validatedFontId)
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::ValidateFont\n" );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  description; family : [%s]\n", fontDescription.family.c_str() );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                 path : [%s]\n", fontDescription.path.c_str() );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[fontDescription.width] );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[fontDescription.weight] );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[fontDescription.slant] );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::ValidateFont\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  description; family : [%s]\n", fontDescription.family.c_str());
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                 path : [%s]\n", fontDescription.path.c_str());
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[fontDescription.width]);
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[fontDescription.weight]);
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[fontDescription.slant]);
 
   // Create a font pattern.
-  FcPattern* fontFamilyPattern = CreateFontFamilyPattern( fontDescription );
+  FcPattern* fontFamilyPattern = CreateFontFamilyPattern(fontDescription);
 
   FontDescription description;
 
   FcCharSet* characterSet = nullptr;
-  bool matched = MatchFontDescriptionToPattern( fontFamilyPattern, description, &characterSet );
-  FcPatternDestroy( fontFamilyPattern );
+  bool       matched      = MatchFontDescriptionToPattern(fontFamilyPattern, description, &characterSet);
+  FcPatternDestroy(fontFamilyPattern);
 
-  if( matched && ( nullptr != characterSet ) )
+  if(matched && (nullptr != characterSet))
   {
+    // Add the path to the cache.
+    description.type = FontDescription::FACE_FONT;
+    mFontDescriptionCache.push_back(description);
+
     // Set the index to the vector of paths to font file names.
     validatedFontId = mFontDescriptionCache.size();
 
-    DALI_LOG_INFO( gLogFilter, Debug::General, "  matched description; family : [%s]\n", description.family.c_str() );
-    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                         path : [%s]\n", description.path.c_str() );
-    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                        width : [%s]\n", FontWidth::Name[description.width] );
-    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                       weight : [%s]\n", FontWeight::Name[description.weight] );
-    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                        slant : [%s]\n\n", FontSlant::Name[description.slant] );
-    DALI_LOG_INFO( gLogFilter, Debug::General, "  validatedFontId : %d\n", validatedFontId );
-
-    // Add the path to the cache.
-    description.type = FontDescription::FACE_FONT;
-    mFontDescriptionCache.push_back( description );
+    DALI_LOG_INFO(gLogFilter, Debug::General, "  matched description; family : [%s]\n", description.family.c_str());
+    DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                         path : [%s]\n", description.path.c_str());
+    DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                        width : [%s]\n", FontWidth::Name[description.width]);
+    DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                       weight : [%s]\n", FontWeight::Name[description.weight]);
+    DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                        slant : [%s]\n\n", FontSlant::Name[description.slant]);
+    DALI_LOG_INFO(gLogFilter, Debug::General, "  validatedFontId : %d\n", validatedFontId);
 
     // The reference counter of the character set has already been increased in MatchFontDescriptionToPattern.
-    mCharacterSetCache.PushBack( characterSet );
+    mCharacterSetCache.PushBack(characterSet);
 
     // Cache the index and the matched font's description.
-    FontDescriptionCacheItem item( description,
-                                   validatedFontId );
+    FontDescriptionCacheItem item(description,
+                                  validatedFontId);
 
-    mValidatedFontCache.push_back( std::move( item ) );
+    mValidatedFontCache.push_back(std::move(item));
 
-    if( ( fontDescription.family != description.family ) ||
-        ( fontDescription.width != description.width )   ||
-        ( fontDescription.weight != description.weight ) ||
-        ( fontDescription.slant != description.slant ) )
+    if((fontDescription.family != description.family) ||
+       (fontDescription.width != description.width) ||
+       (fontDescription.weight != description.weight) ||
+       (fontDescription.slant != description.slant))
     {
       // Cache the given font's description if it's different than the matched.
-      FontDescriptionCacheItem item( fontDescription,
-                                     validatedFontId );
+      FontDescriptionCacheItem item(fontDescription,
+                                    validatedFontId);
 
-      mValidatedFontCache.push_back( std::move( item ) );
+      mValidatedFontCache.push_back(std::move(item));
     }
   }
   else
   {
-    DALI_LOG_INFO( gLogFilter, Debug::General, "  font validation failed for font [%s]\n", fontDescription.family.c_str() );
+    DALI_LOG_INFO(gLogFilter, Debug::General, "  font validation failed for font [%s]\n", fontDescription.family.c_str());
   }
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::ValidateFont\n" );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::ValidateFont\n");
 }
 
-void FontClient::Plugin::GetFontMetrics( FontId fontId,
-                                         FontMetrics& metrics )
+void FontClient::Plugin::GetFontMetrics(FontId       fontId,
+                                        FontMetrics& metrics)
 {
   const FontId index = fontId - 1u;
 
-  if( ( fontId > 0 ) &&
-      ( index < mFontIdCache.Count() ) )
+  if((fontId > 0) &&
+     (index < mFontIdCache.Count()))
   {
     const FontIdCacheItem& fontIdCacheItem = mFontIdCache[index];
 
-    switch( fontIdCacheItem.type )
+    switch(fontIdCacheItem.type)
     {
       case FontDescription::FACE_FONT:
       {
@@ -1104,18 +1236,18 @@ void FontClient::Plugin::GetFontMetrics( FontId fontId,
         metrics = font.mMetrics;
 
         // Adjust the metrics if the fixed-size font should be down-scaled
-        if( font.mIsFixedSizeBitmap )
+        if(font.mIsFixedSizeBitmap)
         {
-          const float desiredFixedSize =  static_cast<float>( font.mRequestedPointSize ) * FROM_266 / POINTS_PER_INCH * mDpiVertical;
+          const float desiredFixedSize = static_cast<float>(font.mRequestedPointSize) * FROM_266 / POINTS_PER_INCH * mDpiVertical;
 
-          if( desiredFixedSize > 0.f )
+          if(desiredFixedSize > 0.f)
           {
             const float scaleFactor = desiredFixedSize / font.mFixedHeightPixels;
 
-            metrics.ascender = metrics.ascender * scaleFactor;
-            metrics.descender = metrics.descender * scaleFactor;
-            metrics.height = metrics.height * scaleFactor;
-            metrics.underlinePosition = metrics.underlinePosition * scaleFactor;
+            metrics.ascender           = metrics.ascender * scaleFactor;
+            metrics.descender          = metrics.descender * scaleFactor;
+            metrics.height             = metrics.height * scaleFactor;
+            metrics.underlinePosition  = metrics.underlinePosition * scaleFactor;
             metrics.underlineThickness = metrics.underlineThickness * scaleFactor;
           }
         }
@@ -1125,10 +1257,10 @@ void FontClient::Plugin::GetFontMetrics( FontId fontId,
       {
         const BitmapFontCacheItem& bitmapFontCacheItem = mBitmapFontCache[fontIdCacheItem.id];
 
-        metrics.ascender = bitmapFontCacheItem.font.ascender;
-        metrics.descender = bitmapFontCacheItem.font.descender;
-        metrics.height = metrics.ascender - metrics.descender;
-        metrics.underlinePosition = bitmapFontCacheItem.font.underlinePosition;
+        metrics.ascender           = bitmapFontCacheItem.font.ascender;
+        metrics.descender          = bitmapFontCacheItem.font.descender;
+        metrics.height             = metrics.ascender - metrics.descender;
+        metrics.underlinePosition  = bitmapFontCacheItem.font.underlinePosition;
         metrics.underlineThickness = bitmapFontCacheItem.font.underlineThickness;
         break;
       }
@@ -1140,180 +1272,221 @@ void FontClient::Plugin::GetFontMetrics( FontId fontId,
   }
   else
   {
-    DALI_LOG_INFO( gLogFilter, Debug::General, "FontClient::Plugin::GetFontMetrics. Invalid font id : %d\n", fontId );
+    DALI_LOG_INFO(gLogFilter, Debug::General, "FontClient::Plugin::GetFontMetrics. Invalid font id : %d\n", fontId);
   }
 }
 
-GlyphIndex FontClient::Plugin::GetGlyphIndex( FontId fontId,
-                                              Character charcode )
+GlyphIndex FontClient::Plugin::GetGlyphIndex(FontId    fontId,
+                                             Character charcode)
 {
-  GlyphIndex glyphIndex = 0u;
-  const FontId index = fontId - 1u;
+  GlyphIndex   glyphIndex = 0u;
+  const FontId index      = fontId - 1u;
 
-  if( ( fontId > 0u ) &&
-      ( index < mFontIdCache.Count() ) )
+  if((fontId > 0u) &&
+     (index < mFontIdCache.Count()))
   {
     const FontIdCacheItem& fontIdCacheItem = mFontIdCache[index];
 
-    if( FontDescription::FACE_FONT == fontIdCacheItem.type )
+    if(FontDescription::FACE_FONT == fontIdCacheItem.type)
     {
       FT_Face ftFace = mFontFaceCache[fontIdCacheItem.id].mFreeTypeFace;
 
-      glyphIndex = FT_Get_Char_Index( ftFace, charcode );
+      glyphIndex = FT_Get_Char_Index(ftFace, charcode);
     }
   }
 
   return glyphIndex;
 }
 
-bool FontClient::Plugin::GetGlyphMetrics( GlyphInfo* array,
-                                          uint32_t size,
-                                          GlyphType type,
-                                          bool horizontal )
+bool FontClient::Plugin::GetGlyphMetrics(GlyphInfo* array,
+                                         uint32_t   size,
+                                         GlyphType  type,
+                                         bool       horizontal)
 {
-  if( VECTOR_GLYPH == type )
+  if(VECTOR_GLYPH == type)
   {
-    return GetVectorMetrics( array, size, horizontal );
+    return GetVectorMetrics(array, size, horizontal);
   }
 
-  return GetBitmapMetrics( array, size, horizontal );
+  return GetBitmapMetrics(array, size, horizontal);
 }
 
-bool FontClient::Plugin::GetBitmapMetrics( GlyphInfo* array,
-                                           uint32_t size,
-                                           bool horizontal )
+bool FontClient::Plugin::GetBitmapMetrics(GlyphInfo* array,
+                                          uint32_t   size,
+                                          bool       horizontal)
 {
-  bool success( true );
+  bool success(true);
 
-  for( unsigned int i=0; i<size; ++i )
+  for(unsigned int i = 0; i < size; ++i)
   {
     GlyphInfo& glyph = array[i];
 
     FontId index = glyph.fontId - 1u;
 
-    if( ( glyph.fontId > 0u ) &&
-        ( index < mFontIdCache.Count() ) )
+    if((glyph.fontId > 0u) &&
+       (index < mFontIdCache.Count()))
     {
       const FontIdCacheItem& fontIdCacheItem = mFontIdCache[index];
 
-      switch( fontIdCacheItem.type )
+      switch(fontIdCacheItem.type)
       {
-      case FontDescription::FACE_FONT:
-      {
-        const FontFaceCacheItem& font = mFontFaceCache[fontIdCacheItem.id];
+        case FontDescription::FACE_FONT:
+        {
+          const FontFaceCacheItem& font = mFontFaceCache[fontIdCacheItem.id];
 
-        FT_Face ftFace = font.mFreeTypeFace;
+          FT_Face ftFace = font.mFreeTypeFace;
 
 #ifdef FREETYPE_BITMAP_SUPPORT
-        // Check to see if we should be loading a Fixed Size bitmap?
-        if( font.mIsFixedSizeBitmap )
-        {
-          FT_Select_Size( ftFace, font.mFixedSizeIndex ); ///< @todo: needs to be investigated why it's needed to select the size again.
-          int error = FT_Load_Glyph( ftFace, glyph.index, FT_LOAD_COLOR );
-          if ( FT_Err_Ok == error )
+          // Check to see if we should be loading a Fixed Size bitmap?
+          if(font.mIsFixedSizeBitmap)
           {
-            glyph.width = font.mFixedWidthPixels;
-            glyph.height = font.mFixedHeightPixels;
-            glyph.advance = font.mFixedWidthPixels;
-            glyph.xBearing = 0.0f;
-            glyph.yBearing = font.mFixedHeightPixels;
+            FT_Select_Size(ftFace, font.mFixedSizeIndex); ///< @todo: needs to be investigated why it's needed to select the size again.
+            int error = FT_Load_Glyph(ftFace, glyph.index, FT_LOAD_COLOR);
+            if(FT_Err_Ok == error)
+            {
+              glyph.width    = font.mFixedWidthPixels;
+              glyph.height   = font.mFixedHeightPixels;
+              glyph.advance  = font.mFixedWidthPixels;
+              glyph.xBearing = 0.0f;
+              glyph.yBearing = font.mFixedHeightPixels;
 
-            // Adjust the metrics if the fixed-size font should be down-scaled
-            const float desiredFixedSize =  static_cast<float>( font.mRequestedPointSize ) * FROM_266 / POINTS_PER_INCH * mDpiVertical;
+              // Adjust the metrics if the fixed-size font should be down-scaled
+              const float desiredFixedSize = static_cast<float>(font.mRequestedPointSize) * FROM_266 / POINTS_PER_INCH * mDpiVertical;
 
-            if( desiredFixedSize > 0.f )
-            {
-              const float scaleFactor = desiredFixedSize / font.mFixedHeightPixels;
+              if(desiredFixedSize > 0.f)
+              {
+                const float scaleFactor = desiredFixedSize / font.mFixedHeightPixels;
 
-              glyph.width = glyph.width * scaleFactor ;
-              glyph.height = glyph.height * scaleFactor;
-              glyph.advance = glyph.advance * scaleFactor;
-              glyph.xBearing = glyph.xBearing * scaleFactor;
-              glyph.yBearing = glyph.yBearing * scaleFactor;
+                glyph.width    = glyph.width * scaleFactor;
+                glyph.height   = glyph.height * scaleFactor;
+                glyph.advance  = glyph.advance * scaleFactor;
+                glyph.xBearing = glyph.xBearing * scaleFactor;
+                glyph.yBearing = glyph.yBearing * scaleFactor;
 
-              glyph.scaleFactor = scaleFactor;
+                glyph.scaleFactor = scaleFactor;
+              }
+            }
+            else
+            {
+              DALI_LOG_INFO(gLogFilter, Debug::General, "FontClient::Plugin::GetBitmapMetrics. FreeType Bitmap Load_Glyph error %d\n", error);
+              success = false;
             }
           }
           else
-          {
-            DALI_LOG_INFO( gLogFilter, Debug::General, "FontClient::Plugin::GetBitmapMetrics. FreeType Bitmap Load_Glyph error %d\n", error );
-            success = false;
-          }
-        }
-        else
 #endif
-        {
-          int error = FT_Load_Glyph( ftFace, glyph.index, FT_LOAD_NO_AUTOHINT );
-
-          if( FT_Err_Ok == error )
           {
-            glyph.width  = static_cast< float >( ftFace->glyph->metrics.width ) * FROM_266;
-            glyph.height = static_cast< float >( ftFace->glyph->metrics.height ) * FROM_266 ;
-            if( horizontal )
+            // FT_LOAD_DEFAULT causes some issues in the alignment of the glyph inside the bitmap.
+            // i.e. with the SNum-3R font.
+            // @todo: add an option to use the FT_LOAD_DEFAULT if required?
+            int error = FT_Load_Glyph(ftFace, glyph.index, FT_LOAD_NO_AUTOHINT);
+
+            // Keep the width of the glyph before doing the software emboldening.
+            // It will be used to calculate a scale factor to be applied to the
+            // advance as Harfbuzz doesn't apply any SW emboldening to calculate
+            // the advance of the glyph.
+            const float width = static_cast<float>(ftFace->glyph->metrics.width) * FROM_266;
+
+            if(FT_Err_Ok == error)
             {
-              glyph.xBearing += static_cast< float >( ftFace->glyph->metrics.horiBearingX ) * FROM_266;
-              glyph.yBearing += static_cast< float >( ftFace->glyph->metrics.horiBearingY ) * FROM_266;
+              const bool isEmboldeningRequired = glyph.isBoldRequired && !(ftFace->style_flags & FT_STYLE_FLAG_BOLD);
+              if(isEmboldeningRequired)
+              {
+                // Does the software bold.
+                FT_GlyphSlot_Embolden(ftFace->glyph);
+              }
+
+              glyph.width  = static_cast<float>(ftFace->glyph->metrics.width) * FROM_266;
+              glyph.height = static_cast<float>(ftFace->glyph->metrics.height) * FROM_266;
+              if(horizontal)
+              {
+                glyph.xBearing += static_cast<float>(ftFace->glyph->metrics.horiBearingX) * FROM_266;
+                glyph.yBearing += static_cast<float>(ftFace->glyph->metrics.horiBearingY) * FROM_266;
+              }
+              else
+              {
+                glyph.xBearing += static_cast<float>(ftFace->glyph->metrics.vertBearingX) * FROM_266;
+                glyph.yBearing += static_cast<float>(ftFace->glyph->metrics.vertBearingY) * FROM_266;
+              }
+
+              if(isEmboldeningRequired && !Dali::EqualsZero(width))
+              {
+                // If the glyph is emboldened by software, the advance is multiplied by a
+                // scale factor to make it slightly bigger.
+                glyph.advance *= (glyph.width / width);
+              }
+
+              // Use the bounding box of the bitmap to correct the metrics.
+              // For some fonts i.e the SNum-3R the metrics need to be corrected,
+              // otherwise the glyphs 'dance' up and down depending on the
+              // font's point size.
+
+              FT_Glyph ftGlyph;
+              error = FT_Get_Glyph(ftFace->glyph, &ftGlyph);
+
+              FT_BBox bbox;
+              FT_Glyph_Get_CBox(ftGlyph, FT_GLYPH_BBOX_GRIDFIT, &bbox);
+
+              const float descender = glyph.height - glyph.yBearing;
+              glyph.height          = (bbox.yMax - bbox.yMin) * FROM_266;
+              glyph.yBearing        = glyph.height - round(descender);
+
+              // Created FT_Glyph object must be released with FT_Done_Glyph
+              FT_Done_Glyph(ftGlyph);
             }
             else
             {
-              glyph.xBearing += static_cast< float >( ftFace->glyph->metrics.vertBearingX ) * FROM_266;
-              glyph.yBearing += static_cast< float >( ftFace->glyph->metrics.vertBearingY ) * FROM_266;
+              success = false;
             }
           }
-          else
-          {
-            success = false;
-          }
+          break;
         }
-        break;
-      }
-      case FontDescription::BITMAP_FONT:
-      {
-        BitmapFontCacheItem& bitmapFontCacheItem = mBitmapFontCache[fontIdCacheItem.id];
-
-        unsigned int index = 0u;
-        for( auto& item : bitmapFontCacheItem.font.glyphs )
+        case FontDescription::BITMAP_FONT:
         {
-          if( item.utf32 == glyph.index )
+          BitmapFontCacheItem& bitmapFontCacheItem = mBitmapFontCache[fontIdCacheItem.id];
+
+          unsigned int index = 0u;
+          for(auto& item : bitmapFontCacheItem.font.glyphs)
           {
-            Devel::PixelBuffer& pixelBuffer = bitmapFontCacheItem.pixelBuffers[index];
-            if( !pixelBuffer )
+            if(item.utf32 == glyph.index)
             {
-              pixelBuffer = LoadImageFromFile( item.url );
-            }
+              Devel::PixelBuffer& pixelBuffer = bitmapFontCacheItem.pixelBuffers[index];
+              if(!pixelBuffer)
+              {
+                pixelBuffer = LoadImageFromFile(item.url);
+              }
 
-            glyph.width  = static_cast< float >( pixelBuffer.GetWidth() );
-            glyph.height = static_cast< float >( pixelBuffer.GetHeight() );
-            glyph.xBearing = 0.f;
-            glyph.yBearing = glyph.height + item.descender;
-            glyph.advance = glyph.width;
-            glyph.scaleFactor = 1.f;
-            break;
+              glyph.width       = static_cast<float>(pixelBuffer.GetWidth());
+              glyph.height      = static_cast<float>(pixelBuffer.GetHeight());
+              glyph.xBearing    = 0.f;
+              glyph.yBearing    = glyph.height + item.descender;
+              glyph.advance     = glyph.width;
+              glyph.scaleFactor = 1.f;
+              break;
+            }
+            ++index;
           }
-          ++index;
-        }
 
-        success = true;
-        break;
-      }
-      default:
-      {
-        DALI_LOG_INFO(gLogFilter, Debug::General, "  Invalid type of font\n");
-      }
+          success = true;
+          break;
+        }
+        default:
+        {
+          DALI_LOG_INFO(gLogFilter, Debug::General, "  Invalid type of font\n");
+        }
       }
     }
     else
     {
       // Check if it's an embedded image.
-      if( ( 0u == glyph.fontId ) && ( 0u != glyph.index ) && ( glyph.index <= mEmbeddedItemCache.Count() ) )
+      if((0u == glyph.fontId) && (0u != glyph.index) && (glyph.index <= mEmbeddedItemCache.Count()))
       {
         const EmbeddedItem& item = mEmbeddedItemCache[glyph.index - 1u];
 
-        glyph.width = static_cast<float>( item.width );
-        glyph.height = static_cast<float>( item.height );
-        glyph.xBearing = 0.f;
-        glyph.yBearing = glyph.height;
-        glyph.advance = glyph.width;
+        glyph.width       = static_cast<float>(item.width);
+        glyph.height      = static_cast<float>(item.height);
+        glyph.xBearing    = 0.f;
+        glyph.yBearing    = glyph.height;
+        glyph.advance     = glyph.width;
         glyph.scaleFactor = 1.f;
       }
       else
@@ -1326,36 +1499,36 @@ bool FontClient::Plugin::GetBitmapMetrics( GlyphInfo* array,
   return success;
 }
 
-bool FontClient::Plugin::GetVectorMetrics( GlyphInfo* array,
-                                           uint32_t size,
-                                           bool horizontal )
+bool FontClient::Plugin::GetVectorMetrics(GlyphInfo* array,
+                                          uint32_t   size,
+                                          bool       horizontal)
 {
 #ifdef ENABLE_VECTOR_BASED_TEXT_RENDERING
-  bool success( true );
+  bool success(true);
 
-  for( unsigned int i = 0u; i < size; ++i )
+  for(unsigned int i = 0u; i < size; ++i)
   {
     FontId fontId = array[i].fontId;
 
-    if( ( fontId > 0u ) &&
-        ( fontId - 1u ) < mFontIdCache.Count() )
+    if((fontId > 0u) &&
+       (fontId - 1u) < mFontIdCache.Count())
     {
       FontFaceCacheItem& font = mFontFaceCache[mFontIdCache[fontId - 1u].id];
 
-      if( ! font.mVectorFontId )
+      if(!font.mVectorFontId)
       {
-        font.mVectorFontId = mVectorFontCache->GetFontId( font.mPath );
+        font.mVectorFontId = mVectorFontCache->GetFontId(font.mPath);
       }
 
-      mVectorFontCache->GetGlyphMetrics( font.mVectorFontId, array[i] );
+      mVectorFontCache->GetGlyphMetrics(font.mVectorFontId, array[i]);
 
       // Vector metrics are in EMs, convert to pixels
-      const float scale = ( static_cast<float>( font.mRequestedPointSize ) * FROM_266 ) * static_cast<float>( mDpiVertical ) / POINTS_PER_INCH;
-      array[i].width    *= scale;
-      array[i].height   *= scale;
+      const float scale = (static_cast<float>(font.mRequestedPointSize) * FROM_266) * static_cast<float>(mDpiVertical) / POINTS_PER_INCH;
+      array[i].width *= scale;
+      array[i].height *= scale;
       array[i].xBearing *= scale;
       array[i].yBearing *= scale;
-      array[i].advance  *= scale;
+      array[i].advance *= scale;
     }
     else
     {
@@ -1369,169 +1542,205 @@ bool FontClient::Plugin::GetVectorMetrics( GlyphInfo* array,
 #endif
 }
 
-void FontClient::Plugin::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, bool isItalicRequired, bool isBoldRequired, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth )
+void FontClient::Plugin::CreateBitmap(FontId fontId, GlyphIndex glyphIndex, bool isItalicRequired, bool isBoldRequired, Dali::TextAbstraction::FontClient::GlyphBufferData& data, int outlineWidth)
 {
   const FontId index = fontId - 1u;
 
-  if( ( fontId > 0u ) &&
-      ( index < mFontIdCache.Count() ) )
+  if((fontId > 0u) &&
+     (index < mFontIdCache.Count()))
   {
     data.isColorBitmap = false;
-    data.isColorEmoji = false;
+    data.isColorEmoji  = false;
 
     const FontIdCacheItem& fontIdCacheItem = mFontIdCache[index];
 
-    switch( fontIdCacheItem.type )
+    switch(fontIdCacheItem.type)
     {
-    case FontDescription::FACE_FONT:
-    {
-      // For the software italics.
-      bool isShearRequired = false;
+      case FontDescription::FACE_FONT:
+      {
+        // For the software italics.
+        bool isShearRequired = false;
 
-      const FontFaceCacheItem& fontFaceCacheItem = mFontFaceCache[fontIdCacheItem.id];
-      FT_Face ftFace = fontFaceCacheItem.mFreeTypeFace;
+        const FontFaceCacheItem& fontFaceCacheItem = mFontFaceCache[fontIdCacheItem.id];
+        FT_Face                  ftFace            = fontFaceCacheItem.mFreeTypeFace;
 
-      FT_Error error;
+        FT_Error error;
 
 #ifdef FREETYPE_BITMAP_SUPPORT
-      // Check to see if this is fixed size bitmap
-      if( fontFaceCacheItem.mIsFixedSizeBitmap )
-      {
-        error = FT_Load_Glyph( ftFace, glyphIndex, FT_LOAD_COLOR );
-      }
-      else
-#endif
-      {
-        error = FT_Load_Glyph( ftFace, glyphIndex, FT_LOAD_NO_AUTOHINT );
-      }
-      if( FT_Err_Ok == error )
-      {
-        if( isBoldRequired && !( ftFace->style_flags & FT_STYLE_FLAG_BOLD ) )
+        // Check to see if this is fixed size bitmap
+        if(fontFaceCacheItem.mIsFixedSizeBitmap)
         {
-          // Does the software bold.
-          FT_GlyphSlot_Embolden( ftFace->glyph );
+          error = FT_Load_Glyph(ftFace, glyphIndex, FT_LOAD_COLOR);
         }
-
-        if( isItalicRequired && !( ftFace->style_flags & FT_STYLE_FLAG_ITALIC ) )
+        else
+#endif
         {
-          // Will do the software italic.
-          isShearRequired = true;
+          // FT_LOAD_DEFAULT causes some issues in the alignment of the glyph inside the bitmap.
+          // i.e. with the SNum-3R font.
+          // @todo: add an option to use the FT_LOAD_DEFAULT if required?
+          error = FT_Load_Glyph(ftFace, glyphIndex, FT_LOAD_NO_AUTOHINT);
         }
+        if(FT_Err_Ok == error)
+        {
+          if(isBoldRequired && !(ftFace->style_flags & FT_STYLE_FLAG_BOLD))
+          {
+            // Does the software bold.
+            FT_GlyphSlot_Embolden(ftFace->glyph);
+          }
 
-        FT_Glyph glyph;
-        error = FT_Get_Glyph( ftFace->glyph, &glyph );
+          if(isItalicRequired && !(ftFace->style_flags & FT_STYLE_FLAG_ITALIC))
+          {
+            // Will do the software italic.
+            isShearRequired = true;
+          }
 
-        // Convert to bitmap if necessary
-        if ( FT_Err_Ok == error )
-        {
-          if( glyph->format != FT_GLYPH_FORMAT_BITMAP )
+          FT_Glyph glyph;
+          error = FT_Get_Glyph(ftFace->glyph, &glyph);
+
+          // Convert to bitmap if necessary
+          if(FT_Err_Ok == error)
           {
-            // Check whether we should create a bitmap for the outline
-            if( glyph->format == FT_GLYPH_FORMAT_OUTLINE && outlineWidth > 0 )
+            if(glyph->format != FT_GLYPH_FORMAT_BITMAP)
             {
-              // Set up a stroker
-              FT_Stroker stroker;
-              error = FT_Stroker_New( mFreeTypeLibrary, &stroker );
+              int  offsetX = 0, offsetY = 0;
+              bool isOutlineGlyph = (glyph->format == FT_GLYPH_FORMAT_OUTLINE && outlineWidth > 0);
 
-              if( FT_Err_Ok == error )
+              // Create a bitmap for the outline
+              if(isOutlineGlyph)
               {
-                FT_Stroker_Set( stroker, outlineWidth * 64, FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0 );
-                error = FT_Glyph_StrokeBorder( &glyph, stroker, 0, 1 );
+                // Retrieve the horizontal and vertical distance from the current pen position to the
+                // left and top border of the glyph bitmap for a normal glyph before applying the outline.
+                if(FT_Err_Ok == error)
+                {
+                  FT_Glyph normalGlyph;
+                  error = FT_Get_Glyph(ftFace->glyph, &normalGlyph);
+
+                  error = FT_Glyph_To_Bitmap(&normalGlyph, FT_RENDER_MODE_NORMAL, 0, 1);
+                  if(FT_Err_Ok == error)
+                  {
+                    FT_BitmapGlyph bitmapGlyph = reinterpret_cast<FT_BitmapGlyph>(normalGlyph);
+
+                    offsetX = bitmapGlyph->left;
+                    offsetY = bitmapGlyph->top;
+                  }
+
+                  // Created FT_Glyph object must be released with FT_Done_Glyph
+                  FT_Done_Glyph(normalGlyph);
+                }
+
+                // Now apply the outline
 
-                if( FT_Err_Ok == error )
+                // Set up a stroker
+                FT_Stroker stroker;
+                error = FT_Stroker_New(mFreeTypeLibrary, &stroker);
+
+                if(FT_Err_Ok == error)
                 {
-                  FT_Stroker_Done( stroker );
+                  FT_Stroker_Set(stroker, outlineWidth * 64, FT_STROKER_LINECAP_ROUND, FT_STROKER_LINEJOIN_ROUND, 0);
+                  error = FT_Glyph_StrokeBorder(&glyph, stroker, 0, 1);
+
+                  if(FT_Err_Ok == error)
+                  {
+                    FT_Stroker_Done(stroker);
+                  }
+                  else
+                  {
+                    DALI_LOG_ERROR("FT_Glyph_StrokeBorder Failed with error: %d\n", error);
+                  }
                 }
                 else
                 {
-                  DALI_LOG_ERROR( "FT_Glyph_StrokeBorder Failed with error: %d\n", error );
+                  DALI_LOG_ERROR("FT_Stroker_New Failed with error: %d\n", error);
                 }
               }
+
+              error = FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, 0, 1);
+              if(FT_Err_Ok == error)
+              {
+                FT_BitmapGlyph bitmapGlyph = reinterpret_cast<FT_BitmapGlyph>(glyph);
+
+                if(isOutlineGlyph)
+                {
+                  // Calculate the additional horizontal and vertical offsets needed for the position of the outline glyph
+                  data.outlineOffsetX = offsetX - bitmapGlyph->left - outlineWidth;
+                  data.outlineOffsetY = bitmapGlyph->top - offsetY - outlineWidth;
+                }
+
+                ConvertBitmap(data, bitmapGlyph->bitmap, isShearRequired);
+              }
               else
               {
-                DALI_LOG_ERROR( "FT_Stroker_New Failed with error: %d\n", error );
+                DALI_LOG_INFO(gLogFilter, Debug::General, "FontClient::Plugin::CreateBitmap. FT_Get_Glyph Failed with error: %d\n", error);
               }
             }
-
-            error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, 0, 1 );
-            if( FT_Err_Ok == error )
-            {
-              FT_BitmapGlyph bitmapGlyph = reinterpret_cast< FT_BitmapGlyph >( glyph );
-              ConvertBitmap( data, bitmapGlyph->bitmap, isShearRequired );
-            }
             else
             {
-              DALI_LOG_INFO( gLogFilter, Debug::General, "FontClient::Plugin::CreateBitmap. FT_Get_Glyph Failed with error: %d\n", error );
+              ConvertBitmap(data, ftFace->glyph->bitmap, isShearRequired);
             }
-          }
-          else
-          {
-            ConvertBitmap( data, ftFace->glyph->bitmap, isShearRequired );
-          }
 
-          data.isColorEmoji = fontFaceCacheItem.mIsFixedSizeBitmap;
+            data.isColorEmoji = fontFaceCacheItem.mIsFixedSizeBitmap;
 
-          // Created FT_Glyph object must be released with FT_Done_Glyph
-          FT_Done_Glyph( glyph );
+            // Created FT_Glyph object must be released with FT_Done_Glyph
+            FT_Done_Glyph(glyph);
+          }
+        }
+        else
+        {
+          DALI_LOG_INFO(gLogFilter, Debug::General, "FontClient::Plugin::CreateBitmap. FT_Load_Glyph Failed with error: %d\n", error);
         }
+        break;
       }
-      else
+      case FontDescription::BITMAP_FONT:
       {
-        DALI_LOG_INFO( gLogFilter, Debug::General, "FontClient::Plugin::CreateBitmap. FT_Load_Glyph Failed with error: %d\n", error );
-      }
-      break;
-    }
-    case FontDescription::BITMAP_FONT:
-    {
-      BitmapFontCacheItem& bitmapFontCacheItem = mBitmapFontCache[fontIdCacheItem.id];
+        BitmapFontCacheItem& bitmapFontCacheItem = mBitmapFontCache[fontIdCacheItem.id];
 
-      unsigned int index = 0u;
-      for( auto& item : bitmapFontCacheItem.font.glyphs )
-      {
-        if( item.utf32 == glyphIndex )
+        unsigned int index = 0u;
+        for(auto& item : bitmapFontCacheItem.font.glyphs)
         {
-          Devel::PixelBuffer& pixelBuffer = bitmapFontCacheItem.pixelBuffers[index];
-          if( !pixelBuffer )
+          if(item.utf32 == glyphIndex)
           {
-            pixelBuffer = LoadImageFromFile( item.url );
-          }
+            Devel::PixelBuffer& pixelBuffer = bitmapFontCacheItem.pixelBuffers[index];
+            if(!pixelBuffer)
+            {
+              pixelBuffer = LoadImageFromFile(item.url);
+            }
 
-          data.width = pixelBuffer.GetWidth();
-          data.height = pixelBuffer.GetHeight();
+            data.width  = pixelBuffer.GetWidth();
+            data.height = pixelBuffer.GetHeight();
 
-          data.isColorBitmap = bitmapFontCacheItem.font.isColorFont;
+            data.isColorBitmap = bitmapFontCacheItem.font.isColorFont;
 
-          ConvertBitmap( data, data.width, data.height, pixelBuffer.GetBuffer() );
+            ConvertBitmap(data, data.width, data.height, pixelBuffer.GetBuffer());
 
-          // Sets the pixel format.
-          data.format = pixelBuffer.GetPixelFormat();
-          break;
+            // Sets the pixel format.
+            data.format = pixelBuffer.GetPixelFormat();
+            break;
+          }
+          ++index;
         }
-        ++index;
+        break;
+      }
+      default:
+      {
+        DALI_LOG_INFO(gLogFilter, Debug::General, "  Invalid type of font\n");
       }
-      break;
-    }
-    default:
-    {
-      DALI_LOG_INFO(gLogFilter, Debug::General, "  Invalid type of font\n");
-    }
     }
   }
   else
   {
-    if( ( 0u != glyphIndex ) && ( glyphIndex <= mEmbeddedItemCache.Count() ) )
+    if((0u != glyphIndex) && (glyphIndex <= mEmbeddedItemCache.Count()))
     {
       // It's an embedded item.
       const EmbeddedItem& item = mEmbeddedItemCache[glyphIndex - 1u];
 
-      data.width = item.width;
+      data.width  = item.width;
       data.height = item.height;
-      if( 0u != item.pixelBufferId )
+      if(0u != item.pixelBufferId)
       {
-        Devel::PixelBuffer pixelBuffer = mPixelBufferCache[item.pixelBufferId-1u].pixelBuffer;
-        if( pixelBuffer )
+        Devel::PixelBuffer pixelBuffer = mPixelBufferCache[item.pixelBufferId - 1u].pixelBuffer;
+        if(pixelBuffer)
         {
-          ConvertBitmap( data, pixelBuffer.GetWidth(), pixelBuffer.GetHeight(), pixelBuffer.GetBuffer() );
+          ConvertBitmap(data, pixelBuffer.GetWidth(), pixelBuffer.GetHeight(), pixelBuffer.GetBuffer());
 
           // Sets the pixel format.
           data.format = pixelBuffer.GetPixelFormat();
@@ -1541,9 +1750,9 @@ void FontClient::Plugin::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, boo
       {
         // Creates the output buffer
         const unsigned int bufferSize = data.width * data.height * 4u;
-        data.buffer = new unsigned char[bufferSize]; // @note The caller is responsible for deallocating the bitmap data using delete[].
+        data.buffer                   = new unsigned char[bufferSize]; // @note The caller is responsible for deallocating the bitmap data using delete[].
 
-        memset( data.buffer, 0u, bufferSize );
+        memset(data.buffer, 0u, bufferSize);
 
         // Just creates a void buffer. Doesn't matter what pixel format is set as is the application code the responsible of filling it.
       }
@@ -1551,139 +1760,139 @@ void FontClient::Plugin::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, boo
   }
 }
 
-PixelData FontClient::Plugin::CreateBitmap( FontId fontId, GlyphIndex glyphIndex, int outlineWidth )
+PixelData FontClient::Plugin::CreateBitmap(FontId fontId, GlyphIndex glyphIndex, int outlineWidth)
 {
   TextAbstraction::FontClient::GlyphBufferData data;
 
-  CreateBitmap( fontId, glyphIndex, false, false, data, outlineWidth );
+  CreateBitmap(fontId, glyphIndex, false, false, data, outlineWidth);
 
-  return PixelData::New( data.buffer,
-                         data.width * data.height * Pixel::GetBytesPerPixel( data.format ),
-                         data.width,
-                         data.height,
-                         data.format,
-                         PixelData::DELETE_ARRAY );
+  return PixelData::New(data.buffer,
+                        data.width * data.height * Pixel::GetBytesPerPixel(data.format),
+                        data.width,
+                        data.height,
+                        data.format,
+                        PixelData::DELETE_ARRAY);
 }
 
-void FontClient::Plugin::CreateVectorBlob( FontId fontId, GlyphIndex glyphIndex, VectorBlob*& blob, unsigned int& blobLength, unsigned int& nominalWidth, unsigned int& nominalHeight )
+void FontClient::Plugin::CreateVectorBlob(FontId fontId, GlyphIndex glyphIndex, VectorBlob*& blob, unsigned int& blobLength, unsigned int& nominalWidth, unsigned int& nominalHeight)
 {
-  blob = nullptr;
+  blob       = nullptr;
   blobLength = 0;
 
 #ifdef ENABLE_VECTOR_BASED_TEXT_RENDERING
-  if( ( fontId > 0u ) &&
-      ( fontId - 1u < mFontIdCache.Count() ) )
+  if((fontId > 0u) &&
+     (fontId - 1u < mFontIdCache.Count()))
   {
-    const FontId fontFaceId = mFontIdCache[fontId - 1u].id;
-    FontFaceCacheItem& font = mFontFaceCache[fontFaceId];
+    const FontId       fontFaceId = mFontIdCache[fontId - 1u].id;
+    FontFaceCacheItem& font       = mFontFaceCache[fontFaceId];
 
-    if( ! font.mVectorFontId )
+    if(!font.mVectorFontId)
     {
-      font.mVectorFontId = mVectorFontCache->GetFontId( font.mPath );
+      font.mVectorFontId = mVectorFontCache->GetFontId(font.mPath);
     }
 
-    mVectorFontCache->GetVectorBlob( font.mVectorFontId, fontFaceId, glyphIndex, blob, blobLength, nominalWidth, nominalHeight );
+    mVectorFontCache->GetVectorBlob(font.mVectorFontId, fontFaceId, glyphIndex, blob, blobLength, nominalWidth, nominalHeight);
   }
 #endif
 }
 
-const GlyphInfo& FontClient::Plugin::GetEllipsisGlyph( PointSize26Dot6 requestedPointSize )
+const GlyphInfo& FontClient::Plugin::GetEllipsisGlyph(PointSize26Dot6 requestedPointSize)
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::GetEllipsisGlyph\n" );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  requestedPointSize %d.\n", requestedPointSize );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::GetEllipsisGlyph\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  requestedPointSize %d.\n", requestedPointSize);
 
   // First look into the cache if there is an ellipsis glyph for the requested point size.
-  for( const auto& item : mEllipsisCache )
+  for(const auto& item : mEllipsisCache)
   {
-    if( item.requestedPointSize != requestedPointSize )
+    if(item.requestedPointSize == requestedPointSize)
     {
       // Use the glyph in the cache.
 
-      DALI_LOG_INFO( gLogFilter, Debug::General, "  glyph id %d found in the cache.\n", item.glyph.index );
-      DALI_LOG_INFO( gLogFilter, Debug::General, "      font %d.\n", item.glyph.fontId );
-      DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::GetEllipsisGlyph\n" );
+      DALI_LOG_INFO(gLogFilter, Debug::General, "  glyph id %d found in the cache.\n", item.glyph.index);
+      DALI_LOG_INFO(gLogFilter, Debug::General, "      font %d.\n", item.glyph.fontId);
+      DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::GetEllipsisGlyph\n");
 
       return item.glyph;
     }
   }
 
   // No glyph has been found. Create one.
-  mEllipsisCache.PushBack( EllipsisItem() );
-  EllipsisItem& item = *( mEllipsisCache.End() - 1u );
+  mEllipsisCache.PushBack(EllipsisItem());
+  EllipsisItem& item = *(mEllipsisCache.End() - 1u);
 
   item.requestedPointSize = requestedPointSize;
 
   // Find a font for the ellipsis glyph.
-  item.glyph.fontId = FindDefaultFont( ELLIPSIS_CHARACTER,
-                                       requestedPointSize,
-                                       false );
+  item.glyph.fontId = FindDefaultFont(ELLIPSIS_CHARACTER,
+                                      requestedPointSize,
+                                      false);
 
   // Set the character index to access the glyph inside the font.
-  item.glyph.index = FT_Get_Char_Index( mFontFaceCache[mFontIdCache[item.glyph.fontId-1u].id].mFreeTypeFace,
-                                        ELLIPSIS_CHARACTER );
+  item.glyph.index = FT_Get_Char_Index(mFontFaceCache[mFontIdCache[item.glyph.fontId - 1u].id].mFreeTypeFace,
+                                       ELLIPSIS_CHARACTER);
 
-  GetBitmapMetrics( &item.glyph, 1u, true );
+  GetBitmapMetrics(&item.glyph, 1u, true);
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  glyph id %d found in the cache.\n", item.glyph.index );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "      font %d.\n", item.glyph.fontId );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::GetEllipsisGlyph\n" );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  glyph id %d found in the cache.\n", item.glyph.index);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "      font %d.\n", item.glyph.fontId);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::GetEllipsisGlyph\n");
 
   return item.glyph;
 }
 
-bool FontClient::Plugin::IsColorGlyph( FontId fontId, GlyphIndex glyphIndex )
+bool FontClient::Plugin::IsColorGlyph(FontId fontId, GlyphIndex glyphIndex)
 {
   FT_Error error = -1;
 
   const FontId index = fontId - 1u;
 
-  if( ( fontId > 0u ) &&
-      ( index < mFontIdCache.Count() ) )
+  if((fontId > 0u) &&
+     (index < mFontIdCache.Count()))
   {
     const FontIdCacheItem& fontIdCacheItem = mFontIdCache[index];
 
-    switch( fontIdCacheItem.type )
-    {
-    case FontDescription::FACE_FONT:
+    switch(fontIdCacheItem.type)
     {
+      case FontDescription::FACE_FONT:
+      {
 #ifdef FREETYPE_BITMAP_SUPPORT
-      const FontFaceCacheItem& item = mFontFaceCache[fontIdCacheItem.id];
-      FT_Face ftFace = item.mFreeTypeFace;
+        const FontFaceCacheItem& item   = mFontFaceCache[fontIdCacheItem.id];
+        FT_Face                  ftFace = item.mFreeTypeFace;
 
-      // Check to see if this is fixed size bitmap
-      if( item.mHasColorTables )
+        // Check to see if this is fixed size bitmap
+        if(item.mHasColorTables)
+        {
+          error = FT_Load_Glyph(ftFace, glyphIndex, FT_LOAD_COLOR);
+        }
+#endif
+        break;
+      }
+      case FontDescription::BITMAP_FONT:
       {
-        error = FT_Load_Glyph( ftFace, glyphIndex, FT_LOAD_COLOR );
+        error = FT_Err_Ok; // Will return true;
+        break;
+      }
+      default:
+      {
+        DALI_LOG_INFO(gLogFilter, Debug::General, "  Invalid type of font\n");
       }
-#endif
-      break;
-    }
-    case FontDescription::BITMAP_FONT:
-    {
-      error = FT_Err_Ok; // Will return true;
-      break;
-    }
-    default:
-    {
-      DALI_LOG_INFO(gLogFilter, Debug::General, "  Invalid type of font\n");
-    }
     }
   }
 
   return FT_Err_Ok == error;
 }
 
-FT_FaceRec_* FontClient::Plugin::GetFreetypeFace( FontId fontId )
+FT_FaceRec_* FontClient::Plugin::GetFreetypeFace(FontId fontId)
 {
   FT_Face fontFace = nullptr;
 
   const FontId index = fontId - 1u;
-  if( ( fontId > 0u ) &&
-      ( index < mFontIdCache.Count() ) )
+  if((fontId > 0u) &&
+     (index < mFontIdCache.Count()))
   {
     const FontIdCacheItem& fontIdCacheItem = mFontIdCache[index];
 
-    if( FontDescription::FACE_FONT == fontIdCacheItem.type )
+    if(FontDescription::FACE_FONT == fontIdCacheItem.type)
     {
       fontFace = mFontFaceCache[fontIdCacheItem.id].mFreeTypeFace;
     }
@@ -1691,42 +1900,42 @@ FT_FaceRec_* FontClient::Plugin::GetFreetypeFace( FontId fontId )
   return fontFace;
 }
 
-FontDescription::Type FontClient::Plugin::GetFontType( FontId fontId )
+FontDescription::Type FontClient::Plugin::GetFontType(FontId fontId)
 {
   const FontId index = fontId - 1u;
-  if( ( fontId > 0u ) &&
-      ( index < mFontIdCache.Count() ) )
+  if((fontId > 0u) &&
+     (index < mFontIdCache.Count()))
   {
     return mFontIdCache[index].type;
   }
   return FontDescription::INVALID;
 }
 
-bool FontClient::Plugin::AddCustomFontDirectory( const FontPath& path )
+bool FontClient::Plugin::AddCustomFontDirectory(const FontPath& path)
 {
   // nullptr as first parameter means the current configuration is used.
-  return FcConfigAppFontAddDir( nullptr, reinterpret_cast<const FcChar8 *>( path.c_str() ) );
+  return FcConfigAppFontAddDir(nullptr, reinterpret_cast<const FcChar8*>(path.c_str()));
 }
 
-GlyphIndex FontClient::Plugin::CreateEmbeddedItem( const TextAbstraction::FontClient::EmbeddedItemDescription& description, Pixel::Format& pixelFormat )
+GlyphIndex FontClient::Plugin::CreateEmbeddedItem(const TextAbstraction::FontClient::EmbeddedItemDescription& description, Pixel::Format& pixelFormat)
 {
   EmbeddedItem embeddedItem;
 
   embeddedItem.pixelBufferId = 0u;
-  embeddedItem.width = description.width;
-  embeddedItem.height = description.height;
+  embeddedItem.width         = description.width;
+  embeddedItem.height        = description.height;
 
   pixelFormat = Pixel::A8;
 
-  if( !description.url.empty() )
+  if(!description.url.empty())
   {
     // Check if the url is in the cache.
     PixelBufferId index = 0u;
 
-    for( const auto& cacheItem : mPixelBufferCache )
+    for(const auto& cacheItem : mPixelBufferCache)
     {
       ++index;
-      if( cacheItem.url == description.url )
+      if(cacheItem.url == description.url)
       {
         // The url is in the pixel buffer cache.
         // Set the index +1 to the vector.
@@ -1736,20 +1945,20 @@ GlyphIndex FontClient::Plugin::CreateEmbeddedItem( const TextAbstraction::FontCl
     }
 
     Devel::PixelBuffer pixelBuffer;
-    if( 0u == embeddedItem.pixelBufferId )
+    if(0u == embeddedItem.pixelBufferId)
     {
       // The pixel buffer is not in the cache. Create one and cache it.
 
       // Load the image from the url.
-      pixelBuffer = LoadImageFromFile( description.url );
+      pixelBuffer = LoadImageFromFile(description.url);
 
       // Create the cache item.
       PixelBufferCacheItem pixelBufferCacheItem;
       pixelBufferCacheItem.pixelBuffer = pixelBuffer;
-      pixelBufferCacheItem.url = description.url;
+      pixelBufferCacheItem.url         = description.url;
 
       // Store the cache item in the cache.
-      mPixelBufferCache.push_back( std::move( pixelBufferCacheItem ) );
+      mPixelBufferCache.push_back(std::move(pixelBufferCacheItem));
 
       // Set the pixel buffer id to the embedded item.
       embeddedItem.pixelBufferId = mPixelBufferCache.size();
@@ -1757,20 +1966,20 @@ GlyphIndex FontClient::Plugin::CreateEmbeddedItem( const TextAbstraction::FontCl
     else
     {
       // Retrieve the pixel buffer from the cache to set the pixel format.
-      pixelBuffer = mPixelBufferCache[embeddedItem.pixelBufferId-1u].pixelBuffer;
+      pixelBuffer = mPixelBufferCache[embeddedItem.pixelBufferId - 1u].pixelBuffer;
     }
 
-    if( pixelBuffer )
+    if(pixelBuffer)
     {
       // Set the size of the embedded item if it has not been set.
-      if( 0u == embeddedItem.width )
+      if(0u == embeddedItem.width)
       {
-        embeddedItem.width = static_cast<unsigned int>( pixelBuffer.GetWidth() );
+        embeddedItem.width = static_cast<unsigned int>(pixelBuffer.GetWidth());
       }
 
-      if( 0u == embeddedItem.height )
+      if(0u == embeddedItem.height)
       {
-        embeddedItem.height = static_cast<unsigned int>( pixelBuffer.GetHeight() );
+        embeddedItem.height = static_cast<unsigned int>(pixelBuffer.GetHeight());
       }
 
       // Set the pixel format.
@@ -1780,169 +1989,217 @@ GlyphIndex FontClient::Plugin::CreateEmbeddedItem( const TextAbstraction::FontCl
 
   // Find if the same embeddedItem has already been created.
   unsigned int index = 0u;
-  for( const auto& item : mEmbeddedItemCache )
+  for(const auto& item : mEmbeddedItemCache)
   {
     ++index;
-    if( ( item.pixelBufferId == embeddedItem.pixelBufferId ) &&
-        ( item.width == embeddedItem.width ) &&
-        ( item.height == embeddedItem.height ) )
+    if((item.pixelBufferId == embeddedItem.pixelBufferId) &&
+       (item.width == embeddedItem.width) &&
+       (item.height == embeddedItem.height))
     {
       return index;
     }
   }
 
   // Cache the embedded item.
-  mEmbeddedItemCache.PushBack( embeddedItem );
+  mEmbeddedItemCache.PushBack(embeddedItem);
 
   return mEmbeddedItemCache.Count();
 }
+//SHS
+
+void FontClient::Plugin::EnableAtlasLimitation(bool enabled)
+{
+  mIsAtlasLimitationEnabled = enabled;
+}
+
+bool FontClient::Plugin::IsAtlasLimitationEnabled() const
+{
+  return mIsAtlasLimitationEnabled;
+}
+
+Size FontClient::Plugin::GetMaximumTextAtlasSize() const
+{
+  return TextAbstraction::FontClient::MAX_TEXT_ATLAS_SIZE;
+}
+
+Size FontClient::Plugin::GetDefaultTextAtlasSize() const
+{
+  return TextAbstraction::FontClient::DEFAULT_TEXT_ATLAS_SIZE;
+}
+
+Size FontClient::Plugin::GetCurrentMaximumBlockSizeFitInAtlas() const
+{
+  return mCurrentMaximumBlockSizeFitInAtlas;
+}
+
+bool FontClient::Plugin::SetCurrentMaximumBlockSizeFitInAtlas(const Size& currentMaximumBlockSizeFitInAtlas)
+{
+  bool            isChanged        = false;
+  const Size&     maxTextAtlasSize = TextAbstraction::FontClient::MAX_TEXT_ATLAS_SIZE;
+  const uint16_t& padding          = TextAbstraction::FontClient::PADDING_TEXT_ATLAS_BLOCK;
+
+  if(currentMaximumBlockSizeFitInAtlas.width <= maxTextAtlasSize.width - padding
+      && currentMaximumBlockSizeFitInAtlas.height <= maxTextAtlasSize.height - padding)
+  {
+    mCurrentMaximumBlockSizeFitInAtlas = currentMaximumBlockSizeFitInAtlas;
+    isChanged = true;
+  }
+
+  return isChanged;
+}
+
+uint32_t FontClient::Plugin::GetNumberOfPointsPerOneUnitOfPointSize() const
+{
+  return TextAbstraction::FontClient::NUMBER_OF_POINTS_PER_ONE_UNIT_OF_POINT_SIZE;;
+}
+
 
 void FontClient::Plugin::InitSystemFonts()
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::InitSystemFonts\n" );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::InitSystemFonts\n");
 
   FcFontSet* fontSet = GetFcFontSet(); // Creates a FcFontSet that needs to be destroyed by calling FcFontSetDestroy.
 
-  if( fontSet )
+  if(fontSet)
   {
-    DALI_LOG_INFO( gLogFilter, Debug::General, "  number of system fonts : %d\n", fontSet->nfont );
+    DALI_LOG_INFO(gLogFilter, Debug::General, "  number of system fonts : %d\n", fontSet->nfont);
 
     // Reserve some space to avoid reallocations.
-    mSystemFonts.reserve( fontSet->nfont );
+    mSystemFonts.reserve(fontSet->nfont);
 
-    for( int i = 0u; i < fontSet->nfont; ++i )
+    for(int i = 0u; i < fontSet->nfont; ++i)
     {
       FcPattern* fontPattern = fontSet->fonts[i];
 
       FontPath path;
 
       // Skip fonts with no path
-      if( GetFcString( fontPattern, FC_FILE, path ) )
+      if(GetFcString(fontPattern, FC_FILE, path))
       {
-        mSystemFonts.push_back( FontDescription() );
+        mSystemFonts.push_back(FontDescription());
         FontDescription& fontDescription = mSystemFonts.back();
 
-        fontDescription.path = std::move( path );
+        fontDescription.path = std::move(path);
 
-        int width = 0;
+        int width  = 0;
         int weight = 0;
-        int slant = 0;
-        GetFcString( fontPattern, FC_FAMILY, fontDescription.family );
-        GetFcInt( fontPattern, FC_WIDTH, width );
-        GetFcInt( fontPattern, FC_WEIGHT, weight );
-        GetFcInt( fontPattern, FC_SLANT, slant );
-        fontDescription.width = IntToWidthType( width );
-        fontDescription.weight = IntToWeightType( weight );
-        fontDescription.slant = IntToSlantType( slant );
-
-        DALI_LOG_INFO( gLogFilter, Debug::Verbose, "  description; family : [%s]\n", fontDescription.family.c_str() );
-        DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                 path : [%s]\n", fontDescription.path.c_str() );
-        DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[fontDescription.width] );
-        DALI_LOG_INFO( gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[fontDescription.weight] );
-        DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[fontDescription.slant] );
+        int slant  = 0;
+        GetFcString(fontPattern, FC_FAMILY, fontDescription.family);
+        GetFcInt(fontPattern, FC_WIDTH, width);
+        GetFcInt(fontPattern, FC_WEIGHT, weight);
+        GetFcInt(fontPattern, FC_SLANT, slant);
+        fontDescription.width  = IntToWidthType(width);
+        fontDescription.weight = IntToWeightType(weight);
+        fontDescription.slant  = IntToSlantType(slant);
+
+        DALI_LOG_INFO(gLogFilter, Debug::Verbose, "  description; family : [%s]\n", fontDescription.family.c_str());
+        DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                 path : [%s]\n", fontDescription.path.c_str());
+        DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[fontDescription.width]);
+        DALI_LOG_INFO(gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[fontDescription.weight]);
+        DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[fontDescription.slant]);
       }
     }
 
     // Destroys the font set created.
-    FcFontSetDestroy( fontSet );
+    FcFontSetDestroy(fontSet);
   }
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::InitSystemFonts\n" );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::InitSystemFonts\n");
 }
 
-bool FontClient::Plugin::MatchFontDescriptionToPattern( FcPattern* pattern, Dali::TextAbstraction::FontDescription& fontDescription, FcCharSet** characterSet )
+bool FontClient::Plugin::MatchFontDescriptionToPattern(FcPattern* pattern, Dali::TextAbstraction::FontDescription& fontDescription, FcCharSet** characterSet)
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::MatchFontDescriptionToPattern\n" );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::MatchFontDescriptionToPattern\n");
 
-  FcResult result = FcResultMatch;
-  FcPattern* match = FcFontMatch( nullptr /* use default configure */, pattern, &result ); // Creates a new font pattern that needs to be destroyed by calling FcPatternDestroy.
+  FcResult   result = FcResultMatch;
+  FcPattern* match  = FcFontMatch(nullptr /* use default configure */, pattern, &result); // Creates a new font pattern that needs to be destroyed by calling FcPatternDestroy.
 
   const bool matched = nullptr != match;
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  pattern matched : %s\n", ( matched ? "true" : "false" ) );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  pattern matched : %s\n", (matched ? "true" : "false"));
 
-  if( matched )
+  if(matched)
   {
-    int width = 0;
+    int width  = 0;
     int weight = 0;
-    int slant = 0;
-    GetFcString( match, FC_FILE, fontDescription.path );
-    GetFcString( match, FC_FAMILY, fontDescription.family );
-    GetFcInt( match, FC_WIDTH, width );
-    GetFcInt( match, FC_WEIGHT, weight );
-    GetFcInt( match, FC_SLANT, slant );
-    fontDescription.width = IntToWidthType( width );
-    fontDescription.weight = IntToWeightType( weight );
-    fontDescription.slant = IntToSlantType( slant );
+    int slant  = 0;
+    GetFcString(match, FC_FILE, fontDescription.path);
+    GetFcString(match, FC_FAMILY, fontDescription.family);
+    GetFcInt(match, FC_WIDTH, width);
+    GetFcInt(match, FC_WEIGHT, weight);
+    GetFcInt(match, FC_SLANT, slant);
+    fontDescription.width  = IntToWidthType(width);
+    fontDescription.weight = IntToWeightType(weight);
+    fontDescription.slant  = IntToSlantType(slant);
 
     // Retrieve the character set and increase the reference counter.
-    FcPatternGetCharSet( match, FC_CHARSET, 0u, characterSet );
-    *characterSet = FcCharSetCopy( *characterSet );
+    FcPatternGetCharSet(match, FC_CHARSET, 0u, characterSet);
+    *characterSet = FcCharSetCopy(*characterSet);
 
     // destroyed the matched pattern
-    FcPatternDestroy( match );
+    FcPatternDestroy(match);
 
-    DALI_LOG_INFO( gLogFilter, Debug::General, "  description; family : [%s]\n", fontDescription.family.c_str() );
-    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                 path : [%s]\n", fontDescription.path.c_str() );
-    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[fontDescription.width] );
-    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[fontDescription.weight] );
-    DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[fontDescription.slant] );
+    DALI_LOG_INFO(gLogFilter, Debug::General, "  description; family : [%s]\n", fontDescription.family.c_str());
+    DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                 path : [%s]\n", fontDescription.path.c_str());
+    DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[fontDescription.width]);
+    DALI_LOG_INFO(gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[fontDescription.weight]);
+    DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[fontDescription.slant]);
   }
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::MatchFontDescriptionToPattern\n" );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::MatchFontDescriptionToPattern\n");
   return matched;
 }
 
-FcPattern* FontClient::Plugin::CreateFontFamilyPattern( const FontDescription& fontDescription ) const
+FcPattern* FontClient::Plugin::CreateFontFamilyPattern(const FontDescription& fontDescription) const
 {
   // create the cached font family lookup pattern
   // a pattern holds a set of names, each name refers to a property of the font
   FcPattern* fontFamilyPattern = FcPatternCreate(); // FcPatternCreate creates a new pattern that needs to be destroyed by calling FcPatternDestroy.
 
-  if( !fontFamilyPattern )
+  if(!fontFamilyPattern)
   {
     return nullptr;
   }
 
   // add a property to the pattern for the font family
-  FcPatternAddString( fontFamilyPattern, FC_FAMILY, reinterpret_cast<const FcChar8*>( fontDescription.family.c_str() ) );
+  FcPatternAddString(fontFamilyPattern, FC_FAMILY, reinterpret_cast<const FcChar8*>(fontDescription.family.c_str()));
 
   // add a property to the pattern for local setting.
-  const char* locale = setlocale( LC_MESSAGES, nullptr );
-  if( locale != nullptr)
+  const char* locale = setlocale(LC_MESSAGES, nullptr);
+  if(locale != nullptr)
   {
-    FcPatternAddString( fontFamilyPattern, FC_LANG, reinterpret_cast<const FcChar8*>( locale ) );
+    FcPatternAddString(fontFamilyPattern, FC_LANG, reinterpret_cast<const FcChar8*>(locale));
   }
 
   int width = FONT_WIDTH_TYPE_TO_INT[fontDescription.width];
-  if( width < 0 )
+  if(width < 0)
   {
     // Use default.
     width = DEFAULT_FONT_WIDTH;
   }
 
   int weight = FONT_WEIGHT_TYPE_TO_INT[fontDescription.weight];
-  if( weight < 0 )
+  if(weight < 0)
   {
     // Use default.
     weight = DEFAULT_FONT_WEIGHT;
   }
 
   int slant = FONT_SLANT_TYPE_TO_INT[fontDescription.slant];
-  if( slant < 0 )
+  if(slant < 0)
   {
     // Use default.
     slant = DEFAULT_FONT_SLANT;
   }
 
-  FcPatternAddInteger( fontFamilyPattern, FC_WIDTH, width );
-  FcPatternAddInteger( fontFamilyPattern, FC_WEIGHT, weight );
-  FcPatternAddInteger( fontFamilyPattern, FC_SLANT, slant );
+  FcPatternAddInteger(fontFamilyPattern, FC_WIDTH, width);
+  FcPatternAddInteger(fontFamilyPattern, FC_WEIGHT, weight);
+  FcPatternAddInteger(fontFamilyPattern, FC_SLANT, slant);
 
   // modify the config, with the mFontFamilyPatterm
-  FcConfigSubstitute( nullptr /* use default configure */, fontFamilyPattern, FcMatchPattern );
+  FcConfigSubstitute(nullptr /* use default configure */, fontFamilyPattern, FcMatchPattern);
 
   // provide default values for unspecified properties in the font pattern
   // e.g. patterns without a specified style or weight are set to Medium
-  FcDefaultSubstitute( fontFamilyPattern );
+  FcDefaultSubstitute(fontFamilyPattern);
 
   return fontFamilyPattern;
 }
@@ -1955,46 +2212,46 @@ _FcFontSet* FontClient::Plugin::GetFcFontSet() const
   // a pattern holds a set of names, each name refers to a property of the font
   FcPattern* pattern = FcPatternCreate();
 
-  if( nullptr != pattern )
+  if(nullptr != pattern)
   {
     // create an object set used to define which properties are to be returned in the patterns from FcFontList.
     FcObjectSet* objectSet = FcObjectSetCreate();
 
-    if( nullptr != objectSet )
+    if(nullptr != objectSet)
     {
       // build an object set from a list of property names
-      FcObjectSetAdd( objectSet, FC_FILE );
-      FcObjectSetAdd( objectSet, FC_FAMILY );
-      FcObjectSetAdd( objectSet, FC_WIDTH );
-      FcObjectSetAdd( objectSet, FC_WEIGHT );
-      FcObjectSetAdd( objectSet, FC_SLANT );
+      FcObjectSetAdd(objectSet, FC_FILE);
+      FcObjectSetAdd(objectSet, FC_FAMILY);
+      FcObjectSetAdd(objectSet, FC_WIDTH);
+      FcObjectSetAdd(objectSet, FC_WEIGHT);
+      FcObjectSetAdd(objectSet, FC_SLANT);
 
       // get a list of fonts
       // creates patterns from those fonts containing only the objects in objectSet and returns the set of unique such patterns
-      fontset = FcFontList( nullptr /* the default configuration is checked to be up to date, and used */, pattern, objectSet ); // Creates a FcFontSet that needs to be destroyed by calling FcFontSetDestroy.
+      fontset = FcFontList(nullptr /* the default configuration is checked to be up to date, and used */, pattern, objectSet); // Creates a FcFontSet that needs to be destroyed by calling FcFontSetDestroy.
 
       // clear up the object set
-      FcObjectSetDestroy( objectSet );
+      FcObjectSetDestroy(objectSet);
     }
 
     // clear up the pattern
-    FcPatternDestroy( pattern );
+    FcPatternDestroy(pattern);
   }
 
   return fontset;
 }
 
-bool FontClient::Plugin::GetFcString( const FcPattern* const pattern,
-                                      const char* const n,
-                                      std::string& string )
+bool FontClient::Plugin::GetFcString(const FcPattern* const pattern,
+                                     const char* const      n,
+                                     std::string&           string)
 {
-  FcChar8* file = nullptr;
-  const FcResult retVal = FcPatternGetString( pattern, n, 0u, &file );
+  FcChar8*       file   = nullptr;
+  const FcResult retVal = FcPatternGetString(pattern, n, 0u, &file);
 
-  if( FcResultMatch == retVal )
+  if(FcResultMatch == retVal)
   {
     // Have to use reinterpret_cast because FcChar8 is unsigned char*, not a const char*.
-    string.assign( reinterpret_cast<const char*>( file ) );
+    string.assign(reinterpret_cast<const char*>(file));
 
     return true;
   }
@@ -2002,11 +2259,11 @@ bool FontClient::Plugin::GetFcString( const FcPattern* const pattern,
   return false;
 }
 
-bool FontClient::Plugin::GetFcInt( const _FcPattern* const pattern, const char* const n, int& intVal )
+bool FontClient::Plugin::GetFcInt(const _FcPattern* const pattern, const char* const n, int& intVal)
 {
-  const FcResult retVal = FcPatternGetInteger( pattern, n, 0u, &intVal );
+  const FcResult retVal = FcPatternGetInteger(pattern, n, 0u, &intVal);
 
-  if( FcResultMatch == retVal )
+  if(FcResultMatch == retVal)
   {
     return true;
   }
@@ -2014,82 +2271,82 @@ bool FontClient::Plugin::GetFcInt( const _FcPattern* const pattern, const char*
   return false;
 }
 
-FontId FontClient::Plugin::CreateFont( const FontPath& path,
-                                       PointSize26Dot6 requestedPointSize,
-                                       FaceIndex faceIndex,
-                                       bool cacheDescription )
+FontId FontClient::Plugin::CreateFont(const FontPath& path,
+                                      PointSize26Dot6 requestedPointSize,
+                                      FaceIndex       faceIndex,
+                                      bool            cacheDescription)
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::CreateFont\n" );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "                path : [%s]\n", path.c_str() );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  requestedPointSize : %d\n", requestedPointSize );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::CreateFont\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "                path : [%s]\n", path.c_str());
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  requestedPointSize : %d\n", requestedPointSize);
 
   FontId id = 0u;
 
   // Create & cache new font face
   FT_Face ftFace;
-  int error = FT_New_Face( mFreeTypeLibrary,
-                           path.c_str(),
-                           0,
-                           &ftFace );
+  int     error = FT_New_Face(mFreeTypeLibrary,
+                          path.c_str(),
+                          0,
+                          &ftFace);
 
-  if( FT_Err_Ok == error )
+  if(FT_Err_Ok == error)
   {
     // Check if a font is scalable.
-    const bool isScalable = ( 0 != ( ftFace->face_flags & FT_FACE_FLAG_SCALABLE ) );
-    const bool hasFixedSizedBitmaps = ( 0 != ( ftFace->face_flags & FT_FACE_FLAG_FIXED_SIZES ) ) && ( 0 != ftFace->num_fixed_sizes );
-    const bool hasColorTables = ( 0 != ( ftFace->face_flags & FT_FACE_FLAG_COLOR ) );
-    FontId fontFaceId = 0u;
+    const bool isScalable           = (0 != (ftFace->face_flags & FT_FACE_FLAG_SCALABLE));
+    const bool hasFixedSizedBitmaps = (0 != (ftFace->face_flags & FT_FACE_FLAG_FIXED_SIZES)) && (0 != ftFace->num_fixed_sizes);
+    const bool hasColorTables       = (0 != (ftFace->face_flags & FT_FACE_FLAG_COLOR));
+    FontId     fontFaceId           = 0u;
 
-    DALI_LOG_INFO( gLogFilter, Debug::General, "            isScalable : [%s]\n", ( isScalable ? "true" : "false" ) );
-    DALI_LOG_INFO( gLogFilter, Debug::General, "  hasFixedSizedBitmaps : [%s]\n", ( hasFixedSizedBitmaps ? "true" : "false" ) );
-    DALI_LOG_INFO( gLogFilter, Debug::General, "        hasColorTables : [%s]\n", ( hasColorTables ? "true" : "false" ) );
+    DALI_LOG_INFO(gLogFilter, Debug::General, "            isScalable : [%s]\n", (isScalable ? "true" : "false"));
+    DALI_LOG_INFO(gLogFilter, Debug::General, "  hasFixedSizedBitmaps : [%s]\n", (hasFixedSizedBitmaps ? "true" : "false"));
+    DALI_LOG_INFO(gLogFilter, Debug::General, "        hasColorTables : [%s]\n", (hasColorTables ? "true" : "false"));
 
     // Check to see if the font contains fixed sizes?
-    if( !isScalable && hasFixedSizedBitmaps )
+    if(!isScalable && hasFixedSizedBitmaps)
     {
       PointSize26Dot6 actualPointSize = 0u;
-      int fixedSizeIndex = 0;
-      for( ; fixedSizeIndex < ftFace->num_fixed_sizes; ++fixedSizeIndex )
+      int             fixedSizeIndex  = 0;
+      for(; fixedSizeIndex < ftFace->num_fixed_sizes; ++fixedSizeIndex)
       {
         const PointSize26Dot6 fixedSize = ftFace->available_sizes[fixedSizeIndex].size;
-        DALI_LOG_INFO( gLogFilter, Debug::Verbose, "  size index : %d, size : %d\n", fixedSizeIndex, fixedSize );
+        DALI_LOG_INFO(gLogFilter, Debug::Verbose, "  size index : %d, size : %d\n", fixedSizeIndex, fixedSize);
 
-        if( fixedSize >= requestedPointSize )
+        if(fixedSize >= requestedPointSize)
         {
           actualPointSize = fixedSize;
           break;
         }
       }
 
-      if( 0u == actualPointSize )
+      if(0u == actualPointSize)
       {
         // The requested point size is bigger than the bigest fixed size.
-        fixedSizeIndex = ftFace->num_fixed_sizes - 1;
+        fixedSizeIndex  = ftFace->num_fixed_sizes - 1;
         actualPointSize = ftFace->available_sizes[fixedSizeIndex].size;
       }
 
-      DALI_LOG_INFO( gLogFilter, Debug::Verbose, "  size index : %d, actual size : %d\n", fixedSizeIndex, actualPointSize );
+      DALI_LOG_INFO(gLogFilter, Debug::Verbose, "  size index : %d, actual size : %d\n", fixedSizeIndex, actualPointSize);
 
       // Tell Freetype to use this size
-      error = FT_Select_Size( ftFace, fixedSizeIndex );
-      if ( FT_Err_Ok != error )
+      error = FT_Select_Size(ftFace, fixedSizeIndex);
+      if(FT_Err_Ok != error)
       {
-        DALI_LOG_INFO( gLogFilter, Debug::General, "FreeType Select_Size error: %d\n", error );
+        DALI_LOG_INFO(gLogFilter, Debug::General, "FreeType Select_Size error: %d\n", error);
       }
       else
       {
-        const float fixedWidth  = static_cast<float>( ftFace->available_sizes[ fixedSizeIndex ].width );
-        const float fixedHeight = static_cast<float>( ftFace->available_sizes[ fixedSizeIndex ].height );
+        const float fixedWidth  = static_cast<float>(ftFace->available_sizes[fixedSizeIndex].width);
+        const float fixedHeight = static_cast<float>(ftFace->available_sizes[fixedSizeIndex].height);
 
         // Indicate that the font is a fixed sized bitmap
-        FontMetrics metrics( fixedHeight, // The ascender in pixels.
-                             0.0f,
-                             fixedHeight, // The height in pixels.
-                             0.0f,
-                             0.0f );
+        FontMetrics metrics(fixedHeight, // The ascender in pixels.
+                            0.0f,
+                            fixedHeight, // The height in pixels.
+                            0.0f,
+                            0.0f);
 
         // Create the FreeType font face item to cache.
-        FontFaceCacheItem fontFaceCacheItem( ftFace, path, requestedPointSize, faceIndex, metrics, fixedSizeIndex, fixedWidth, fixedHeight, hasColorTables );
+        FontFaceCacheItem fontFaceCacheItem(ftFace, path, requestedPointSize, faceIndex, metrics, fixedSizeIndex, fixedWidth, fixedHeight, hasColorTables);
 
         // Set the index to the font's id cache.
         fontFaceCacheItem.mFontId = mFontIdCache.Count();
@@ -2100,11 +2357,11 @@ FontId FontClient::Plugin::CreateFont( const FontPath& path,
 
         // Set the index to the FreeType font face cache.
         fontIdCacheItem.id = mFontFaceCache.size();
-        fontFaceId = fontIdCacheItem.id + 1u;
+        fontFaceId         = fontIdCacheItem.id + 1u;
 
         // Cache the items.
-        mFontFaceCache.push_back( fontFaceCacheItem );
-        mFontIdCache.PushBack( fontIdCacheItem );
+        mFontFaceCache.push_back(fontFaceCacheItem);
+        mFontIdCache.PushBack(fontIdCacheItem);
 
         // Set the font id to be returned.
         id = mFontIdCache.Count();
@@ -2112,25 +2369,42 @@ FontId FontClient::Plugin::CreateFont( const FontPath& path,
     }
     else
     {
-      error = FT_Set_Char_Size( ftFace,
-                                0,
-                                requestedPointSize,
-                                mDpiHorizontal,
-                                mDpiVertical );
-
-      if( FT_Err_Ok == error )
+      if(mIsAtlasLimitationEnabled)
+      {
+        //There is limitation on block size to fit in predefined atlas size.
+        //If the block size cannot fit into atlas size, then the system cannot draw block.
+        //This is workaround to avoid issue in advance
+        //Decrementing point-size until arriving to maximum allowed block size.
+        auto requestedPointSizeBackup= requestedPointSize;
+        const Size& maxSizeFitInAtlas = GetCurrentMaximumBlockSizeFitInAtlas();
+        error = SearchOnProperPointSize(ftFace, mDpiHorizontal, mDpiVertical, maxSizeFitInAtlas, requestedPointSize);
+
+        if(requestedPointSize != requestedPointSizeBackup)
+        {
+          DALI_LOG_WARNING(" The requested-point-size : %d, is reduced to point-size : %d\n", requestedPointSizeBackup, requestedPointSize);
+        }
+      }
+      else
       {
+         error = FT_Set_Char_Size(ftFace,
+                               0,
+                               requestedPointSize,
+                               mDpiHorizontal,
+                               mDpiVertical);
+      }
 
+      if(FT_Err_Ok == error)
+      {
         FT_Size_Metrics& ftMetrics = ftFace->size->metrics;
 
-        FontMetrics metrics( static_cast< float >( ftMetrics.ascender  ) * FROM_266,
-                             static_cast< float >( ftMetrics.descender ) * FROM_266,
-                             static_cast< float >( ftMetrics.height    ) * FROM_266,
-                             static_cast< float >( ftFace->underline_position ) * FROM_266,
-                             static_cast< float >( ftFace->underline_thickness ) * FROM_266 );
+        FontMetrics metrics(static_cast<float>(ftMetrics.ascender) * FROM_266,
+                            static_cast<float>(ftMetrics.descender) * FROM_266,
+                            static_cast<float>(ftMetrics.height) * FROM_266,
+                            static_cast<float>(ftFace->underline_position) * FROM_266,
+                            static_cast<float>(ftFace->underline_thickness) * FROM_266);
 
         // Create the FreeType font face item to cache.
-        FontFaceCacheItem fontFaceCacheItem( ftFace, path, requestedPointSize, faceIndex, metrics );
+        FontFaceCacheItem fontFaceCacheItem(ftFace, path, requestedPointSize, faceIndex, metrics);
 
         // Set the index to the font's id cache.
         fontFaceCacheItem.mFontId = mFontIdCache.Count();
@@ -2141,87 +2415,87 @@ FontId FontClient::Plugin::CreateFont( const FontPath& path,
 
         // Set the index to the FreeType font face cache.
         fontIdCacheItem.id = mFontFaceCache.size();
-        fontFaceId = fontIdCacheItem.id + 1u;
+        fontFaceId         = fontIdCacheItem.id + 1u;
 
         // Cache the items.
-        mFontFaceCache.push_back( fontFaceCacheItem );
-        mFontIdCache.PushBack( fontIdCacheItem );
+        mFontFaceCache.push_back(fontFaceCacheItem);
+        mFontIdCache.PushBack(fontIdCacheItem);
 
         // Set the font id to be returned.
         id = mFontIdCache.Count();
       }
       else
       {
-        DALI_LOG_INFO( gLogFilter, Debug::General, "  FreeType Set_Char_Size error: %d for pointSize %d\n", error, requestedPointSize );
+        DALI_LOG_INFO(gLogFilter, Debug::General, "  FreeType Set_Char_Size error: %d for pointSize %d\n", error, requestedPointSize);
       }
     }
 
-    if( 0u != fontFaceId )
+    if(0u != fontFaceId)
     {
-      if( cacheDescription )
+      if(cacheDescription)
       {
-        CacheFontPath( ftFace, fontFaceId, requestedPointSize, path );
+        CacheFontPath(ftFace, fontFaceId, requestedPointSize, path);
       }
     }
   }
   else
   {
-    DALI_LOG_INFO( gLogFilter, Debug::General, "  FreeType New_Face error: %d for [%s]\n", error, path.c_str() );
+    DALI_LOG_INFO(gLogFilter, Debug::General, "  FreeType New_Face error: %d for [%s]\n", error, path.c_str());
   }
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  font id : %d\n", id );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::CreateFont\n" );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  font id : %d\n", id);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::CreateFont\n");
 
   return id;
 }
 
-void FontClient::Plugin::ConvertBitmap( TextAbstraction::FontClient::GlyphBufferData& data, unsigned int srcWidth, unsigned int srcHeight, const unsigned char* const srcBuffer )
+void FontClient::Plugin::ConvertBitmap(TextAbstraction::FontClient::GlyphBufferData& data, unsigned int srcWidth, unsigned int srcHeight, const unsigned char* const srcBuffer)
 {
   // Set the input dimensions.
-  const ImageDimensions inputDimensions( srcWidth, srcHeight );
+  const ImageDimensions inputDimensions(srcWidth, srcHeight);
 
   // Set the output dimensions.
   // If the output dimension is not given, the input dimension is set
   // and won't be downscaling.
-  data.width = ( data.width == 0 ) ? srcWidth : data.width;
-  data.height = ( data.height == 0 ) ? srcHeight : data.height;
-  const ImageDimensions desiredDimensions( data.width, data.height );
+  data.width  = (data.width == 0) ? srcWidth : data.width;
+  data.height = (data.height == 0) ? srcHeight : data.height;
+  const ImageDimensions desiredDimensions(data.width, data.height);
 
   // Creates the output buffer
   const unsigned int bufferSize = data.width * data.height * 4u;
-  data.buffer = new unsigned char[bufferSize]; // @note The caller is responsible for deallocating the bitmap data using delete[].
+  data.buffer                   = new unsigned char[bufferSize]; // @note The caller is responsible for deallocating the bitmap data using delete[].
 
-  if( inputDimensions == desiredDimensions )
+  if(inputDimensions == desiredDimensions)
   {
     // There isn't downscaling.
-    memcpy( data.buffer, srcBuffer, bufferSize );
+    memcpy(data.buffer, srcBuffer, bufferSize);
   }
   else
   {
-    Dali::Internal::Platform::LanczosSample4BPP( srcBuffer,
-                                                 inputDimensions,
-                                                 data.buffer,
-                                                 desiredDimensions );
+    Dali::Internal::Platform::LanczosSample4BPP(srcBuffer,
+                                                inputDimensions,
+                                                data.buffer,
+                                                desiredDimensions);
   }
 }
 
-void FontClient::Plugin::ConvertBitmap( TextAbstraction::FontClient::GlyphBufferData& data, FT_Bitmap srcBitmap, bool isShearRequired )
+void FontClient::Plugin::ConvertBitmap(TextAbstraction::FontClient::GlyphBufferData& data, FT_Bitmap srcBitmap, bool isShearRequired)
 {
-  if( srcBitmap.width*srcBitmap.rows > 0 )
+  if(srcBitmap.width * srcBitmap.rows > 0)
   {
-    switch( srcBitmap.pixel_mode )
+    switch(srcBitmap.pixel_mode)
     {
       case FT_PIXEL_MODE_GRAY:
       {
-        if( srcBitmap.pitch == static_cast<int>( srcBitmap.width ) )
+        if(srcBitmap.pitch == static_cast<int>(srcBitmap.width))
         {
-          uint8_t* pixelsIn = srcBitmap.buffer;
-          unsigned int width = srcBitmap.width;
-          unsigned height = srcBitmap.rows;
+          uint8_t*     pixelsIn = srcBitmap.buffer;
+          unsigned int width    = srcBitmap.width;
+          unsigned     height   = srcBitmap.rows;
 
-          std::unique_ptr<uint8_t, void(*)(void*)> pixelsOutPtr( nullptr, free );
+          std::unique_ptr<uint8_t, void (*)(void*)> pixelsOutPtr(nullptr, free);
 
-          if( isShearRequired )
+          if(isShearRequired)
           {
             /**
              * Glyphs' bitmaps with no slant retrieved from FreeType:
@@ -2256,31 +2530,31 @@ void FontClient::Plugin::ConvertBitmap( TextAbstraction::FontClient::GlyphBuffer
              *
              * This difference in some bitmaps' width causes an overlap of some glyphs. This is the reason why a shear operation is done here instead of relying on the experimental FT_GlyphSlot_Oblique() implementation.
              */
-            unsigned int widthOut = 0u;
+            unsigned int widthOut  = 0u;
             unsigned int heightOut = 0u;
-            uint8_t* pixelsOut = nullptr;
-
-            Dali::Internal::Platform::HorizontalShear( pixelsIn,
-                                                       width,
-                                                       height,
-                                                       1u,
-                                                       -TextAbstraction::FontClient::DEFAULT_ITALIC_ANGLE,
-                                                       pixelsOut,
-                                                       widthOut,
-                                                       heightOut );
-
-            width = widthOut;
-            height = heightOut;
+            uint8_t*     pixelsOut = nullptr;
+
+            Dali::Internal::Platform::HorizontalShear(pixelsIn,
+                                                      width,
+                                                      height,
+                                                      1u,
+                                                      -TextAbstraction::FontClient::DEFAULT_ITALIC_ANGLE,
+                                                      pixelsOut,
+                                                      widthOut,
+                                                      heightOut);
+
+            width    = widthOut;
+            height   = heightOut;
             pixelsIn = pixelsOut;
-            pixelsOutPtr.reset( pixelsOut );
+            pixelsOutPtr.reset(pixelsOut);
           }
 
           const unsigned int bufferSize = width * height;
-          data.buffer = new unsigned char[bufferSize]; // @note The caller is responsible for deallocating the bitmap data using delete[].
-          data.width = width;
-          data.height = height;
-          data.format = Pixel::L8; // Sets the pixel format.
-          memcpy( data.buffer, pixelsIn, bufferSize );
+          data.buffer                   = new unsigned char[bufferSize]; // @note The caller is responsible for deallocating the bitmap data using delete[].
+          data.width                    = width;
+          data.height                   = height;
+          data.format                   = Pixel::L8; // Sets the pixel format.
+          memcpy(data.buffer, pixelsIn, bufferSize);
         }
         break;
       }
@@ -2288,9 +2562,9 @@ void FontClient::Plugin::ConvertBitmap( TextAbstraction::FontClient::GlyphBuffer
 #ifdef FREETYPE_BITMAP_SUPPORT
       case FT_PIXEL_MODE_BGRA:
       {
-        if( srcBitmap.pitch == static_cast<int>( srcBitmap.width << 2u ) )
+        if(srcBitmap.pitch == static_cast<int>(srcBitmap.width << 2u))
         {
-          ConvertBitmap( data, srcBitmap.width, srcBitmap.rows, srcBitmap.buffer );
+          ConvertBitmap(data, srcBitmap.width, srcBitmap.rows, srcBitmap.buffer);
 
           // Sets the pixel format.
           data.format = Pixel::BGRA8888;
@@ -2300,150 +2574,150 @@ void FontClient::Plugin::ConvertBitmap( TextAbstraction::FontClient::GlyphBuffer
 #endif
       default:
       {
-        DALI_LOG_INFO( gLogFilter, Debug::General, "FontClient::Plugin::ConvertBitmap. FontClient Unable to create Bitmap of this PixelType\n" );
+        DALI_LOG_INFO(gLogFilter, Debug::General, "FontClient::Plugin::ConvertBitmap. FontClient Unable to create Bitmap of this PixelType\n");
         break;
       }
     }
   }
 }
 
-bool FontClient::Plugin::FindFont( const FontPath& path,
-                                   PointSize26Dot6 requestedPointSize,
-                                   FaceIndex faceIndex,
-                                   FontId& fontId ) const
+bool FontClient::Plugin::FindFont(const FontPath& path,
+                                  PointSize26Dot6 requestedPointSize,
+                                  FaceIndex       faceIndex,
+                                  FontId&         fontId) const
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::FindFont\n" );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "                path : [%s]\n", path.c_str() );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  requestedPointSize : %d\n", requestedPointSize );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "  number of fonts in the cache : %d\n", mFontFaceCache.size() );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::FindFont\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "                path : [%s]\n", path.c_str());
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  requestedPointSize : %d\n", requestedPointSize);
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "  number of fonts in the cache : %d\n", mFontFaceCache.size());
 
   fontId = 0u;
-  for( const auto& cacheItem : mFontFaceCache )
+  for(const auto& cacheItem : mFontFaceCache)
   {
-    if( cacheItem.mRequestedPointSize == requestedPointSize &&
-        cacheItem.mFaceIndex == faceIndex &&
-        cacheItem.mPath == path )
+    if(cacheItem.mRequestedPointSize == requestedPointSize &&
+       cacheItem.mFaceIndex == faceIndex &&
+       cacheItem.mPath == path)
     {
       fontId = cacheItem.mFontId + 1u;
 
-      DALI_LOG_INFO( gLogFilter, Debug::General, "  font found, id : %d\n", fontId );
-      DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::FindFont\n" );
+      DALI_LOG_INFO(gLogFilter, Debug::General, "  font found, id : %d\n", fontId);
+      DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::FindFont\n");
 
       return true;
     }
   }
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  font not found\n" );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::FindFont\n" );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  font not found\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::FindFont\n");
 
   return false;
 }
 
-bool FontClient::Plugin::FindValidatedFont( const FontDescription& fontDescription,
-                                            FontDescriptionId& validatedFontId )
+bool FontClient::Plugin::FindValidatedFont(const FontDescription& fontDescription,
+                                           FontDescriptionId&     validatedFontId)
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::FindValidatedFont\n" );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  description; family : [%s]\n", fontDescription.family.c_str() );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                 path : [%s]\n", fontDescription.path.c_str() );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[fontDescription.width] );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[fontDescription.weight] );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[fontDescription.slant] );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "  number of validated fonts in the cache : %d\n", mValidatedFontCache.size() );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::FindValidatedFont\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  description; family : [%s]\n", fontDescription.family.c_str());
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                 path : [%s]\n", fontDescription.path.c_str());
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[fontDescription.width]);
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[fontDescription.weight]);
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[fontDescription.slant]);
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "  number of validated fonts in the cache : %d\n", mValidatedFontCache.size());
 
   validatedFontId = 0u;
 
-  for( const auto& item : mValidatedFontCache )
+  for(const auto& item : mValidatedFontCache)
   {
-    if( !fontDescription.family.empty() &&
-        ( fontDescription.family == item.fontDescription.family ) &&
-        ( fontDescription.width == item.fontDescription.width ) &&
-        ( fontDescription.weight == item.fontDescription.weight ) &&
-        ( fontDescription.slant == item.fontDescription.slant ) )
+    if(!fontDescription.family.empty() &&
+       (fontDescription.family == item.fontDescription.family) &&
+       (fontDescription.width == item.fontDescription.width) &&
+       (fontDescription.weight == item.fontDescription.weight) &&
+       (fontDescription.slant == item.fontDescription.slant))
     {
       validatedFontId = item.index;
 
-      DALI_LOG_INFO( gLogFilter, Debug::General, "  validated font found, id : %d\n", validatedFontId );
-      DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::FindValidatedFont\n" );
+      DALI_LOG_INFO(gLogFilter, Debug::General, "  validated font found, id : %d\n", validatedFontId);
+      DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::FindValidatedFont\n");
       return true;
     }
   }
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  validated font not found\n" );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::FindValidatedFont\n" );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  validated font not found\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::FindValidatedFont\n");
   return false;
 }
 
-bool FontClient::Plugin::FindFallbackFontList( const FontDescription& fontDescription,
-                                               FontList*& fontList,
-                                               CharacterSetList*& characterSetList )
+bool FontClient::Plugin::FindFallbackFontList(const FontDescription& fontDescription,
+                                              FontList*&             fontList,
+                                              CharacterSetList*&     characterSetList)
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::FindFallbackFontList\n" );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  description; family : [%s]\n", fontDescription.family.c_str() );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                 path : [%s]\n", fontDescription.path.c_str() );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[fontDescription.width] );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[fontDescription.weight] );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[fontDescription.slant] );
-  DALI_LOG_INFO( gLogFilter, Debug::Verbose, "  number of fallback font lists in the cache : %d\n", mFallbackCache.size() );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::FindFallbackFontList\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  description; family : [%s]\n", fontDescription.family.c_str());
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                 path : [%s]\n", fontDescription.path.c_str());
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                width : [%s]\n", FontWidth::Name[fontDescription.width]);
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "               weight : [%s]\n", FontWeight::Name[fontDescription.weight]);
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "                slant : [%s]\n\n", FontSlant::Name[fontDescription.slant]);
+  DALI_LOG_INFO(gLogFilter, Debug::Verbose, "  number of fallback font lists in the cache : %d\n", mFallbackCache.size());
 
   fontList = nullptr;
 
-  for( const auto& item : mFallbackCache )
+  for(const auto& item : mFallbackCache)
   {
-    if( !fontDescription.family.empty() &&
-        ( fontDescription.family == item.fontDescription.family ) &&
-        ( fontDescription.width == item.fontDescription.width ) &&
-        ( fontDescription.weight == item.fontDescription.weight ) &&
-        ( fontDescription.slant == item.fontDescription.slant ) )
+    if(!fontDescription.family.empty() &&
+       (fontDescription.family == item.fontDescription.family) &&
+       (fontDescription.width == item.fontDescription.width) &&
+       (fontDescription.weight == item.fontDescription.weight) &&
+       (fontDescription.slant == item.fontDescription.slant))
     {
-      fontList = item.fallbackFonts;
+      fontList         = item.fallbackFonts;
       characterSetList = item.characterSets;
 
-      DALI_LOG_INFO( gLogFilter, Debug::General, "  fallback font list found.\n" );
-      DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::FindFallbackFontList\n" );
+      DALI_LOG_INFO(gLogFilter, Debug::General, "  fallback font list found.\n");
+      DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::FindFallbackFontList\n");
       return true;
     }
   }
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  fallback font list not found.\n" );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::FindFallbackFontList\n" );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  fallback font list not found.\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::FindFallbackFontList\n");
   return false;
 }
 
-bool FontClient::Plugin::FindFont( FontDescriptionId validatedFontId,
-                                   PointSize26Dot6 requestedPointSize,
-                                   FontId& fontId )
+bool FontClient::Plugin::FindFont(FontDescriptionId validatedFontId,
+                                  PointSize26Dot6   requestedPointSize,
+                                  FontId&           fontId)
 {
-  DALI_LOG_INFO( gLogFilter, Debug::General, "-->FontClient::Plugin::FindFont\n" );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "    validatedFontId  : %d\n", validatedFontId );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  requestedPointSize : %d\n", requestedPointSize );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "-->FontClient::Plugin::FindFont\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "    validatedFontId  : %d\n", validatedFontId);
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  requestedPointSize : %d\n", requestedPointSize);
 
   fontId = 0u;
 
-  for( const auto& item : mFontDescriptionSizeCache )
+  for(const auto& item : mFontDescriptionSizeCache)
   {
-    if( ( validatedFontId == item.validatedFontId ) &&
-        ( requestedPointSize == item.requestedPointSize ) )
+    if((validatedFontId == item.validatedFontId) &&
+       (requestedPointSize == item.requestedPointSize))
     {
       fontId = item.fontId;
 
-      DALI_LOG_INFO( gLogFilter, Debug::General, "  font found, id : %d\n", fontId );
-      DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::FindFont\n" );
+      DALI_LOG_INFO(gLogFilter, Debug::General, "  font found, id : %d\n", fontId);
+      DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::FindFont\n");
       return true;
     }
   }
 
-  DALI_LOG_INFO( gLogFilter, Debug::General, "  font not found.\n" );
-  DALI_LOG_INFO( gLogFilter, Debug::General, "<--FontClient::Plugin::FindFont\n" );
+  DALI_LOG_INFO(gLogFilter, Debug::General, "  font not found.\n");
+  DALI_LOG_INFO(gLogFilter, Debug::General, "<--FontClient::Plugin::FindFont\n");
   return false;
 }
 
-bool FontClient::Plugin::FindBitmapFont( const FontFamily& bitmapFont, FontId& fontId ) const
+bool FontClient::Plugin::FindBitmapFont(const FontFamily& bitmapFont, FontId& fontId) const
 {
   fontId = 0u;
 
-  for( const auto& item : mBitmapFontCache )
+  for(const auto& item : mBitmapFontCache)
   {
-    if( bitmapFont == item.font.name )
+    if(bitmapFont == item.font.name)
     {
       fontId = item.id + 1u;
       return true;
@@ -2453,18 +2727,18 @@ bool FontClient::Plugin::FindBitmapFont( const FontFamily& bitmapFont, FontId& f
   return false;
 }
 
-bool FontClient::Plugin::IsScalable( const FontPath& path )
+bool FontClient::Plugin::IsScalable(const FontPath& path)
 {
   bool isScalable = false;
 
   FT_Face ftFace;
-  int error = FT_New_Face( mFreeTypeLibrary,
-                           path.c_str(),
-                           0,
-                           &ftFace );
-  if( FT_Err_Ok != error )
+  int     error = FT_New_Face(mFreeTypeLibrary,
+                          path.c_str(),
+                          0,
+                          &ftFace);
+  if(FT_Err_Ok != error)
   {
-    DALI_LOG_INFO( gLogFilter, Debug::General, "FontClient::Plugin::IsScalable. FreeType Cannot check font: %s\n", path.c_str() );
+    DALI_LOG_INFO(gLogFilter, Debug::General, "FontClient::Plugin::IsScalable. FreeType Cannot check font: %s\n", path.c_str());
   }
   else
   {
@@ -2474,208 +2748,208 @@ bool FontClient::Plugin::IsScalable( const FontPath& path )
   return isScalable;
 }
 
-bool FontClient::Plugin::IsScalable( const FontDescription& fontDescription )
+bool FontClient::Plugin::IsScalable(const FontDescription& fontDescription)
 {
   // Create a font pattern.
-  FcPattern* fontFamilyPattern = CreateFontFamilyPattern( fontDescription ); // Creates a font pattern that needs to be destroyed by calling FcPatternDestroy.
+  FcPattern* fontFamilyPattern = CreateFontFamilyPattern(fontDescription); // Creates a font pattern that needs to be destroyed by calling FcPatternDestroy.
 
   FcResult result = FcResultMatch;
 
   // match the pattern
-  FcPattern* match = FcFontMatch( nullptr /* use default configure */, fontFamilyPattern, &result ); // Creates a font pattern that needs to be destroyed by calling FcPatternDestroy.
-  bool isScalable = false;
+  FcPattern* match      = FcFontMatch(nullptr /* use default configure */, fontFamilyPattern, &result); // Creates a font pattern that needs to be destroyed by calling FcPatternDestroy.
+  bool       isScalable = false;
 
-  if( match )
+  if(match)
   {
     // Get the path to the font file name.
     FontPath path;
-    GetFcString( match, FC_FILE, path );
-    isScalable = IsScalable( path );
+    GetFcString(match, FC_FILE, path);
+    isScalable = IsScalable(path);
   }
   else
   {
-    DALI_LOG_INFO( gLogFilter, Debug::General, "FontClient::Plugin::IsScalable. FreeType Cannot check font: [%s]\n", fontDescription.family.c_str() );
+    DALI_LOG_INFO(gLogFilter, Debug::General, "FontClient::Plugin::IsScalable. FreeType Cannot check font: [%s]\n", fontDescription.family.c_str());
   }
 
   // Destroys the created patterns.
-  FcPatternDestroy( match );
-  FcPatternDestroy( fontFamilyPattern );
+  FcPatternDestroy(match);
+  FcPatternDestroy(fontFamilyPattern);
 
   return isScalable;
 }
 
-void FontClient::Plugin::GetFixedSizes( const FontPath& path, Vector< PointSize26Dot6 >& sizes )
+void FontClient::Plugin::GetFixedSizes(const FontPath& path, Vector<PointSize26Dot6>& sizes)
 {
   // Empty the caller container
   sizes.Clear();
 
   FT_Face ftFace;
-  int error = FT_New_Face( mFreeTypeLibrary,
-                           path.c_str(),
-                           0,
-                           &ftFace );
-  if( FT_Err_Ok != error )
+  int     error = FT_New_Face(mFreeTypeLibrary,
+                          path.c_str(),
+                          0,
+                          &ftFace);
+  if(FT_Err_Ok != error)
   {
-    DALI_LOG_INFO( gLogFilter, Debug::General, "FontClient::Plugin::GetFixedSizes. FreeType Cannot check font path : [%s]\n", path.c_str() );
+    DALI_LOG_INFO(gLogFilter, Debug::General, "FontClient::Plugin::GetFixedSizes. FreeType Cannot check font path : [%s]\n", path.c_str());
   }
 
   // Fetch the number of fixed sizes available
-  if ( ftFace->num_fixed_sizes && ftFace->available_sizes )
+  if(ftFace->num_fixed_sizes && ftFace->available_sizes)
   {
-    for ( int i = 0; i < ftFace->num_fixed_sizes; ++i )
+    for(int i = 0; i < ftFace->num_fixed_sizes; ++i)
     {
-      sizes.PushBack( ftFace->available_sizes[ i ].size );
+      sizes.PushBack(ftFace->available_sizes[i].size);
     }
   }
 }
 
-void FontClient::Plugin::GetFixedSizes( const FontDescription& fontDescription,
-                                        Vector< PointSize26Dot6 >& sizes )
+void FontClient::Plugin::GetFixedSizes(const FontDescription&   fontDescription,
+                                       Vector<PointSize26Dot6>& sizes)
 {
   // Create a font pattern.
-  FcPattern* fontFamilyPattern = CreateFontFamilyPattern( fontDescription ); // Creates a font pattern that needs to be destroyed by calling FcPatternDestroy.
+  FcPattern* fontFamilyPattern = CreateFontFamilyPattern(fontDescription); // Creates a font pattern that needs to be destroyed by calling FcPatternDestroy.
 
   FcResult result = FcResultMatch;
 
   // match the pattern
-  FcPattern* match = FcFontMatch( nullptr /* use default configure */, fontFamilyPattern, &result ); // Creates a font pattern that needs to be destroyed by calling FcPatternDestroy.
+  FcPattern* match = FcFontMatch(nullptr /* use default configure */, fontFamilyPattern, &result); // Creates a font pattern that needs to be destroyed by calling FcPatternDestroy.
 
-  if( match )
+  if(match)
   {
     // Get the path to the font file name.
     FontPath path;
-    GetFcString( match, FC_FILE, path );
-    GetFixedSizes( path, sizes );
+    GetFcString(match, FC_FILE, path);
+    GetFixedSizes(path, sizes);
   }
   else
   {
-    DALI_LOG_INFO( gLogFilter, Debug::General, "FontClient::Plugin::GetFixedSizes. FreeType Cannot check font: [%s]\n", fontDescription.family.c_str() );
+    DALI_LOG_INFO(gLogFilter, Debug::General, "FontClient::Plugin::GetFixedSizes. FreeType Cannot check font: [%s]\n", fontDescription.family.c_str());
   }
 
   // Destroys the created patterns.
-  FcPatternDestroy( match );
-  FcPatternDestroy( fontFamilyPattern );
+  FcPatternDestroy(match);
+  FcPatternDestroy(fontFamilyPattern);
 }
 
-bool FontClient::Plugin::HasItalicStyle( FontId fontId ) const
+bool FontClient::Plugin::HasItalicStyle(FontId fontId) const
 {
   bool hasItalicStyle = false;
 
   const FontId index = fontId - 1u;
 
-  if( ( fontId > 0 ) &&
-      ( index < mFontIdCache.Count() ) )
+  if((fontId > 0) &&
+     (index < mFontIdCache.Count()))
   {
     const FontIdCacheItem& fontIdCacheItem = mFontIdCache[index];
 
-    if( FontDescription::FACE_FONT == fontIdCacheItem.type )
+    if(FontDescription::FACE_FONT == fontIdCacheItem.type)
     {
       const FontFaceCacheItem& font = mFontFaceCache[fontIdCacheItem.id];
 
-      hasItalicStyle = 0u != ( font.mFreeTypeFace->style_flags & FT_STYLE_FLAG_ITALIC );
+      hasItalicStyle = 0u != (font.mFreeTypeFace->style_flags & FT_STYLE_FLAG_ITALIC);
     }
   }
   else
   {
-    DALI_LOG_INFO( gLogFilter, Debug::General, "FontClient::Plugin::GetFontMetrics. Invalid font id : %d\n", fontId );
+    DALI_LOG_INFO(gLogFilter, Debug::General, "FontClient::Plugin::GetFontMetrics. Invalid font id : %d\n", fontId);
   }
 
   return hasItalicStyle;
 }
 
-void FontClient::Plugin::CacheFontPath( FT_Face ftFace, FontId id, PointSize26Dot6 requestedPointSize,  const FontPath& path )
+void FontClient::Plugin::CacheFontPath(FT_Face ftFace, FontId id, PointSize26Dot6 requestedPointSize, const FontPath& path)
 {
   FontDescription description;
-  description.path = path;
-  description.family = std::move( FontFamily( ftFace->family_name ) );
+  description.path   = path;
+  description.family = std::move(FontFamily(ftFace->family_name));
   description.weight = FontWeight::NONE;
-  description.width = FontWidth::NONE;
-  description.slant = FontSlant::NONE;
+  description.width  = FontWidth::NONE;
+  description.slant  = FontSlant::NONE;
 
   // Note FreeType doesn't give too much info to build a proper font style.
-  if( ftFace->style_flags & FT_STYLE_FLAG_ITALIC )
+  if(ftFace->style_flags & FT_STYLE_FLAG_ITALIC)
   {
     description.slant = FontSlant::ITALIC;
   }
-  if( ftFace->style_flags & FT_STYLE_FLAG_BOLD )
+  if(ftFace->style_flags & FT_STYLE_FLAG_BOLD)
   {
     description.weight = FontWeight::BOLD;
   }
 
   FontDescriptionId validatedFontId = 0u;
-  if( !FindValidatedFont( description,
-                          validatedFontId ) )
+  if(!FindValidatedFont(description,
+                        validatedFontId))
   {
-    // Set the index to the vector of paths to font file names.
-    validatedFontId = mFontDescriptionCache.size();
+    FcPattern* pattern = CreateFontFamilyPattern(description); // Creates a new pattern that needs to be destroyed by calling FcPatternDestroy.
 
-    FcPattern* pattern = CreateFontFamilyPattern( description ); // Creates a new pattern that needs to be destroyed by calling FcPatternDestroy.
-
-    FcResult result = FcResultMatch;
-    FcPattern* match = FcFontMatch( nullptr, pattern, &result ); // FcFontMatch creates a new pattern that needs to be destroyed by calling FcPatternDestroy.
+    FcResult   result = FcResultMatch;
+    FcPattern* match  = FcFontMatch(nullptr, pattern, &result); // FcFontMatch creates a new pattern that needs to be destroyed by calling FcPatternDestroy.
 
     FcCharSet* characterSet = nullptr;
-    FcPatternGetCharSet( match, FC_CHARSET, 0u, &characterSet );
+    FcPatternGetCharSet(match, FC_CHARSET, 0u, &characterSet);
 
-    const FontId fontFaceId = id - 1u;
-    mFontFaceCache[fontFaceId].mCharacterSet = FcCharSetCopy( characterSet ); // Increases the reference counter.
+    const FontId fontFaceId                  = id - 1u;
+    mFontFaceCache[fontFaceId].mCharacterSet = FcCharSetCopy(characterSet); // Increases the reference counter.
 
     // Destroys the created patterns.
-    FcPatternDestroy( match );
-    FcPatternDestroy( pattern );
+    FcPatternDestroy(match);
+    FcPatternDestroy(pattern);
 
     // Add the path to the cache.
     description.type = FontDescription::FACE_FONT;
-    mFontDescriptionCache.push_back( description );
+    mFontDescriptionCache.push_back(description);
+
+    // Set the index to the vector of paths to font file names.
+    validatedFontId = mFontDescriptionCache.size();
 
     // Increase the reference counter and add the character set to the cache.
-    mCharacterSetCache.PushBack( FcCharSetCopy( characterSet ) );
+    mCharacterSetCache.PushBack(FcCharSetCopy(characterSet));
 
     // Cache the index and the font's description.
-    mValidatedFontCache.push_back( std::move( FontDescriptionCacheItem( std::move( description ),
-                                                                        validatedFontId) ) );
+    mValidatedFontCache.push_back(std::move(FontDescriptionCacheItem(std::move(description),
+                                                                     validatedFontId)));
 
     // Cache the pair 'validatedFontId, requestedPointSize' to improve the following queries.
-    mFontDescriptionSizeCache.push_back( FontDescriptionSizeCacheItem( validatedFontId,
-                                                                       requestedPointSize,
-                                                                       fontFaceId ) );
+    mFontDescriptionSizeCache.push_back(FontDescriptionSizeCacheItem(validatedFontId,
+                                                                     requestedPointSize,
+                                                                     fontFaceId));
   }
 }
 
-FcCharSet* FontClient::Plugin::CreateCharacterSetFromDescription( const FontDescription& description )
+FcCharSet* FontClient::Plugin::CreateCharacterSetFromDescription(const FontDescription& description)
 {
   FcCharSet* characterSet = nullptr;
 
-  FcPattern* pattern = CreateFontFamilyPattern( description ); // Creates a new pattern that needs to be destroyed by calling FcPatternDestroy.
+  FcPattern* pattern = CreateFontFamilyPattern(description); // Creates a new pattern that needs to be destroyed by calling FcPatternDestroy.
 
-  if( nullptr != pattern )
+  if(nullptr != pattern)
   {
-    FcResult result = FcResultMatch;
-    FcPattern* match = FcFontMatch( nullptr, pattern, &result ); // FcFontMatch creates a new pattern that needs to be destroyed by calling FcPatternDestroy.
+    FcResult   result = FcResultMatch;
+    FcPattern* match  = FcFontMatch(nullptr, pattern, &result); // FcFontMatch creates a new pattern that needs to be destroyed by calling FcPatternDestroy.
 
-    FcPatternGetCharSet( match, FC_CHARSET, 0u, &characterSet );
+    FcPatternGetCharSet(match, FC_CHARSET, 0u, &characterSet);
 
     // Destroys the created patterns.
-    FcPatternDestroy( match );
-    FcPatternDestroy( pattern );
+    FcPatternDestroy(match);
+    FcPatternDestroy(pattern);
   }
 
   return characterSet;
 }
 
-void FontClient::Plugin::ClearFallbackCache( std::vector<FallbackCacheItem>& fallbackCache )
+void FontClient::Plugin::ClearFallbackCache(std::vector<FallbackCacheItem>& fallbackCache)
 {
-  for( auto& item : fallbackCache )
+  for(auto& item : fallbackCache)
   {
-    if( nullptr != item.fallbackFonts )
+    if(nullptr != item.fallbackFonts)
     {
       delete item.fallbackFonts;
     }
 
-    if( nullptr != item.characterSets )
+    if(nullptr != item.characterSets)
     {
       // Free the resources allocated by the FcCharSet objects in the 'characterSets' vector.
-      DestroyCharacterSets( *item.characterSets );
+      DestroyCharacterSets(*item.characterSets);
       delete item.characterSets;
     }
   }
@@ -2683,9 +2957,9 @@ void FontClient::Plugin::ClearFallbackCache( std::vector<FallbackCacheItem>& fal
 
 void FontClient::Plugin::ClearCharacterSetFromFontFaceCache()
 {
-  for( auto& item : mFontFaceCache )
+  for(auto& item : mFontFaceCache)
   {
-    FcCharSetDestroy( item.mCharacterSet );
+    FcCharSetDestroy(item.mCharacterSet);
     item.mCharacterSet = nullptr;
   }
 }