From: Victor Cebollada Date: Thu, 11 Jun 2015 07:00:46 +0000 (+0100) Subject: Fix for multi-language support. X-Git-Tag: dali_1.0.45~16 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=2aa1507dbdb0ed42f45edb1a643f5bd50acd8f51;ds=sidebyside Fix for multi-language support. Change-Id: I0eb938a4edac325daff30cad3a77f5bd1e80f5ac Signed-off-by: Victor Cebollada --- diff --git a/dali-toolkit/internal/text/multi-language-support-impl.cpp b/dali-toolkit/internal/text/multi-language-support-impl.cpp index 47db1e2..2d2352e 100644 --- a/dali-toolkit/internal/text/multi-language-support-impl.cpp +++ b/dali-toolkit/internal/text/multi-language-support-impl.cpp @@ -126,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(), @@ -262,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; @@ -374,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; } @@ -427,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!" ); @@ -436,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; @@ -488,6 +491,26 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, else { // Add the font to the valid font cache. + + // 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 ); } } @@ -520,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 ) || @@ -559,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,