X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Fmulti-language-support-impl.cpp;h=2d2352e413d4a9aa290eddf2f6357bfa8994f9fa;hp=4c68a74d5bd6613f97bd7aa26d9c06eb468a63b6;hb=f7e73f010f873b37b8f617c62873992e6e41dc5d;hpb=3b1fb566901d21b8303d9be3308e3920f5182e6d diff --git a/dali-toolkit/internal/text/multi-language-support-impl.cpp b/dali-toolkit/internal/text/multi-language-support-impl.cpp index 4c68a74..2d2352e 100644 --- a/dali-toolkit/internal/text/multi-language-support-impl.cpp +++ b/dali-toolkit/internal/text/multi-language-support-impl.cpp @@ -21,14 +21,15 @@ // EXTERNAL INCLUDES #include #include -#include -#include -#include +#include +#include +#include // INTERNAL INCLUDES -#include +#include #include #include +#include namespace Dali { @@ -125,24 +126,6 @@ Script GetScript( Length index, return script; } -/** - * @brief Whether the character is valid for all scripts. i.e. the white space. - * - * @param[in] character The character. - * - * @return @e true if the character is valid for all scripts. - */ -bool IsValidForAllScripts( Character character ) -{ - return ( TextAbstraction::IsWhiteSpace( character ) || - TextAbstraction::IsZeroWidthNonJoiner( character ) || - TextAbstraction::IsZeroWidthJoiner( character ) || - TextAbstraction::IsZeroWidthSpace( character ) || - TextAbstraction::IsLeftToRightMark( character ) || - TextAbstraction::IsRightToLeftMark( character ) || - TextAbstraction::IsThinSpace( character ) ); -} - bool ValidateFontsPerScript::FindValidFont( FontId fontId ) const { for( Vector::ConstIterator it = mValidFonts.Begin(), @@ -261,7 +244,7 @@ void MultilanguageSupport::SetScripts( const Vector& text, // Skip those characters valid for many scripts like white spaces or '\n'. bool endOfText = index == numberOfCharacters; while( !endOfText && - IsValidForAllScripts( character ) ) + TextAbstraction::IsCommonScript( character ) ) { // Count all these characters to be added into a script. ++numberOfAllScriptCharacters; @@ -373,10 +356,12 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, const Vector& scripts, Vector& fonts ) { + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "-->MultilanguageSupport::ValidateFonts\n" ); const Length numberOfCharacters = text.Count(); if( 0u == numberOfCharacters ) { + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--MultilanguageSupport::ValidateFonts\n" ); // Nothing to do if there are no characters. return; } @@ -426,6 +411,20 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, scriptRunIt, scriptRunEndIt ); +#ifdef DEBUG_ENABLED + { + Dali::TextAbstraction::FontDescription description; + fontClient.GetDescription( fontId, description ); + + DALI_LOG_INFO( gLogFilter, + Debug::Verbose, + " Initial font set\n Character : %x, Script : %s, Font : %s \n", + character, + Dali::TextAbstraction::ScriptName[script], + description.path.c_str() ); + } +#endif + if( TextAbstraction::UNKNOWN == script ) { DALI_LOG_WARNING( "MultilanguageSupport::ValidateFonts. Unknown script!" ); @@ -435,6 +434,11 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, // Whether the font being validated is a default one not set by the user. const bool isDefault = ( 0u == fontId ); + DALI_LOG_INFO( gLogFilter, + Debug::Verbose, + " Is a default font : %s\n", + ( isDefault ? "true" : "false" ) ); + // The default font point size. PointSize26Dot6 pointSize = TextAbstraction::FontClient::DEFAULT_POINT_SIZE; @@ -449,12 +453,32 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, { // Check in the valid fonts cache. ValidateFontsPerScript* validateFontsPerScript = *( validFontsPerScriptCacheBuffer + script ); + + if( NULL == validateFontsPerScript ) + { + validateFontsPerScript = new ValidateFontsPerScript(); + + *( validFontsPerScriptCacheBuffer + script ) = validateFontsPerScript; + } + if( NULL != validateFontsPerScript ) { if( !validateFontsPerScript->FindValidFont( fontId ) ) { // Use the font client to validate the font. - const GlyphIndex glyphIndex = fontClient.GetGlyphIndex( fontId, character ); + GlyphIndex glyphIndex = fontClient.GetGlyphIndex( fontId, character ); + + // Emojis are present in many monochrome fonts; prefer color by default. + if( TextAbstraction::EMOJI == script && + 0u != glyphIndex ) + { + BufferImage bitmap = fontClient.CreateBitmap( fontId, glyphIndex ); + if( bitmap && + Pixel::BGRA8888 != bitmap.GetPixelFormat() ) + { + glyphIndex = 0; + } + } if( 0u == glyphIndex ) { @@ -467,34 +491,32 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, else { // Add the font to the valid font cache. - validateFontsPerScript->mValidFonts.PushBack( fontId ); - } - } - } - else - { - // Use the font client to validate the font. - const GlyphIndex glyphIndex = fontClient.GetGlyphIndex( fontId, character ); - - if( 0u == glyphIndex ) - { - // Get the point size of the current font. It will be used to get a default font id. - pointSize = fontClient.GetPointSize( fontId ); - // The font is not valid. Set to zero and a default one will be set. - fontId = 0u; - } - else - { - // Add the font to the valid font cache. - validateFontsPerScript = new ValidateFontsPerScript(); - *( validFontsPerScriptCacheBuffer + script ) = validateFontsPerScript; + // At this point the validated font supports the given character. However, characters + // common for all scripts, like white spaces or new paragraph characters, need to be + // processed differently. + // + // i.e. A white space can have assigned a DEVANAGARI script but the font assigned may not + // support none of the DEVANAGARI glyphs. This font can't be added to the cache as a valid + // font for the DEVANAGARI script but the COMMON one. + if( TextAbstraction::IsCommonScript( character ) ) + { + validateFontsPerScript = *( validFontsPerScriptCacheBuffer + TextAbstraction::COMMON ); + + if( NULL == validateFontsPerScript ) + { + validateFontsPerScript = new ValidateFontsPerScript(); + + *( validFontsPerScriptCacheBuffer + TextAbstraction::COMMON ) = validateFontsPerScript; + } + } - validateFontsPerScript->mValidFonts.PushBack( fontId ); + validateFontsPerScript->mValidFonts.PushBack( fontId ); + } } } } - } + } // !isDefault // The font has not been validated. Find a default one. if( 0u == fontId ) @@ -521,16 +543,24 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, fontId = fontClient.FindDefaultFont( UTF32_A, pointSize ); } -#ifdef DEBUG_ENABLED - Dali::TextAbstraction::FontDescription description; - fontClient.GetDescription( fontId, description ); - DALI_LOG_INFO( gLogFilter, Debug::Concise, "Script: %s; Selected font: %s\n", Dali::TextAbstraction::ScriptName[script], description.path.c_str() ); -#endif // Cache the font. *( defaultFontPerScriptCacheBuffer + script ) = fontId; } } +#ifdef DEBUG_ENABLED + { + Dali::TextAbstraction::FontDescription description; + fontClient.GetDescription( fontId, description ); + DALI_LOG_INFO( gLogFilter, + Debug::Verbose, + " Validated font set\n Character : %x, Script : %s, Font : %s \n", + character, + Dali::TextAbstraction::ScriptName[script], + description.path.c_str() ); + } +#endif + // The font is now validated. if( ( fontId != currentFontRun.fontId ) || @@ -560,6 +590,7 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, // Store the last run. fonts.PushBack( currentFontRun ); } + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--MultilanguageSupport::ValidateFonts\n" ); } void MultilanguageSupport::ValidateFonts( LogicalModel& model,