X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Ftext-controller.cpp;h=a48c09386dfc1a179cf7a86432c932d663fa66d0;hb=24279a886ad9ae76add5295ae047170a42d479dc;hp=ce7ba8b85ee08f1bc3984d53f6da3d70e1849d43;hpb=5f52c3c35c5349781a0fb864c03b59825bec5965;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index ce7ba8b..a48c093 100755 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.cpp @@ -2140,12 +2140,14 @@ Toolkit::DevelText::TextDirection::Type Controller::GetTextDirection() if ( mImpl->mUpdateTextDirection ) { // Operations that can be done only once until the text changes. - const OperationsMask onlyOnceOperations = static_cast( GET_SCRIPTS | + const OperationsMask onlyOnceOperations = static_cast( CONVERT_TO_UTF32 | + GET_SCRIPTS | VALIDATE_FONTS | GET_LINE_BREAKS | GET_WORD_BREAKS | BIDI_INFO | - SHAPE_TEXT ); + SHAPE_TEXT | + GET_GLYPH_METRICS ); // Set the update info to relayout the whole text. mImpl->mTextUpdateInfo.mParagraphCharacterIndex = 0u; @@ -2160,6 +2162,9 @@ Toolkit::DevelText::TextDirection::Type Controller::GetTextDirection() LAYOUT | REORDER | UPDATE_DIRECTION ), naturalSize.GetVectorXY() ); + // Do not do again the only once operations. + mImpl->mOperationsPending = static_cast( mImpl->mOperationsPending & ~onlyOnceOperations ); + // Clear the update info. This info will be set the next time the text is updated. mImpl->mTextUpdateInfo.Clear(); @@ -3445,6 +3450,22 @@ bool Controller::DoRelayout( const Size& size, const CharacterIndex lastIndex = startIndex + ( ( requestedNumberOfCharacters > 0u ) ? requestedNumberOfCharacters - 1u : 0u ); const GlyphIndex startGlyphIndex = mImpl->mTextUpdateInfo.mStartGlyphIndex; + + // Make sure the index is not out of bound + if ( charactersToGlyph.Count() != glyphsPerCharacter.Count() || + requestedNumberOfCharacters > charactersToGlyph.Count() || + ( lastIndex >= charactersToGlyph.Count() && charactersToGlyph.Count() > 0u ) ) + { + std::string currentText; + GetText( currentText ); + + DALI_LOG_ERROR( "Controller::DoRelayout: Attempting to access invalid buffer\n" ); + DALI_LOG_ERROR( "Current text is: %s\n", currentText.c_str() ); + DALI_LOG_ERROR( "startIndex: %u, lastIndex: %u, requestedNumberOfCharacters: %u, charactersToGlyph.Count = %lu, glyphsPerCharacter.Count = %lu\n", startIndex, lastIndex, requestedNumberOfCharacters, charactersToGlyph.Count(), glyphsPerCharacter.Count()); + + return false; + } + const Length numberOfGlyphs = ( requestedNumberOfCharacters > 0u ) ? *( charactersToGlyphBuffer + lastIndex ) + *( glyphsPerCharacterBuffer + lastIndex ) - startGlyphIndex : 0u; const Length totalNumberOfGlyphs = mImpl->mModel->mVisualModel->mGlyphs.Count();