FontClient Plugin moved to its own file 82/35282/1
authorVictor Cebollada <v.cebollada@samsung.com>
Wed, 11 Feb 2015 11:38:20 +0000 (11:38 +0000)
committerVictor Cebollada <v.cebollada@samsung.com>
Wed, 11 Feb 2015 11:42:14 +0000 (11:42 +0000)
Change-Id: I4c409a3e723c218626adcb9776b8b210295b7e2a
Signed-off-by: Victor Cebollada <v.cebollada@samsung.com>
text/dali/internal/text-abstraction/font-client-impl.cpp
text/dali/internal/text-abstraction/font-client-plugin-impl.cpp [new file with mode: 0644]
text/dali/internal/text-abstraction/font-client-plugin-impl.h [new file with mode: 0644]
text/dali/public-api/text-abstraction/font-client.h
text/file.list

index cac4ed5..51f56d0 100644 (file)
  *
  */
 
-// CLASS  HEADER
-#include "font-client-impl.h"
-
-// EXTERNAL INCLUDES
-#include <vector>
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include FT_GLYPH_H
-#include <fontconfig/fontconfig.h>
-#include <dali/integration-api/debug.h>
+// CLASS HEADER
+#include <dali/internal/text-abstraction/font-client-impl.h>
 
 // INTERNAL INCLUDES
-#include <singleton-service-impl.h>
-
-/**
- * Conversion from Fractional26.6 to float
- */
-namespace
-{
-const float FROM_266 = 1.0f / 64.0f;
-}
+#include <singleton-service.h>
+#include <dali/internal/text-abstraction/font-client-plugin-impl.h>
 
 namespace Dali
 {
@@ -46,401 +31,6 @@ namespace TextAbstraction
 namespace Internal
 {
 
-struct FontClient::Plugin
-{
-  struct CacheItem
-  {
-    CacheItem( FontId id, FT_Face ftFace, const std::string& path, PointSize26Dot6 pointSize, FaceIndex face, const FontMetrics& metrics )
-    : mFreeTypeFace( ftFace ),
-      mPath( path ),
-      mPointSize( pointSize ),
-      mFaceIndex( face ),
-      mMetrics( metrics )
-    {
-    }
-
-    FT_Face mFreeTypeFace;
-    std::string mPath;
-    PointSize26Dot6 mPointSize;
-    FaceIndex mFaceIndex;
-    FontMetrics mMetrics;
-  };
-
-  Plugin( unsigned int horizontalDpi, unsigned int verticalDpi )
-  : mFreeTypeLibrary( NULL ),
-    mDpiHorizontal( horizontalDpi ),
-    mDpiVertical( verticalDpi )
-  {
-  }
-
-  ~Plugin()
-  {
-    FT_Done_FreeType( mFreeTypeLibrary );
-  }
-
-  void Initialize()
-  {
-    int error = FT_Init_FreeType( &mFreeTypeLibrary );
-    if( FT_Err_Ok != error )
-    {
-      DALI_LOG_ERROR( "FreeType Init error: %d\n", error );
-    }
-  }
-
-  void SetDpi( unsigned int horizontalDpi, unsigned int verticalDpi )
-  {
-    mDpiHorizontal = horizontalDpi;
-    mDpiVertical = verticalDpi;
-  }
-
-  void GetSystemFonts( FontList& systemFonts )
-  {
-    if( mSystemFonts.empty() )
-    {
-      InitSystemFonts();
-    }
-
-    systemFonts = mSystemFonts;
-  }
-
-  void InitSystemFonts()
-  {
-    FcFontSet* fontSet = GetFcFontSet();
-
-    if( fontSet )
-    {
-      mSystemFonts.reserve( fontSet->nfont );
-
-      for( int i = 0u; i < fontSet->nfont; ++i )
-      {
-        FcPattern* fontPattern = fontSet->fonts[i];
-
-        std::string path;
-
-        // Skip fonts with no path
-        if( GetFcString( fontPattern, FC_FILE, path ) )
-        {
-          mSystemFonts.push_back( FontDescription() );
-          FontDescription& fontDescription = mSystemFonts.back();
-
-          fontDescription.path = path;
-
-          GetFcString( fontPattern, FC_FAMILY, fontDescription.family );
-          GetFcString( fontPattern, FC_STYLE, fontDescription.style );
-        }
-      }
-
-      FcFontSetDestroy( fontSet );
-    }
-  }
-
-  _FcFontSet* GetFcFontSet() const
-  {
-    // create a new pattern.
-    // a pattern holds a set of names, each name refers to a property of the font
-    FcPattern* pattern = FcPatternCreate();
-
-    // create an object set used to define which properties are to be returned in the patterns from FcFontList.
-    FcObjectSet* objectSet = FcObjectSetCreate();
-
-    // build an object set from a list of property names
-    FcObjectSetAdd( objectSet, FC_FILE );
-    FcObjectSetAdd( objectSet, FC_FAMILY );
-    FcObjectSetAdd( objectSet, FC_STYLE );
-
-    // get a list of fonts
-    // creates patterns from those fonts containing only the objects in objectSet and returns the set of unique such patterns
-    FcFontSet* fontset = FcFontList( NULL /* the default configuration is checked to be up to date, and used */, pattern, objectSet );
-
-    // clear up the object set
-    if( objectSet )
-    {
-      FcObjectSetDestroy( objectSet );
-    }
-    // clear up the pattern
-    if( pattern )
-    {
-      FcPatternDestroy( pattern );
-    }
-
-    return fontset;
-  }
-
-  bool GetFcString( const FcPattern* pattern, const char* n, std::string& string )
-  {
-    FcChar8* file = NULL;
-    const FcResult retVal = FcPatternGetString( pattern, n, 0u, &file );
-
-    if( FcResultMatch == retVal )
-    {
-      // Have to use reinterpret_cast because FcChar8 is unsigned char*, not a const char*.
-      string.assign( reinterpret_cast<const char*>( file ) );
-
-      return true;
-    }
-
-    return false;
-  }
-
-  void GetDescription( FontId id, FontDescription& fontDescription ) const
-  {
-    // TODO
-  }
-
-  PointSize26Dot6 GetPointSize( FontId id )
-  {
-    return 12*64;
-  }
-
-  FontId FindDefaultFont( Character charcode, PointSize26Dot6 pointSize )
-  {
-    // TODO - Use FcCharSetHasChar()
-    return FontId(0);
-  }
-
-  FontId GetFontId( const std::string& path, PointSize26Dot6 pointSize, FaceIndex faceIndex )
-  {
-    FontId id( 0 );
-
-    if( NULL != mFreeTypeLibrary )
-    {
-      FontId foundId(0);
-      if( FindFont( path, pointSize, faceIndex, foundId ) )
-      {
-        id = foundId;
-      }
-      else
-      {
-        id = CreateFont( path, pointSize, faceIndex );
-      }
-    }
-
-    return id;
-  }
-
-  FontId GetFontId( const FontFamily& fontFamily,
-                    const FontStyle& fontStyle,
-                    PointSize26Dot6 pointSize,
-                    FaceIndex faceIndex )
-  {
-    return 0u;
-  }
-
-  GlyphIndex GetGlyphIndex( FontId fontId, Character charcode )
-  {
-    GlyphIndex index( 0 );
-
-    if( fontId > 0 &&
-        fontId-1 < mFontCache.size() )
-    {
-      FT_Face ftFace = mFontCache[fontId-1].mFreeTypeFace;
-
-      index = FT_Get_Char_Index( ftFace, charcode );
-    }
-
-    return index;
-  }
-
-  FontId CreateFont( const std::string& path, PointSize26Dot6 pointSize, FaceIndex faceIndex )
-  {
-    FontId id( 0 );
-
-    // Create & cache new font face
-    FT_Face ftFace;
-    int error = FT_New_Face( mFreeTypeLibrary,
-                             path.c_str(),
-                             0,
-                             &ftFace );
-
-    if( FT_Err_Ok == error )
-    {
-      error = FT_Set_Char_Size( ftFace,
-                                0,
-                                pointSize,
-                                mDpiHorizontal,
-                                mDpiVertical );
-
-      if( FT_Err_Ok == error )
-      {
-        id = mFontCache.size() + 1;
-
-        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 );
-
-        mFontCache.push_back( CacheItem( id, ftFace, path, pointSize, faceIndex, metrics ) );
-      }
-      else
-      {
-        DALI_LOG_ERROR( "FreeType Set_Char_Size error: %d for pointSize %d\n", pointSize );
-      }
-    }
-    else
-    {
-      DALI_LOG_ERROR( "FreeType New_Face error: %d for %s\n", error, path.c_str() );
-    }
-
-    return id;
-  }
-
-  void GetFontMetrics( FontId fontId, FontMetrics& metrics )
-  {
-    if( fontId > 0 &&
-        fontId-1 < mFontCache.size() )
-    {
-      metrics = mFontCache[fontId-1].mMetrics;
-    }
-    else
-    {
-      DALI_LOG_ERROR( "Invalid font ID %d\n", fontId );
-    }
-  }
-
-  bool GetGlyphMetrics( GlyphInfo* array, uint32_t size, bool horizontal )
-  {
-    bool success( true );
-
-    for( unsigned int i=0; i<size; ++i )
-    {
-      FontId fontId = array[i].fontId;
-
-      if( fontId > 0 &&
-          fontId-1 < mFontCache.size() )
-      {
-        FT_Face ftFace = mFontCache[fontId-1].mFreeTypeFace;
-
-        int error = FT_Load_Glyph( ftFace, array[i].index, FT_LOAD_DEFAULT );
-
-        if( FT_Err_Ok == error )
-        {
-          array[i].width  = static_cast< float >( ftFace->glyph->metrics.width ) * FROM_266;
-          array[i].height = static_cast< float >( ftFace->glyph->metrics.height ) * FROM_266 ;
-          if( horizontal )
-          {
-            array[i].xBearing = static_cast< float >( ftFace->glyph->metrics.horiBearingX ) * FROM_266;
-            array[i].yBearing = static_cast< float >( ftFace->glyph->metrics.horiBearingY ) * FROM_266;
-            array[i].advance  = static_cast< float >( ftFace->glyph->metrics.horiAdvance ) * FROM_266;
-          }
-          else
-          {
-            array[i].xBearing = static_cast< float >( ftFace->glyph->metrics.vertBearingX ) * FROM_266;
-            array[i].yBearing = static_cast< float >( ftFace->glyph->metrics.vertBearingY ) * FROM_266;
-            array[i].advance  = static_cast< float >( ftFace->glyph->metrics.vertAdvance ) * FROM_266;
-          }
-        }
-        else
-        {
-          success = false;
-        }
-      }
-      else
-      {
-        success = false;
-      }
-    }
-
-    return success;
-  }
-
-  BitmapImage CreateBitmap( FontId fontId, GlyphIndex glyphIndex )
-  {
-    BitmapImage bitmap;
-
-    if( fontId > 0 &&
-        fontId-1 < mFontCache.size() )
-    {
-      FT_Face ftFace = mFontCache[fontId-1].mFreeTypeFace;
-
-      FT_Error error = FT_Load_Glyph( ftFace, glyphIndex, FT_LOAD_DEFAULT );
-      if( FT_Err_Ok == error )
-      {
-        FT_Glyph glyph;
-        error = FT_Get_Glyph( ftFace->glyph, &glyph );
-
-        // Convert to bitmap if necessary
-        if ( FT_Err_Ok == error )
-        {
-          if( glyph->format != FT_GLYPH_FORMAT_BITMAP )
-          {
-            error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, 0, 1 );
-          }
-          else
-          {
-            DALI_LOG_ERROR( "FT_Glyph_To_Bitmap Failed with error: %d\n", error );
-          }
-        }
-        else
-        {
-          DALI_LOG_ERROR( "FT_Get_Glyph Failed with error: %d\n", error );
-        }
-
-        if( FT_Err_Ok == error )
-        {
-          // Access the underlying bitmap data
-          FT_BitmapGlyph bitmapGlyph = (FT_BitmapGlyph)glyph;
-          ConvertBitmap( bitmap, bitmapGlyph->bitmap );
-        }
-
-        // Created FT_Glyph object must be released with FT_Done_Glyph
-        FT_Done_Glyph( glyph );
-      }
-      else
-      {
-        DALI_LOG_ERROR( "FT_Load_Glyph Failed with error: %d\n", error );
-      }
-    }
-
-    return bitmap;
-  }
-
-  void ConvertBitmap( BitmapImage& destBitmap, FT_Bitmap srcBitmap )
-  {
-    if( srcBitmap.width*srcBitmap.rows > 0 )
-    {
-      // TODO - Support all pixel modes
-      if( FT_PIXEL_MODE_GRAY == srcBitmap.pixel_mode )
-      {
-        if( srcBitmap.pitch == srcBitmap.width )
-        {
-          destBitmap = BitmapImage::New( srcBitmap.width, srcBitmap.rows, Pixel::L8 );
-
-          PixelBuffer* destBuffer = destBitmap.GetBuffer();
-          memcpy( destBuffer, srcBitmap.buffer, srcBitmap.width*srcBitmap.rows );
-        }
-      }
-    }
-  }
-
-private:
-
-  bool FindFont( const std::string& path, PointSize26Dot6 pointSize, FaceIndex faceIndex, FontId& found ) const
-  {
-    for( unsigned int i=0; i<mFontCache.size(); ++i )
-    {
-      if( mFontCache[i].mPointSize == pointSize &&
-          mFontCache[i].mPath == path &&
-          mFontCache[i].mFaceIndex == faceIndex )
-      {
-        found = i + 1;
-        return true;
-      }
-    }
-
-    return false;
-  }
-
-  FT_Library mFreeTypeLibrary;
-
-  FontList mSystemFonts;
-
-  std::vector<CacheItem> mFontCache;
-
-  unsigned int mDpiHorizontal;
-  unsigned int mDpiVertical;
-};
-
 FontClient::FontClient()
 : mPlugin( NULL ),
   mDpiHorizontal( 0 ),
@@ -575,6 +165,6 @@ void FontClient::CreatePlugin()
 
 } // namespace Internal
 
-} // namespace FontClient
+} // namespace TextAbstraction
 
 } // namespace Dali
diff --git a/text/dali/internal/text-abstraction/font-client-plugin-impl.cpp b/text/dali/internal/text-abstraction/font-client-plugin-impl.cpp
new file mode 100644 (file)
index 0000000..2ba2693
--- /dev/null
@@ -0,0 +1,445 @@
+/*
+ * Copyright (c) 2015 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali/internal/text-abstraction/font-client-plugin-impl.h>
+
+// INTERNAL INCLUDES
+#include <dali/public-api/common/vector-wrapper.h>
+#include <dali/public-api/text-abstraction/glyph-info.h>
+#include <dali/integration-api/debug.h>
+
+/**
+ * Conversion from Fractional26.6 to float
+ */
+namespace
+{
+const float FROM_266 = 1.0f / 64.0f;
+
+const std::string FONT_FORMAT( "TrueType" );
+const std::string DEFAULT_FONT_FAMILY_NAME( "Tizen" );
+const std::string DEFAULT_FONT_STYLE( "Regular" );
+}
+
+namespace Dali
+{
+
+namespace TextAbstraction
+{
+
+namespace Internal
+{
+
+FontClient::Plugin::CacheItem::CacheItem( FontId id,
+                                          FT_Face ftFace,
+                                          const std::string& path,
+                                          PointSize26Dot6 pointSize,
+                                          FaceIndex face,
+                                          const FontMetrics& metrics )
+: mFreeTypeFace( ftFace ),
+  mPath( path ),
+  mPointSize( pointSize ),
+  mFaceIndex( face ),
+  mMetrics( metrics )
+{}
+
+FontClient::Plugin::Plugin( unsigned int horizontalDpi,
+                            unsigned int verticalDpi )
+: mFreeTypeLibrary( NULL ),
+  mDpiHorizontal( horizontalDpi ),
+  mDpiVertical( verticalDpi )
+{}
+
+FontClient::Plugin::~Plugin()
+{
+  FT_Done_FreeType( mFreeTypeLibrary );
+}
+
+void FontClient::Plugin::Initialize()
+{
+  int error = FT_Init_FreeType( &mFreeTypeLibrary );
+  if( FT_Err_Ok != error )
+  {
+    DALI_LOG_ERROR( "FreeType Init error: %d\n", error );
+  }
+}
+
+void FontClient::Plugin::SetDpi( unsigned int horizontalDpi,
+                                 unsigned int verticalDpi )
+{
+  mDpiHorizontal = horizontalDpi;
+  mDpiVertical = verticalDpi;
+}
+
+void FontClient::Plugin::GetSystemFonts( FontList& systemFonts )
+{
+  if( mSystemFonts.empty() )
+  {
+    InitSystemFonts();
+  }
+
+  systemFonts = mSystemFonts;
+}
+
+void FontClient::Plugin::InitSystemFonts()
+{
+  FcFontSet* fontSet = GetFcFontSet();
+
+  if( fontSet )
+  {
+    mSystemFonts.reserve( fontSet->nfont );
+
+    for( int i = 0u; i < fontSet->nfont; ++i )
+    {
+      FcPattern* fontPattern = fontSet->fonts[i];
+
+      std::string path;
+
+      // Skip fonts with no path
+      if( GetFcString( fontPattern, FC_FILE, path ) )
+      {
+        mSystemFonts.push_back( FontDescription() );
+        FontDescription& fontDescription = mSystemFonts.back();
+
+        fontDescription.path = path;
+
+        GetFcString( fontPattern, FC_FAMILY, fontDescription.family );
+        GetFcString( fontPattern, FC_STYLE, fontDescription.style );
+      }
+    }
+
+    FcFontSetDestroy( fontSet );
+  }
+}
+
+_FcFontSet* FontClient::Plugin::GetFcFontSet() const
+{
+  // create a new pattern.
+  // a pattern holds a set of names, each name refers to a property of the font
+  FcPattern* pattern = FcPatternCreate();
+
+  // create an object set used to define which properties are to be returned in the patterns from FcFontList.
+  FcObjectSet* objectSet = FcObjectSetCreate();
+
+  // build an object set from a list of property names
+  FcObjectSetAdd( objectSet, FC_FILE );
+  FcObjectSetAdd( objectSet, FC_FAMILY );
+  FcObjectSetAdd( objectSet, FC_STYLE );
+
+  // get a list of fonts
+  // creates patterns from those fonts containing only the objects in objectSet and returns the set of unique such patterns
+  FcFontSet* fontset = FcFontList( NULL /* the default configuration is checked to be up to date, and used */, pattern, objectSet );
+
+  // clear up the object set
+  if( objectSet )
+  {
+    FcObjectSetDestroy( objectSet );
+  }
+  // clear up the pattern
+  if( pattern )
+  {
+    FcPatternDestroy( pattern );
+  }
+
+  return fontset;
+}
+
+bool FontClient::Plugin::GetFcString( const FcPattern* pattern,
+                                      const char* n,
+                                      std::string& string )
+{
+  FcChar8* file = NULL;
+  const FcResult retVal = FcPatternGetString( pattern, n, 0u, &file );
+
+  if( FcResultMatch == retVal )
+  {
+    // Have to use reinterpret_cast because FcChar8 is unsigned char*, not a const char*.
+    string.assign( reinterpret_cast<const char*>( file ) );
+
+    return true;
+  }
+
+  return false;
+}
+
+void FontClient::Plugin::GetDescription( FontId id,
+                                         FontDescription& fontDescription ) const
+{
+  // TODO
+}
+
+PointSize26Dot6 FontClient::Plugin::GetPointSize( FontId id )
+{
+  return 12*64;
+}
+
+FontId FontClient::Plugin::FindDefaultFont( Character charcode,
+                                            PointSize26Dot6 pointSize )
+{
+  // TODO - Use FcCharSetHasChar()
+  return FontId(0);
+}
+
+FontId FontClient::Plugin::GetFontId( const std::string& path,
+                                      PointSize26Dot6 pointSize,
+                                      FaceIndex faceIndex )
+{
+  FontId id( 0 );
+
+  if( NULL != mFreeTypeLibrary )
+  {
+    FontId foundId(0);
+    if( FindFont( path, pointSize, faceIndex, foundId ) )
+    {
+      id = foundId;
+    }
+    else
+    {
+      id = CreateFont( path, pointSize, faceIndex );
+    }
+  }
+
+  return id;
+}
+
+FontId FontClient::Plugin::GetFontId( const FontFamily& fontFamily,
+                                      const FontStyle& fontStyle,
+                                      PointSize26Dot6 pointSize,
+                                      FaceIndex faceIndex )
+{
+  return 0u;
+}
+
+GlyphIndex FontClient::Plugin::GetGlyphIndex( FontId fontId,
+                                              Character charcode )
+{
+  GlyphIndex index( 0 );
+
+  if( fontId > 0 &&
+      fontId-1 < mFontCache.size() )
+  {
+    FT_Face ftFace = mFontCache[fontId-1].mFreeTypeFace;
+
+    index = FT_Get_Char_Index( ftFace, charcode );
+  }
+
+  return index;
+}
+
+FontId FontClient::Plugin::CreateFont( const std::string& path,
+                                       PointSize26Dot6 pointSize,
+                                       FaceIndex faceIndex )
+{
+  FontId id( 0 );
+
+  // Create & cache new font face
+  FT_Face ftFace;
+  int error = FT_New_Face( mFreeTypeLibrary,
+                           path.c_str(),
+                           0,
+                           &ftFace );
+
+  if( FT_Err_Ok == error )
+  {
+    error = FT_Set_Char_Size( ftFace,
+                              0,
+                              pointSize,
+                              mDpiHorizontal,
+                              mDpiVertical );
+
+    if( FT_Err_Ok == error )
+    {
+      id = mFontCache.size() + 1;
+
+      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 );
+
+      mFontCache.push_back( CacheItem( id, ftFace, path, pointSize, faceIndex, metrics ) );
+    }
+    else
+    {
+      DALI_LOG_ERROR( "FreeType Set_Char_Size error: %d for pointSize %d\n", pointSize );
+    }
+  }
+  else
+  {
+    DALI_LOG_ERROR( "FreeType New_Face error: %d for %s\n", error, path.c_str() );
+  }
+
+  return id;
+}
+
+void FontClient::Plugin::GetFontMetrics( FontId fontId,
+                                         FontMetrics& metrics )
+{
+  if( fontId > 0 &&
+      fontId-1 < mFontCache.size() )
+  {
+    metrics = mFontCache[fontId-1].mMetrics;
+  }
+  else
+  {
+    DALI_LOG_ERROR( "Invalid font ID %d\n", fontId );
+  }
+}
+
+bool FontClient::Plugin::GetGlyphMetrics( GlyphInfo* array,
+                                          uint32_t size,
+                                          bool horizontal )
+{
+  bool success( true );
+
+  for( unsigned int i=0; i<size; ++i )
+  {
+    FontId fontId = array[i].fontId;
+
+    if( fontId > 0 &&
+        fontId-1 < mFontCache.size() )
+    {
+      FT_Face ftFace = mFontCache[fontId-1].mFreeTypeFace;
+
+      int error = FT_Load_Glyph( ftFace, array[i].index, FT_LOAD_DEFAULT );
+
+      if( FT_Err_Ok == error )
+      {
+        array[i].width  = static_cast< float >( ftFace->glyph->metrics.width ) * FROM_266;
+        array[i].height = static_cast< float >( ftFace->glyph->metrics.height ) * FROM_266 ;
+        if( horizontal )
+        {
+          array[i].xBearing = static_cast< float >( ftFace->glyph->metrics.horiBearingX ) * FROM_266;
+          array[i].yBearing = static_cast< float >( ftFace->glyph->metrics.horiBearingY ) * FROM_266;
+          array[i].advance  = static_cast< float >( ftFace->glyph->metrics.horiAdvance ) * FROM_266;
+        }
+        else
+        {
+          array[i].xBearing = static_cast< float >( ftFace->glyph->metrics.vertBearingX ) * FROM_266;
+          array[i].yBearing = static_cast< float >( ftFace->glyph->metrics.vertBearingY ) * FROM_266;
+          array[i].advance  = static_cast< float >( ftFace->glyph->metrics.vertAdvance ) * FROM_266;
+        }
+      }
+      else
+      {
+        success = false;
+      }
+    }
+    else
+    {
+      success = false;
+    }
+  }
+
+  return success;
+}
+
+BitmapImage FontClient::Plugin::CreateBitmap( FontId fontId,
+                                              GlyphIndex glyphIndex )
+{
+  BitmapImage bitmap;
+
+  if( fontId > 0 &&
+      fontId-1 < mFontCache.size() )
+  {
+    FT_Face ftFace = mFontCache[fontId-1].mFreeTypeFace;
+
+    FT_Error error = FT_Load_Glyph( ftFace, glyphIndex, FT_LOAD_DEFAULT );
+    if( FT_Err_Ok == error )
+    {
+      FT_Glyph glyph;
+      error = FT_Get_Glyph( ftFace->glyph, &glyph );
+
+      // Convert to bitmap if necessary
+      if ( FT_Err_Ok == error )
+      {
+        if( glyph->format != FT_GLYPH_FORMAT_BITMAP )
+        {
+          error = FT_Glyph_To_Bitmap( &glyph, FT_RENDER_MODE_NORMAL, 0, 1 );
+        }
+        else
+        {
+          DALI_LOG_ERROR( "FT_Glyph_To_Bitmap Failed with error: %d\n", error );
+        }
+      }
+      else
+      {
+        DALI_LOG_ERROR( "FT_Get_Glyph Failed with error: %d\n", error );
+      }
+
+      if( FT_Err_Ok == error )
+      {
+        // Access the underlying bitmap data
+        FT_BitmapGlyph bitmapGlyph = (FT_BitmapGlyph)glyph;
+        ConvertBitmap( bitmap, bitmapGlyph->bitmap );
+      }
+
+      // Created FT_Glyph object must be released with FT_Done_Glyph
+      FT_Done_Glyph( glyph );
+    }
+    else
+    {
+      DALI_LOG_ERROR( "FT_Load_Glyph Failed with error: %d\n", error );
+    }
+  }
+
+  return bitmap;
+}
+
+void FontClient::Plugin::ConvertBitmap( BitmapImage& destBitmap,
+                                        FT_Bitmap srcBitmap )
+{
+  if( srcBitmap.width*srcBitmap.rows > 0 )
+  {
+    // TODO - Support all pixel modes
+    if( FT_PIXEL_MODE_GRAY == srcBitmap.pixel_mode )
+    {
+      if( srcBitmap.pitch == srcBitmap.width )
+      {
+        destBitmap = BitmapImage::New( srcBitmap.width, srcBitmap.rows, Pixel::L8 );
+
+        PixelBuffer* destBuffer = destBitmap.GetBuffer();
+        memcpy( destBuffer, srcBitmap.buffer, srcBitmap.width*srcBitmap.rows );
+      }
+    }
+  }
+}
+
+bool FontClient::Plugin::FindFont( const std::string& path,
+                                   PointSize26Dot6 pointSize,
+                                   FaceIndex faceIndex,
+                                   FontId& found ) const
+{
+  for( unsigned int i=0; i<mFontCache.size(); ++i )
+  {
+    if( mFontCache[i].mPointSize == pointSize &&
+        mFontCache[i].mPath == path &&
+        mFontCache[i].mFaceIndex == faceIndex )
+    {
+      found = i + 1;
+      return true;
+    }
+  }
+
+  return false;
+}
+
+} // namespace Internal
+
+} // namespace TextAbstraction
+
+} // namespace Dali
diff --git a/text/dali/internal/text-abstraction/font-client-plugin-impl.h b/text/dali/internal/text-abstraction/font-client-plugin-impl.h
new file mode 100644 (file)
index 0000000..58163f4
--- /dev/null
@@ -0,0 +1,114 @@
+#ifndef __DALI_INTERNAL_TEXT_ABSTRACTION_FONT_CLIENT_PLUGIN_IMPL_H__
+#define __DALI_INTERNAL_TEXT_ABSTRACTION_FONT_CLIENT_PLUGIN_IMPL_H__
+
+/*
+ * Copyright (c) 2015 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// INTERNAL INCLUDES
+#include <dali/public-api/text-abstraction/font-metrics.h>
+#include <dali/internal/text-abstraction/font-client-impl.h>
+
+// EXTERNAL INCLUDES
+#include <ft2build.h>
+#include FT_FREETYPE_H
+#include FT_GLYPH_H
+#include <fontconfig/fontconfig.h>
+
+namespace Dali
+{
+
+namespace TextAbstraction
+{
+
+namespace Internal
+{
+
+struct FontClient::Plugin
+{
+  struct CacheItem
+  {
+    CacheItem( FontId id, FT_Face ftFace, const std::string& path, PointSize26Dot6 pointSize, FaceIndex face, const FontMetrics& metrics );
+
+    FT_Face mFreeTypeFace;
+    std::string mPath;
+    PointSize26Dot6 mPointSize;
+    FaceIndex mFaceIndex;
+    FontMetrics mMetrics;
+  };
+
+  Plugin( unsigned int horizontalDpi, unsigned int verticalDpi );
+
+  ~Plugin();
+
+  void Initialize();
+
+  void SetDpi( unsigned int horizontalDpi, unsigned int verticalDpi );
+
+  void GetSystemFonts( FontList& systemFonts );
+
+  void InitSystemFonts();
+
+  _FcFontSet* GetFcFontSet() const;
+
+  bool GetFcString( const FcPattern* pattern, const char* n, std::string& string );
+
+  void GetDescription( FontId id, FontDescription& fontDescription ) const;
+
+  PointSize26Dot6 GetPointSize( FontId id );
+
+  FontId FindDefaultFont( Character charcode, PointSize26Dot6 pointSize );
+
+  FontId GetFontId( const std::string& path, PointSize26Dot6 pointSize, FaceIndex faceIndex );
+
+  FontId GetFontId( const FontFamily& fontFamily,
+                    const FontStyle& fontStyle,
+                    PointSize26Dot6 pointSize,
+                    FaceIndex faceIndex );
+
+  GlyphIndex GetGlyphIndex( FontId fontId, Character charcode );
+
+  FontId CreateFont( const std::string& path, PointSize26Dot6 pointSize, FaceIndex faceIndex );
+
+  void GetFontMetrics( FontId fontId, FontMetrics& metrics );
+
+  bool GetGlyphMetrics( GlyphInfo* array, uint32_t size, bool horizontal );
+
+  BitmapImage CreateBitmap( FontId fontId, GlyphIndex glyphIndex );
+
+  void ConvertBitmap( BitmapImage& destBitmap, FT_Bitmap srcBitmap );
+
+private:
+
+  bool FindFont( const std::string& path, PointSize26Dot6 pointSize, FaceIndex faceIndex, FontId& found ) const;
+
+  FT_Library mFreeTypeLibrary;
+
+  FontList mSystemFonts;
+
+  std::vector<CacheItem> mFontCache;
+
+  unsigned int mDpiHorizontal;
+  unsigned int mDpiVertical;
+};
+
+} // namespace Internal
+
+} // namespace TextAbstraction
+
+} // namespace Dali
+
+#endif // __DALI_INTERNAL_TEXT_ABSTRACTION_FONT_CLIENT_PLUGIN_IMPL_H__
index 4b17804..940f353 100644 (file)
  */
 
 // INTERNAL INCLUDES
-#include <dali/public-api/object/base-handle.h>
 #include <dali/public-api/images/bitmap-image.h>
-#include <dali/public-api/text-abstraction/glyph-info.h>
+#include <dali/public-api/object/base-handle.h>
 #include <dali/public-api/text-abstraction/font-list.h>
-#include <dali/public-api/text-abstraction/font-metrics.h>
+#include <dali/public-api/text-abstraction/text-abstraction-definitions.h>
 
 namespace Dali
 {
@@ -31,6 +30,9 @@ namespace Dali
 namespace TextAbstraction
 {
 
+struct FontMetrics;
+struct GlyphInfo;
+
 namespace Internal DALI_INTERNAL
 {
 class FontClient;
index 874b793..bd8a3ce 100644 (file)
@@ -10,6 +10,7 @@ text_abstraction_src_files = \
    $(text_src_dir)/dali/public-api/text-abstraction/shaping.cpp \
    $(text_src_dir)/dali/internal/text-abstraction/bidirectional-support-impl.cpp \
    $(text_src_dir)/dali/internal/text-abstraction/font-client-impl.cpp \
+   $(text_src_dir)/dali/internal/text-abstraction/font-client-plugin-impl.cpp \
    $(text_src_dir)/dali/internal/text-abstraction/segmentation-impl.cpp \
    $(text_src_dir)/dali/internal/text-abstraction/shaping-impl.cpp