X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Fmulti-language-support-impl.cpp;h=8b491b064942a653eff2a008a625078a05aff78e;hb=76aedd71699fdbd88ab863b2c96b2ec740abfcfd;hp=1e8abf2a627a665aee80b3b22c7f5f1c67f674f9;hpb=3e30971f9884dc48e80ef82de4ef85fc9dba1229;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 1e8abf2..8b491b0 100644 --- a/dali-toolkit/internal/text/multi-language-support-impl.cpp +++ b/dali-toolkit/internal/text/multi-language-support-impl.cpp @@ -211,6 +211,19 @@ void MultilanguageSupport::SetScripts( const Vector& text, while( !endOfText && ( TextAbstraction::COMMON == script ) ) { + if( TextAbstraction::EMOJI == currentScriptRun.script ) + { + // Emojis doesn't mix well with characters common to all scripts. Insert the emoji run. + scripts.Insert( scripts.Begin() + scriptIndex, currentScriptRun ); + ++scriptIndex; + + // Initialize the new one. + currentScriptRun.characterRun.characterIndex = currentScriptRun.characterRun.characterIndex + currentScriptRun.characterRun.numberOfCharacters; + currentScriptRun.characterRun.numberOfCharacters = 0u; + currentScriptRun.script = TextAbstraction::UNKNOWN; + numberOfAllScriptCharacters = 0u; + } + // Count all these characters to be added into a script. ++numberOfAllScriptCharacters; @@ -248,7 +261,7 @@ void MultilanguageSupport::SetScripts( const Vector& text, character = *( textBuffer + index ); script = TextAbstraction::GetCharacterScript( character ); } - } + } // end while( !endOfText && ( TextAbstraction::COMMON == script ) ) if( endOfText ) { @@ -260,7 +273,8 @@ void MultilanguageSupport::SetScripts( const Vector& text, // Check if it is the first character of a paragraph. if( isFirstScriptToBeSet && ( TextAbstraction::UNKNOWN != script ) && - ( TextAbstraction::COMMON != script ) ) + ( TextAbstraction::COMMON != script ) && + ( TextAbstraction::EMOJI != script ) ) { // Sets the direction of the first valid script. isParagraphRTL = TextAbstraction::IsRightToLeftScript( script ); @@ -288,6 +302,13 @@ void MultilanguageSupport::SetScripts( const Vector& text, currentScriptRun.characterRun.numberOfCharacters += numberOfAllScriptCharacters; numberOfAllScriptCharacters = 0u; } + else if( ( TextAbstraction::UNKNOWN == currentScriptRun.script ) && + ( TextAbstraction::EMOJI == script ) ) + { + currentScriptRun.script = TextAbstraction::LATIN; + currentScriptRun.characterRun.numberOfCharacters += numberOfAllScriptCharacters; + numberOfAllScriptCharacters = 0u; + } if( 0u != currentScriptRun.characterRun.numberOfCharacters ) { @@ -435,6 +456,7 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, PointSize26Dot6 currentPointSize = defaultPointSize; FontId currentFontId = 0u; FontId previousFontId = 0u; + bool isPreviousEmojiScript = false; // Whether it's the first set of characters to be validated. // Used in case the paragraph starts with characters common to all scripts. @@ -497,6 +519,23 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, isValidFont = isValidCachedDefaultFont && ( fontId == cachedDefaultFontId ); bool isCommonScript = false; + bool isEmojiScript = TextAbstraction::EMOJI == script; + + if( isEmojiScript && !isPreviousEmojiScript ) + { + if( 0u != currentFontRun.characterRun.numberOfCharacters ) + { + // Store the font run. + fonts.Insert( fonts.Begin() + fontIndex, currentFontRun ); + ++fontIndex; + } + + // Initialize the new one. + currentFontRun.characterRun.characterIndex = currentFontRun.characterRun.characterIndex + currentFontRun.characterRun.numberOfCharacters; + currentFontRun.characterRun.numberOfCharacters = 0u; + currentFontRun.fontId = fontId; + } + // If the given font is not valid, it means either: // - there is no cached font for the current script yet or, @@ -523,7 +562,8 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, if( isCommonScript ) { if( isValidCachedDefaultFont && - ( isDefault || ( currentFontId == previousFontId ) ) ) + ( isDefault || ( currentFontId == previousFontId ) ) && + !isEmojiScript ) { // At this point the character common for all scripts has no font assigned. // If there is a valid previously cached default font for it, use that one. @@ -551,9 +591,9 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, // Emojis are present in many monochrome fonts; prefer color by default. if( isValidFont && - ( TextAbstraction::EMOJI == script ) ) + isEmojiScript ) { - const BufferImage bitmap = fontClient.CreateBitmap( fontId, glyphIndex ); + const PixelData bitmap = fontClient.CreateBitmap( fontId, glyphIndex ); // For color emojis, the font is valid if the bitmap is RGBA. isValidFont = bitmap && ( Pixel::BGRA8888 == bitmap.GetPixelFormat() ); @@ -611,8 +651,13 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, // Cache the font. if( NULL == defaultFontsPerScript ) { - defaultFontsPerScript = new DefaultFonts(); - *( defaultFontPerScriptCacheBuffer + script ) = defaultFontsPerScript; + defaultFontsPerScript = *( defaultFontPerScriptCacheBuffer + script ); + + if( NULL == defaultFontsPerScript ) + { + defaultFontsPerScript = new DefaultFonts(); + *( defaultFontPerScriptCacheBuffer + script ) = defaultFontsPerScript; + } } defaultFontsPerScript->mFonts.PushBack( fontId ); } @@ -670,6 +715,7 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, // Whether the current character is a new paragraph character. isNewParagraphCharacter = TextAbstraction::IsNewParagraph( character ); previousFontId = currentFontId; + isPreviousEmojiScript = isEmojiScript; } // end traverse characters. if( 0u != currentFontRun.characterRun.numberOfCharacters )