From: Victor Cebollada Date: Wed, 9 Dec 2015 15:49:22 +0000 (+0000) Subject: Text cleaning. X-Git-Tag: dali_1.1.15~10^2 X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=commitdiff_plain;h=7defa3b4bae282299a3c701bbf1e3d4a1d968786 Text cleaning. * Iterators added in the text atlas renderer. * Removes unimplemented method from the visual model. * Typo fixed in the text controller. * Extra white spaces removed. * std::vector replaced by Dali::Vector in the text controller. * Some var's type fixes in the text controller. Change-Id: I75193fc02ea6f1f53ede8a09606167ef4506142f Signed-off-by: Victor Cebollada --- diff --git a/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp b/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp index 4cb19ed..e336e0b 100644 --- a/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp +++ b/dali-toolkit/internal/text/rendering/atlas/text-atlas-renderer.cpp @@ -221,10 +221,10 @@ struct AtlasRenderer::Impl thereAreUnderlinedGlyphs = thereAreUnderlinedGlyphs || underlineGlyph; // No operation for white space - if ( glyph.width && glyph.height ) + if( glyph.width && glyph.height ) { // Are we still using the same fontId as previous - if ( underlineGlyph && ( glyph.fontId != lastUnderlinedFontId ) ) + if( underlineGlyph && ( glyph.fontId != lastUnderlinedFontId ) ) { // We need to fetch fresh font underline metrics FontMetrics fontMetrics; @@ -248,10 +248,11 @@ struct AtlasRenderer::Impl } // Clamp the underline position at the font descender and check for ( as EFL describes it ) a broken font - if ( currentUnderlinePosition > descender ) + if( currentUnderlinePosition > descender ) { currentUnderlinePosition = descender; } + if( fabsf( currentUnderlinePosition ) < Math::MACHINE_EPSILON_1000 ) { // Move offset down by one ( EFL behavior ) @@ -261,47 +262,54 @@ struct AtlasRenderer::Impl lastUnderlinedFontId = glyph.fontId; } // underline - if ( !mGlyphManager.IsCached( glyph.fontId, glyph.index, slot ) ) + if( !mGlyphManager.IsCached( glyph.fontId, glyph.index, slot ) ) { // Select correct size for new atlas if needed....? - if ( lastFontId != glyph.fontId ) + if( lastFontId != glyph.fontId ) { - for ( uint32_t j = 0; j < mBlockSizes.size(); ++j ) + uint32_t index = 0u; + for( std::vector::const_iterator it = mBlockSizes.begin(), + endIt = mBlockSizes.end(); + it != endIt; + ++it, ++index ) { - if ( mBlockSizes[ j ].mFontId == glyph.fontId ) + const MaxBlockSize& blockSize = *it; + if( blockSize.mFontId == glyph.fontId ) { - currentBlockSize = j; + currentBlockSize = index; mGlyphManager.SetNewAtlasSize( DEFAULT_ATLAS_WIDTH, DEFAULT_ATLAS_HEIGHT, - mBlockSizes[ j ].mNeededBlockWidth, - mBlockSizes[ j ].mNeededBlockHeight ); + blockSize.mNeededBlockWidth, + blockSize.mNeededBlockHeight ); } } } // Create a new image for the glyph BufferImage bitmap = mFontClient.CreateBitmap( glyph.fontId, glyph.index ); - if ( bitmap ) + if( bitmap ) { + MaxBlockSize& blockSize = mBlockSizes[currentBlockSize]; + // Ensure that the next image will fit into the current block size bool setSize = false; - if ( bitmap.GetWidth() > mBlockSizes[ currentBlockSize ].mNeededBlockWidth ) + if( bitmap.GetWidth() > blockSize.mNeededBlockWidth ) { setSize = true; - mBlockSizes[ currentBlockSize ].mNeededBlockWidth = bitmap.GetWidth(); + blockSize.mNeededBlockWidth = bitmap.GetWidth(); } - if ( bitmap.GetHeight() > mBlockSizes[ currentBlockSize ].mNeededBlockHeight ) + if( bitmap.GetHeight() > blockSize.mNeededBlockHeight ) { setSize = true; - mBlockSizes[ currentBlockSize ].mNeededBlockHeight = bitmap.GetHeight(); + blockSize.mNeededBlockHeight = bitmap.GetHeight(); } - if ( setSize ) + if( setSize ) { mGlyphManager.SetNewAtlasSize( DEFAULT_ATLAS_WIDTH, DEFAULT_ATLAS_HEIGHT, - mBlockSizes[ currentBlockSize ].mNeededBlockWidth, - mBlockSizes[ currentBlockSize ].mNeededBlockHeight ); + blockSize.mNeededBlockWidth, + blockSize.mNeededBlockHeight ); } // Locate a new slot for our glyph @@ -315,7 +323,7 @@ struct AtlasRenderer::Impl } // Move the origin (0,0) of the mesh to the center of the actor - Vector2 position = *( positionsBuffer + i ) - halfActorSize; + const Vector2 position = *( positionsBuffer + i ) - halfActorSize; // Generate mesh data for this quad, plugging in our supplied position AtlasManager::Mesh2D newMesh; @@ -325,13 +333,20 @@ struct AtlasRenderer::Impl textCacheEntry.mIndex = glyph.index; newTextCache.PushBack( textCacheEntry ); + AtlasManager::Vertex2D* verticesBuffer = newMesh.mVertices.Begin(); + // Adjust the vertices if the fixed-size font should be down-scaled if( glyph.scaleFactor > 0 ) { - for( unsigned int i=0; i::iterator mIt = meshContainer.begin(); mIt != meshContainer.end(); ++mIt ) + for( std::vector< MeshRecord >::iterator it = meshContainer.begin(), + endIt = meshContainer.end(); + it != endIt; ++it ) { - Actor actor = CreateMeshActor( *mIt, actorSize ); + MeshRecord& meshRecord = *it; + + Actor actor = CreateMeshActor( meshRecord, actorSize ); // Create an effect if necessary - if ( style == STYLE_DROP_SHADOW ) + if( style == STYLE_DROP_SHADOW ) { // Create a container actor to act as a common parent for text and shadow, to avoid color inheritence issues. Actor containerActor = Actor::New(); @@ -380,7 +399,7 @@ struct AtlasRenderer::Impl #endif // Offset shadow in x and y shadowActor.RegisterProperty("uOffset", shadowOffset ); - if ( actor.GetRendererCount() ) + if( actor.GetRendererCount() ) { Dali::Renderer renderer( actor.GetRendererAt( 0 ) ); Geometry geometry = renderer.GetGeometry(); @@ -417,7 +436,7 @@ struct AtlasRenderer::Impl DALI_LOG_INFO( gLogFilter, Debug::Verbose, "%s\n", metrics.mVerboseGlyphCounts.c_str() ); - for ( uint32_t i = 0; i < metrics.mAtlasMetrics.mAtlasCount; ++i ) + for( uint32_t i = 0; i < metrics.mAtlasMetrics.mAtlasCount; ++i ) { DALI_LOG_INFO( gLogFilter, Debug::Verbose, " Atlas [%i] %sPixels: %s Size: %ix%i, BlockSize: %ix%i, BlocksUsed: %i/%i\n", i + 1, i > 8 ? "" : " ", @@ -434,7 +453,7 @@ struct AtlasRenderer::Impl void RemoveText() { - for ( Vector< TextCacheEntry >::Iterator oldTextIter = mTextCache.Begin(); oldTextIter != mTextCache.End(); ++oldTextIter ) + for( Vector< TextCacheEntry >::Iterator oldTextIter = mTextCache.Begin(); oldTextIter != mTextCache.End(); ++oldTextIter ) { mGlyphManager.AdjustReferenceCount( oldTextIter->mFontId, oldTextIter->mIndex, -1/*decrement*/ ); } @@ -489,7 +508,7 @@ struct AtlasRenderer::Impl mIt != mEndIt; ++mIt, ++index ) { - if ( slot.mAtlasId == mIt->mAtlasId && color == mIt->mColor ) + if( slot.mAtlasId == mIt->mAtlasId && color == mIt->mColor ) { // Append the mesh to the existing mesh and adjust any extents Toolkit::Internal::AtlasMeshFactory::AppendMesh( mIt->mMesh, newMesh ); @@ -584,25 +603,36 @@ struct AtlasRenderer::Impl void CalculateBlocksSize( const Vector& glyphs ) { - MaxBlockSize maxBlockSize; - for ( uint32_t i = 0; i < glyphs.Size(); ++i ) + for( Vector::ConstIterator glyphIt = glyphs.Begin(), + glyphEndIt = glyphs.End(); + glyphIt != glyphEndIt; + ++glyphIt ) { - FontId fontId = glyphs[ i ].fontId; + const FontId fontId = (*glyphIt).fontId; bool foundFont = false; - for ( uint32_t j = 0; j < mBlockSizes.size(); ++j ) + + for( std::vector< MaxBlockSize >::const_iterator blockIt = mBlockSizes.begin(), + blockEndIt = mBlockSizes.end(); + blockIt != blockEndIt; + ++blockIt ) { - if ( mBlockSizes[ j ].mFontId == fontId ) + if( (*blockIt).mFontId == fontId ) { foundFont = true; + break; } } + if ( !foundFont ) { FontMetrics fontMetrics; mFontClient.GetFontMetrics( fontId, fontMetrics ); + + MaxBlockSize maxBlockSize; maxBlockSize.mNeededBlockWidth = static_cast< uint32_t >( fontMetrics.height ); - maxBlockSize.mNeededBlockHeight = static_cast< uint32_t >( fontMetrics.height ); + maxBlockSize.mNeededBlockHeight = maxBlockSize.mNeededBlockWidth; maxBlockSize.mFontId = fontId; + mBlockSizes.push_back( maxBlockSize ); } } @@ -663,7 +693,7 @@ struct AtlasRenderer::Impl newMesh.mIndices.PushBack( faceIndex + 1u ); faceIndex += 4; - if ( underlineColor == textColor ) + if( underlineColor == textColor ) { Toolkit::Internal::AtlasMeshFactory::AppendMesh( meshRecords[ index ].mMesh, newMesh ); } @@ -721,8 +751,8 @@ Actor AtlasRenderer::Render( Text::ViewInterface& view, int depth ) glyphs, depth ); - /* In the case where AddGlyphs does not create a renderable Actor for example when glyphs are all whitespace create a new Actor. */ - /* This renderable actor is used to position the text, other "decorations" can rely on there always being an Actor regardless of it is whitespace or regular text*/ + /* In the case where AddGlyphs does not create a renderable Actor for example when glyphs are all whitespace create a new Actor. */ + /* This renderable actor is used to position the text, other "decorations" can rely on there always being an Actor regardless of it is whitespace or regular text. */ if ( !mImpl->mActor ) { mImpl->mActor = Actor::New(); diff --git a/dali-toolkit/internal/text/text-controller-impl.cpp b/dali-toolkit/internal/text/text-controller-impl.cpp index ccd64db..a86688d 100644 --- a/dali-toolkit/internal/text/text-controller-impl.cpp +++ b/dali-toolkit/internal/text/text-controller-impl.cpp @@ -889,30 +889,30 @@ void Controller::Impl::OnSelectAllEvent() } } -void Controller::Impl::RetrieveSelection( std::string& selectedText, bool deleteAfterRetreival ) +void Controller::Impl::RetrieveSelection( std::string& selectedText, bool deleteAfterRetrieval ) { - if( mEventData->mLeftSelectionPosition == mEventData->mRightSelectionPosition ) + if( mEventData->mLeftSelectionPosition == mEventData->mRightSelectionPosition ) { // Nothing to select if handles are in the same place. - selectedText=""; + selectedText.clear(); return; } const bool handlesCrossed = mEventData->mLeftSelectionPosition > mEventData->mRightSelectionPosition; //Get start and end position of selection - uint32_t startOfSelectedText = handlesCrossed ? mEventData->mRightSelectionPosition : mEventData->mLeftSelectionPosition; - uint32_t lengthOfSelectedText = ( handlesCrossed ? mEventData->mLeftSelectionPosition : mEventData->mRightSelectionPosition ) - startOfSelectedText; + const CharacterIndex startOfSelectedText = handlesCrossed ? mEventData->mRightSelectionPosition : mEventData->mLeftSelectionPosition; + const Length lengthOfSelectedText = ( handlesCrossed ? mEventData->mLeftSelectionPosition : mEventData->mRightSelectionPosition ) - startOfSelectedText; // Validate the start and end selection points - if( ( startOfSelectedText + lengthOfSelectedText ) <= mLogicalModel->mText.Count() ) + if( ( startOfSelectedText + lengthOfSelectedText ) <= mLogicalModel->mText.Count() ) { //Get text as a UTF8 string Vector& utf32Characters = mLogicalModel->mText; Utf32ToUtf8( &utf32Characters[startOfSelectedText], lengthOfSelectedText, selectedText ); - if ( deleteAfterRetreival ) // Only delete text if copied successfully + if( deleteAfterRetrieval ) // Only delete text if copied successfully { // Delete text between handles Vector& currentText = mLogicalModel->mText; @@ -963,11 +963,11 @@ void Controller::Impl::SendSelectionToClipboard( bool deleteAfterSending ) ChangeState( EventData::EDITING ); } -void Controller::Impl::GetTextFromClipboard( unsigned int itemIndex, std::string& retreivedString ) +void Controller::Impl::GetTextFromClipboard( unsigned int itemIndex, std::string& retrievedString ) { if ( mClipboard ) { - retreivedString = mClipboard.GetItem( itemIndex ); + retrievedString = mClipboard.GetItem( itemIndex ); } } @@ -1534,7 +1534,7 @@ CharacterIndex Controller::Impl::GetClosestCursorIndex( float visualX, // Get the position of the first glyph. const Vector2& position = *( positionsBuffer + firstLogicalGlyphIndex ); - // Whether the glyph can be split, like Latin ligatures fi, ff or Arabic ï»». + // Whether the glyph can be split, like Latin ligatures fi, ff or Arabic ï»». const bool isInterglyphIndex = ( numberOfCharacters > numberOfGlyphs ) && HasLigatureMustBreak( script ); const Length numberOfBlocks = isInterglyphIndex ? numberOfCharacters : 1u; const float glyphAdvance = glyphMetrics.advance / static_cast( numberOfBlocks ); diff --git a/dali-toolkit/internal/text/text-controller-impl.h b/dali-toolkit/internal/text/text-controller-impl.h index 0f5149d..927352c 100644 --- a/dali-toolkit/internal/text/text-controller-impl.h +++ b/dali-toolkit/internal/text/text-controller-impl.h @@ -162,7 +162,7 @@ struct EventData bool mUpdateRightSelectionPosition : 1; ///< True if the visual position of the right selection handle must be recalculated. bool mScrollAfterUpdatePosition : 1; ///< Whether to scroll after the cursor position is updated. bool mScrollAfterDelete : 1; ///< Whether to scroll after delete characters. - bool mAllTextSelected : 1; ///< True if the selection handles are selecting all the text + bool mAllTextSelected : 1; ///< True if the selection handles are selecting all the text. }; struct ModifyEvent @@ -194,7 +194,7 @@ struct FontDefaults { if( !mFontId ) { - Dali::TextAbstraction::PointSize26Dot6 pointSize = mDefaultPointSize*64; + const PointSize26Dot6 pointSize = static_cast( mDefaultPointSize * 64.f ); mFontId = fontClient.GetFontId( mFontDescription, pointSize ); } @@ -224,7 +224,7 @@ struct Controller::Impl mTextColor( Color::BLACK ), mAlignmentOffset(), mOperationsPending( NO_OPERATION ), - mMaximumNumberOfCharacters( 50 ), + mMaximumNumberOfCharacters( 50u ), mRecalculateNaturalSize( true ), mUserDefinedFontFamily( false ) { @@ -264,12 +264,12 @@ struct Controller::Impl if( ModifyEvent::TEXT_REPLACED == type) { // Cancel previously queued inserts etc. - mModifyEvents.clear(); + mModifyEvents.Clear(); } ModifyEvent event; event.type = type; - mModifyEvents.push_back( event ); + mModifyEvents.PushBack( event ); // The event will be processed during relayout RequestRelayout(); @@ -383,7 +383,7 @@ struct Controller::Impl void OnSelectAllEvent(); - void RetrieveSelection( std::string& selectedText, bool deleteAfterRetreival ); + void RetrieveSelection( std::string& selectedText, bool deleteAfterRetrieval ); void ShowClipboard(); @@ -393,7 +393,7 @@ struct Controller::Impl void SendSelectionToClipboard( bool deleteAfterSending ); - void GetTextFromClipboard( unsigned int itemIndex, std::string& retreivedString ); + void GetTextFromClipboard( unsigned int itemIndex, std::string& retrievedString ); void RepositionSelectionHandles(); void RepositionSelectionHandles( float visualX, float visualY ); @@ -504,7 +504,7 @@ struct Controller::Impl View mView; ///< The view interface to the rendering back-end. MetricsPtr mMetrics; ///< A wrapper around FontClient used to get metrics & potentially down-scaled Emoji metrics. LayoutEngine mLayoutEngine; ///< The layout engine. - std::vector mModifyEvents; ///< Temporary stores the text set until the next relayout. + Vector mModifyEvents; ///< Temporary stores the text set until the next relayout. Vector4 mTextColor; ///< The regular text color Vector2 mAlignmentOffset; ///< Vertical and horizontal offset of the whole text inside the control due to alignment. OperationsMask mOperationsPending; ///< Operations pending to be done to layout the text. diff --git a/dali-toolkit/internal/text/text-controller.cpp b/dali-toolkit/internal/text/text-controller.cpp index 592bc12..2a06637 100644 --- a/dali-toolkit/internal/text/text-controller.cpp +++ b/dali-toolkit/internal/text/text-controller.cpp @@ -784,22 +784,33 @@ bool Controller::Relayout( const Size& size ) void Controller::ProcessModifyEvents() { - std::vector& events = mImpl->mModifyEvents; + Vector& events = mImpl->mModifyEvents; - for( unsigned int i=0; i::ConstIterator it = events.Begin(), + endIt = events.End(); + it != endIt; + ++it ) + { + const ModifyEvent& event = *it; + + if( ModifyEvent::TEXT_REPLACED == event.type ) { // A (single) replace event should come first, otherwise we wasted time processing NOOP events - DALI_ASSERT_DEBUG( 0 == i && "Unexpected TEXT_REPLACED event" ); + DALI_ASSERT_DEBUG( it == events.Begin() && "Unexpected TEXT_REPLACED event" ); TextReplacedEvent(); } - else if( ModifyEvent::TEXT_INSERTED == events[i].type ) + else if( ModifyEvent::TEXT_INSERTED == event.type ) { TextInsertedEvent(); } - else if( ModifyEvent::TEXT_DELETED == events[i].type ) + else if( ModifyEvent::TEXT_DELETED == event.type ) { // Placeholder-text cannot be deleted if( !mImpl->IsShowingPlaceholderText() ) @@ -809,15 +820,14 @@ void Controller::ProcessModifyEvents() } } - if( mImpl->mEventData && - 0 != events.size() ) + if( mImpl->mEventData ) { // When the text is being modified, delay cursor blinking mImpl->mEventData->mDecorator->DelayCursorBlink(); } // Discard temporary text - events.clear(); + events.Clear(); } void Controller::ResetText() @@ -1432,9 +1442,10 @@ void Controller::InsertText( const std::string& text, Controller::InsertType typ Length maxSizeOfNewText = std::min ( ( mImpl->mMaximumNumberOfCharacters - numberOfCharactersInModel ), characterCount ); maxLengthReached = ( characterCount > maxSizeOfNewText ); - // Insert at current cursor position + // The cursor position. CharacterIndex& cursorIndex = mImpl->mEventData->mPrimaryCursorPosition; + // Insert at current cursor position. Vector& modifyText = mImpl->mLogicalModel->mText; if( cursorIndex < numberOfCharactersInModel ) diff --git a/dali-toolkit/internal/text/visual-model-impl.h b/dali-toolkit/internal/text/visual-model-impl.h index 0717582..52d2d31 100644 --- a/dali-toolkit/internal/text/visual-model-impl.h +++ b/dali-toolkit/internal/text/visual-model-impl.h @@ -88,19 +88,6 @@ public: GlyphIndex glyphIndex, Length numberOfGlyphs ) const; - // Character <--> Glyph conversion - - /** - * @brief Retrieves for each character the number of glyphs the character is shaped. - * - * @param[out] glyphsPerCharacter Pointer to a buffer where the number of glyphs for each character are copied. - * @param[in] characterIndex Index to the first character. - * @param[in] numberOfCharacters The number of characters. - */ - void GetGlyphsPerCharacterMap( Length* glyphsPerCharacter, - CharacterIndex characterIndex, - Length numberOfCharacters ) const; - // Position interface /**