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=d730c9e207ab4bdb04d38f71a36c28e4fd379f01;hp=2d2352e413d4a9aa290eddf2f6357bfa8994f9fa;hb=1c1a0aa8481233240396cf469f08e524b2d86021;hpb=1285b533b39904afb182730717c59f6362ae6131 diff --git a/dali-toolkit/internal/text/multi-language-support-impl.cpp b/dali-toolkit/internal/text/multi-language-support-impl.cpp index 2d2352e..d730c9e 100644 --- a/dali-toolkit/internal/text/multi-language-support-impl.cpp +++ b/dali-toolkit/internal/text/multi-language-support-impl.cpp @@ -19,17 +19,9 @@ #include // EXTERNAL INCLUDES -#include #include #include #include -#include - -// INTERNAL INCLUDES -#include -#include -#include -#include namespace Dali { @@ -194,7 +186,6 @@ Text::MultilanguageSupport MultilanguageSupport::Get() } void MultilanguageSupport::SetScripts( const Vector& text, - const Vector& lineBreakInfo, Vector& scripts ) { const Length numberOfCharacters = text.Count(); @@ -214,8 +205,8 @@ void MultilanguageSupport::SetScripts( const Vector& text, // Reserve some space to reduce the number of reallocations. scripts.Reserve( numberOfCharacters << 2u ); - // Whether the first valid script need to be set. - bool firstValidScript = true; + // Whether the first valid script needs to be set. + bool isFirstScriptToBeSet = true; // Whether the first valid script is a right to left script. bool isParagraphRTL = false; @@ -224,14 +215,15 @@ void MultilanguageSupport::SetScripts( const Vector& text, Length numberOfAllScriptCharacters = 0u; // Pointers to the text and break info buffers. - const Character* textBuffer = text.Begin(); - const LineBreakInfo* breakInfoBuffer = lineBreakInfo.Begin(); + const Character* const textBuffer = text.Begin(); // Traverse all characters and set the scripts. for( Length index = 0u; index < numberOfCharacters; ++index ) { Character character = *( textBuffer + index ); - LineBreakInfo breakInfo = *( breakInfoBuffer + index ); + + // Get the script of the character. + Script script = TextAbstraction::GetCharacterScript( character ); // Some characters (like white spaces) are valid for many scripts. The rules to set a script // for them are: @@ -244,19 +236,25 @@ void MultilanguageSupport::SetScripts( const Vector& text, // Skip those characters valid for many scripts like white spaces or '\n'. bool endOfText = index == numberOfCharacters; while( !endOfText && - TextAbstraction::IsCommonScript( character ) ) + ( TextAbstraction::COMMON == script ) ) { // Count all these characters to be added into a script. ++numberOfAllScriptCharacters; - if( TextAbstraction::LINE_MUST_BREAK == breakInfo ) + if( TextAbstraction::IsNewParagraph( character ) ) { - // The next character is a new paragraph. - // Know when there is a new paragraph is needed because if there is a white space + // The character is a new paragraph. + // To know when there is a new paragraph is needed because if there is a white space // between two scripts with different directions, it is added to the script with // the same direction than the first script of the paragraph. - firstValidScript = true; - isParagraphRTL = false; + isFirstScriptToBeSet = true; + + // Characters common to all scripts at the end of the paragraph are added to the last script (if the last one is not unknown). + if( TextAbstraction::UNKNOWN != currentScriptRun.script ) + { + currentScriptRun.characterRun.numberOfCharacters += numberOfAllScriptCharacters; + numberOfAllScriptCharacters = 0u; + } } // Get the next character. @@ -265,7 +263,7 @@ void MultilanguageSupport::SetScripts( const Vector& text, if( !endOfText ) { character = *( textBuffer + index ); - breakInfo = *( breakInfoBuffer + index ); + script = TextAbstraction::GetCharacterScript( character ); } } @@ -276,25 +274,33 @@ void MultilanguageSupport::SetScripts( const Vector& text, break; } - // Get the script of the character. - Script script = TextAbstraction::GetCharacterScript( character ); - // Check if it is the first character of a paragraph. - if( firstValidScript && - ( TextAbstraction::UNKNOWN != script ) ) + if( isFirstScriptToBeSet && + ( TextAbstraction::UNKNOWN != script ) && + ( TextAbstraction::COMMON != script ) ) { // Sets the direction of the first valid script. isParagraphRTL = TextAbstraction::IsRightToLeftScript( script ); - firstValidScript = false; + isFirstScriptToBeSet = false; } - if( script != currentScriptRun.script ) + if( ( script != currentScriptRun.script ) && + ( TextAbstraction::COMMON != script ) ) { // Current run needs to be stored and a new one initialized. - if( isParagraphRTL != TextAbstraction::IsRightToLeftScript( script ) ) + if( ( isParagraphRTL == TextAbstraction::IsRightToLeftScript( currentScriptRun.script ) ) && + ( TextAbstraction::UNKNOWN != currentScriptRun.script ) ) { - // Current script has different direction than the first script of the paragraph. + // Previous script has the same direction than the first script of the paragraph. + // All the previously skipped characters need to be added to the previous script before it's stored. + currentScriptRun.characterRun.numberOfCharacters += numberOfAllScriptCharacters; + numberOfAllScriptCharacters = 0u; + } + else if( ( TextAbstraction::IsRightToLeftScript( currentScriptRun.script ) == TextAbstraction::IsRightToLeftScript( script ) ) && + ( TextAbstraction::UNKNOWN != currentScriptRun.script ) ) + { + // Current script and previous one have the same direction. // All the previously skipped characters need to be added to the previous script before it's stored. currentScriptRun.characterRun.numberOfCharacters += numberOfAllScriptCharacters; numberOfAllScriptCharacters = 0u; @@ -308,48 +314,37 @@ void MultilanguageSupport::SetScripts( const Vector& text, // Initialize the new one. currentScriptRun.characterRun.characterIndex = currentScriptRun.characterRun.characterIndex + currentScriptRun.characterRun.numberOfCharacters; - currentScriptRun.characterRun.numberOfCharacters = numberOfAllScriptCharacters; // Adds the white spaces which are at the begining of the script. + currentScriptRun.characterRun.numberOfCharacters = numberOfAllScriptCharacters + 1u; // Adds the white spaces which are at the begining of the script. currentScriptRun.script = script; numberOfAllScriptCharacters = 0u; } else { - // Adds white spaces between characters. - currentScriptRun.characterRun.numberOfCharacters += numberOfAllScriptCharacters; - numberOfAllScriptCharacters = 0u; - } + if( TextAbstraction::UNKNOWN != currentScriptRun.script ) + { + // Adds white spaces between characters. + currentScriptRun.characterRun.numberOfCharacters += numberOfAllScriptCharacters; + numberOfAllScriptCharacters = 0u; + } - if( TextAbstraction::LINE_MUST_BREAK == breakInfo ) - { - // The next character is a new paragraph. - firstValidScript = true; - isParagraphRTL = false; + // Add one more character to the run. + ++currentScriptRun.characterRun.numberOfCharacters; } - - // Add one more character to the run. - ++currentScriptRun.characterRun.numberOfCharacters; } // 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, @@ -593,13 +588,6 @@ void MultilanguageSupport::ValidateFonts( const Vector& text, DALI_LOG_INFO( gLogFilter, Debug::Verbose, "<--MultilanguageSupport::ValidateFonts\n" ); } -void MultilanguageSupport::ValidateFonts( LogicalModel& model, - CharacterIndex characterIndex, - Length numberOfCharactersToRemove, - Length numberOfCharactersToInsert ) -{ -} - } // namespace Internal } // namespace Text