{ "Layer", LAYER_MEMORY_SIZE },
{ "CameraActor", CAMERA_ACTOR_MEMORY_SIZE },
{ "ImageActor", IMAGE_ACTOR_MEMORY_SIZE },
- { "TextActor", TEXT_ACTOR_MEMORY_SIZE },
{ "MeshActor", MESH_ACTOR_MEMORY_SIZE },
{ "Image", IMAGE_MEMORY_SIZE },
{ "Mesh", MESH_MEMORY_SIZE },
{
if (styleChange.defaultFontChange || styleChange.defaultFontSizeChange)
{
- mPlatformAbstraction.UpdateDefaultsFromDevice();
+ //mPlatformAbstraction.UpdateDefaultsFromDevice();
}
EmitStyleChangeSignal(styleChange);
std::string StyleMonitor::GetDefaultFontFamily() const
{
- return mPlatformAbstraction.GetDefaultFontFamily();
+ //return mPlatformAbstraction.GetDefaultFontFamily();
+ return std::string();
}
float StyleMonitor::GetDefaultFontSize() const
{
- return mPlatformAbstraction.GetDefaultFontSize();
+ //return mPlatformAbstraction.GetDefaultFontSize();
+ return float();
}
const std::string& StyleMonitor::GetTheme() const
void DALI_TEST_EQUALS( const char* str1, const std::string &str2, const char* location);
/**
- * Test whether two UTF32 strings are equal.
- * @param[in] str1 The first string
- * @param[in] str2 The second string
- * @param[in] location The TEST_LOCATION macro should be used here
- */
-template<>
-inline void DALI_TEST_EQUALS<const Integration::TextArray&>( const Integration::TextArray& str1, const Integration::TextArray& str2, const char* location)
-{
- if( !std::equal( str1.Begin(), str1.End(), str2.Begin() ) )
- {
- fprintf(stderr, "%s, checking '", location);
-
- for( unsigned int i = 0; i < str1.Count(); ++i )
- {
- fprintf(stderr, "%c", str1[i]);
- }
-
- fprintf(stderr, "' == '");
-
- for( unsigned int i = 0; i < str2.Count(); ++i )
- {
- fprintf(stderr, "%c", str2[i]);
- }
-
- fprintf(stderr, "'\n");
-
- tet_result(TET_FAIL);
- }
- else
- {
- tet_result(TET_PASS);
- }
-}
-
-/**
* Test whether one unsigned integer value is greater than another.
* Test succeeds if value1 > value2
* @param[in] value1 The first value
void TestPlatformAbstraction::LoadResource(const Integration::ResourceRequest& request)
{
std::ostringstream out;
- out << "Type:";
- if( request.GetType()->id == Integration::ResourceText )
- {
- out << "Text";
- }
- else
- {
- out << request.GetType()->id;
- }
- out << ", Path: " << request.GetPath() << std::endl ;
+ out << "Type:" << request.GetType()->id << ", Path: " << request.GetPath() << std::endl ;
mTrace.PushCall("LoadResource", out.str());
if(mRequest != NULL)
}
/**
- * @copydoc PlatformAbstraction::GetDefaultFontFamily()
- */
-const std::string& TestPlatformAbstraction::GetDefaultFontFamily() const
-{
- mTrace.PushCall("GetDefaultFontFamily", "");
- return mGetDefaultFontFamilyResult;
-}
-
-/**
- * @copydoc PlatformAbstraction::GetDefaultFontSize()
- */
-float TestPlatformAbstraction::GetDefaultFontSize() const
-{
- mTrace.PushCall("GetDefaultFontSize", "");
- return mGetDefaultFontSizeResult;
-}
-
-PixelSize TestPlatformAbstraction::GetFontLineHeightFromCapsHeight(const std::string& fontFamily, const std::string& fontStyle, CapsHeight capsHeight) const
-{
- mTrace.PushCall("GetFontLineHeightFromCapsHeight", "");
- // LineHeight will be bigger than CapsHeight, so return capsHeight + 1
- return PixelSize(capsHeight + 1);
-}
-
-/**
- * @copydoc PlatformAbstraction::GetGlyphData()
- */
-
-Integration::GlyphSet* TestPlatformAbstraction::GetGlyphData ( const Integration::TextResourceType& textRequest,
- const std::string& fontFamily,
- bool getBitmap) const
-{
- if( getBitmap )
- {
- mTrace.PushCall("GetGlyphData", "getBitmap:true");
- }
- else
- {
- mTrace.PushCall("GetGlyphData", "getBitmap:false");
- }
-
- // It creates fake metrics for the received characters.
-
- Integration::GlyphSet* set = new Dali::Integration::GlyphSet();
- Integration::BitmapPtr bitmapData;
-
- std::set<uint32_t> characters;
-
- for( Integration::TextResourceType::CharacterList::const_iterator it = textRequest.mCharacterList.begin(), endIt = textRequest.mCharacterList.end(); it != endIt; ++it )
- {
- if( characters.find( it->character ) == characters.end() )
- {
- characters.insert( it->character );
- Integration::GlyphMetrics character = {it->character, Integration::GlyphMetrics::LOW_QUALITY, 10.0f, 10.0f, 9.0f, 1.0f, 10.0f, it->xPosition, it->yPosition };
-
- if( getBitmap )
- {
- bitmapData = Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD);
- bitmapData->GetPackedPixelsProfile()->ReserveBuffer(Pixel::A8, 64, 64);
- PixelBuffer* pixelBuffer = bitmapData->GetBuffer();
- memset( pixelBuffer, it->character, 64*64 );
- }
-
- set->AddCharacter(bitmapData, character);
- }
- }
-
- set->mLineHeight = 10.0f;
- set->mAscender = 9.0f;
- set->mUnitsPerEM = 2048.0f/64.0f;
- set->SetAtlasResourceId( textRequest.mTextureAtlasId );
- set->mFontHash = textRequest.mFontHash;
-
- return set;
-}
-
-/**
- * @copydoc PlatformAbstraction::GetCachedGlyphData()
- */
-
-Integration::GlyphSet* TestPlatformAbstraction::GetCachedGlyphData( const Integration::TextResourceType& textRequest,
- const std::string& fontFamily ) const
-{
- mTrace.PushCall("GetCachedGlyphData", "");
-
- // It creates fake metrics and bitmap for received numeric characters '0' through '9'.
- Integration::GlyphSet* set = new Dali::Integration::GlyphSet();
- Integration::BitmapPtr bitmapData;
-
- std::set<uint32_t> characters;
-
- for( Integration::TextResourceType::CharacterList::const_iterator it = textRequest.mCharacterList.begin(), endIt = textRequest.mCharacterList.end(); it != endIt; ++it )
- {
- if( it->character >= '0' && it->character <= '9' && characters.find( it->character ) == characters.end() )
- {
- characters.insert( it->character );
- Integration::GlyphMetrics character = {it->character, Integration::GlyphMetrics::HIGH_QUALITY, 10.0f, 10.0f, 9.0f, 1.0f, 10.0f, it->xPosition, it->yPosition };
-
- bitmapData = Integration::Bitmap::New(Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD);
- bitmapData->GetPackedPixelsProfile()->ReserveBuffer(Pixel::A8, 64, 64);
- PixelBuffer* pixelBuffer = bitmapData->GetBuffer();
- memset( pixelBuffer, it->character, 64*64 );
- set->AddCharacter(bitmapData, character);
- }
- }
-
- set->mLineHeight = 10.0f;
- set->mAscender = 9.0f;
- set->mUnitsPerEM = 2048.0f/64.0f;
- set->SetAtlasResourceId( textRequest.mTextureAtlasId );
- set->mFontHash = textRequest.mFontHash;
-
- return set;
-}
-
-
-/**
- * @copydoc PlatformAbstraction::GetGlobalMetrics()
- */
-void TestPlatformAbstraction::GetGlobalMetrics( const std::string& fontFamily,
- const std::string& fontStyle,
- Integration::GlobalMetrics& globalMetrics ) const
-{
- globalMetrics.lineHeight = 10.0f;
- globalMetrics.ascender = 9.0f;
- globalMetrics.unitsPerEM = 2048.0f/64.0f;
- globalMetrics.underlineThickness = 2.f;
- globalMetrics.underlinePosition = 1.f;
-}
-
-/**
- * @copydoc PlatformAbstraction::GetFontPath()
- */
-std::string TestPlatformAbstraction::GetFontPath(const std::string& family, bool bold, bool italic) const
-{
- mTrace.PushCall("GetFontPath", "");
- return mGetFontPathResult;
-
- // Do nothing with arguments
-}
-
-/**
* @copydoc PlatformAbstraction::SetDpi()
*/
void TestPlatformAbstraction::SetDpi (unsigned int dpiHorizontal, unsigned int dpiVertical)
}
/**
- * @copydoc PlatformAbstraction::GetFontFamilyForChars()
- */
-const std::string& TestPlatformAbstraction::GetFontFamilyForChars(const Integration::TextArray& charsRequested) const
-{
- mTrace.PushCall("GetFontFamilyForChars", "");
- return mGetDefaultFontFamilyResult;
-}
-
-/**
- * @copydoc PlatformAbstraction::AllGlyphsSupported()
- */
-bool TestPlatformAbstraction::AllGlyphsSupported(const std::string& name, const std::string& fontStyle, const Integration::TextArray& text) const
-{
- mTrace.PushCall("AllGlyphsSupported", "");
- return true;
-}
-
-/**
- * @copydoc PlatformAbstraction::ValidateFontFamilyName()
- */
-bool TestPlatformAbstraction::ValidateFontFamilyName(const std::string& fontFamily, const std::string& fontStyle, bool& isDefaultSystemFont, std::string& closestMatch, std::string& closestStyleMatch) const
-{
- mTrace.PushCall("ValidateFontFamilyName", "");
- return true;
-}
-
-/**
- * @copydoc PlatformAbstraction::GetFontList()
- */
-void TestPlatformAbstraction::GetFontList( PlatformAbstraction::FontListMode mode, std::vector<std::string>& fonstList ) const
-{
- mFontListMode = mode;
- mTrace.PushCall("ValidateGetFontList", "");
-}
-
-/**
* @copydoc PlatformAbstraction::LoadFile()
*/
bool TestPlatformAbstraction::LoadFile( const std::string& filename, std::vector< unsigned char >& buffer ) const
mTrace.PushCall("JoinLoaderThreads", "");
}
-void TestPlatformAbstraction::UpdateDefaultsFromDevice()
-{
- mTrace.PushCall("UpdateDefaultsFromDevice", "");
- mGetDefaultFontFamilyResult+=1.0f;
-}
-
Integration::DynamicsFactory* TestPlatformAbstraction::GetDynamicsFactory()
{
mTrace.PushCall("GetDynamicsFactory", "");
return NULL;
}
-bool TestPlatformAbstraction::ReadGlobalMetricsFromCache( const std::string& fontFamily,
- const std::string& fontStyle,
- Integration::GlobalMetrics& globalMetrics )
-{
- mTrace.PushCall("ReadGlobalMetricsFromCacheFile", "");
- globalMetrics = mReadGlobalMetrics; // Want to copy contents...
- return mReadGlobalMetricsResult; // Default false (will be set to true on subsequent write)
-}
-
-void TestPlatformAbstraction::WriteGlobalMetricsToCache( const std::string& fontFamily,
- const std::string& fontStyle,
- const Integration::GlobalMetrics& globalMetrics )
-{
- // Copy so next read uses written values. TODO: Could add method
- // to turn this behaviour off for more extensive testing.
- mReadGlobalMetrics = globalMetrics;
- mReadGlobalMetricsResult = true;
-
- mTrace.PushCall("WriteGlobalMetricsToCacheFile", "");
-}
-
-bool TestPlatformAbstraction::ReadMetricsFromCache( const std::string& fontFamily,
- const std::string& fontStyle,
- std::vector<Integration::GlyphMetrics>& glyphMetricsContainer )
-{
- mTrace.PushCall("ReadMetricsFromCacheFile", "");
- glyphMetricsContainer = mReadMetrics;
- return mReadMetricsResult; // Default false (will be set to true on subsequent write)
-}
-
-void TestPlatformAbstraction::WriteMetricsToCache( const std::string& fontFamily,
- const std::string& fontStyle,
- const Integration::GlyphSet& glyphSet )
-{
- // Copy so next read uses written values. TODO: Could add method
- // to turn this behaviour off for more extensive testing.
- const Integration::GlyphSet::CharacterList& charList = glyphSet.GetCharacterList();
- mReadMetrics.clear();
- for(std::size_t i=0, end=charList.size(); i<end; ++i)
- {
- mReadMetrics.push_back(charList[i].second);
- }
- mReadMetricsResult = true;
-
- mTrace.PushCall("WriteMetricsToCacheFile", "");
-}
-
-
-void TestPlatformAbstraction::GetFileNamesFromDirectory( const std::string& directoryName,
- std::vector<std::string>& fileNames )
-{
- fileNames.push_back( std::string( "u1f004.png" ) );
- fileNames.push_back( std::string( "u1f0cf.png" ) );
- fileNames.push_back( std::string( "u1f170.png" ) );
- fileNames.push_back( std::string( "u1f601.png" ) );
-}
-
-
-Integration::BitmapPtr TestPlatformAbstraction::GetGlyphImage( const std::string& fontFamily, const std::string& fontStyle, float fontSize, uint32_t character ) const
-{
- Integration::BitmapPtr image = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
- image->GetPackedPixelsProfile()->ReserveBuffer( Pixel::RGBA8888, 1, 1 );
-
- mTrace.PushCall("GetGlyphImage", "");
-
- return image;
-}
-
-
/** Call this every test */
void TestPlatformAbstraction::Initialize()
{
mTrace.Reset();
mTrace.Enable(true);
memset(&mResources, 0, sizeof(Resources));
- memset(&mReadGlobalMetrics, 0, sizeof(Integration::GlobalMetrics));
mSeconds=0;
mMicroSeconds=0;
mIsLoadingResult=false;
- mGetDefaultFontFamilyResult = "HelveticaNeue";
- mGetDefaultFontSizeResult=12.0f;
- mGetFontPathResult="helvetica-12";
- mReadMetricsResult=false;
- mReadGlobalMetricsResult=false;
if(mRequest)
{
case CancelLoadFunc: return mTrace.FindMethod("CancelLoad");
case GetResourcesFunc: return mTrace.FindMethod("GetResources");
case IsLoadingFunc: return mTrace.FindMethod("IsLoading");
- case GetDefaultFontFamilyFunc: return mTrace.FindMethod("GetDefaultFontFamily");
- case GetDefaultFontSizeFunc: return mTrace.FindMethod("GetDefaultFontSize");
- case GetFontLineHeightFromCapsHeightFunc: return mTrace.FindMethod("GetFontLineHeightFromCapsHeight");
- case GetGlyphDataFunc: return mTrace.FindMethod("GetGlyphData");
- case GetCachedGlyphDataFunc: return mTrace.FindMethod("GetCachedGlyphData");
- case GetFontPathFunc: return mTrace.FindMethod("GetFontPath");
case SetDpiFunc: return mTrace.FindMethod("SetDpi");
case JoinLoaderThreadsFunc: return mTrace.FindMethod("JoinLoaderThreads");
- case GetFontFamilyForCharsFunc: return mTrace.FindMethod("GetFontFamilyForChars");
- case AllGlyphsSupportedFunc: return mTrace.FindMethod("AllGlyphsSupported");
- case ValidateFontFamilyNameFunc: return mTrace.FindMethod("ValidateFontFamilyName");
- case UpdateDefaultsFromDeviceFunc: return mTrace.FindMethod("UpdateDefaultsFromDevice");
case GetDynamicsFactoryFunc: return mTrace.FindMethod("GetDynamicsFactory");
- case ValidateGetFontListFunc: return mTrace.FindMethod("ValidateGetFontList");
- case ReadGlobalMetricsFromCacheFileFunc: return mTrace.FindMethod("ReadGlobalMetricsFromCacheFile");
- case WriteGlobalMetricsToCacheFileFunc: return mTrace.FindMethod("WriteGlobalMetricsToCacheFile");
- case ReadMetricsFromCacheFileFunc: return mTrace.FindMethod("ReadMetricsFromCacheFile");
- case WriteMetricsToCacheFileFunc: return mTrace.FindMethod("WriteMetricsToCacheFile");
}
return false;
}
mIsLoadingResult = result;
}
-void TestPlatformAbstraction::SetGetDefaultFontFamilyResult(std::string result)
-{
- mGetDefaultFontFamilyResult = result;
-}
-
-void TestPlatformAbstraction::SetGetDefaultFontSizeResult(float result)
-{
- mGetDefaultFontSizeResult = result;
-}
-
-void TestPlatformAbstraction::SetGetFontPathResult(std::string& result)
-{
- mGetFontPathResult = result;
-}
-
void TestPlatformAbstraction::ClearReadyResources()
{
memset(&mResources, 0, sizeof(Resources));
mSaveFileResult = result;
}
-Integration::PlatformAbstraction::FontListMode TestPlatformAbstraction::GetLastFontListMode( )
-{
- return mFontListMode;
-}
-
-void TestPlatformAbstraction::SetReadGlobalMetricsResult( bool success, Integration::GlobalMetrics& globalMetrics )
-{
- mReadGlobalMetricsResult = success;
- mReadGlobalMetrics = globalMetrics;
-}
-
-void TestPlatformAbstraction::SetReadMetricsResult( bool success, std::vector<Integration::GlyphMetrics>& glyphMetricsContainer )
-{
- mReadMetricsResult = success;
- mReadMetrics = glyphMetricsContainer; // copy
-}
-
} // namespace Dali
#include <dali/public-api/common/set-wrapper.h>
#include <dali/integration-api/platform-abstraction.h>
-#include <dali/integration-api/glyph-set.h>
#include "test-trace-call-stack.h"
virtual bool IsLoading();
/**
- * @copydoc PlatformAbstraction::GetDefaultFontFamily()
- */
- virtual const std::string& GetDefaultFontFamily() const;
-
- /**
- * @copydoc PlatformAbstraction::GetDefaultFontSize()
- */
- virtual float GetDefaultFontSize() const;
-
- /**
- * @copydoc PlatformAbstraction::GetFontLineHeightFromCapsHeight()
- */
- virtual Dali::PixelSize GetFontLineHeightFromCapsHeight(const std::string& fontFamily, const std::string& fontStyle, CapsHeight capsHeight) const;
-
- /**
- * @copydoc PlatformAbstraction::GetGlyphData()
- */
- virtual Integration::GlyphSet* GetGlyphData ( const Integration::TextResourceType& textRequest,
- const std::string& fontFamily,
- bool getBitmap) const;
-
- /**
- * @copydoc PlatformAbstraction::GetCachedGlyphData()
- */
- virtual Integration::GlyphSet* GetCachedGlyphData( const Integration::TextResourceType& textRequest,
- const std::string& fontFamily ) const;
-
-
- /**
- * @copydoc PlatformAbstraction::GetGlobalMetrics()
- */
- virtual void GetGlobalMetrics( const std::string& fontFamily,
- const std::string& fontStyle,
- Integration::GlobalMetrics& globalMetrics ) const;
-
- /**
- * @copydoc PlatformAbstraction::GetFontPath()
- */
- virtual std::string GetFontPath(const std::string& family, bool bold, bool italic) const;
-
- /**
* @copydoc PlatformAbstraction::SetDpi()
*/
virtual void SetDpi (unsigned int dpiHorizontal, unsigned int dpiVertical);
/**
- * @copydoc PlatformAbstraction::GetFontFamilyForChars()
- */
- virtual const std::string& GetFontFamilyForChars(const Integration::TextArray& charsRequested) const;
-
- /**
- * @copydoc PlatformAbstraction::AllGlyphsSupported()
- */
- virtual bool AllGlyphsSupported(const std::string& name, const std::string& fontStyle, const Integration::TextArray& text) const;
-
- /**
- * @copydoc PlatformAbstraction::ValidateFontFamilyName()
- */
- virtual bool ValidateFontFamilyName(const std::string& fontFamily, const std::string& fontStyle, bool& isDefaultSystemFont, std::string& closestMatch, std::string& closestStyleMatch) const;
-
- /**
- * @copydoc PlatformAbstraction::GetFontList()
- */
- virtual void GetFontList( PlatformAbstraction::FontListMode mode, std::vector<std::string>& fontList ) const;
-
- /**
* @copydoc PlatformAbstraction::LoadFile()
*/
virtual bool LoadFile( const std::string& filename, std::vector< unsigned char >& buffer ) const;
virtual void JoinLoaderThreads();
- virtual void UpdateDefaultsFromDevice();
-
virtual Integration::DynamicsFactory* GetDynamicsFactory();
- virtual bool ReadGlobalMetricsFromCache( const std::string& fontFamily,
- const std::string& fontStyle,
- Integration::GlobalMetrics& globalMetrics );
-
- virtual void WriteGlobalMetricsToCache( const std::string& fontFamily,
- const std::string& fontStyle,
- const Integration::GlobalMetrics& globalMetrics );
-
- virtual bool ReadMetricsFromCache( const std::string& fontFamily,
- const std::string& fontStyle,
- std::vector<Integration::GlyphMetrics>& glyphMetricsContainer );
- virtual void WriteMetricsToCache( const std::string& fontFamily,
- const std::string& fontStyle,
- const Integration::GlyphSet& glyphSet );
-
-
- virtual void GetFileNamesFromDirectory( const std::string& directoryName,
- std::vector<std::string>& fileNames );
-
- virtual Integration::BitmapPtr GetGlyphImage( const std::string& fontFamily, const std::string& fontStyle, float fontSize, uint32_t character ) const;
-
public: // TEST FUNCTIONS
// Enumeration of Platform Abstraction methods
CancelLoadFunc,
GetResourcesFunc,
IsLoadingFunc,
- GetDefaultFontFamilyFunc,
- GetDefaultFontSizeFunc,
- GetFontLineHeightFromCapsHeightFunc,
- GetGlyphDataFunc,
- GetCachedGlyphDataFunc,
SetDpiFunc,
- GetFontPathFunc,
JoinLoaderThreadsFunc,
- GetFontFamilyForCharsFunc,
- AllGlyphsSupportedFunc,
- ValidateFontFamilyNameFunc,
- UpdateDefaultsFromDeviceFunc,
- GetDynamicsFactoryFunc,
- ValidateGetFontListFunc,
- ReadGlobalMetricsFromCacheFileFunc,
- WriteGlobalMetricsToCacheFileFunc,
- ReadMetricsFromCacheFileFunc,
- WriteMetricsToCacheFileFunc,
+ GetDynamicsFactoryFunc
} TestFuncEnum;
/** Call this every test */
void SetSaveFileResult( bool result );
- PlatformAbstraction::FontListMode GetLastFontListMode( );
-
- void SetReadGlobalMetricsResult( bool success, Integration::GlobalMetrics& globalMetrics );
-
- void SetReadMetricsResult( bool success, std::vector<Integration::GlyphMetrics>& glyphMetricsContainer );
-
private:
mutable TraceCallStack mTrace;
size_t mSeconds;
size_t mMicroSeconds;
bool mIsLoadingResult;
- std::string mGetDefaultFontFamilyResult;
- float mGetDefaultFontSizeResult;
- std::string mGetFontPathResult;
Resources mResources;
Integration::ResourceRequest* mRequest;
Vector2 mSize;
Vector2 mClosestSize;
- bool mReadGlobalMetricsResult;
- bool mReadMetricsResult;
- Integration::GlobalMetrics mReadGlobalMetrics;
- std::vector<Integration::GlyphMetrics> mReadMetrics;
LoadFileResult mLoadFileResult;
bool mSaveFileResult;
- mutable FontListMode mFontListMode;
};
} // Dali
+++ /dev/null
-#ifndef __DALI_PLATFORM_FONT_CONTROLLER_H__
-#define __DALI_PLATFORM_FONT_CONTROLLER_H__
-
-/*
- * Copyright (c) 2014 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 (for TextArray)
-#include <dali/integration-api/platform-abstraction.h>
-
-// EXTERNAL INCLUDES
-#include <string>
-
-namespace Dali
-{
-
-namespace Platform
-{
-
-/**
- * Abstract interface for the font controller.
- * Hides platform specific code for managing fonts.
- */
-class FontController
-{
-public:
-
- /**
- * The mode for GetFontList()
- */
- enum FontListMode
- {
- LIST_SYSTEM_FONTS, ///< List system fonts
- LIST_APPLICATION_FONTS, ///< List application fonts
- LIST_ALL_FONTS ///< List all fonts
- };
-
- /**
- * Defines a font family with style.
- */
- typedef std::pair<std::string/*font family*/,std::string/*font style*/> StyledFontFamily;
-
- /**
- * Font list typedef.
- */
- typedef std::vector<StyledFontFamily> FontList;
-
- /**
- * Create a new font controller.
- */
- static FontController* New();
-
-
- /**
- * Destructor.
- */
- virtual ~FontController()
- {
- }
-
- /**
- * Given a font family return a font path.
- * @param[in] styledFontFamily The name of the font's family and the font's style.
- * @return font file name.
- */
- virtual const std::string& GetFontPath( const StyledFontFamily& styledFontFamily ) = 0;
-
- /**
- * Gets a list of fonts installed on the system.
- * @param[in] fontListMode which fonts to include in the list.
- * @param[out] fontList The list of font family names.
- */
- virtual void GetFontList( FontListMode fontListMode, FontList& fontList ) = 0;
-
- /**
- * Checks whether fontName is a valid font family name.
- * closestMatch is always set to the best matching font or the system default font if no near match is detected.
- * @param[in] styledFontFamily The name of the font's family and the font's style.
- * @param[out] isDefaultSystemFontFamily Whether this font has been created with a default system font family.
- * @param[out] isDefaultSystemFontStyle Whether this font has been created with a default system font style.
- * @param[out] closestStyledFontFamilyMatch The name of the font's family and the font's style found based on the given input.
- * @return true if styledFontFamily is valid, false otherwise.
- */
- virtual bool ValidateFontFamilyName( const StyledFontFamily& styledFontFamily,
- bool& isDefaultSystemFontFamily,
- bool& isDefaultSystemFontStyle,
- StyledFontFamily& closestStyledFontFamilyMatch ) = 0;
-
- /**
- * Returns font family name for displayed text.
- * If possible, the returned font name should be able to display all characters in text.
- * Otherwise returns closest match.
- * @param[in] charsRequested displayed text.
- */
- virtual const StyledFontFamily& GetFontFamilyForChars( const Integration::TextArray& charsRequested ) = 0;
-
- /**
- * Checks whether all characters of text could be displayed with specified font family.
- * @param[in] styledFontFamily The name of the font's family and the font's style.
- * @param[in] text displayed text.
- */
- virtual bool AllGlyphsSupported( const StyledFontFamily& styledFontFamily, const Integration::TextArray& text ) = 0;
-
- /**
- * Set the default font family and its style that should be used by the font controller.
- * @param[in] styledFontFamily The default name of the font's family and the default font's style.
- */
- virtual void SetDefaultFontFamily( const StyledFontFamily& styledFontFamily ) = 0;
-
-protected:
-
- /**
- * Constructor
- */
- FontController()
- {
- }
-
-private:
-
- // Undefined copy constructor.
- FontController( const FontController& );
-
- // Undefined assignment operator.
- FontController& operator=( const FontController& );
-};
-
-} // namespace Platform
-
-} // namespace Dali
-
-#endif // __DALI_PLATFORM_FONT_CONTROLLER_H__
+++ /dev/null
-#ifndef DALI_SLP_PLATFORM_METRICS_CACHE_H
-#define DALI_SLP_PLATFORM_METRICS_CACHE_H
-
-/*
- * Copyright (c) 2014 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.
- *
- */
-
-#include <dali/integration-api/glyph-set.h>
-#include <string>
-
-namespace Dali
-{
-namespace SlpPlatform
-{
-namespace MetricsCache
-{
-
-/**
- * Read from the metrics file into the global metrics parameter
- * @param[in] fontFamily The name of the font family
- * @param[in] fontStyle The name of the font style
- * @param[out] globalMetrics The data store to write into
- * @return true if the operation succeeded
- */
-bool ReadGlobal( const std::string& fontFamily, const std::string& fontStyle, Integration::GlobalMetrics& globalMetrics);
-
-/**
- * Write the global metrics parameter to the metrics file
- * @param[in] fontFamily The name of the font family
- * @param[in] fontStyle The name of the font style
- * @param[out] globalMetrics The data store to write
- */
-void WriteGlobal( const std::string& fontFamily, const std::string& fontStyle, const Integration::GlobalMetrics& globalMetrics);
-
-/**
- * Read the metrics from the given file into the supplied vector
- * @param[in] fontFamily The name of the font family
- * @param[in] fontStyle The name of the font style
- * @param[out] glyphMetricsContainer The vector of metrics to write
- * @return true if the operation succeeded
- */
-bool Read( const std::string& fontFamily, const std::string& fontStyle, std::vector<Integration::GlyphMetrics>& glyphMetricsContainer );
-
-/**
- * Write the metrics into the given file
- * @param[in] fontFamily The name of the font family
- * @param[in] fontStyle The name of the font style
- * @param[in] glyphSet The set of metrics to write
- */
-void Write( const std::string& fontFamily, const std::string& fontStyle, const Integration::GlyphSet& glyphSet );
-
-} // MetricsCache
-} // SlpPlatform
-} // Dali
-
-#endif //DALI_INTEGRATION_METRICS_CACHE_H
$(slp_platform_abstraction_src_dir)/slp-platform-abstraction.cpp \
$(slp_platform_abstraction_src_dir)/slp-logging.cpp \
$(slp_platform_abstraction_src_dir)/slp-font-configuration-parser.cpp \
- $(slp_platform_abstraction_src_dir)/font-platform/font-controller-impl.cpp \
$(slp_platform_abstraction_src_dir)/data-cache/data-cache-io.cpp \
$(slp_platform_abstraction_src_dir)/data-cache/data-cache-impl.cpp \
$(slp_platform_abstraction_src_dir)/data-cache/tests/data-cache-debug.cpp \
$(slp_platform_abstraction_src_dir)/data-cache/data-compression.cpp \
- $(slp_platform_abstraction_src_dir)/data-cache/metrics-cache.cpp \
$(slp_platform_abstraction_src_dir)/dynamics/dynamics-factory.cpp \
\
- $(slp_platform_abstraction_src_dir)/resource-loader/loader-font.cpp \
$(slp_platform_abstraction_src_dir)/resource-loader/resource-loader.cpp \
$(slp_platform_abstraction_src_dir)/resource-loader/resource-requester-base.cpp \
$(slp_platform_abstraction_src_dir)/resource-loader/resource-bitmap-requester.cpp \
$(slp_platform_abstraction_src_dir)/resource-loader/resource-model-requester.cpp \
$(slp_platform_abstraction_src_dir)/resource-loader/resource-shader-requester.cpp \
- $(slp_platform_abstraction_src_dir)/resource-loader/resource-text-requester.cpp \
\
$(slp_platform_abstraction_src_dir)/resource-loader/resource-thread-base.cpp \
$(slp_platform_abstraction_src_dir)/resource-loader/resource-thread-image.cpp \
$(slp_platform_abstraction_src_dir)/resource-loader/resource-thread-distance-field.cpp \
$(slp_platform_abstraction_src_dir)/resource-loader/resource-thread-model.cpp \
$(slp_platform_abstraction_src_dir)/resource-loader/resource-thread-shader.cpp \
- $(slp_platform_abstraction_src_dir)/resource-loader/resource-thread-text.cpp \
\
$(slp_platform_abstraction_src_dir)/resource-loader/binary-model-builder.cpp \
\
+++ /dev/null
-/*
- * Copyright (c) 2014 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 "font-controller-impl.h"
-
-// INTERNAL HEADERS
-#include <dali/public-api/common/dali-common.h>
-#include <dali/integration-api/debug.h>
-
-// EXTERNAL HEADERS
-#include <fontconfig/fontconfig.h>
-
-
-namespace Dali
-{
-
-namespace SlpPlatform
-{
-
-#if defined(DEBUG_ENABLED)
-namespace
-{
-Dali::Integration::Log::Filter* gLogFilter = Dali::Integration::Log::Filter::New(Debug::Concise, false, "LOG_FONT_CONTROLLER");
-} // unnamed namespace
-#endif
-
-namespace
-{
-const std::string SETTING_FONT_PRELOAD_FONT_PATH( FONT_PRELOADED_PATH );
-const std::string SETTING_FONT_DOWNLOADED_FONT_PATH( FONT_DOWNLOADED_PATH );
-const std::string SETTING_FONT_APP_FONT_PATH( FONT_APPLICATION_PATH );
-
-const uint32_t UNICODE_CR_LF = 0x85;
-const uint32_t UNICODE_CHAR_START = 0x20; // start range of unicode characters (below are control chars)
-const std::string FONT_FORMAT( "TrueType" );
-const std::string DEFAULT_FONT_FAMILY_NAME( "Tizen" );
-const std::string DEFAULT_FONT_STYLE( "Regular" );
-
-const std::string NULL_FONT_FAMILY_NAME( "" );
-const FontController::StyledFontFamily NULL_STYLED_FONT_FAMILY( std::make_pair( NULL_FONT_FAMILY_NAME, std::string( "" ) ) );
-
-/**
- * @param[in] pattern pointer to a font config pattern
- * @param[out] familyName font family name or an empty string if the font is not found.
- * @return Whether a font is found.
- */
-bool GetFontFamily( const FcPattern* pattern, std::string& familyName )
-{
- FcChar8* family = NULL;
- const FcResult retVal = FcPatternGetString( pattern, FC_FAMILY, 0u, &family );
-
- if( FcResultMatch != retVal )
- {
- familyName.clear();
- return false;
- }
-
- // Have to use reinterpret_cast because FcChar8 is unsigned char*, not a const char*.
- familyName.assign( reinterpret_cast<const char*>( family ) );
-
- return true;
-}
-
-/**
- * @param[in] pattern pointer to a font config pattern
- * @param[out] fontStyle font style name or an empty string if the font has no style.
- * @return Whether a font style is found.
- */
-bool GetFontStyle( const FcPattern* pattern, std::string& fontStyle )
-{
- FcChar8* style = NULL;
- const FcResult retVal = FcPatternGetString( pattern, FC_STYLE, 0u, &style );
-
- if( FcResultMatch != retVal)
- {
- // Has no style.
- fontStyle.clear();
- return false;
- }
-
- // Have to use reinterpret_cast because FcChar8 is unsigned char*, not a const char*.
- fontStyle.assign( reinterpret_cast<const char*>( style ) );
-
- return true;
-}
-
-/**
- * @param[in] pattern pointer to a font config pattern
- * @param[out] fileName font file name or an empty string if the font is not found.
- * @return Whether a font is found.
- */
-bool GetFileName( const FcPattern* pattern, std::string& fileName )
-{
- FcChar8* file = NULL;
- const FcResult retVal = FcPatternGetString( pattern, FC_FILE, 0u, &file );
-
- if( FcResultMatch != retVal )
- {
- // Has no file name.
- fileName.clear();
- return false;
- }
-
- // Have to use reinterpret_cast because FcChar8 is unsigned char*, not a const char*.
- fileName.assign( reinterpret_cast<const char*>( file ) );
-
- return true;
-}
-
-bool CheckFontInstallPath( FontController::FontListMode listMode, const std::string& fileName )
-{
- switch( listMode )
- {
- case FontController::LIST_SYSTEM_FONTS:
- {
- const std::string& preloadPath( SETTING_FONT_PRELOAD_FONT_PATH );
- const std::string& downloadPath( SETTING_FONT_DOWNLOADED_FONT_PATH );
- const std::size_t preloadLength = preloadPath.length();
- const std::size_t downloadLength = downloadPath.length();
-
- if( ( 0u == preloadPath.compare( 0u, preloadLength, fileName, 0u, preloadLength ) ) ||
- ( 0u == downloadPath.compare( 0u, downloadLength, fileName, 0u, downloadLength ) ) )
- {
- return true;
- }
- return false;
- }
- case FontController::LIST_APPLICATION_FONTS:
- {
- const std::string& appPath( SETTING_FONT_APP_FONT_PATH );
- const std::size_t appLength = appPath.length();
-
- if( 0u == appPath.compare( 0u, appLength, fileName, 0u, appLength ) )
- {
- return true;
- }
- return false;
- }
- default:
- {
- DALI_ASSERT_DEBUG( false && "unhandled FontListMode" );
- return false;
- }
- }
-}
-
-} // unnamed namespace
-
-FontController::FontController()
-{
- FcInit();
- FcConfigEnableHome(true);
-}
-
-FontController::~FontController()
-{
- // clear the font family cache
- ClearFontFamilyCache();
-
- // Clear the preferred font list.
- ClearPreferredFontList();
-}
-
-const std::string& FontController::GetFontPath( const StyledFontFamily& styledFontFamily )
-{
- DALI_ASSERT_DEBUG( !styledFontFamily.first.empty() && !styledFontFamily.second.empty() && "FontController::GetFontPath(): The font name or the font style is empty. Probably they have not been validated." );
-
- // lock the mFontFamilyCacheMutex and don't release it until the function finishes.
- // If we release it then another thread may try to create the same duplicate data.
- boost::mutex::scoped_lock lock( mFontFamilyCacheMutex );
-
- StyledFontFamily closestStyledFontFamilyMatch;
-
- // first check to see if the font has been matched before.
- closestStyledFontFamilyMatch = GetMatchedFont( styledFontFamily );
-
- if( closestStyledFontFamilyMatch.first.empty() )
- {
- // The font is not in the matches font cache. Use the given one.
- closestStyledFontFamilyMatch = styledFontFamily;
- }
-
- return GetCachedFontPath( closestStyledFontFamilyMatch );
-}
-
-void FontController::GetFontList( FontListMode fontListMode, FontList& fontList )
-{
- // protect the mFontList from access by multiple threads
- // this is locked for the entire function, because we don't want two functions
- // trying to fill the cache with duplicate data.
- boost::mutex::scoped_lock sharedDatalock( mFontListMutex );
-
- // if we have already scanned for fonts, return the cached values
- if ( !mFontSystemList.empty() )
- {
- GetCachedFontList( fontListMode, fontList );
-
- return;
- }
-
- // font list needs to be cached
-
- // font config isn't thread safe
- boost::mutex::scoped_lock lock( mFontConfigMutex );
-
- // use font config to get the font set which contains a list of fonts
- FcFontSet* fontSet = GetFontSet();
-
- DALI_LOG_INFO( gLogFilter, Debug::Verbose, "number of fonts found: %d\n", fontSet->nfont );
-
- if( fontSet )
- {
- std::string preload_path(SETTING_FONT_PRELOAD_FONT_PATH);
- std::string download_path(SETTING_FONT_DOWNLOADED_FONT_PATH);
- std::string application_path(SETTING_FONT_APP_FONT_PATH);
-
- for( int i = 0u; i < fontSet->nfont; ++i )
- {
- FcPattern* fontPattern = fontSet->fonts[i];
- std::string fileName;
-
- if( !GetFileName( fontPattern, fileName ) )
- {
- continue; // Has no file name. Jump to the next iteration.
- }
-
- // this is checking to make sure the font is in either the normal font path, or download path
- if( 0u == preload_path.compare( 0u, preload_path.length(), fileName, 0u, preload_path.length() ) ||
- 0u == download_path.compare( 0u, download_path.length(), fileName, 0u, download_path.length() ) ||
- 0u == application_path.compare( 0u, application_path.length(), fileName, 0u, application_path.length() ) )
- {
- StyledFontFamily styledFontFamily;
-
- if( !GetFontFamily( fontPattern, styledFontFamily.first ) )
- {
- continue; // Has no font name. Jump to the next iteration.
- }
-
- GetFontStyle( fontPattern, styledFontFamily.second );
-
- // Add the font to the either the system or application font list
- AddToFontList( fileName, styledFontFamily );
- }
- }
- // delete the font set
- FcFontSetDestroy( fontSet );
- }
- else
- {
- DALI_ASSERT_ALWAYS( false && "No valid fonts found on system." );
- }
-
- // return the font list for the specified mode
- GetCachedFontList( fontListMode, fontList );
-}
-
-bool FontController::ValidateFontFamilyName( const StyledFontFamily& styledFontFamily,
- bool& isDefaultSystemFontFamily,
- bool& isDefaultSystemFontStyle,
- StyledFontFamily& closestStyledFontFamilyMatch )
-{
- // Initialize the defaults to false as the validation process supposes the given font is correct.
- isDefaultSystemFontFamily = false;
- isDefaultSystemFontStyle = false;
-
- // default the closest Match to empty
- closestStyledFontFamilyMatch.first.clear();
- closestStyledFontFamilyMatch.second.clear();
-
- // lock the mFontFamilyCacheMutex and don't release it until the function finishes.
- // If we release it then another thread may try to create the same duplicate data.
- boost::mutex::scoped_lock lock( mFontFamilyCacheMutex );
-
- StyledFontFamily styledFontFamilyToCheck = styledFontFamily;
-
- // if the font is blank, then use the default font if it has been cached
- if( styledFontFamilyToCheck.first.empty() && ( !mDefaultStyledFont.first.empty() ) )
- {
- styledFontFamilyToCheck.first = mDefaultStyledFont.first;
-
- // No font family is given, default system font is used.
- isDefaultSystemFontFamily = true;
- }
-
- if( styledFontFamilyToCheck.second.empty() && ( !mDefaultStyledFont.second.empty() ) )
- {
- styledFontFamilyToCheck.second = mDefaultStyledFont.second;
-
- // No font style is given, default system font is used.
- isDefaultSystemFontStyle = true;
- }
-
- // first check to see if the font has been matched before.
- closestStyledFontFamilyMatch = GetMatchedFont( styledFontFamilyToCheck );
-
- if( !closestStyledFontFamilyMatch.first.empty() )
- {
- // The font has been cached before.
- return true;
- }
-
- // check the cache
- const std::string& fontFileName = GetCachedFontPath( styledFontFamilyToCheck );
-
- if( !fontFileName.empty() )
- {
- // The font has been cached before.
-
- closestStyledFontFamilyMatch = styledFontFamilyToCheck;
-
- return true;
- }
-
- DALI_LOG_INFO( gLogFilter, Debug::Verbose,"Failed to find %s %s in cache, querying FontConfig for a match\n", styledFontFamily.first.c_str(), styledFontFamily.second.c_str() );
-
- // it's not in the cache, find a match using font config and add it to the cache
- boost::mutex::scoped_lock fcLock( mFontConfigMutex );
-
- // create the pattern
- FcPattern* fontFamilyPattern = CreateFontFamilyPattern( styledFontFamilyToCheck );
-
- FcResult result(FcResultMatch);
-
- // match the pattern
- FcPattern* match = FcFontMatch( NULL /* use default configure */, fontFamilyPattern, &result );
-
- bool validFont = false;
-
- if( match )
- {
- validFont = true;
-
- CacheFontInfo( match, styledFontFamilyToCheck, closestStyledFontFamilyMatch );
-
- // destroyed the matched pattern
- FcPatternDestroy( match );
- }
- else
- {
- DALI_LOG_ERROR( "FcFontMatch failed for font %s %s\n", styledFontFamilyToCheck.first.c_str(), styledFontFamilyToCheck.second.c_str() );
- }
-
- // destroy the pattern
- FcPatternDestroy( fontFamilyPattern );
-
- return validFont;
-}
-
-const FontController::StyledFontFamily& FontController::GetFontFamilyForChars( const Integration::TextArray& charsRequested )
-{
- if( 0u == mPreferredFonts.Count() )
- {
- CreatePreferedFontList();
- }
-
- // Cycle through the preferred list of fonts on the system for 'Tizen'.
- for( std::size_t n = 0u; n < mPreferredFonts.Count(); ++n )
- {
- const StyledFontFamily& font = *mPreferredFonts[n];
-
- if( !mPreferredFontsValidated[n] )
- {
- // First make sure it is validated and cached so we can access it's character set object
- bool isDefaultSystemFontFamily = false;
- bool isDefaultSystemFontStyle = false;
- StyledFontFamily closestStyledFontFamilyMatch;
- ValidateFontFamilyName( font,
- isDefaultSystemFontFamily,
- isDefaultSystemFontStyle,
- closestStyledFontFamilyMatch );
-
- mPreferredFontsValidated[n] = true;
- }
-
- const std::string& filePath = GetFontPath( font );
-
- if( filePath.empty() )
- {
- continue;
- }
-
- const bool matched = FontFamilySupportsText( font, charsRequested );
- if( matched )
- {
- return font;
- }
- }
-
- // return empty string
- return NULL_STYLED_FONT_FAMILY;
-}
-
-void FontController::CacheFontInfo( FcPattern* pattern, const StyledFontFamily& inputStyledFontFamily, StyledFontFamily& closestStyledFontFamilyMatch )
-{
- // Check we can get the following data from the pattern
-
- if( !GetFontFamily( pattern, closestStyledFontFamilyMatch.first ) )
- {
- DALI_LOG_INFO( gLogFilter, Debug::Verbose, "CacheFontInfo failed to get family information from pattern %s %s\n", inputStyledFontFamily.first.c_str(), inputStyledFontFamily.second.c_str() );
- return;
- }
-
- std::string fileName;
- if( !GetFileName( pattern, fileName ) )
- {
- DALI_LOG_INFO( gLogFilter, Debug::Verbose, "CacheFontInfo failed to get file information from pattern %s %s\n", inputStyledFontFamily.first.c_str(), inputStyledFontFamily.second.c_str() );
- return;
- }
-
- FcCharSet* matchedCharSet = NULL;
- const FcResult retVal = FcPatternGetCharSet( pattern, FC_CHARSET, 0u, &matchedCharSet );
- if( retVal != FcResultMatch )
- {
- DALI_LOG_INFO( gLogFilter, Debug::Verbose, "CacheFontInfo failed to get character set from pattern %s %s\n", inputStyledFontFamily.first.c_str(), inputStyledFontFamily.second.c_str() );
- return;
- }
-
- GetFontStyle( pattern, closestStyledFontFamilyMatch.second );
-
- // Add the match to the font cache
- AddCachedFont( closestStyledFontFamilyMatch, fileName, matchedCharSet );
-
- if( ( !inputStyledFontFamily.first.empty() &&
- ( inputStyledFontFamily.first != closestStyledFontFamilyMatch.first ) ) &&
- ( !inputStyledFontFamily.second.empty() &&
- ( inputStyledFontFamily.second != closestStyledFontFamilyMatch.second ) ) )
- {
- // if the font family used to create the pattern was not found in the match then
- // store it in the MissingFont container
- AddMatchedFont( inputStyledFontFamily, closestStyledFontFamilyMatch );
- }
-}
-
-bool FontController::AllGlyphsSupported( const StyledFontFamily& styledFontFamily, const Integration::TextArray& text )
-{
- // The font has already been validated by the font implementation.
-
- return FontFamilySupportsText( styledFontFamily, text );
-}
-
-void FontController::SetDefaultFontFamily( const StyledFontFamily& styledFontFamily )
-{
- // reload font configuration files
- const bool ok = FcInitReinitialize();
- DALI_ASSERT_ALWAYS( ok && "FcInitReinitialize failed");
-
- CreatePreferedFontList();
-}
-
-void FontController::AddCachedFont( const StyledFontFamily& styledFontFamily, const std::string& fontPath, _FcCharSet *characterSet )
-{
- FontFamilyLookup::const_iterator iter = mFontFamilyCache.find( styledFontFamily );
- if( iter == mFontFamilyCache.end() )
- {
- // store the path and chacter set
- FontCacheItem item;
- item.FontFileName = fontPath;
- item.FcCharSet = FcCharSetCopy( characterSet ); // increase the ref count on the char set
- mFontFamilyCache[ styledFontFamily ] = item;
-
- DALI_LOG_INFO( gLogFilter, Debug::Verbose, "Caching font %s %s\n", styledFontFamily.first.c_str(), styledFontFamily.second.c_str() );
- }
-}
-
-void FontController::GetCachedFontList( FontListMode fontListMode, FontList& fontList ) const
-{
- // return a list of fonts, for the FontListMode
- switch( fontListMode )
- {
- case LIST_SYSTEM_FONTS:
- {
- fontList.insert( fontList.end(), mFontSystemList.begin(), mFontSystemList.end() );
- return;
- }
- case LIST_APPLICATION_FONTS:
- {
- fontList.insert( fontList.end(), mFontApplicationList.begin(), mFontApplicationList.end() );
- return;
- }
- case LIST_ALL_FONTS:
- {
- // add both system and application fonts together
- fontList.insert( fontList.end(), mFontSystemList.begin(), mFontSystemList.end() );
- fontList.insert( fontList.end(), mFontApplicationList.begin(), mFontApplicationList.end() );
- return;
- }
- }
- DALI_ASSERT_ALWAYS( false && "GetCachedFontList called with invalid value." );
-}
-
-const std::string& FontController::GetCachedFontPath( const StyledFontFamily& styledFontFamily ) const
-{
- if( !mFontFamilyCache.empty() )
- {
- FontFamilyLookup::const_iterator iter = mFontFamilyCache.find( styledFontFamily );
- if( iter != mFontFamilyCache.end() )
- {
- return (*iter).second.FontFileName;
- }
- }
-
- return NULL_FONT_FAMILY_NAME;
-}
-
-FcCharSet* FontController::GetCachedFontCharacterSet( const StyledFontFamily& styledFontFamily ) const
-{
- if( !mFontFamilyCache.empty() )
- {
- FontFamilyLookup::const_iterator iter = mFontFamilyCache.find( styledFontFamily );
- if( iter != mFontFamilyCache.end() )
- {
- return (*iter).second.FcCharSet;
- }
- }
- return NULL;
-}
-
-_FcPattern* FontController::CreateFontFamilyPattern( const StyledFontFamily& styledFontFamily )
-{
- // 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();
-
- // add a property to the pattern for the font family
- FcPatternAddString( fontFamilyPattern, FC_FAMILY, reinterpret_cast<const FcChar8*>( styledFontFamily.first.c_str() ) );
-
- // add a property to the pattern for the font family
- FcPatternAddString( fontFamilyPattern, FC_STYLE, reinterpret_cast<const FcChar8*>( styledFontFamily.second.c_str() ) );
-
- // Add a property of the pattern, to say we want to match TrueType fonts
- FcPatternAddString( fontFamilyPattern , FC_FONTFORMAT, reinterpret_cast<const FcChar8*>( FONT_FORMAT.c_str() ) );
-
- // modify the config, with the mFontFamilyPatterm
- FcConfigSubstitute( NULL /* 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 );
-
- return fontFamilyPattern;
-}
-
-bool FontController::IsAControlCharacter( uint32_t character ) const
-{
- // UNICODE_CHAR_START is the space character
- // below it are the control characters that we want to ignore.
-
- return( ( character < UNICODE_CHAR_START ) ||
- ( character == UNICODE_CR_LF ) );
-}
-
-bool FontController::FontFamilySupportsText( const StyledFontFamily& styledFontFamily, const Integration::TextArray& text )
-{
- FcCharSet* charSet = GetCachedFontCharacterSet( styledFontFamily );
-
- DALI_ASSERT_ALWAYS( charSet && "No cached character set for font family" );
-
- const size_t textLength = text.Count();
-
- // quick early exit before accessing font config for text arrays which are just a single control character
- if( textLength == 1u )
- {
- if( IsAControlCharacter( *text.Begin() ) )
- {
- return true;
- }
- }
-
- // protect font config
- boost::mutex::scoped_lock fcLock( mFontConfigMutex );
-
- for( Integration::TextArray::ConstIterator iter = text.Begin(), endIter = text.End(); iter != endIter; ++iter )
- {
- const uint32_t character = (*iter);
-
- // if it's a control character then don't test it
- if( IsAControlCharacter( character ) )
- {
- continue;
- }
-
- // test to see if the character set supports the character
- if( !FcCharSetHasChar( charSet, character ) )
- {
- return false;
- }
- }
- return true;
-}
-
-void FontController::ClearFontFamilyCache()
-{
- // should be called by the destructor only
-
- for( FontFamilyLookup::iterator iter = mFontFamilyCache.begin(), enditer = mFontFamilyCache.end(); iter != enditer; ++iter )
- {
- FontCacheItem& cacheItem = (*iter).second;
-
- // this reduces the character sets ref count by 1.
- FcCharSetDestroy( cacheItem.FcCharSet );
- }
-
- mFontFamilyCache.clear();
-}
-
-void FontController::AddToFontList( const std::string& fileName, const StyledFontFamily& styledFontFamily )
-{
- const bool systemFont = CheckFontInstallPath( LIST_SYSTEM_FONTS, fileName );
-
- FontList* fontList(NULL);
-
- if( systemFont )
- {
- fontList = &mFontSystemList;
- }
- else
- {
- fontList = &mFontApplicationList;
- }
-
- // check the font family doesn't already exist in the vector, then add it
- if( fontList->end() == std::find( fontList->begin(), fontList->end(), styledFontFamily ) )
- {
- fontList->push_back( styledFontFamily );
- }
-}
-
-_FcFontSet* FontController::GetFontSet() 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_FAMILY );
- FcObjectSetAdd( objectSet, FC_STYLE );
- FcObjectSetAdd( objectSet, FC_FILE );
-
- // 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;
-}
-
-_FcCharSet* FontController::CreateCharacterSet( const Integration::TextArray& charsRequested )
-{
- // create the character set object
- FcCharSet* charSet = FcCharSetCreate();
-
- bool validCharAdded(false);
-
- // add valid characters to the character set.
- for( Integration::TextArray::ConstIterator iter = charsRequested.Begin(), endIter = charsRequested.End(); iter != endIter; ++iter )
- {
- const uint32_t character = (*iter);
-
- // if it's not a control character then add it
- if( !IsAControlCharacter( character ) )
- {
- FcBool ok = FcCharSetAddChar( charSet, character );
- if( ok )
- {
- validCharAdded = true;
- }
- }
- }
- // if no characters have been added to the character set, then return null
- if( !validCharAdded )
- {
- FcCharSetDestroy(charSet);
- return NULL;
- }
- return charSet;
-}
-
-void FontController::AddMatchedFont( const StyledFontFamily& missingStyledFontFamily, StyledFontFamily& closestStyledFontFamilyMatch )
-{
- // we store the missing font, and the name of the font that font config found as the closet match
- mMatchedFontsFound[ missingStyledFontFamily ] = closestStyledFontFamilyMatch;
-}
-
-const FontController::StyledFontFamily& FontController::GetMatchedFont( const StyledFontFamily& styledFontFamily ) const
-{
- if( mMatchedFontsFound.empty() )
- {
- return NULL_STYLED_FONT_FAMILY;
- }
-
- MatchedFontLookup::const_iterator iter = mMatchedFontsFound.find( styledFontFamily );
- if( iter != mMatchedFontsFound.end() )
- {
- return iter->second;
- }
-
- return NULL_STYLED_FONT_FAMILY;
-}
-
-void FontController::CreatePreferedFontList( )
-{
- StyledFontFamily tizenFont;
- tizenFont.first = DEFAULT_FONT_FAMILY_NAME;
- tizenFont.second = DEFAULT_FONT_STYLE;
-
- // clear the current list
- ClearPreferredFontList();
-
- FcPattern* searchPattern = CreateFontFamilyPattern( tizenFont );
-
- FcResult result(FcResultMatch);
-
- // Match the pattern.
- StyledFontFamily previousFont;
-
- FcFontSet* fontSet = FcFontSort( NULL /* use default configure */, searchPattern, false /* don't trim */, NULL, &result );
-
- for( int i = 0u; i < fontSet->nfont; ++i )
- {
- // we have already filled in the first entry with the default font
- FcPattern* pattern = fontSet->fonts[i];
-
- StyledFontFamily* styledFont = new StyledFontFamily();
-
- GetFontFamily( pattern, styledFont->first );
- GetFontStyle( pattern, styledFont->second );
-
- bool releaseMemory = true;
- if( *styledFont != previousFont )
- {
- mPreferredFonts.PushBack( styledFont );
- releaseMemory = false;
- }
- if( i == 0u )
- {
- mDefaultStyledFont = *styledFont;
- }
- previousFont = *styledFont;
-
- if( releaseMemory )
- {
- delete styledFont;
- }
- }
-
- // Set all fonts to non validated.
- mPreferredFontsValidated.Resize( fontSet->nfont, false );
-
- FcPatternDestroy( searchPattern );
- FcFontSetDestroy( fontSet );
-}
-
-void FontController::ClearPreferredFontList()
-{
- for( Vector<StyledFontFamily*>::Iterator it = mPreferredFonts.Begin(), endIt = mPreferredFonts.End(); it != endIt; ++it )
- {
- delete *it;
- }
- mPreferredFonts.Clear();
-}
-
-} // namespace SlpPlatform
-
-} // namespace Dali
-
-// Implementation of Dali::Platform::FontController::New()
-Dali::Platform::FontController* Dali::Platform::FontController::New()
-{
- return new Dali::SlpPlatform::FontController();
-}
+++ /dev/null
-#ifndef __DALI_SLP_PLATFORM_FONT_CONTROLLER_H__
-#define __DALI_SLP_PLATFORM_FONT_CONTROLLER_H__
-
-/*
- * Copyright (c) 2014 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 "../../interfaces/font-controller.h"
-#include <dali/public-api/common/dali-vector.h>
-#include <dali/public-api/common/map-wrapper.h>
-
-// EXTERNAL INCLUDES
-#include <boost/thread.hpp>
-
-
-// forward declarations of font config types
-struct _FcConfig;
-struct _FcPattern;
-struct _FcCharSet;
-struct _FcFontSet;
-
-namespace Dali
-{
-
-namespace SlpPlatform
-{
-
-typedef Dali::Platform::FontController::FontList FontList;
-
-/**
- * concrete interface for the SLP font controller.
- *
- * Font controller currently caches the following:
- * - List of fonts on the system, if the user calls GetFontList()
- * - List of fonts used by the application with both its filename and character set
- *
- * When searching for a font that can display a string of text, the follow occurs:
- *
- * - 1. Check the last used font to see if it supports the text
- * - 2. If 1 fails, check all other Fonts in the cache to see if they support the text
- * - 3. If 2 fails, use FontConfig to find a font which supports the text, then cache that font.
- *
- * Suggested future improvements:
- * Stop using FontConfig library, instead use FreeType directly to query and cache font family names and
- * character sets. Then parse the font config configuration file directly to get the system preferred fonts etc.
- */
-class FontController : public Platform::FontController
-{
-public:
-
- /**
- * Constructor
- */
- FontController();
-
- /**
- * Destructor
- */
- virtual ~FontController();
-
- /**
- * Internally caches the font file name for every font family passed in
- * @copydoc Dali::Platform::FontController::GetFontPath()
- */
- virtual const std::string& GetFontPath( const StyledFontFamily& styledFontFamily );
-
- /**
- * Internally caches the font list the first time it is called.
- * @copydoc Dali::Platform::FontController::GetFontList()
- */
- virtual void GetFontList( FontListMode fontListMode, FontList& fontList );
-
- /**
- * @copydoc Dali::Platform::FontController::ValidateFontFamilyName()
- */
- virtual bool ValidateFontFamilyName( const StyledFontFamily& styledFontFamily,
- bool& isDefaultSystemFontFamily,
- bool& isDefaultSystemFontStyle,
- StyledFontFamily& closestStyledFontFamilyMatch );
-
- /**
- * @copydoc Dali::Platform::FontController::GetFontFamilyForChars()
- */
- virtual const StyledFontFamily& GetFontFamilyForChars( const Integration::TextArray& charsRequested);
-
- /**
- * @copydoc Dali::Platform::FontController::AllGlyphsSupported()
- */
- virtual bool AllGlyphsSupported( const StyledFontFamily& styledFontFamily, const Integration::TextArray& text );
-
- /**
- * @copydoc Dali::Platform::FontController::SetDefaultFontFamily()
- */
- virtual void SetDefaultFontFamily( const StyledFontFamily& styledFontFamily );
-
-private:
-
- /**
- * Gets a cached font list
- * @param[in] fontListMode the font list mode
- * @return font list
- */
- void GetCachedFontList( FontListMode fontListMode, FontList& fontList ) const;
-
- /**
- * returns the font path given a font family.
- * @param[in] styledFontFamily The name of the font's family and the font's style.
- * @return The font's file name path.
- */
- const std::string& GetCachedFontPath( const StyledFontFamily& styledFontFamily ) const;
-
- /**
- * returns the cached character set for a font family.
- * @param[in] styledFontFamily The name of the font's family and the font's style.
- * @return pointer to font configs character set object.
- *
- */
- _FcCharSet* GetCachedFontCharacterSet( const StyledFontFamily& styledFontFamily ) const;
-
- /**
- * Add a font path to the font path cache.
- * @param[in] styledFontFamily The name of the font's family and the font's style.
- * @param[in] fontPath font path.
- * @param[in] characterSet font config character set object (not const because it's ref count is increased).
- */
- void AddCachedFont( const StyledFontFamily& styledFontFamily, const std::string& fontPath, _FcCharSet *characterSet );
-
- /**
- * Store information held in a fontconfig pattern, into the font cache.
- * Stores font name, filename and character set.
- * @param[in] pattern pointer to a font config pattern.
- * @param[in] inputStyledFontFamily font family name with its style used to perform the pattern match.
- * @param[out] closestStyledFontFamilyMatch matched family name and style.
- */
- void CacheFontInfo( _FcPattern* pattern, const StyledFontFamily& inputStyledFontFamily, StyledFontFamily& closestStyledFontFamilyMatch );
-
- /**
- * Create a pattern for font lookups.
- * @param[in] styledFontFamily The name of the font's family and the font's style.
- */
- _FcPattern* CreateFontFamilyPattern( const StyledFontFamily& styledFontFamily );
-
- /**
- * Checks whether a character is a control character.
- */
- bool IsAControlCharacter( uint32_t character ) const;
-
- /**
- * Checks cached fonts to see if they support the text.
- * @param styledFontFamily The name of the font's family and the font's style.
- * @param text text array.
- * @return true if the font family supports the text false if not.
- */
- bool FontFamilySupportsText( const StyledFontFamily& styledFontFamily, const Integration::TextArray& text );
-
- /**
- * Clear the font family cache.
- * Should only be called by the destructor.
- */
- void ClearFontFamilyCache();
-
- /**
- * Adds a font to the cached font list.
- * Checks for duplicates.
- * @param fileName the font full filename with path
- * @param styledFontFamily The name of the font's family and the font's style.
- */
- void AddToFontList( const std::string& fileName, const StyledFontFamily& styledFontFamily );
-
- /**
- * Returns a FontConfig font set, which has a list of fonts.
- * @return pointer to _FcFontSet struct.
- */
- _FcFontSet* GetFontSet() const;
-
- /**
- * Create a font config character set object, using the text string.
- * @param charsRequested array of characters.
- * @return a pointer to _FcCharSet object on success, NULL on failure.
- */
- _FcCharSet* CreateCharacterSet( const Integration::TextArray& charsRequested );
-
- /**
- * Add a font that has not been found on the system but a match has been found.
- * @param[in] missingStyledFontFamily the missing font and its style to add.
- * @param[in] closestStyledFontFamilyMatch it's nearest font and its style match.
- */
- void AddMatchedFont( const StyledFontFamily& missingStyledFontFamily, StyledFontFamily& closestStyledFontFamilyMatch );
-
- /**
- * Check the cache to see if a font and its style has been added to the missing fonts list.
- * @param styledFontFamily the font and its style to check.
- * @return the closest styled font that the missing styled font has been matched with by font-config.
- */
- const StyledFontFamily& GetMatchedFont( const StyledFontFamily& styledFontFamily ) const;
-
- /**
- * Create a preferred list of fonts to use for when GetFontFamilyForChars() is called.
- */
- void CreatePreferedFontList();
-
- /**
- * Deletes all preferred fonts.
- */
- void ClearPreferredFontList();
-
- /**
- * Font cache item.
- */
- struct FontCacheItem
- {
- std::string FontFileName; ///< font file name
- _FcCharSet* FcCharSet; ///< font config character set, used to test if a character is supported
- };
-
- typedef std::map<StyledFontFamily, FontCacheItem> FontFamilyLookup; ///< lookup for font names and font cache itmes
-
- typedef std::map<StyledFontFamily, StyledFontFamily> MatchedFontLookup; ///< lookup for fonts that don't exist, and their nearest match return by FontConfig
-
- boost::mutex mFontConfigMutex; ///< FontConfig needs serializing because it isn't thread safe
- boost::mutex mFontFamilyCacheMutex; ///< to protect the FontFamilyCache data
- boost::mutex mFontListMutex; ///< to prevent more than one thread creating the font list data
-
- StyledFontFamily mDefaultStyledFont; ///< default font
-
- FontList mFontSystemList; ///< cached list of system fonts
- FontList mFontApplicationList; ///< cached list of application fonts
-
- FontFamilyLookup mFontFamilyCache; ///< cache of font names and corresponding font cache items
- MatchedFontLookup mMatchedFontsFound; ///< lookup for fonts that haven't been found on the sytem, and the nearest matching font.
- Vector<StyledFontFamily*> mPreferredFonts; ///< Ordered list of preferred fonts.
- Vector<bool> mPreferredFontsValidated; ///< Stores which of the prefered fonts have been validated.
-
-};
-
-} // namespace SlpPlatform
-
-} // namespace Dali
-
-#endif // __DALI_SLP_PLATFORM_FONT_CONTROLLER_H__
#if defined(DEBUG_ENABLED)
-#include <iostream>
-#include <sstream>
-#include <string>
-#include <dali/integration-api/glyph-set.h>
-
namespace Dali
{
namespace SlpPlatform
*/
Debug::Filter* gLoaderFilter = Debug::Filter::New(Debug::Concise, false, "LOG_RESOURCE_LOADER");
-
-std::string DebugRequestList(TextResourceType::CharacterList& chars)
-{
- std::string textString;
-
- for(std::size_t i=0, length=chars.size(); i<length; i++)
- {
- std::ostringstream oss;
- const TextResourceType::GlyphPosition& glyph = chars[i];
- oss << static_cast<char>(glyph.character) << "(" << glyph.xPosition << "," << glyph.yPosition
- << " " << (glyph.quality?"Hg":"Lw") << " " << (glyph.loaded?"LD":"UN") << ") ";
- textString.append(oss.str());
- }
- return textString;
-}
-
-std::string DebugResourceList(LoadedResource& partialResource)
-{
- GlyphSetPointer glyphSet = static_cast<GlyphSet*>(partialResource.resource.Get());
- const GlyphSet::CharacterList& characterList = glyphSet->GetCharacterList();
- std::string textString;
-
- for(std::size_t i=0, length=characterList.size(); i<length; i++)
- {
- std::ostringstream oss;
- const GlyphMetrics& gm = characterList[i].second;
- oss << static_cast<char>(gm.code) << "(" << gm.xPosition << "," << gm.yPosition
- << " " << (gm.quality?"H":"L") << ") ";
- textString.append(oss.str());
- }
- return textString;
-}
-
} //SlpPlatform
} //Dali
extern Debug::Filter* gLoaderFilter;
-std::string DebugRequestList(Integration::TextResourceType::CharacterList& chars);
-std::string DebugResourceList(LoadedResource& partialResource);
-
} // SlpPlatform
} // Dali
+++ /dev/null
-/*
- * Copyright (c) 2014 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.
- *
- */
-
-#include <cmath>
-
-#include "loader-font.h"
-#include <dali/public-api/images/distance-field.h>
-
-namespace Dali
-{
-namespace SlpPlatform
-{
-using namespace Dali::Integration;
-
-#if defined(DEBUG_ENABLED)
-namespace
-{
-static Integration::Log::Filter* gLogFilter = Log::Filter::New(Log::General, false, "LOG_LOADER_FONT");
-} // unnamed namespace
-#endif
-
-static SlpFace* LoadFontFile(const std::string &fileName, FT_Library freeType)
-{
- SlpFace* slpFace = NULL;
-
- // Open freetype font file
- FILE* fontFile = fopen(fileName.c_str(), "rb");
- if(fontFile != NULL)
- {
- // determine file size
- unsigned int fileSize( 0u );
- if( fseek(fontFile, 0, SEEK_END) )
- {
- DALI_LOG_ERROR("Error seeking to end of file\n");
- }
- else
- {
- long positionIndicator = ftell(fontFile);
- if( positionIndicator > -1L )
- {
- fileSize = static_cast<unsigned int>(positionIndicator);
- }
- }
-
- if( fileSize > 0u )
- {
- if( fseek(fontFile, 0, SEEK_SET) )
- {
- DALI_LOG_ERROR("Error seeking to start of file\n");
- }
-
- // allocate a buffer for the file (throws a memory exception on failure)
- slpFace = new SlpFace;
- slpFace->buffer = new FT_Byte[fileSize];
-
- // read the file
- unsigned int bytes = fread(slpFace->buffer, 1, fileSize, fontFile);
- if (bytes != fileSize)
- {
- DALI_LOG_WARNING("Number of bytes read (%d) does not match the file's size (%d)\n", bytes, fileSize);
- }
-
- // create a freetype face from the memory buffer
- FT_Error retVal = FT_New_Memory_Face(freeType, slpFace->buffer, fileSize, 0, &slpFace->face);
- if (retVal != FT_Err_Ok)
- {
- DALI_LOG_WARNING("FT_New_Face failed on %s\n", fileName.c_str());
- delete slpFace;
- slpFace = NULL;
- }
- }
-
- // finished with file, so close the handle
- fclose(fontFile);
- }
-
- return slpFace;
-}
-
-SlpFace* LoadFontFace(const std::string &fileName,
- const PointSize pointSize,
- const unsigned int dpiHor, const unsigned int dpiVer,
- FT_Library freeType)
-{
- SlpFace* slpFace = LoadFontFile(fileName, freeType);
-
- if (NULL != slpFace)
- {
- FT_Face face = slpFace->face;
-
- // set the char size for glyph scaling
- FT_Error retVal = FT_Set_Char_Size(face, 0, static_cast<unsigned int>(roundf(pointSize.value))<<6, dpiHor, dpiVer);
- if (retVal != FT_Err_Ok)
- {
- DALI_LOG_WARNING("FT_Set_Char_Size failed on %s\n", fileName.c_str());
- delete slpFace;
- slpFace = NULL;
- }
- else
- {
- DALI_LOG_INFO (gLogFilter, Log::Verbose, "Loading font %s Glyphs(%d) Points(%f) DPI(%d %d) Units/EM(%d) PPEM(%d %d) Scale(%f %f)\n",
- fileName.c_str(), face->num_glyphs,
- roundf(pointSize.value), dpiHor, dpiVer, face->units_per_EM,
- face->size->metrics.x_ppem, face->size->metrics.y_ppem,
- face->size->metrics.x_scale / 65536.0f,
- face->size->metrics.y_scale / 65536.0f);
- }
- }
-
- return slpFace;
-}
-
-
-SlpFace* LoadFontFace(const std::string &fileName,
- const PixelSize pixelSize,
- FT_Library freeType)
-{
- SlpFace* slpFace = LoadFontFile(fileName, freeType);
-
- if (NULL != slpFace)
- {
- FT_Face face = slpFace->face;
-
- // set the pixel size for glyph scaling
- FT_Error retVal = FT_Set_Pixel_Sizes(face, pixelSize, pixelSize);
- if (retVal != FT_Err_Ok)
- {
- DALI_LOG_WARNING("FT_Set_Pixel_Sizes failed on %s\n", fileName.c_str());
- delete slpFace;
- slpFace = NULL;
- }
- else
- {
- DALI_LOG_INFO (gLogFilter, Log::Verbose, "Loading font %s Glyphs(%d) Pixels(%d) Units/EM(%d) PPEM(%d %d) Scale(%f %f)\n",
- fileName.c_str(), face->num_glyphs,
- pixelSize.value, face->units_per_EM,
- face->size->metrics.x_ppem, face->size->metrics.y_ppem,
- face->size->metrics.x_scale / 65536.0f,
- face->size->metrics.y_scale / 65536.0f);
- }
- }
-
- return slpFace;
-}
-
-// charcode must be UTF-32 representation
-FT_Glyph GetGlyph(FT_Face face, FT_ULong charcode, FT_Int32 load_flags)
-{
- if (face == NULL)
- {
- DALI_LOG_WARNING("face == NULL\n");
- return NULL;
- }
-
- // FT_Load_Char is always succeeds providing the face is valid. So if the character code is not
- // found it will just return a default glyph
- FT_Error retVal = FT_Load_Char(face, charcode , load_flags);
- if(retVal != FT_Err_Ok)
- {
- DALI_LOG_WARNING("FT_Load_Char failed %d\n", retVal);
- return NULL;
- }
-
- // get the glyph
- FT_Glyph glyph;
- retVal = FT_Get_Glyph(face->glyph, &glyph);
- if(retVal != FT_Err_Ok)
- {
- DALI_LOG_WARNING("FT_Get_Glyph failed %d\n", retVal);
- return NULL;
- }
-
- return glyph;
-}
-
-// use getBitmap = false to find out glyph x-advance without copying/rendering bitmap
-GlyphSet::Character* GetCharacter(FT_Face face, FT_ULong charcode,
- const unsigned int fieldSize, const unsigned int fieldPadding,
- const Vector2& maxGlyphCell,
- const bool renderBitmap, const bool highQuality)
-{
- FT_Glyph glyph = GetGlyph(face, charcode, FT_LOAD_DEFAULT|FT_LOAD_NO_AUTOHINT);
- if(glyph == NULL)
- {
- // early out, if glyph is NULL
- return NULL;
- }
-
- // scale factor for unit scaled glyphs
- const float xScale = 1.0f / (face->size->metrics.x_scale / 65536.0f);
- const float yScale = 1.0f / (face->size->metrics.y_scale / 65536.0f);
-
- // create a new glyph-metric for the letter
- GlyphMetrics glyphMetrics;
- glyphMetrics.code = charcode;
- glyphMetrics.quality = (highQuality ? 1 : 0);
- glyphMetrics.xPosition = 0;
- glyphMetrics.yPosition = 0;
-
- // Set correct glyph size for underline
- const uint32_t UNDERLINE_CHARACTER( 0x0332 );
- if(charcode == UNDERLINE_CHARACTER)
- {
- float underlineBitmapWidth(64.f);
- float underlineBitmapHeight( 8.f );
- glyphMetrics.left = 0.f;
- glyphMetrics.top = 0.f;
- glyphMetrics.width = xScale * underlineBitmapWidth;
- glyphMetrics.height = yScale * underlineBitmapHeight;
- glyphMetrics.xAdvance = glyphMetrics.width;
- }
- else
- {
- // Regular glyphs
- glyphMetrics.left = xScale * face->glyph->metrics.horiBearingX / 64.0f;
- glyphMetrics.top = yScale * face->glyph->metrics.horiBearingY / 64.0f;
- glyphMetrics.width = xScale * face->glyph->metrics.width / 64.0f;
- glyphMetrics.height = yScale * face->glyph->metrics.height / 64.0f;
- glyphMetrics.xAdvance = xScale * face->glyph->metrics.horiAdvance / 64.0f;
- }
-
- // TODO: Look at generating the distance field directly from the glyph vector outline
- // instead of FreeType's scaled bitmap
- BitmapPtr bitmapData = NULL;
- // bitmap required?
- if (renderBitmap)
- {
- // convert glyph to bitmap
- if (glyph->format != FT_GLYPH_FORMAT_BITMAP)
- {
- FT_Error retVal = FT_Glyph_To_Bitmap(&glyph, FT_RENDER_MODE_NORMAL, 0, 1);
- if(retVal != FT_Err_Ok)
- {
- DALI_LOG_WARNING("FT_Glyph_To_Bitmap failed %d\n", retVal);
- FT_Done_Glyph(glyph);
- return NULL;
- }
- }
- // cast the FT_Glyph to a FT_BitmapGlyph
- FT_BitmapGlyph bitmapGlyph = (FT_BitmapGlyph) glyph;
-
- // access the underlying bitmap data
- FT_Bitmap bitmap = bitmapGlyph->bitmap;
-
- DALI_LOG_INFO(gLogFilter, Log::Verbose, "%s(%c %f %f %f %f %f %f) [%.2f %.2f %.2f %.2f %f %f]\n",
- __FUNCTION__, (int)charcode,
- glyphMetrics.left, glyphMetrics.top, glyphMetrics.width, glyphMetrics.height,
- glyphMetrics.xAdvance, face->height/64.0f,
- xScale * bitmapGlyph->left, yScale * bitmapGlyph->top, xScale * bitmap.width, yScale * bitmap.rows,
- glyph->advance.x / 65536.0f * xScale, face->ascender / 64.0f);
-
- // create a new bitmap for the glyph
- if(charcode == UNDERLINE_CHARACTER)
- {
- float underlineBitmapWidth( glyphMetrics.width / xScale );
- float underlineBitmapHeight( glyphMetrics.height / yScale );
-
- const unsigned int underlineBitmapSize(underlineBitmapWidth*underlineBitmapHeight);
- std::vector<unsigned char> underlineAlphaMap(underlineBitmapSize);
- std::fill(underlineAlphaMap.begin(), underlineAlphaMap.end(), 0xff);
-
- bitmapData = Integration::Bitmap::New(Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD);
- bitmapData->GetPackedPixelsProfile()->ReserveBuffer(Pixel::A8, fieldSize, fieldSize);
- GenerateDistanceFieldMap( &(*underlineAlphaMap.begin()), Vector2(underlineBitmapWidth, underlineBitmapHeight),
- bitmapData->GetBuffer(), Vector2(fieldSize, fieldSize),
- fieldPadding, Vector2( maxGlyphCell.width / xScale, maxGlyphCell.height / yScale ),
- highQuality );
- }
- else
- {
- if (0 != (bitmap.width * bitmap.rows))
- {
- bitmapData = Integration::Bitmap::New(Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD);
- bitmapData->GetPackedPixelsProfile()->ReserveBuffer(Pixel::A8, fieldSize, fieldSize);
-
- GenerateDistanceFieldMap(bitmap.buffer, Vector2(bitmap.width, bitmap.rows),
- bitmapData->GetBuffer(), Vector2(fieldSize, fieldSize),
- fieldPadding, Vector2( maxGlyphCell.width / xScale, maxGlyphCell.height / yScale ),
- highQuality );
- }
- else
- {
- // FreeType has rendered a zero width / height bitmap.
- // This will only happen with a few characters like no break space (nbsp)
- // @todo filter out known, non-visible characters in Dali-core.
- // However we will still need this code for characters like OGHAM SPACE MARK
- // which will be blank with some fonts, and visible with others.
- // Create a dummy bitmap of size 64,64
- bitmapData = Integration::Bitmap::New(Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD);
- bitmapData->GetPackedPixelsProfile()->ReserveBuffer(Pixel::A8, fieldSize, fieldSize);
- PixelBuffer* pixelBuffer = bitmapData->GetBuffer();
- memset( pixelBuffer, 0x0, fieldSize * fieldSize );
- }
- }
- }
-
- // finished with glyph, so, release it
- FT_Done_Glyph(glyph);
-
- return new GlyphSet::Character(bitmapData, glyphMetrics);
-}
-
-Integration::BitmapPtr GetGlyphBitmap( FT_Face face, FT_ULong charCode )
-{
- Integration::BitmapPtr image;
-
- FT_Glyph ftGlyph = GetGlyph( face, charCode, FT_LOAD_RENDER );
- if( NULL != ftGlyph )
- {
- FT_Error ftError = FT_Err_Ok;
-
- // convert glyph to bitmap
- if( ftGlyph->format != FT_GLYPH_FORMAT_BITMAP )
- {
- ftError = FT_Glyph_To_Bitmap( &ftGlyph, FT_RENDER_MODE_NORMAL, 0, 1 );
-
- if( ftError != FT_Err_Ok)
- {
- DALI_LOG_WARNING( "FT_Glyph_To_Bitmap failed %d\n", ftError );
- FT_Done_Glyph( ftGlyph );
- return image;
- }
- }
-
- // cast the FT_Glyph to a FT_BitmapGlyph
- FT_BitmapGlyph ftBitmapGlyph = (FT_BitmapGlyph)ftGlyph;
-
- // access the underlying bitmap data
- FT_Bitmap ftBitmap = ftBitmapGlyph->bitmap;
-
- const std::size_t size = ftBitmap.width * ftBitmap.rows;
- if( 0 < size )
- {
- image = Integration::Bitmap::New( Integration::Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD );
- image->GetPackedPixelsProfile()->ReserveBuffer( Pixel::A8, ftBitmap.width, ftBitmap.rows );
-
- memcpy( static_cast<unsigned char*>( image->GetBuffer() ), ftBitmap.buffer, size );
- }
-
- // finished with glyph, so, release it
- FT_Done_Glyph( ftGlyph );
- }
-
- return image;
-}
-
-} // namespace SlpPlatform
-
-} // namespace Dali
+++ /dev/null
-#ifndef __DALI_SLP_PLATFORM_LOADER_FONT_H__
-#define __DALI_SLP_PLATFORM_LOADER_FONT_H__
-
-/*
- * Copyright (c) 2014 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.
- *
- */
-
-#include <string>
-
-#include <ft2build.h>
-#include <dali/integration-api/glyph-set.h>
-#include <dali/public-api/text/font.h>
-#include FT_FREETYPE_H
-#include FT_GLYPH_H
-#include FT_OUTLINE_H
-
-namespace Dali
-{
-namespace Integration
-{
-class GlyphSet;
-}
-
-namespace SlpPlatform
-{
-struct SlpFace
-{
- SlpFace()
- {
- face = NULL;
- buffer = NULL;
- }
-
- ~SlpFace()
- {
- if (face)
- {
- FT_Done_Face(face);
- face = NULL;
- }
- if (buffer)
- {
- delete [] buffer;
- buffer = NULL;
- }
- }
-
- FT_Face face; ///< FT_Face object
- FT_Byte* buffer; ///< A buffer used by the face.
-};
-
-/**
- * Loads a freetype font face
- * @param [in] fileName Font file name
- * @param [in] pointSize Point size for freetype source glyph scaling
- * @param [in] dpiHor Horizontal dpi
- * @param [in] dpiVer Vertical dpi
- * @param [inout] freeType A handle to the FreeType library resource
- * @return A SlpFace pointer on success, NULL on failure
- */
-SlpFace* LoadFontFace(const std::string &fileName,
- const PointSize pointSize,
- const unsigned int dpiHor, const unsigned int dpiVer,
- FT_Library freeType);
-/**
- * Loads a freetype font face
- * @param [in] fileName Font file name
- * @param [in] pixelSize Pixel size for freetype source glyph scaling
- * @param [inout] freeType A handle to the FreeType library resource
- * @return A SlpFace pointer on success, NULL on failure
- */
-SlpFace* LoadFontFace(const std::string &fileName,
- const PixelSize pixelSize,
- FT_Library freeType);
-
-/**
- * Gets a glyph (character) from a font face.
- * @param [in] face Freetype face object
- * @param [in] charcode Character code (unicode)
- * @param [in] load_flags How the glyph should be loaded
- * @return FT_Glyph object on success, NULL on failure
- */
-FT_Glyph GetGlyph(FT_Face face, FT_ULong charcode, FT_Int32 load_flags);
-
-/**
- * Gets a glyph (character) from a font face.
- * @param [in] face Freetype face object
- * @param [in] charcode UCS4 character code (UTF32)
- * @param [in] fieldSize size (w and h) of generated distance field cells
- * @param [in] fieldPadding number of border pixels to add around source glyph bitmap
- * @param [in] maxGlyphCell The maximum pixel area of a single glyph (in font units)
- * @param [in] renderBitmap whether to load/render bitmap data as well
- * @return Character pointer on success, NULL on failure
- */
-Integration::GlyphSet::Character* GetCharacter(FT_Face face, const FT_ULong charcode,
- const unsigned int fieldSize, const unsigned int fieldPadding,
- const Vector2& maxGlyphCell,
- const bool renderBitmap, const bool highQuality );
-
-/**
- * Retrieves a glyph's image from the given Freetype face object.
- *
- * @param[in] face Freetype face object.
- * @param[in] charCode UCS4 character code (UTF32).
- *
- * @return The glyph's image for the given character.
- */
-Integration::BitmapPtr GetGlyphBitmap( FT_Face face, FT_ULong charCode );
-
-} // namespace SlpPlatform
-
-} // namespace Dali
-
-#endif // __DALI_SLP_PLATFORM_LOADER_FONT_H__
#include "resource-bitmap-requester.h"
#include "resource-model-requester.h"
#include "resource-shader-requester.h"
-#include "resource-text-requester.h"
#include "debug/resource-loader-debug.h"
-#include "loader-font.h"
-#include "../interfaces/font-controller.h"
#include "../interfaces/data-cache.h"
namespace
{
-const char * const DALI_USER_FONT_CACHE_PATH( DALI_USER_FONT_CACHE_DIR );
-const unsigned int MAX_NUMBER_CHARS_TO_CACHE( 60000 ); ///< support up to 60,000 glyphs
-const unsigned int DISTANCE_FIELD_SIZE = 64; // doesn't need to be power of two (the atlas may for performance)
-const unsigned int DISTANCE_FIELD_PADDING = 30; // Number of pixels of padding around the source FreeType bitmap
-const unsigned int HIGH_QUALITY_PIXEL_SIZE = 200; // Pixel size sent to FreeType2 FT_Set_Char_Size() for high quality glyphs
-const float ONE_OVER_64 = 1.0f/64.0f;
-
#ifdef DEBUG_ENABLED
// For DEBUG_ENABLED profiling of distance field glyph generation
double GetTimeMicroseconds()
FailedQueue mFailedLoads; ///< Failed load request notifications are stored here until fetched by core
FailedQueue mFailedSaves; ///< Failed save request notifications are stored here until fetched by core
- Dali::Platform::FontController* mFontController; ///< Interface for accessing font information
-
RequestHandlers mRequestHandlers;
RequestStore mStoredRequests; ///< Used to store load requests until loading is completed
ResourceLoaderImpl( ResourceLoader* loader )
{
- mFontController = Dali::Platform::FontController::New();
-
mRequestHandlers.insert(std::make_pair(ResourceBitmap, new ResourceBitmapRequester(*loader)));
mRequestHandlers.insert(std::make_pair(ResourceShader, new ResourceShaderRequester(*loader)));
mRequestHandlers.insert(std::make_pair(ResourceModel, new ResourceModelRequester(*loader)));
- mRequestHandlers.insert(std::make_pair(ResourceText, new ResourceTextRequester(*loader)));
}
~ResourceLoaderImpl()
ResourceRequesterBase* requestBase = it->second;
delete requestBase;
}
-
- delete mFontController;
}
void Pause()
return mImpl->IsLoading();
}
-const std::string& ResourceLoader::GetFontFamilyForChars( const Integration::TextArray& charsRequested )
-{
- return mImpl->mFontController->GetFontFamilyForChars( charsRequested ).first;
-}
-
-bool ResourceLoader::AllGlyphsSupported( const std::string& fontFamily, const std::string& fontStyle, const Integration::TextArray& charsRequested )
-{
- // At this point fontFamily and fontStyle must have been validated.
-
- return mImpl->mFontController->AllGlyphsSupported( Platform::FontController::StyledFontFamily( fontFamily, fontStyle ), charsRequested );
-}
-
-bool ResourceLoader::ValidateFontFamilyName( const std::string& fontFamily,
- const std::string& fontStyle,
- bool& isDefaultSystemFontFamily,
- bool& isDefaultSystemFontStyle,
- std::string& closestFontFamilyMatch,
- std::string& closestFontStyleMatch )
-{
- Platform::FontController::StyledFontFamily closestMatch;
-
- bool result = mImpl->mFontController->ValidateFontFamilyName( Platform::FontController::StyledFontFamily( fontFamily, fontStyle ),
- isDefaultSystemFontFamily,
- isDefaultSystemFontStyle,
- closestMatch );
-
- closestFontFamilyMatch = closestMatch.first;
- closestFontStyleMatch = closestMatch.second;
-
- return result;
-}
-
-PixelSize ResourceLoader::GetFontLineHeightFromCapsHeight( const std::string& fontFamily, const std::string& fontStyle, CapsHeight capsHeight, FT_Library freeType )
-{
- // At this point fontFamily and fontStyle must have been validated.
-
- PixelSize result(0);
-
- if (!fontFamily.empty())
- {
- const std::string& fontFileName = GetFontPath( fontFamily, fontStyle );
- SlpFace* slpFace = LoadFontFace(fontFileName, PixelSize(capsHeight), freeType);
-
- if (slpFace)
- {
- const float scale = static_cast<float>(capsHeight.value) / ((slpFace->face->ascender / 64.0f) * 0.95f);
-
- result.value = static_cast<unsigned int>(roundf(scale * (slpFace->face->height / 64.0f)));
-
- delete slpFace;
- slpFace = NULL;
- }
- }
-
- return result;
-}
-
-void ResourceLoader::GetFontList( Dali::Integration::PlatformAbstraction::FontListMode mode, std::vector<std::string>& fontList )
-{
- // VCC TODO: A GetStyles() method which returns a list of styles for a given font family is needed.
-
- Platform::FontController::FontListMode listMode = Platform::FontController::LIST_SYSTEM_FONTS;
-
- switch( mode )
- {
- case Dali::Integration::PlatformAbstraction::LIST_ALL_FONTS:
- {
- listMode = Platform::FontController::LIST_ALL_FONTS;
- break;
- }
- case Dali::Integration::PlatformAbstraction::LIST_SYSTEM_FONTS:
- {
- listMode = Platform::FontController::LIST_SYSTEM_FONTS;
- break;
- }
- case Dali::Integration::PlatformAbstraction::LIST_APPLICATION_FONTS:
- {
- listMode = Platform::FontController::LIST_APPLICATION_FONTS;
- break;
- }
- default:
- {
- DALI_ASSERT_DEBUG( false && "invalid mode" );
- }
- }
-
- Platform::FontController::FontList styledFontList;
- mImpl->mFontController->GetFontList( listMode, styledFontList );
-
- std::set<std::string> uniqueFontNames;
- for( Platform::FontController::FontList::const_iterator it = styledFontList.begin(), endIt = styledFontList.end(); it != endIt; ++it )
- {
- uniqueFontNames.insert( it->first );
- }
-
- // copy into a vector
- std::copy( uniqueFontNames.begin(), uniqueFontNames.end(), std::back_inserter( fontList ) );
-}
-
-
-/**
- * Note, called from both platform abstraction & from text loader threads
- **/
-GlyphSet* ResourceLoader::GetGlyphData (const TextResourceType& textRequest,
- FT_Library freeType,
- const std::string& fontFamily,
- bool getBitmap)
-{
- // At this point fontFamily and the font style stored in the textRequest must have been validated.
-
- GlyphSet* glyphSet = NULL;
-
- size_t fontHash = textRequest.mFontHash;
-
- DALI_LOG_INFO(gLoaderFilter, Debug::Verbose, "LoadGlyphSet - requested string is %d characters long\n", textRequest.mCharacterList.size());
-
- // path holds the font name
- if( !fontFamily.empty() )
- {
- const std::string& fontFileName = GetFontPath( fontFamily, textRequest.mStyle );
-
- const bool highQuality(textRequest.mQuality == TextResourceType::TextQualityHigh);
- const unsigned int glyphQuality( highQuality ? GlyphMetrics::HIGH_QUALITY : GlyphMetrics::LOW_QUALITY );
-
- SlpFace* slpFace = LoadFontFace( fontFileName, PixelSize( HIGH_QUALITY_PIXEL_SIZE), freeType );
- if (slpFace)
- {
- glyphSet = new GlyphSet();
- glyphSet->mFontHash = fontHash;
- glyphSet->SetAtlasResourceId( textRequest.mTextureAtlasId );
-
- for( TextResourceType::CharacterList::const_iterator it = textRequest.mCharacterList.begin(), endIt = textRequest.mCharacterList.end(); it != endIt; ++it )
- {
- uint32_t charCode( it->character );
-
- if (!glyphSet->HasCharacter(charCode)) // ignore duplicate glyphs in the request
- {
-#ifdef DEBUG_ENABLED
- // DEBUG_ENABLED profiling of distance field glyph generation
- double then( 0.0 );
- if( getBitmap )
- {
- then = GetTimeMicroseconds();
- }
-#endif
- ScopedPointer< GlyphSet::Character > character( GetCharacter(slpFace->face, charCode,
- DISTANCE_FIELD_SIZE, DISTANCE_FIELD_PADDING, textRequest.mMaxGlyphSize,
- getBitmap, highQuality ) );
-
-#ifdef DEBUG_ENABLED
- // DEBUG_ENABLED profiling of distance field glyph generation
- if( getBitmap )
- {
- double now( GetTimeMicroseconds() );
-
- DALI_LOG_INFO( gLoaderFilter, Log::Verbose, "Generating (%c) in %s quality took %.3f ms\n", charCode, highQuality ? "high" : "low", 1e-3 * ( now - then ) );
- }
-#endif
- if (character.Get() != 0 )
- {
- GlyphSet::Character& glyphCharacter( *character );
-
- glyphCharacter.second.quality = glyphQuality;
- glyphCharacter.second.xPosition = it->xPosition;
- glyphCharacter.second.yPosition = it->yPosition;
- // copy character to GlyphSet
- glyphSet->AddCharacter( glyphCharacter );
- }
- }
- }
-
- delete slpFace;
- }
- }
-
- return glyphSet;
-}
-
-GlyphSet* ResourceLoader::GetCachedGlyphData(const TextResourceType& textRequest, const std::string& fontFamily)
-{
- GlyphSet* glyphSet( new GlyphSet() );
- glyphSet->mFontHash = textRequest.mFontHash;
- glyphSet->SetAtlasResourceId(textRequest.mTextureAtlasId);
-
- std::string cachePath(DALI_USER_FONT_CACHE_PATH);
- cachePath.append(fontFamily + "-" + textRequest.mStyle);
- std::replace(cachePath.begin(), cachePath.end(), ' ', '-');
-
- DALI_LOG_INFO(gLoaderFilter, Debug::Verbose, "ResourceLoader::GetCachedGlyphData() - cachefile: %s\n", cachePath.c_str() );
-
- Platform::DataCache* dataCache = Platform::DataCache::New( Platform::DataCache::READ_ONLY,
- Platform::DataCache::RUN_LENGTH_ENCODING,
- cachePath,
- DISTANCE_FIELD_SIZE * DISTANCE_FIELD_SIZE,
- MAX_NUMBER_CHARS_TO_CACHE);
-
- Platform::DataCache::KeyVector keyVector;
- Platform::DataCache::DataVector dataVector;
-
- const TextResourceType::CharacterList& requestedCharacters = textRequest.mCharacterList;
- for( std::size_t i=0, length = requestedCharacters.size(); i < length; ++i )
- {
- keyVector.push_back( requestedCharacters[i].character );
- }
-
- // load the glyphs from file
- dataCache->Find( keyVector, dataVector );
-
- // for each glyph found, add to the glyph set
- for( std::size_t n = 0, arraySize = keyVector.size(); n < arraySize ; n++ )
- {
- Platform::DataCache::Data& data( dataVector[n]);
-
- if( data.exists )
- {
- GlyphMetrics glyphMetrics;
- glyphMetrics.code = keyVector[ n ];
- glyphMetrics.quality = GlyphMetrics::HIGH_QUALITY;
- glyphMetrics.xPosition = requestedCharacters[n].xPosition;
- glyphMetrics.yPosition = requestedCharacters[n].yPosition;
-
- // create a new bitmap, and copy in the data
- BitmapPtr bitmapData ( Integration::Bitmap::New(Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD) );
-
- // assign the data
- bitmapData->GetPackedPixelsProfile()->AssignBuffer( Pixel::A8, data.data, DISTANCE_FIELD_SIZE * DISTANCE_FIELD_SIZE, DISTANCE_FIELD_SIZE, DISTANCE_FIELD_SIZE );
-
- data.data = NULL;
-
- // add to the glyphset
- glyphSet->AddCharacter( bitmapData, glyphMetrics );
- }
- }
- DALI_LOG_INFO( gLoaderFilter, Debug::Verbose, "ResourceLoader::GetCachedGlyphData() - requestedGlyphs:%u, cachedGlyphs:%u\n",
- requestedCharacters.size(), glyphSet->GetCharacterList().size() );
-
- delete dataCache;
-
- return glyphSet;
-}
-
-void ResourceLoader::GetGlobalMetrics( FT_Library freeType,
- const std::string& fontFamily,
- const std::string& fontStyle,
- GlobalMetrics& globalMetrics )
-{
- // At this point fontFamily and fontStyle must have been validated.
-
- if( !fontFamily.empty() )
- {
- const std::string& fontFileName = GetFontPath( fontFamily, fontStyle );
-
- SlpFace* slpFace = LoadFontFace( fontFileName, PixelSize( HIGH_QUALITY_PIXEL_SIZE), freeType );
- if( slpFace )
- {
- // scale factor for unit scaled glyphs
- const float xScale = 1.0f / (slpFace->face->size->metrics.x_scale / 65536.0f);
- const float yScale = 1.0f / (slpFace->face->size->metrics.y_scale / 65536.0f);
-
- globalMetrics.lineHeight = slpFace->face->height * ONE_OVER_64;
- globalMetrics.ascender = slpFace->face->ascender * ONE_OVER_64;
- globalMetrics.unitsPerEM = slpFace->face->units_per_EM * ONE_OVER_64;
-
- globalMetrics.underlinePosition = -4.f;
- globalMetrics.underlineThickness = 5.f * yScale;
- if( 1.f > globalMetrics.underlineThickness )
- {
- globalMetrics.underlineThickness = 1.f;
- }
- globalMetrics.maxWidth = DISTANCE_FIELD_SIZE * xScale;
- globalMetrics.maxHeight = DISTANCE_FIELD_SIZE * yScale;
- globalMetrics.padAdjustX = DISTANCE_FIELD_PADDING * xScale;
- globalMetrics.padAdjustY = DISTANCE_FIELD_PADDING * yScale;
-
- delete slpFace;
- }
- }
-}
-
void ResourceLoader::SetDpi(unsigned int dpiHor, unsigned int dpiVer)
{
// Unused
return result;
}
-Integration::BitmapPtr ResourceLoader::GetGlyphImage( FT_Library freeType, const std::string& fontFamily, const std::string& fontStyle, float fontSize, uint32_t character )
-{
- // At this point fontFamily and fontStyle must have been validated.
-
- Integration::BitmapPtr image;
-
- const std::string& fontFileName = GetFontPath( fontFamily, fontStyle );
- SlpFace* slpFace = LoadFontFace( fontFileName, PixelSize( Font::PointsToPixels( fontSize ) ), freeType );
-
- if( NULL != slpFace )
- {
- image = GetGlyphBitmap( slpFace->face, character );
- delete slpFace;
- }
-
- return image;
-}
-
-void ResourceLoader::SetDefaultFontFamily( const std::string& fontFamily, const std::string& fontStyle )
-{
- mImpl->mFontController->SetDefaultFontFamily( Platform::FontController::StyledFontFamily( fontFamily, fontStyle ) );
-}
-
-const std::string& ResourceLoader::GetFontPath(const std::string& fontFamily, const std::string& fontStyle)
-{
- // At this point fontFamily and fontStyle must have been validated.
- return mImpl->mFontController->GetFontPath(std::make_pair(fontFamily,fontStyle));
-}
-
} // namespace SlpPlatform
} // namespace Dali
*/
#include <dali/integration-api/platform-abstraction.h>
-#include <dali/integration-api/glyph-set.h>
#include <dali/integration-api/resource-cache.h>
#include <dali/public-api/common/dali-vector.h>
#include <string>
-#include <ft2build.h>
-#include FT_FREETYPE_H
-#include FT_GLYPH_H
namespace Dali
{
}
}
-namespace Platform
-{
-class FontController;
-}
-
namespace SlpPlatform
{
void GetResources(Integration::ResourceCache& cache);
/**
- * Called by Font objects to synchronously query glyph data.
- * @param[in] textRequest resource request
- * @param[in] freeType handle to the FreeType library
- * @param[in] fontFamily name of the font's family
- * @param[in] getBitmap whether to load bitmaps for the symbols as well
- * @return A GlyphSet pointer with a list of the requested glyph metrics.
- */
- Integration::GlyphSet* GetGlyphData ( const Integration::TextResourceType& textRequest,
- FT_Library freeType,
- const std::string& fontFamily,
- bool getBitmap);
-
- /**
- * Called by Font objects to synchronously load glyph data.
- * @param[in] textRequest resource request
- * @param[in] fontFamily name of the font's family
- * @return A GlyphSet pointer containing the requested glyph bitmaps.
- */
- Integration::GlyphSet* GetCachedGlyphData( const Integration::TextResourceType& textRequest,
- const std::string& fontFamily );
-
- /**
- * Called by Font objects to synchronously query global font metrics.
- * @param[in] freeType handle to the FreeType library
- * @param[in] fontFamily name of the font's family
- * @param[in] fontStyle name of the font's style
- * @param[out] globalMetrics font requested global metrics.
- */
- void GetGlobalMetrics( FT_Library freeType,
- const std::string& fontFamily,
- const std::string& fontStyle,
- Integration::GlobalMetrics& globalMetrics );
-
- /**
* @copydoc PlatformAbstraction::SetDpi()
*/
void SetDpi(unsigned int dpiHor, unsigned int dpiVer);
/**
- * @copydoc PlatformAbstraction::GetFontFamilyForChars()
- */
- const std::string& GetFontFamilyForChars(const Integration::TextArray& charsRequested);
-
- /**
- * @copydoc PlatformAbstraction::AllGlyphsSupported()
- */
- bool AllGlyphsSupported(const std::string& fontFamily, const std::string& fontStyle, const Integration::TextArray& charsRequested);
-
- /**
- * @copydoc PlatformAbstraction::ValidateFontFamilyName()
- */
- bool ValidateFontFamilyName( const std::string& fontFamily,
- const std::string& fontStyle,
- bool& isDefaultSystemFontFamily,
- bool& isDefaultSystemFontStyle,
- std::string& closestFontFamilyMatch,
- std::string& closestFontStyleMatch );
-
- /**
- * @copydoc SlpPlatformAbstraction::GetFontLineHeightFromCapsHeight
- */
- PixelSize GetFontLineHeightFromCapsHeight(const std::string& fontFamily, const std::string& fontStyle, CapsHeight capsHeight, FT_Library freeType);
-
- /**
- * @copydoc SlpPlatformAbstraction::GetFontList
- */
- void GetFontList( Dali::Integration::PlatformAbstraction::FontListMode mode, std::vector<std::string>& fontList );
-
- /**
* @copydoc SlpPlatformAbstraction::LoadFile()
*/
bool LoadFile( const std::string& filename, std::vector< unsigned char >& buffer ) const;
*/
static bool SaveFile(const std::string& filename, std::vector< unsigned char >& buffer);
- /**
- * Sets the default font family that should be used by the font resources.
- * @param[in] fontFamily The default font family.
- * @param[in] fontStyle The default font style.
- */
- void SetDefaultFontFamily( const std::string& fontFamily, const std::string& fontStyle );
-
- /**
- * Retrieves the glyp's image representing the given character.
- *
- * @param[in] freeType Handle to the FreeType library.
- * @param[in] fontFamily The font's family name.
- * @param[in] fontStyle The font's style.
- * @param[in] fontSize The font's size.
- * @param[in] character The given character.
- *
- * @return The bitmap image.
- */
- Integration::BitmapPtr GetGlyphImage( FT_Library freeType, const std::string& fontFamily, const std::string& fontStyle, float fontSize, uint32_t character );
-
-private:
-
- /**
- * Find the path of a platform-specific font resource.
- * Multi-threading note: this method will be called from the main thread only i.e. not
- * from within the Core::Render() method.
- * @note Italics and boldness are applied by transforming the outline.
- * @param[in] fontFamily The font family e.g. Arial, Courier.
- * @param[in] fontStyle The font's style.
- * @return The path to a font resource; the closest available match for the family parameter.
- */
- const std::string& GetFontPath(const std::string& fontFamily, const std::string& fontStyle); // not const because of mutex
-
private:
struct ResourceLoaderImpl;
ResourceLoaderImpl* mImpl;
+++ /dev/null
-/*
- * Copyright (c) 2014 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.
- *
- */
-
-#include "resource-text-requester.h"
-
-#include "debug/resource-loader-debug.h"
-
-using namespace Dali::Integration;
-
-namespace Dali
-{
-
-namespace SlpPlatform
-{
-
-namespace
-{
-const uint32_t FIRST_VISIBLE_CHAR( 0x21 ); // 0x20 is the white space
-
-bool IsVisible(uint32_t code)
-{
- return !(code < FIRST_VISIBLE_CHAR);
-}
-
-// helper to remove invisible characters
-void RemoveInvisibleCharacters( Integration::TextResourceType::CharacterList& text )
-{
- Integration::TextResourceType::CharacterList temp;
- temp.reserve(text.size());
- for(std::size_t i=0, length= text.size(); i< length; i++)
- {
- if (IsVisible( text[i].character ))
- {
- temp.push_back(text[i]);
- }
- }
- text = temp;
-}
-
-} // Anonymous namespace
-
-ResourceTextRequester::ResourceTextRequester( ResourceLoader& resourceLoader )
-: ResourceRequesterBase( resourceLoader ),
- mThreadText( NULL )
-{
-}
-
-ResourceTextRequester::~ResourceTextRequester()
-{
- delete mThreadText;
-}
-
-void ResourceTextRequester::Pause()
-{
- if( mThreadText )
- {
- mThreadText->Pause();
- }
-}
-
-void ResourceTextRequester::Resume()
-{
- if( mThreadText )
- {
- mThreadText->Resume();
- }
-}
-
-void ResourceTextRequester::LoadResource( Integration::ResourceRequest& request )
-{
- TextResourceType* textRequest = dynamic_cast<TextResourceType*>(request.GetType());
- if( textRequest )
- {
- TextResourceType::CharacterList& text(textRequest->mCharacterList);
-
- // Remove from stored request
- RemoveInvisibleCharacters( text );
- if( text.empty() )
- {
- IntrusivePtr<GlyphSet> cachedGlyphs( new GlyphSet() );
- LoadedResource resource( request.GetId(), request.GetType()->id, cachedGlyphs );
- mResourceLoader.AddLoadedResource(resource);
- }
- else
- {
- CreateThread();
- mThreadText->AddRequest( request, ResourceThreadBase::RequestLoad );
- }
- }
-}
-
-ResourcePointer ResourceTextRequester::LoadResourceSynchronously( const Integration::ResourceType& type, const std::string& path )
-{
- DALI_ASSERT_ALWAYS( false && "Cannot load text synchronously" );
-}
-
-LoadStatus ResourceTextRequester::LoadFurtherResources( ResourceRequest& request, LoadedResource partialResource )
-{
- // nothing to do
-
- return RESOURCE_COMPLETELY_LOADED;
-}
-
-void ResourceTextRequester::SaveResource(const Integration::ResourceRequest& request )
-{
- // Nothing to do
-}
-
-void ResourceTextRequester::CancelLoad(Integration::ResourceId id, Integration::ResourceTypeId typeId)
-{
- if( mThreadText )
- {
- mThreadText->CancelRequest(id);
- }
-}
-
-void ResourceTextRequester::CreateThread()
-{
- if( ! mThreadText )
- {
- mThreadText = new ResourceThreadText( mResourceLoader , TextResourceType::TextQualityHigh );
- }
-}
-
-} // SlpPlatform
-
-} // Dali
+++ /dev/null
-#ifndef __DALI_SLP_PLATFORM_RESOURCE_TEXT_REQUESTER_H__
-#define __DALI_SLP_PLATFORM_RESOURCE_TEXT_REQUESTER_H__
-
-/*
- * Copyright (c) 2014 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.
- *
- */
-
-#include <platform-abstractions/slp/resource-loader/resource-requester-base.h>
-#include "resource-thread-text.h"
-
-namespace Dali
-{
-namespace Integration
-{
-class ResourceRequest;
-}
-
-namespace SlpPlatform
-{
-
-class ResourceTextRequester : public ResourceRequesterBase
-{
-public:
- /**
- * Constructor
- * @param[in] resourceLoader The resource loader with which to communicate results
- */
- ResourceTextRequester( ResourceLoader& resourceLoader );
-
- /**
- * Destructor
- */
- virtual ~ResourceTextRequester();
-
- /**
- * @copydoc ResourceRequester::Pause()
- */
- virtual void Pause();
-
- /**
- * @copydoc ResourceRequester::Resume()
- */
- virtual void Resume();
-
- /**
- * @copydoc ResourceRequester::LoadResource()
- */
- virtual void LoadResource( Integration::ResourceRequest& request );
-
- /**
- * @copydoc ResourceRequester::LoadResourceSynchronously()
- */
- virtual Integration::ResourcePointer LoadResourceSynchronously( const Integration::ResourceType& type, const std::string& path );
-
- /**
- * @copydoc ResourceRequester::LoadFurtherResources()
- */
- virtual Integration::LoadStatus LoadFurtherResources( Integration::ResourceRequest& request, LoadedResource partialResource );
-
- /**
- * @copydoc ResourceRequester::SaveResource()
- */
- virtual void SaveResource(const Integration::ResourceRequest& request );
-
- /**
- * @copydoc ResourceRequester::CancelLoad()
- */
- virtual void CancelLoad(Integration::ResourceId id, Integration::ResourceTypeId typeId);
-
-private:
-
- /**
- * Create thread if it doesn't exist
- */
- void CreateThread();
-
-protected:
- ResourceThreadText* mThreadText; ///< Loader thread
-};
-
-} // SlpPlatform
-} // Dali
-
-#endif // __DALI_SLP_PLATFORM_RESOURCE_TEXT_REQUESTER_H__
+++ /dev/null
-/*
- * Copyright (c) 2014 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 "resource-thread-text.h"
-
-// INTERNAL INCLUDES
-#include "loader-font.h"
-#include "../interfaces/data-cache.h"
-#include "../data-cache/tests/data-cache-debug.h"
-
-// EXTERNAL INCLUDES
-#include <boost/functional/hash.hpp>
-#include <ft2build.h>
-#include <iostream>
-#include FT_FREETYPE_H
-#include FT_GLYPH_H
-
-#include <dali/integration-api/glyph-set.h>
-#include <dali/integration-api/platform-abstraction.h>
-
-
-using namespace Dali::Integration;
-
-namespace Dali
-{
-namespace SlpPlatform
-{
-
-namespace
-{
-
-const char * const DALI_USER_FONT_CACHE_PATH( DALI_USER_FONT_CACHE_DIR );
-const unsigned int DISTANCE_FIELD_WIDTH( 64 );
-const unsigned int DISTANCE_FIELD_HEIGHT( 64 );
-const unsigned int DISTANCE_FIELD_SIZE(DISTANCE_FIELD_WIDTH * DISTANCE_FIELD_HEIGHT);
-const unsigned int MAX_NUMBER_CHARS_TO_CACHE( 60000 ); ///< support up to 60,000 glyphs
-
-boost::mutex mFileCheckMutex; ///< used to ensure only one thread checks the files for corruption on startup
-
-
-}; // unnamed namespace
-
-ResourceThreadText::ResourceThreadText(ResourceLoader& resourceLoader, const TextResourceType::TextQuality quality)
-: ResourceThreadBase(resourceLoader),
- mQuality(quality),
- mFreeTypeHandle( NULL )
-{
-
-#ifdef DATA_CACHE_DEBUG
- DataCacheIo::ThreadedStressTest();
-#endif
-}
-
-ResourceThreadText::~ResourceThreadText()
-{
- TerminateThread();
-
- DeleteDataCaches();
-
- if( mFreeTypeHandle )
- {
- FT_Done_FreeType(mFreeTypeHandle);
- }
-}
-
-void ResourceThreadText::Load(const ResourceRequest& request)
-{
- // 1: Check if glyphs are in the data cache
- // 2: For any missing glyphs, load from FreeType and save to cache file.
- //
- // Important Note: FreeType will never fail to load a character, if the character code
- // is not part of the font it will render a 'default glyph'.
- //
- // This means we never call mResourceLoader.AddFailedLoad( ...)
-
- const TextResourceType& textRequest = dynamic_cast<const TextResourceType&>(*request.GetType());
- TextResourceType::CharacterList text(textRequest.mCharacterList);
-
- std::string cachePath(DALI_USER_FONT_CACHE_PATH);
- cachePath.append(request.GetPath() + "-" + textRequest.mStyle);
- std::replace(cachePath.begin(), cachePath.end(), ' ', '-');
-
- Platform::DataCache* dataCache = GetDataCache( cachePath );
-
- GlyphSet *glyphSet( new GlyphSet() );
- glyphSet->mFontHash = textRequest.mFontHash;
- glyphSet->SetAtlasResourceId(textRequest.mTextureAtlasId);
-
- if( textRequest.mCache == TextResourceType::GLYPH_CACHE_READ )
- {
- LoadCharactersFromCache( *dataCache, *glyphSet, text );
- }
- else
- {
- LoadCharacters( *dataCache, *glyphSet, textRequest, request.GetPath(), text );
- }
-
- IntrusivePtr<GlyphSet> glyphResource( glyphSet );
- LoadedResource resource( request.GetId(), request.GetType()->id, glyphResource );
- mResourceLoader.AddPartiallyLoadedResource(resource);
-}
-
-void ResourceThreadText::Save(const ResourceRequest& request)
-{
-}
-
-void ResourceThreadText::LoadCharactersFromCache(
- Platform::DataCache& dataCache,
- GlyphSet& glyphSet,
- const TextResourceType::CharacterList& requestedCharacters )
-{
- Platform::DataCache::KeyVector keyVector;
- for( std::size_t i=0, length=requestedCharacters.size(); i<length; i++ )
- {
- keyVector.push_back(requestedCharacters[i].character);
- }
- Platform::DataCache::DataVector dataVector;
-
- // load the glyphs from file
- dataCache.Find( keyVector, dataVector );
-
-
- // for each glyph found, add to the glyph set
- for( std::size_t n = 0, arraySize = keyVector.size(); n < arraySize ; n++ )
- {
- Platform::DataCache::Data& data( dataVector[n]);
-
- if( data.exists )
- {
- GlyphMetrics glyphMetrics;
- glyphMetrics.code = keyVector[ n ];
- glyphMetrics.quality = GlyphMetrics::HIGH_QUALITY;
- glyphMetrics.xPosition = requestedCharacters[n].xPosition;
- glyphMetrics.yPosition = requestedCharacters[n].yPosition;
-
- // create a new bitmap, and copy in the data
- BitmapPtr bitmapData ( Integration::Bitmap::New(Bitmap::BITMAP_2D_PACKED_PIXELS, ResourcePolicy::DISCARD) );
- DALI_ASSERT_ALWAYS( data.length == DISTANCE_FIELD_SIZE );
-
- // assign the data
- bitmapData->GetPackedPixelsProfile()->AssignBuffer( Pixel::A8, data.data, DISTANCE_FIELD_SIZE, DISTANCE_FIELD_WIDTH, DISTANCE_FIELD_HEIGHT );
-
- data.data = NULL;
-
- // add to the glyphset
- glyphSet.AddCharacter( bitmapData, glyphMetrics );
- }
- }
-}
-
-void ResourceThreadText::SaveCharacters( Platform::DataCache& dataCache, const GlyphSet& glyphSet )
-{
- const GlyphSet::CharacterList& chars = glyphSet.GetCharacterList();
-
- Platform::DataCache::KeyVector keyVector;
- Platform::DataCache::DataVector dataVector;
-
- keyVector.reserve( chars.size() );
- dataVector.reserve( chars.size() );
-
- for( GlyphSet::CharacterList::const_iterator it = chars.begin(), endIt = chars.end(); it != endIt; ++it )
- {
- const BitmapPtr& bitmap( it->first );
- if ( bitmap )
- {
- const GlyphMetrics& metrics( it->second );
-
- Platform::DataCache::DataKey key( metrics.code );
- Platform::DataCache::Data data;
- data.SetData( bitmap->GetBuffer(), DISTANCE_FIELD_SIZE );
-
- keyVector.push_back( key );
- dataVector.push_back( data );
- }
- }
-
- // this will save the distance fields to file
- dataCache.Add( keyVector, dataVector );
-
-}
-
-void ResourceThreadText::LoadCharacters( Platform::DataCache& dataCache,
- GlyphSet& glyphSet,
- const TextResourceType& textRequest,
- const std::string& path,
- const TextResourceType::CharacterList& charCodes )
-{
- // we need to use freetype, ensure the library has been initialised
- LoadFreeType();
-
- // baseline and other general info still queried from FreeType even if all characters were found in cache
- GlyphSet* missingGlyphSet = mResourceLoader.GetGlyphData(textRequest, mFreeTypeHandle, path, true);
-
- const GlyphSet::CharacterList& cachedChars = missingGlyphSet->GetCharacterList();
- for( GlyphSet::CharacterList::const_iterator it = cachedChars.begin(), endIt = cachedChars.end(); it != endIt; ++it )
- {
- glyphSet.AddCharacter( *it );
- }
-
- // save to cache if high quality
- if( ( mQuality == TextResourceType::TextQualityHigh ) && ( TextResourceType::GLYPH_CACHE_WRITE == textRequest.mCache ) )
- {
- SaveCharacters( dataCache, glyphSet );
- }
-
- // all the information in missingGlyphSet has been copied, so delete it.
- delete missingGlyphSet;
-}
-
-void ResourceThreadText::LoadFreeType()
-{
- if( mFreeTypeHandle )
- {
- return;
- }
-
- if( FT_Init_FreeType( &mFreeTypeHandle ) != 0 )
- {
- DALI_ASSERT_ALWAYS( 0 && "FT_Init_FreeType failed\n");
- }
-}
-
-Platform::DataCache* ResourceThreadText::CreateDataCache( const std::string& fileName )
-{
- // low quality text thread just reads from the cache
- Platform::DataCache::ReadWriteMode readWriteMode( Platform::DataCache::READ_ONLY);
-
- // allow high quality distance fields to be written to the cache
- if( mQuality == TextResourceType::TextQualityHigh )
- {
- readWriteMode = Platform::DataCache::READ_WRITE;
- }
-
- return Platform::DataCache::New( readWriteMode,
- Platform::DataCache::RUN_LENGTH_ENCODING,
- fileName,
- DISTANCE_FIELD_SIZE,
- MAX_NUMBER_CHARS_TO_CACHE);
-}
-
-Platform::DataCache* ResourceThreadText::GetDataCache( const std::string& fileName )
-{
- boost::hash<const std::string> hasher;
- std::size_t hashValue = hasher( fileName );
-
- // most applications use under 3 fonts, so a simple vector to do the lookup is fine
- for( unsigned int i = 0; i< mDataCaches.size() ; i++ )
- {
- if( mDataCaches[i].second == hashValue)
- {
- return mDataCaches[i].first;
- }
- }
- // not found in lookup, create a new data cache
-
- Platform::DataCache* newCache = CreateDataCache( fileName );
- mDataCaches.push_back( TDataCachePair( newCache, hashValue ) );
- return newCache;
-}
-
-void ResourceThreadText::DeleteDataCaches()
-{
- for( unsigned int i = 0; i< mDataCaches.size() ; i++ )
- {
- delete mDataCaches[i].first;
- }
- mDataCaches.clear();
-}
-
-} // namespace SlpPlatform
-} // namespace Dali
+++ /dev/null
-#ifndef __DALI_SLP_PLATFORM_RESOURCE_THREAD_TEXT_H__
-#define __DALI_SLP_PLATFORM_RESOURCE_THREAD_TEXT_H__
-
-/*
- * Copyright (c) 2014 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.
- *
- */
-
-#include <dali/integration-api/resource-cache.h>
-
-
-#include "resource-thread-base.h"
-
-struct FT_LibraryRec_; // forward declaration of freetype library handle
-
-namespace Dali
-{
-
-namespace Integration
-{
-class GlyphSet;
-class TextResourceType;
-}
-namespace Platform
-{
-class DataCache;
-}
-
-namespace SlpPlatform
-{
-/**
- * Resource loader for glyph distance fields.
- * Uses FreeType and a distance field generator to create distance fields.
- * The distance fields are then cached to file for future use.
- */
-class ResourceThreadText : public ResourceThreadBase
-{
-public:
- /**
- * Constructor
- * @param[in] resourceLoader A reference to the ResourceLoader
- * @param[in] quality The quality at which to render the glyph bitmaps
- */
- ResourceThreadText(ResourceLoader& resourceLoader, const Integration::TextResourceType::TextQuality quality);
-
- /**
- * Destructor
- */
- virtual ~ResourceThreadText();
-
-private:
- /**
- * @copydoc ResourceThreadBase::Load
- */
- virtual void Load(const Integration::ResourceRequest& request);
-
- /**
- * @copydoc ResourceThreadBase::Save
- */
- virtual void Save(const Integration::ResourceRequest& request);
-
- /**
- * Load characters from the data cache.
- * @param[in] dataCache reference to a data cache
- * @param[in] glyphset reference to a glyph set
- * @param[in] requestedCharacters the characters to load from the cache
- */
- void LoadCharactersFromCache( Platform::DataCache& dataCache,
- Integration::GlyphSet& glyphSet,
- const Integration::TextResourceType::CharacterList& requestedCharacters);
-
- /**
- * Save characters to the data cache.
- * @param[in] dataCache reference to a data cache
- * @param[in] glyphset reference to a glyph set
- */
- void SaveCharacters( Platform::DataCache& dataCache,
- const Integration::GlyphSet& glyphSet);
-
- /**
- * Loading characters using Freetype and write to data cache
- * @param[in] dataCache reference to a data cache
- * @param[in] glyphset reference to a glyph set
- * @param[in] textRequest the text request
- * @param[in] path font filename
- * @param[in] characterCodes the characters to load
- */
- void LoadCharacters( Platform::DataCache& dataCache,
- Integration::GlyphSet& glyphSet,
- const Integration::TextResourceType& textRequest,
- const std::string& path,
- const Integration::TextResourceType::CharacterList& characterCodes );
-
- /**
- * Initialize the freetype library.
- * Called if a glyph is required that isn't cached.
- */
- void LoadFreeType();
-
- /**
- * Creates a data cache
- * @param[in] fileName font name
- * @return pointer to a data cache
- */
- Platform::DataCache* CreateDataCache( const std::string& fileName );
-
- /**
- * Deletes all data cache objects
- */
- void DeleteDataCaches();
-
- /**
- * Returns a data cache for a font and creates one if it doesn't exist
- * @param[in] fileName font name
- * @return a data cache for a given font filename
- */
- Platform::DataCache* GetDataCache( const std::string& fileName );
-
-private:
-
- typedef std::pair< Platform::DataCache*, std::size_t /* hash value*/ > TDataCachePair;
- std::vector< TDataCachePair >mDataCaches; ///< Vector of data caches, hash value
- Integration::TextResourceType::TextQuality mQuality; ///< The quality at which to render the glyph bitmaps
- FT_LibraryRec_* mFreeTypeHandle; ///< Handle to the FreeType2 library
-
-}; // class ResourceThreadText
-
-} // namespace SlpPlatform
-
-} // namespace Dali
-
-#endif // __DALI_SLP_PLATFORM_RESOURCE_THREAD_TEXT_H__
#include "resource-loader/resource-loader.h"
#include "dynamics/dynamics-factory.h"
-#include "slp-font-configuration-parser.h"
-#include "data-cache/metrics-cache.h"
#include "image-loaders/image-loader.h"
namespace Dali
namespace
{
-const std::string FONT_CONFIGURATION_FILE( FONT_CONFIGURATION_FILE_PATH ); ///< Default font configuration file
-const std::string DEFAULT_FONT_FAMILY( "HelveticaNeue" ); ///< Default font family when unable to retrieve from font configuration file
-const std::string DEFAULT_FONT_STYLE( "Book" ); ///< Default font style when unable to retrieve from font configuration file
-const std::string NULL_FONT_FAMILY_NAME( "" );
const unsigned int NANOSECS_TO_MICROSECS( 1000 ); ///< 1000 nanoseconds = 1 microsecond
-
-/// Settings to float point conversion table
-const float FONT_SIZE_TABLE[5] =
-{
- 8.0f, ///< Small
- 10.0f, ///< Normal
- 15.0f, ///< Large
- 19.0f, ///< Huge
- 25.0f ///< Giant
-};
}
SlpPlatformAbstraction::SlpPlatformAbstraction()
: mResourceLoader(new ResourceLoader),
- mDefaultFontSize(FONT_SIZE_TABLE[1]),
mDynamicsFactory(NULL)
{
- int error = FT_Init_FreeType(&mFreeTypeHandle);
- DALI_ASSERT_ALWAYS( error == 0 && "Freetype initialization failed" );
-
- UpdateDefaultsFromDevice();
}
SlpPlatformAbstraction::~SlpPlatformAbstraction()
{
delete mResourceLoader;
delete mDynamicsFactory;
-
- if (mFreeTypeHandle)
- {
- FT_Done_FreeType(mFreeTypeHandle);
- }
}
void SlpPlatformAbstraction::GetTimeMicroseconds(unsigned int &seconds, unsigned int µSeconds)
}
}
-const std::string& SlpPlatformAbstraction::GetDefaultFontFamily() const
-{
- // VCC TODO: return default font style as well.
- return mDefaultFontFamily;
-}
-
-float SlpPlatformAbstraction::GetDefaultFontSize() const
-{
- return mDefaultFontSize;
-}
-
-PixelSize SlpPlatformAbstraction::GetFontLineHeightFromCapsHeight(const std::string& fontFamily, const std::string& fontStyle, CapsHeight capsHeight) const
-{
- PixelSize result(0);
-
- if (mResourceLoader)
- {
- result = mResourceLoader->GetFontLineHeightFromCapsHeight(fontFamily, fontStyle, capsHeight, mFreeTypeHandle);
- }
-
- return result;
-}
-
-Integration::GlyphSet* SlpPlatformAbstraction::GetGlyphData ( const Dali::Integration::TextResourceType& textRequest,
- const std::string& fontFamily,
- bool getBitmap) const
-{
- if (mResourceLoader)
- {
- return mResourceLoader->GetGlyphData(textRequest,
- mFreeTypeHandle,
- fontFamily,
- getBitmap);
- }
- return NULL;
-}
-
-Integration::GlyphSet* SlpPlatformAbstraction::GetCachedGlyphData( const Integration::TextResourceType& textRequest,
- const std::string& fontFamily ) const
-{
- if (mResourceLoader)
- {
- return mResourceLoader->GetCachedGlyphData( textRequest, fontFamily );
- }
- return NULL;
-}
-
-
-void SlpPlatformAbstraction::GetGlobalMetrics( const std::string& fontFamily, const std::string& fontStyle, Integration::GlobalMetrics& globalMetrics ) const
-{
- if( mResourceLoader )
- {
- mResourceLoader->GetGlobalMetrics( mFreeTypeHandle,
- fontFamily,
- fontStyle,
- globalMetrics );
- }
-}
-
void SlpPlatformAbstraction::GetClosestImageSize( const std::string& filename,
const ImageAttributes& attributes,
Vector2& closestSize )
}
}
-const std::string& SlpPlatformAbstraction::GetFontFamilyForChars(const Integration::TextArray& charsRequested) const
-{
- if( mResourceLoader )
- {
- return mResourceLoader->GetFontFamilyForChars(charsRequested);
- }
-
- return NULL_FONT_FAMILY_NAME;
-}
-
-bool SlpPlatformAbstraction::AllGlyphsSupported(const std::string &fontFamily, const std::string& fontStyle, const Integration::TextArray& charsRequested) const
-{
- bool ret = false;
- if (mResourceLoader)
- {
- ret = mResourceLoader->AllGlyphsSupported(fontFamily, fontStyle, charsRequested);
- }
- return ret;
-}
-
-bool SlpPlatformAbstraction::ValidateFontFamilyName(const std::string& fontFamily, const std::string& fontStyle, bool& isDefaultSystemFont, std::string& closestMatch, std::string& closestStyleMatch) const
-{
- bool ret = false;
- if( mResourceLoader )
- {
- // TODO: Consider retrieve both isDefaultSystemFontFamily and isDefaultSystemFontStyle.
- bool isDefaultFamily = false;
- bool isDefaultStyle = false;
- ret = mResourceLoader->ValidateFontFamilyName( fontFamily, fontStyle, isDefaultFamily, isDefaultStyle, closestMatch, closestStyleMatch );
- isDefaultSystemFont = isDefaultFamily && isDefaultStyle;
- }
- return ret;
-}
-
-void SlpPlatformAbstraction::GetFontList( Dali::Integration::PlatformAbstraction::FontListMode mode, std::vector<std::string>& fontList ) const
-{
- if( mResourceLoader )
- {
- mResourceLoader->GetFontList( mode, fontList );
- }
-}
-
bool SlpPlatformAbstraction::LoadFile( const std::string& filename, std::vector< unsigned char >& buffer ) const
{
bool result = false;
mResourceLoader = NULL;
}
-void SlpPlatformAbstraction::UpdateDefaultsFromDevice()
-{
- // FontConfigurationParser::Parse sets the default font family and the default font style.
- // If the isn't a configuration file or is invalid, or it doesn't have any tag with the default
- // font family nor font style then default values set by the application are used.
- mDefaultFontFamily = DEFAULT_FONT_FAMILY;
- mDefaultFontStyle = DEFAULT_FONT_STYLE;
-
- // The initialized values above are not used to parse the configuration file. These values
- // are set just in case FontConfigurationParser::Parse is not able to set default values.
- FontConfigurationParser::Parse(FONT_CONFIGURATION_FILE, mDefaultFontFamily, mDefaultFontStyle);
-
- if ( mResourceLoader )
- {
- mResourceLoader->SetDefaultFontFamily( mDefaultFontFamily, mDefaultFontStyle );
- }
-
- int fontSize(0);
-#ifndef DALI_PROFILE_UBUNTU
- vconf_get_int( VCONFKEY_SETAPPL_ACCESSIBILITY_FONT_SIZE, &fontSize );
-#endif // DALI_PROFILE_UBUNTU
- mDefaultFontSize = FONT_SIZE_TABLE[fontSize];
-}
-
Integration::DynamicsFactory* SlpPlatformAbstraction::GetDynamicsFactory()
{
if( NULL == mDynamicsFactory )
return mDynamicsFactory;
}
-bool SlpPlatformAbstraction::ReadGlobalMetricsFromCache( const std::string& fontFamily,
- const std::string& fontStyle,
- Integration::GlobalMetrics& globalMetrics )
-{
- return MetricsCache::ReadGlobal( fontFamily, fontStyle, globalMetrics );
-}
-
-void SlpPlatformAbstraction::WriteGlobalMetricsToCache( const std::string& fontFamily,
- const std::string& fontStyle,
- const Integration::GlobalMetrics& globalMetrics )
-{
- MetricsCache::WriteGlobal( fontFamily, fontStyle, globalMetrics);
-}
-
-bool SlpPlatformAbstraction::ReadMetricsFromCache( const std::string& fontFamily,
- const std::string& fontStyle,
- std::vector<Integration::GlyphMetrics>& glyphMetricsContainer )
-{
- return MetricsCache::Read( fontFamily, fontStyle, glyphMetricsContainer );
-}
-
-void SlpPlatformAbstraction::WriteMetricsToCache( const std::string& fontFamily,
- const std::string& fontStyle,
- const Integration::GlyphSet& glyphSet )
-{
- MetricsCache::Write( fontFamily, fontStyle, glyphSet );
-}
-
-void SlpPlatformAbstraction::GetFileNamesFromDirectory( const std::string& directoryName,
- std::vector<std::string>& fileNames )
-{
- dirent* de = NULL;
- DIR* dp;
- dp = opendir( directoryName.c_str() );
- if( dp )
- {
- const std::string dot( "." );
- const std::string dotDot( ".." );
- while( true )
- {
- de = readdir( dp );
- if( de == NULL )
- {
- break;
- }
- const std::string fileName( de->d_name );
- if( ( fileName != dot ) &&
- ( fileName != dotDot ) )
- {
- fileNames.push_back( fileName );
- }
- }
- closedir( dp );
- }
-}
-
-Integration::BitmapPtr SlpPlatformAbstraction::GetGlyphImage( const std::string& fontFamily, const std::string& fontStyle, const float fontSize, const uint32_t character ) const
-{
- Integration::BitmapPtr glyphImage;
-
- if( mResourceLoader )
- {
- glyphImage = mResourceLoader->GetGlyphImage( mFreeTypeHandle, fontFamily, fontStyle, fontSize, character );
- }
-
- return glyphImage;
-}
-
} // namespace SlpPlatform
} // namespace Dali
virtual void JoinLoaderThreads();
/**
- *@copydoc PlatformAbstraction::GetDefaultFontFamily()
- */
- virtual const std::string& GetDefaultFontFamily() const;
-
- /**
- *@copydoc PlatformAbstraction::GetDefaultFontSize()
- */
- virtual float GetDefaultFontSize() const;
-
- /**
- *@copydoc PlatformAbstraction::GetFontLineHeightFromCapsHeight()
- */
- virtual PixelSize GetFontLineHeightFromCapsHeight(const std::string& fontFamily, const std::string& fontStyle, CapsHeight capsHeight) const;
-
- /**
- * @copydoc PlatformAbstraction::GetGlyphData()
- */
- virtual Integration::GlyphSet* GetGlyphData ( const Dali::Integration::TextResourceType& textRequest,
- const std::string& fontFamily,
- bool getBitmap) const;
-
- /**
- * @copydoc PlatformAbstraction::GetCachedGlyphData()
- */
- virtual Integration::GlyphSet* GetCachedGlyphData( const Integration::TextResourceType& textRequest,
- const std::string& fontFamily ) const;
-
- /**
- * @copydoc PlatformAbstraction::GetGlobalMetrics()
- */
- virtual void GetGlobalMetrics( const std::string& fontFamily,
- const std::string& fontStyle,
- Integration::GlobalMetrics& globalMetrics ) const;
-
- /**
* @copydoc PlatformAbstraction::SetDpi()
*/
virtual void SetDpi (unsigned int DpiHorizontal, unsigned int DpiVertical);
/**
- * @copydoc PlatformAbstraction::GetFontFamilyForChars()
- */
- const std::string& GetFontFamilyForChars(const Integration::TextArray& charsRequested) const;
-
- /**
- * @copydoc PlatformAbstraction::AllGlyphsSupported()
- */
- bool AllGlyphsSupported(const std::string &fontFamily, const std::string& fontStyle, const Integration::TextArray& charsRequested) const;
-
- /**
- * @copydoc PlatformAbstraction::ValidateFontFamilyName()
- */
- virtual bool ValidateFontFamilyName( const std::string& fontFamily, const std::string& fontStyle, bool& isDefaultSystemFont, std::string& closestMatch, std::string& closestStyleMatch) const;
-
- /**
- * @copydoc PlatformAbstraction::GetFontList()
- */
- virtual void GetFontList ( Dali::Integration::PlatformAbstraction::FontListMode mode, std::vector<std::string>& fontList ) const;
-
- /**
* @copydoc PlatformAbstraction::LoadFile()
*/
virtual bool LoadFile( const std::string& filename, std::vector< unsigned char >& buffer ) const;
virtual bool SaveFile(const std::string& filename, std::vector< unsigned char >& buffer) const;
/**
- * @copydoc PlatformAbstraction::UpdateDefaultsFromDevice();
- */
- virtual void UpdateDefaultsFromDevice();
-
- /**
* @copydoc PlatformAbstraction::GetDynamicsFactory();
*/
virtual Integration::DynamicsFactory* GetDynamicsFactory();
- /**
- * @copydoc PlatformAbstraction::ReadGlobalMetricsFromCacheFile
- */
- virtual bool ReadGlobalMetricsFromCache( const std::string& fontFamily,
- const std::string& fontStyle,
- Integration::GlobalMetrics& globalMetrics );
-
- /**
- * @copydoc PlatformAbstraction::WriteGlobalMetricsToCacheFile
- */
- virtual void WriteGlobalMetricsToCache( const std::string& fontFamily,
- const std::string& fontStyle,
- const Integration::GlobalMetrics& globalMetrics );
-
- /**
- * @copydoc PlatformAbstraction::ReadMetricsFromCacheFile
- */
- virtual bool ReadMetricsFromCache( const std::string& fontFamily,
- const std::string& fontStyle,
- std::vector<Integration::GlyphMetrics>& glyphMetricsContainer );
-
- /**
- * @copydoc PlatformAbstraction::WriteMetricsToCacheFile
- */
- virtual void WriteMetricsToCache( const std::string& fontFamily,
- const std::string& fontStyle,
- const Integration::GlyphSet& glyphSet );
-
- /**
- * @copydoc PlatformAbstraction::GetFileNamesFromDirectory()
- */
- virtual void GetFileNamesFromDirectory( const std::string& directoryName,
- std::vector<std::string>& fileNames );
-
- /**
- * @copydoc PlatformAbstraction::GetGlyphImage()
- */
- virtual Integration::BitmapPtr GetGlyphImage( const std::string& fontFamily, const std::string& fontStyle, float fontSize, uint32_t character ) const;
-
private:
ResourceLoader* mResourceLoader;
- FT_Library mFreeTypeHandle; ///< Freetype library
- std::string mDefaultFontFamily;
- std::string mDefaultFontStyle;
- float mDefaultFontSize;
- std::string mDefaultThemeFile;
DynamicsFactory* mDynamicsFactory;
};