X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Fmulti-language-support-impl.cpp;h=750fab78dd24baa0c8b7f0df0f63abd6521f965b;hb=a632f8445619b331bc1cf1ae95b14d84a024a281;hp=8b491b064942a653eff2a008a625078a05aff78e;hpb=9d09b345fbdef7a0532f5b45ffe65754f87258c6;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 8b491b0..750fab7 100644 --- a/dali-toolkit/internal/text/multi-language-support-impl.cpp +++ b/dali-toolkit/internal/text/multi-language-support-impl.cpp @@ -63,7 +63,9 @@ bool ValidateFontsPerScript::IsValidFont( FontId fontId ) const return false; } -FontId DefaultFonts::FindFont( TextAbstraction::FontClient& fontClient, PointSize26Dot6 size ) const +FontId DefaultFonts::FindFont( TextAbstraction::FontClient& fontClient, + const TextAbstraction::FontDescription& description, + PointSize26Dot6 size ) const { for( Vector::ConstIterator it = mFonts.Begin(), endIt = mFonts.End(); @@ -71,7 +73,13 @@ FontId DefaultFonts::FindFont( TextAbstraction::FontClient& fontClient, PointSiz ++it ) { const FontId fontId = *it; - if( size == fontClient.GetPointSize( fontId ) ) + TextAbstraction::FontDescription fontDescription; + fontClient.GetDescription( fontId, fontDescription ); + + if( ( size == fontClient.GetPointSize( fontId ) ) && + ( description.weight == fontDescription.weight ) && + ( description.width == fontDescription.width ) && + ( description.slant == fontDescription.slant ) ) { return fontId; } @@ -374,7 +382,8 @@ void MultilanguageSupport::SetScripts( const Vector& text, void MultilanguageSupport::ValidateFonts( const Vector& text, const Vector& scripts, const Vector& fontDescriptions, - FontId defaultFontId, + const TextAbstraction::FontDescription& defaultFontDescription, + TextAbstraction::PointSize26Dot6 defaultFontPointSize, CharacterIndex startIndex, Length numberOfCharacters, Vector& fonts ) @@ -424,36 +433,13 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, // Get the font client. TextAbstraction::FontClient fontClient = TextAbstraction::FontClient::Get(); - // Get the default font description and default size. - TextAbstraction::FontDescription defaultFontDescription; - TextAbstraction::PointSize26Dot6 defaultPointSize = TextAbstraction::FontClient::DEFAULT_POINT_SIZE; - if( defaultFontId > 0u ) - { - fontClient.GetDescription( defaultFontId, defaultFontDescription ); - defaultPointSize = fontClient.GetPointSize( defaultFontId ); - } - - // Merge font descriptions - Vector fontIds; - fontIds.Resize( numberOfCharacters, defaultFontId ); - Vector isDefaultFont; - isDefaultFont.Resize( numberOfCharacters, true ); - MergeFontDescriptions( fontDescriptions, - fontIds, - isDefaultFont, - defaultFontDescription, - defaultPointSize, - startIndex, - numberOfCharacters ); - const Character* const textBuffer = text.Begin(); - const FontId* const fontIdsBuffer = fontIds.Begin(); - const bool* const isDefaultFontBuffer = isDefaultFont.Begin(); + + // Iterators of the script runs. Vector::ConstIterator scriptRunIt = scripts.Begin(); Vector::ConstIterator scriptRunEndIt = scripts.End(); bool isNewParagraphCharacter = false; - PointSize26Dot6 currentPointSize = defaultPointSize; FontId currentFontId = 0u; FontId previousFontId = 0u; bool isPreviousEmojiScript = false; @@ -468,24 +454,26 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, // Get the current character. const Character character = *( textBuffer + index ); - // Get the font for the current character. - FontId fontId = *( fontIdsBuffer + index - startIndex ); + TextAbstraction::FontDescription currentFontDescription; + TextAbstraction::PointSize26Dot6 currentFontPointSize = defaultFontPointSize; + bool isDefaultFont = true; + MergeFontDescriptions( fontDescriptions, + defaultFontDescription, + defaultFontPointSize, + index, + currentFontDescription, + currentFontPointSize, + isDefaultFont ); - // Whether the font being validated for the current character is a default one not set by the user. - const bool isDefault = *( isDefaultFontBuffer + index - startIndex ); + // Get the font for the current character. + FontId fontId = fontClient.GetFontId( currentFontDescription, currentFontPointSize ); + currentFontId = fontId; // Get the script for the current character. const Script script = GetScript( index, scriptRunIt, scriptRunEndIt ); - // Get the current point size. - if( currentFontId != fontId ) - { - currentPointSize = fontClient.GetPointSize( fontId ); - currentFontId = fontId; - } - #ifdef DEBUG_ENABLED { Dali::TextAbstraction::FontDescription description; @@ -509,7 +497,9 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, FontId cachedDefaultFontId = 0u; if( NULL != defaultFonts ) { - cachedDefaultFontId = defaultFonts->FindFont( fontClient, currentPointSize ); + cachedDefaultFontId = defaultFonts->FindFont( fontClient, + currentFontDescription, + currentFontPointSize ); } // Whether the cached default font is valid. @@ -562,7 +552,7 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, if( isCommonScript ) { if( isValidCachedDefaultFont && - ( isDefault || ( currentFontId == previousFontId ) ) && + ( isDefaultFont || ( currentFontId == previousFontId ) ) && !isEmojiScript ) { // At this point the character common for all scripts has no font assigned. @@ -631,7 +621,10 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, const bool preferColor = ( TextAbstraction::EMOJI == script ); // Find a fallback-font. - fontId = fontClient.FindFallbackFont( currentFontId, character, currentPointSize, preferColor ); + fontId = fontClient.FindFallbackFont( character, + currentFontDescription, + currentFontPointSize, + preferColor ); if( 0u == fontId ) { @@ -639,13 +632,15 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, defaultFontsPerScript = *( defaultFontPerScriptCacheBuffer + TextAbstraction::LATIN ); if( NULL != defaultFontsPerScript ) { - fontId = defaultFontsPerScript->FindFont( fontClient, currentPointSize ); + fontId = defaultFontsPerScript->FindFont( fontClient, + currentFontDescription, + currentFontPointSize ); } } if( 0u == fontId ) { - fontId = fontClient.FindDefaultFont( UTF32_A, currentPointSize ); + fontId = fontClient.FindDefaultFont( UTF32_A, currentFontPointSize ); } // Cache the font.