X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Fmulti-language-support-impl.cpp;h=3fa8f6f2a9a1b51c8086e1822a6403de6facd93e;hb=242a6531bc1ec7336156a95363816aa587645d72;hp=4c68a74d5bd6613f97bd7aa26d9c06eb468a63b6;hpb=3b1fb566901d21b8303d9be3308e3920f5182e6d;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/text/multi-language-support-impl.cpp b/dali-toolkit/internal/text/multi-language-support-impl.cpp index 4c68a74..3fa8f6f 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; @@ -349,34 +332,29 @@ void MultilanguageSupport::SetScripts( const Vector& text, // Add remaining characters into the last script. currentScriptRun.characterRun.numberOfCharacters += numberOfAllScriptCharacters; - if( 0u != currentScriptRun.characterRun.numberOfCharacters ) - { - if( TextAbstraction::UNKNOWN == currentScriptRun.script ) - { - // There are only white spaces in the last script. Set the latin script. - currentScriptRun.script = TextAbstraction::LATIN; - } - // Store the last run. - scripts.PushBack( currentScriptRun ); + DALI_ASSERT_DEBUG( ( 0u != currentScriptRun.characterRun.numberOfCharacters ) && "MultilanguageSupport::SetScripts() Trying to insert a script run with zero characters." ); + + if( TextAbstraction::UNKNOWN == currentScriptRun.script ) + { + // There are only white spaces in the last script. Set the latin script. + currentScriptRun.script = TextAbstraction::LATIN; } -} -void MultilanguageSupport::ReplaceScripts( LogicalModel& model, - CharacterIndex characterIndex, - Length numberOfCharactersToRemove, - Length numberOfCharactersToInsert ) -{ + // Store the last run. + scripts.PushBack( currentScriptRun ); } 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 +404,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 +427,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 +446,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 +484,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 +536,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,13 +583,7 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, // Store the last run. fonts.PushBack( currentFontRun ); } -} - -void MultilanguageSupport::ValidateFonts( LogicalModel& model, - CharacterIndex characterIndex, - Length numberOfCharactersToRemove, - Length numberOfCharactersToInsert ) -{ + DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--MultilanguageSupport::ValidateFonts\n" ); } } // namespace Internal