From: Paul Wisbey Date: Tue, 17 Mar 2015 09:09:41 +0000 (+0000) Subject: Break-up the Relayout method X-Git-Tag: dali_1.0.38~11^2~52 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=refs%2Fchanges%2F41%2F36941%2F1 Break-up the Relayout method Change-Id: I55ed27274e9665ea0a1421d804cc021993be009a --- diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index 79185ba..a203e03 100644 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.cpp @@ -643,6 +643,9 @@ bool Controller::Relayout( const Vector2& size ) mImpl->mControlSize = size; } + // Make sure the model is up-to-date before layouting + ReplaceText( mImpl->mOperationsPending ); + Size layoutSize; bool updated = DoRelayout( mImpl->mControlSize, mImpl->mOperationsPending, @@ -660,12 +663,8 @@ bool Controller::Relayout( const Vector2& size ) return updated; } -bool Controller::DoRelayout( const Vector2& size, - OperationsMask operationsRequired, - Size& layoutSize ) +void Controller::ReplaceText( OperationsMask operationsRequired ) { - bool viewUpdated( false ); - // Calculate the operations to be done. const OperationsMask operations = static_cast( mImpl->mOperationsPending & operationsRequired ); @@ -762,7 +761,6 @@ bool Controller::DoRelayout( const Vector2& size, } } - Vector bidirectionalInfo; if( BIDI_INFO & operations ) { // Some vectors with data needed to get the paragraph's bidirectional info may be void @@ -810,6 +808,7 @@ bool Controller::DoRelayout( const Vector2& size, } } + Vector bidirectionalInfo; bidirectionalInfo.Reserve( numberOfParagraphs ); // Calculates the bidirectional info for the whole paragraph if it contains right to left scripts. @@ -860,6 +859,16 @@ bool Controller::DoRelayout( const Vector2& size, charactersPerGlyph.Begin(), numberOfGlyphs ); } +} + +bool Controller::DoRelayout( const Vector2& size, + OperationsMask operationsRequired, + Size& layoutSize ) +{ + bool viewUpdated( false ); + + // Calculate the operations to be done. + const OperationsMask operations = static_cast( mImpl->mOperationsPending & operationsRequired ); if( LAYOUT & operations ) { @@ -868,47 +877,37 @@ bool Controller::DoRelayout( const Vector2& size, // Fill the vectors again. const Length numberOfCharacters = mImpl->mLogicalModel->GetNumberOfCharacters(); - numberOfGlyphs = mImpl->mVisualModel->GetNumberOfGlyphs(); + Length numberOfGlyphs = mImpl->mVisualModel->GetNumberOfGlyphs(); - if( 0u == lineBreakInfo.Count() ) - { - lineBreakInfo.Resize( numberOfCharacters ); - mImpl->mLogicalModel->GetLineBreakInfo( lineBreakInfo.Begin(), - 0u, - numberOfCharacters ); - } + Vector lineBreakInfo; + lineBreakInfo.Resize( numberOfCharacters ); + mImpl->mLogicalModel->GetLineBreakInfo( lineBreakInfo.Begin(), + 0u, + numberOfCharacters ); - if( 0u == wordBreakInfo.Count() ) - { - wordBreakInfo.Resize( numberOfCharacters ); - mImpl->mLogicalModel->GetWordBreakInfo( wordBreakInfo.Begin(), - 0u, - numberOfCharacters ); - } + Vector wordBreakInfo; + wordBreakInfo.Resize( numberOfCharacters ); + mImpl->mLogicalModel->GetWordBreakInfo( wordBreakInfo.Begin(), + 0u, + numberOfCharacters ); - if( 0u == glyphs.Count() ) - { - glyphs.Resize( numberOfGlyphs ); - mImpl->mVisualModel->GetGlyphs( glyphs.Begin(), - 0u, - numberOfGlyphs ); - } + Vector glyphs; + glyphs.Resize( numberOfGlyphs ); + mImpl->mVisualModel->GetGlyphs( glyphs.Begin(), + 0u, + numberOfGlyphs ); - if( 0u == glyphsToCharactersMap.Count() ) - { - glyphsToCharactersMap.Resize( numberOfGlyphs ); - mImpl->mVisualModel->GetGlyphToCharacterMap( glyphsToCharactersMap.Begin(), + Vector glyphsToCharactersMap; + glyphsToCharactersMap.Resize( numberOfGlyphs ); + mImpl->mVisualModel->GetGlyphToCharacterMap( glyphsToCharactersMap.Begin(), + 0u, + numberOfGlyphs ); + + Vector charactersPerGlyph; + charactersPerGlyph.Resize( numberOfGlyphs ); + mImpl->mVisualModel->GetCharactersPerGlyphMap( charactersPerGlyph.Begin(), 0u, numberOfGlyphs ); - } - - if( 0u == charactersPerGlyph.Count() ) - { - charactersPerGlyph.Resize( numberOfGlyphs ); - mImpl->mVisualModel->GetCharactersPerGlyphMap( charactersPerGlyph.Begin(), - 0u, - numberOfGlyphs ); - } // Set the layout parameters. LayoutParameters layoutParameters( size, @@ -943,13 +942,11 @@ bool Controller::DoRelayout( const Vector2& size, { const Length numberOfBidiParagraphs = mImpl->mLogicalModel->GetNumberOfBidirectionalInfoRuns( 0u, numberOfCharacters ); - if( 0u == bidirectionalInfo.Count() ) - { - bidirectionalInfo.Resize( numberOfBidiParagraphs ); - mImpl->mLogicalModel->GetBidirectionalInfo( bidirectionalInfo.Begin(), - 0u, - numberOfCharacters ); - } + Vector bidirectionalInfo; + bidirectionalInfo.Resize( numberOfBidiParagraphs ); + mImpl->mLogicalModel->GetBidirectionalInfo( bidirectionalInfo.Begin(), + 0u, + numberOfCharacters ); // Check first if there are paragraphs with bidirectional info. if( 0u != bidirectionalInfo.Count() ) @@ -1051,6 +1048,8 @@ Vector3 Controller::GetNaturalSize() GET_WORD_BREAKS | SHAPE_TEXT | GET_GLYPH_METRICS ); + // Make sure the model is up-to-date before layouting + ReplaceText( onlyOnceOperations ); // Operations that need to be done if the size changes. const OperationsMask sizeOperations = static_cast( LAYOUT | @@ -1095,6 +1094,9 @@ float Controller::GetHeightForWidth( float width ) SHAPE_TEXT | GET_GLYPH_METRICS ); + // Make sure the model is up-to-date before layouting + ReplaceText( onlyOnceOperations ); + // Operations that need to be done if the size changes. const OperationsMask sizeOperations = static_cast( LAYOUT | REORDER ); diff --git a/dali-toolkit/internal/text/text-controller.h b/dali-toolkit/internal/text/text-controller.h index 640c2b4..ee77ca3 100644 --- a/dali-toolkit/internal/text/text-controller.h +++ b/dali-toolkit/internal/text/text-controller.h @@ -207,6 +207,13 @@ public: bool Relayout( const Vector2& size ); /** + * @brief Update the model with new text. + * + * @param[in] operations The layout operations which need to be done. + */ + void ReplaceText( OperationsMask operations ); + + /** * @brief Lays-out the text. * * GetNaturalSize(), GetHeightForWidth() and Relayout() calls this method.