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=61afef1b9f197e7db1e87b8d3f0ee4cc814c38c3;hp=efac834b37d81eab64b5007dc7029dab74821903;hb=0b2e209ecfb3cedba510f53a4af58d7d8a2b3876;hpb=56d412791a44c2a79135d2293c13fddb135c9d54 diff --git a/dali-toolkit/internal/text/segmentation.cpp b/dali-toolkit/internal/text/segmentation.cpp index efac834..61afef1 100644 --- a/dali-toolkit/internal/text/segmentation.cpp +++ b/dali-toolkit/internal/text/segmentation.cpp @@ -15,11 +15,30 @@ * */ -// CLASS HEADER +// FILE HEADER #include // EXTERNAL INCLUDES -#include +#include +#ifdef DEBUG_ENABLED +#include +#include +#endif + +// INTERNAL INCLUDES +#ifdef DEBUG_ENABLED +#include +#endif + +namespace +{ + +#if defined(DEBUG_ENABLED) + Debug::Filter* gLogFilter = Debug::Filter::New(Debug::Concise, true, "LOG_TEXT_SEGMENTATION"); +#endif + +} // namespace + namespace Dali { @@ -31,53 +50,133 @@ namespace Text { 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(), + 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, - lineBreakInfo.Begin() ); -} + lineBreakInfoBuffer ); -void ReplaceLineBreakInfo( LogicalModel& model, - CharacterIndex characterIndex, - Length numberOfCharactersToRemove, - Length numberOfCharactersToInsert ) -{ + // 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) ) + { + std::string utf8; + Utf32ToUtf8( text.Begin(), numberOfCharacters, utf8 ); + + std::string info; + info.reserve( numberOfCharacters ); + for( unsigned int i=0; i('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() ); + } +#endif } void SetWordBreakInfo( const Vector& text, + CharacterIndex startIndex, + Length numberOfCharacters, Vector& wordBreakInfo ) { - 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; } + // 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(), + TextAbstraction::Segmentation::Get().GetWordBreakPositions( text.Begin() + startIndex, numberOfCharacters, - wordBreakInfo.Begin() ); -} + wordBreakInfoBuffer ); -void ReplaceWordBreakInfo( LogicalModel& model, - CharacterIndex characterIndex, - Length numberOfCharactersToRemove, - Length numberOfCharactersToInsert ) -{ + // 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) ) + { + std::string utf8; + Utf32ToUtf8( text.Begin(), totalNumberOfCharacters, utf8 ); + + std::string info; + info.reserve( totalNumberOfCharacters ); + for( unsigned int i=0; i('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() ); + } +#endif } } // namespace Text