X-Git-Url: http://review.tizen.org/git/?p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git;a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Ftext-controller-impl.cpp;h=c2c2fa86bd0bc52d763d74b9ed48e3f15118055f;hp=a197d327729b3898be25b0dd68e1b2b4dac0f482;hb=5b4982566aba41b5e21c3b8ce3e01a7e86db8f28;hpb=d38447a2265a4018e9afa89c79b693e3c8ec5b4c diff --git a/dali-toolkit/internal/text/text-controller-impl.cpp b/dali-toolkit/internal/text/text-controller-impl.cpp index a197d32..c2c2fa8 100644 --- a/dali-toolkit/internal/text/text-controller-impl.cpp +++ b/dali-toolkit/internal/text/text-controller-impl.cpp @@ -325,6 +325,8 @@ void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) const Length numberOfCharacters = utf32Characters.Count(); Vector& lineBreakInfo = mLogicalModel->mLineBreakInfo; + CharacterIndex startIndex = 0u; + Length requestedNumberOfCharacters = numberOfCharacters; if( GET_LINE_BREAKS & operations ) { // Retrieves the line break info. The line break info is used to split the text in 'paragraphs' to @@ -344,6 +346,8 @@ void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) wordBreakInfo.Resize( numberOfCharacters, TextAbstraction::WORD_NO_BREAK ); SetWordBreakInfo( utf32Characters, + startIndex, + requestedNumberOfCharacters, wordBreakInfo ); } @@ -363,22 +367,27 @@ void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) { // Retrieves the scripts used in the text. multilanguageSupport.SetScripts( utf32Characters, + startIndex, + requestedNumberOfCharacters, scripts ); } if( validateFonts ) { - if( 0u == validFonts.Count() ) - { - // Copy the requested font defaults received via the property system. - // These may not be valid i.e. may not contain glyphs for the necessary scripts. - GetDefaultFonts( validFonts, numberOfCharacters ); - } + // Validate the fonts set through the mark-up string. + Vector& fontDescriptionRuns = mLogicalModel->mFontDescriptionRuns; + + // Get the default font id. + const FontId defaultFontId = ( NULL == mFontDefaults ) ? 0u : mFontDefaults->GetFontId( mFontClient ); // Validates the fonts. If there is a character with no assigned font it sets a default one. // After this call, fonts are validated. multilanguageSupport.ValidateFonts( utf32Characters, scripts, + fontDescriptionRuns, + defaultFontId, + startIndex, + requestedNumberOfCharacters, validFonts ); } } @@ -407,23 +416,29 @@ void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) SetBidirectionalInfo( utf32Characters, scripts, lineBreakInfo, + startIndex, + requestedNumberOfCharacters, bidirectionalInfo ); if( 0u != bidirectionalInfo.Count() ) { - // This paragraph has right to left text. Some characters may need to be mirrored. - // TODO: consider if the mirrored string can be stored as well. - - textMirrored = GetMirroredText( utf32Characters, - mirroredUtf32Characters, - bidirectionalInfo ); - // Only set the character directions if there is right to left characters. Vector& directions = mLogicalModel->mCharacterDirections; - directions.Resize( numberOfCharacters ); - GetCharactersDirection( bidirectionalInfo, + numberOfCharacters, + startIndex, + requestedNumberOfCharacters, directions ); + + // This paragraph has right to left text. Some characters may need to be mirrored. + // TODO: consider if the mirrored string can be stored as well. + + textMirrored = GetMirroredText( utf32Characters, + directions, + bidirectionalInfo, + startIndex, + requestedNumberOfCharacters, + mirroredUtf32Characters ); } else { @@ -438,6 +453,7 @@ void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) Vector newParagraphGlyphs; newParagraphGlyphs.Reserve( numberOfParagraphs ); + GlyphIndex startGlyphIndex = 0u; if( SHAPE_TEXT & operations ) { const Vector& textToShape = textMirrored ? mirroredUtf32Characters : utf32Characters; @@ -446,21 +462,24 @@ void Controller::Impl::UpdateModel( OperationsMask operationsRequired ) lineBreakInfo, scripts, validFonts, + startIndex, + startGlyphIndex, + requestedNumberOfCharacters, glyphs, glyphsToCharactersMap, charactersPerGlyph, newParagraphGlyphs ); // Create the 'number of glyphs' per character and the glyph to character conversion tables. - mVisualModel->CreateGlyphsPerCharacterTable( numberOfCharacters ); - mVisualModel->CreateCharacterToGlyphTable( numberOfCharacters ); + mVisualModel->CreateGlyphsPerCharacterTable( startIndex, numberOfCharacters ); + mVisualModel->CreateCharacterToGlyphTable( startIndex, numberOfCharacters ); } const Length numberOfGlyphs = glyphs.Count(); if( GET_GLYPH_METRICS & operations ) { - GlyphInfo* glyphsBuffer = glyphs.Begin(); + GlyphInfo* glyphsBuffer = glyphs.Begin() + startGlyphIndex; mMetrics->GetGlyphMetrics( glyphsBuffer, numberOfGlyphs ); // Update the width and advance of all new paragraph characters. @@ -517,22 +536,37 @@ bool Controller::Impl::UpdateModelStyle( OperationsMask operationsRequired ) void Controller::Impl::RetrieveDefaultInputStyle( InputStyle& inputStyle ) { - // Set the default text's color. + // Sets the default text's color. inputStyle.textColor = mTextColor; -} -void Controller::Impl::GetDefaultFonts( Vector& fonts, Length numberOfCharacters ) -{ + // Sets the default font's family name, weight, width, slant and size. if( mFontDefaults ) { - DALI_LOG_INFO( gLogFilter, Debug::General, "Controller::GetDefaultFonts font family(%s)\n", mFontDefaults->mFontDescription.family.c_str() ); - FontRun fontRun; - fontRun.characterRun.characterIndex = 0; - fontRun.characterRun.numberOfCharacters = numberOfCharacters; - fontRun.fontId = mFontDefaults->GetFontId( mFontClient ); - fontRun.isDefault = true; + inputStyle.familyName = mFontDefaults->mFontDescription.family; + inputStyle.weight = mFontDefaults->mFontDescription.weight; + inputStyle.width = mFontDefaults->mFontDescription.width; + inputStyle.slant = mFontDefaults->mFontDescription.slant; + inputStyle.size = mFontDefaults->mDefaultPointSize; + + inputStyle.familyDefined = mFontDefaults->familyDefined; + inputStyle.weightDefined = mFontDefaults->weightDefined; + inputStyle.widthDefined = mFontDefaults->widthDefined; + inputStyle.slantDefined = mFontDefaults->slantDefined; + inputStyle.sizeDefined = mFontDefaults->sizeDefined; + } + else + { + inputStyle.familyName.clear(); + inputStyle.weight = TextAbstraction::FontWeight::NORMAL; + inputStyle.width = TextAbstraction::FontWidth::NORMAL; + inputStyle.slant = TextAbstraction::FontSlant::NORMAL; + inputStyle.size = 0.f; - fonts.PushBack( fontRun ); + inputStyle.familyDefined = false; + inputStyle.weightDefined = false; + inputStyle.widthDefined = false; + inputStyle.slantDefined = false; + inputStyle.sizeDefined = false; } } @@ -1157,9 +1191,15 @@ void Controller::Impl::RepositionSelectionHandles() const Vector2 primaryPosition = primaryCursorInfo.primaryPosition + offset; const Vector2 secondaryPosition = secondaryCursorInfo.primaryPosition + offset; - mEventData->mDecorator->SetPosition( LEFT_SELECTION_HANDLE, primaryPosition.x, primaryPosition.y, primaryCursorInfo.lineHeight ); + mEventData->mDecorator->SetPosition( LEFT_SELECTION_HANDLE, + primaryPosition.x, + primaryCursorInfo.lineOffset + offset.y, + primaryCursorInfo.lineHeight ); - mEventData->mDecorator->SetPosition( RIGHT_SELECTION_HANDLE, secondaryPosition.x, secondaryPosition.y, secondaryCursorInfo.lineHeight ); + mEventData->mDecorator->SetPosition( RIGHT_SELECTION_HANDLE, + secondaryPosition.x, + secondaryCursorInfo.lineOffset + offset.y, + secondaryCursorInfo.lineHeight ); // Cursor to be positioned at end of selection so if selection interrupted and edit mode restarted the cursor will be at end of selection mEventData->mPrimaryCursorPosition = ( indicesSwapped ) ? mEventData->mLeftSelectionPosition : mEventData->mRightSelectionPosition; @@ -1642,6 +1682,7 @@ void Controller::Impl::GetCursorPosition( CharacterIndex logical, // If there is no font's family set, use the default font. // Use the current alignment to place the cursor at the beginning, center or end of the box. + cursorInfo.lineOffset = 0.f; cursorInfo.lineHeight = GetDefaultFontLineHeight(); cursorInfo.primaryCursorHeight = cursorInfo.lineHeight; @@ -1721,7 +1762,8 @@ void Controller::Impl::GetCursorPosition( CharacterIndex logical, cursorInfo.isSecondaryCursor = ( !isLastPosition && ( isCurrentRightToLeft != isNextRightToLeft ) ) || ( isLastPosition && ( isRightToLeftParagraph != isCurrentRightToLeft ) ); - // Set the line height. + // Set the line offset and height. + cursorInfo.lineOffset = 0.f; cursorInfo.lineHeight = line.ascender + -line.descender; // Calculate the primary cursor. @@ -1934,7 +1976,7 @@ void Controller::Impl::UpdateCursorPosition( const CursorInfo& cursorInfo ) // Sets the grab handle position. mEventData->mDecorator->SetPosition( GRAB_HANDLE, cursorPosition.x, - cursorPosition.y, + cursorInfo.lineOffset + offset.y, cursorInfo.lineHeight ); if( cursorInfo.isSecondaryCursor ) @@ -1976,12 +2018,13 @@ void Controller::Impl::UpdateSelectionHandle( HandleType handleType, return; } - const Vector2 cursorPosition = cursorInfo.primaryPosition + mEventData->mScrollPosition + mAlignmentOffset; + const Vector2 offset = mEventData->mScrollPosition + mAlignmentOffset; + const Vector2 cursorPosition = cursorInfo.primaryPosition + offset; // Sets the handle's position. mEventData->mDecorator->SetPosition( handleType, cursorPosition.x, - cursorPosition.y, + cursorInfo.lineOffset + offset.y, cursorInfo.lineHeight ); // If selection handle at start of the text and other at end of the text then all text is selected.