X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Fsegmentation.cpp;h=f52710cdcbd19218a0b71adf484574b8b4466474;hp=38897938c655d28dc623e72746f7901c585e7f51;hb=7c13cc0c065ae22e7ad0deaea4f56730ff050c5c;hpb=820c66e71516e7a25600b8b5de2e84b5d44d8ff3 diff --git a/dali-toolkit/internal/text/segmentation.cpp b/dali-toolkit/internal/text/segmentation.cpp index 3889793..f52710c 100644 --- a/dali-toolkit/internal/text/segmentation.cpp +++ b/dali-toolkit/internal/text/segmentation.cpp @@ -15,14 +15,14 @@ * */ -// CLASS HEADER +// FILE HEADER #include // EXTERNAL INCLUDES #include #ifdef DEBUG_ENABLED -#include #include +#include #endif // INTERNAL INCLUDES @@ -32,107 +32,148 @@ namespace { - #if defined(DEBUG_ENABLED) - Debug::Filter* gLogFilter = Debug::Filter::New(Debug::Concise, true, "LOG_TEXT_SEGMENTATION"); +Debug::Filter* gLogFilter = Debug::Filter::New(Debug::Concise, true, "LOG_TEXT_SEGMENTATION"); #endif } // namespace - namespace Dali { - namespace Toolkit { - namespace Text { - -void SetLineBreakInfo( const Vector& text, - Vector& lineBreakInfo ) +void SetLineBreakInfo(const Vector& text, + CharacterIndex startIndex, + Length numberOfCharacters, + Vector& lineBreakInfo) { - const Length numberOfCharacters = text.Count(); + const Length totalNumberOfCharacters = text.Count(); - if( 0u == numberOfCharacters ) + if(0u == totalNumberOfCharacters) { // Nothing to do if there are no characters. return; } // Retrieve the line break info. - lineBreakInfo.Resize( numberOfCharacters ); - TextAbstraction::Segmentation::Get().GetLineBreakPositions( text.Begin(), - numberOfCharacters, - lineBreakInfo.Begin() ); + lineBreakInfo.Resize(totalNumberOfCharacters); + + // Whether the current buffer is being updated or is set from scratch. + const bool updateCurrentBuffer = numberOfCharacters < totalNumberOfCharacters; + + LineBreakInfo* lineBreakInfoBuffer = NULL; + Vector newLineBreakInfo; + + if(updateCurrentBuffer) + { + newLineBreakInfo.Resize(numberOfCharacters); + lineBreakInfoBuffer = newLineBreakInfo.Begin(); + } + else + { + lineBreakInfoBuffer = lineBreakInfo.Begin(); + } + + // Retrieve the line break info. + TextAbstraction::Segmentation::Get().GetLineBreakPositions(text.Begin() + startIndex, + numberOfCharacters, + lineBreakInfoBuffer); + + // If the line break info is updated, it needs to be inserted in the model. + if(updateCurrentBuffer) + { + lineBreakInfo.Insert(lineBreakInfo.Begin() + startIndex, + newLineBreakInfo.Begin(), + newLineBreakInfo.End()); + lineBreakInfo.Resize(totalNumberOfCharacters); + } + #ifdef DEBUG_ENABLED - if( gLogFilter->IsEnabledFor(Debug::Verbose) ) + if(gLogFilter->IsEnabledFor(Debug::Verbose)) { std::string utf8; - Utf32ToUtf8( text.Begin(), numberOfCharacters, utf8 ); + Utf32ToUtf8(text.Begin(), numberOfCharacters, utf8); std::string info; - info.reserve( numberOfCharacters ); - for( unsigned int i=0; i('0' + lineBreakInfo[i]) ); + info.push_back(static_cast('0' + lineBreakInfo[i])); } - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "SetLineBreakInfo Characters: %s\n", utf8.c_str() ); - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "SetLineBreakInfo Break info: %s\n", info.c_str() ); + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "SetLineBreakInfo Characters: %s\n", utf8.c_str()); + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "SetLineBreakInfo Break info: %s\n", info.c_str()); } #endif } -void ReplaceLineBreakInfo( LogicalModel& model, - CharacterIndex characterIndex, - Length numberOfCharactersToRemove, - Length numberOfCharactersToInsert ) +void SetWordBreakInfo(const Vector& text, + CharacterIndex startIndex, + Length numberOfCharacters, + Vector& wordBreakInfo) { -} + const Length totalNumberOfCharacters = text.Count(); -void SetWordBreakInfo( const Vector& text, - Vector& wordBreakInfo ) -{ - const Length numberOfCharacters = text.Count(); - - if( 0u == numberOfCharacters ) + if(0u == totalNumberOfCharacters) { // Nothing to do if there are no characters. return; } + // Resize the vector. + wordBreakInfo.Resize(totalNumberOfCharacters); + + // Whether the current buffer is being updated or is set from scratch. + const bool updateCurrentBuffer = numberOfCharacters < totalNumberOfCharacters; + + WordBreakInfo* wordBreakInfoBuffer = NULL; + Vector newWordBreakInfo; + + if(updateCurrentBuffer) + { + newWordBreakInfo.Resize(numberOfCharacters); + wordBreakInfoBuffer = newWordBreakInfo.Begin(); + } + else + { + wordBreakInfoBuffer = wordBreakInfo.Begin(); + } + // Retrieve the word break info. - wordBreakInfo.Resize( numberOfCharacters ); - TextAbstraction::Segmentation::Get().GetWordBreakPositions( text.Begin(), - numberOfCharacters, - wordBreakInfo.Begin() ); + TextAbstraction::Segmentation::Get().GetWordBreakPositions(text.Begin() + startIndex, + numberOfCharacters, + wordBreakInfoBuffer); + + // If the word break info is updated, it needs to be inserted in the model. + if(updateCurrentBuffer) + { + wordBreakInfo.Insert(wordBreakInfo.Begin() + startIndex, + newWordBreakInfo.Begin(), + newWordBreakInfo.End()); + wordBreakInfo.Resize(totalNumberOfCharacters); + } + #ifdef DEBUG_ENABLED - if( gLogFilter->IsEnabledFor(Debug::Verbose) ) + if(gLogFilter->IsEnabledFor(Debug::Verbose)) { std::string utf8; - Utf32ToUtf8( text.Begin(), numberOfCharacters, utf8 ); + Utf32ToUtf8(text.Begin(), totalNumberOfCharacters, utf8); std::string info; - info.reserve( numberOfCharacters ); - for( unsigned int i=0; i('0' + wordBreakInfo[i]) ); + info.push_back(static_cast('0' + wordBreakInfo[i])); } - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "SetWordBreakInfo Characters: %s\n", utf8.c_str() ); - DALI_LOG_INFO( gLogFilter, Debug::Verbose, "SetWordBreakInfo Break info: %s\n", info.c_str() ); + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "SetWordBreakInfo Characters: %s\n", utf8.c_str()); + DALI_LOG_INFO(gLogFilter, Debug::Verbose, "SetWordBreakInfo Break info: %s\n", info.c_str()); } #endif } -void ReplaceWordBreakInfo( LogicalModel& model, - CharacterIndex characterIndex, - Length numberOfCharactersToRemove, - Length numberOfCharactersToInsert ) -{ -} - } // namespace Text } // namespace Toolkit