X-Git-Url: http://review.tizen.org/git/?a=blobdiff_plain;f=dali-toolkit%2Finternal%2Ftext%2Ftext-controller-impl.cpp;h=cf49df5b5c3dfb35713519d92b9dd1bd0aa69266;hb=22451f7abe0230b418d551d9eac0c685273e72f1;hp=35ad9593a8a0ffc6b715b8dce3944fcb00abb19e;hpb=7c13cc0c065ae22e7ad0deaea4f56730ff050c5c;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git diff --git a/dali-toolkit/internal/text/text-controller-impl.cpp b/dali-toolkit/internal/text/text-controller-impl.cpp index 35ad959..cf49df5 100644 --- a/dali-toolkit/internal/text/text-controller-impl.cpp +++ b/dali-toolkit/internal/text/text-controller-impl.cpp @@ -1,5 +1,5 @@ /* - * Copyright (c) 2021 Samsung Electronics Co., Ltd. + * Copyright (c) 2022 Samsung Electronics Co., Ltd. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -19,14 +19,16 @@ #include // EXTERNAL INCLUDES -#include +#include #include #include -#include +#include +#include // INTERNAL INCLUDES #include #include +#include #include #include #include @@ -37,6 +39,7 @@ #include #include #include +#include using namespace Dali; @@ -54,10 +57,8 @@ const std::string EMPTY_STRING(""); namespace Dali::Toolkit::Text { - namespace { - void SetDefaultInputStyle(InputStyle& inputStyle, const FontDefaults* const fontDefaults, const Vector4& textColor) { // Sets the default text's color. @@ -342,7 +343,7 @@ void ChangeTextControllerState(Controller::Impl& impl, EventData::State newState decorator->StopCursorBlink(); decorator->SetHandleActive(GRAB_HANDLE, false); if(eventData->mDecorator->IsHandleActive(LEFT_SELECTION_HANDLE) || - decorator->IsHandleActive(RIGHT_SELECTION_HANDLE)) + decorator->IsHandleActive(RIGHT_SELECTION_HANDLE)) { decorator->SetHandleActive(LEFT_SELECTION_HANDLE, false); decorator->SetHandleActive(RIGHT_SELECTION_HANDLE, false); @@ -674,11 +675,11 @@ float Controller::Impl::GetDefaultFontLineHeight() if(nullptr == mFontDefaults) { TextAbstraction::FontDescription fontDescription; - defaultFontId = mFontClient.GetFontId(fontDescription, TextAbstraction::FontClient::DEFAULT_POINT_SIZE * mFontSizeScale); + defaultFontId = mFontClient.GetFontId(fontDescription, TextAbstraction::FontClient::DEFAULT_POINT_SIZE * GetFontSizeScale()); } else { - defaultFontId = mFontDefaults->GetFontId(mFontClient, mFontDefaults->mDefaultPointSize * mFontSizeScale); + defaultFontId = mFontDefaults->GetFontId(mFontClient, mFontDefaults->mDefaultPointSize * GetFontSizeScale()); } Text::FontMetrics fontMetrics; @@ -692,9 +693,8 @@ bool Controller::Impl::SetDefaultLineSpacing(float lineSpacing) if(std::fabs(lineSpacing - mLayoutEngine.GetDefaultLineSpacing()) > Math::MACHINE_EPSILON_1000) { mLayoutEngine.SetDefaultLineSpacing(lineSpacing); - mRecalculateNaturalSize = true; - RelayoutForNewLineSize(); + RelayoutAllCharacters(); return true; } return false; @@ -705,14 +705,30 @@ bool Controller::Impl::SetDefaultLineSize(float lineSize) if(std::fabs(lineSize - mLayoutEngine.GetDefaultLineSize()) > Math::MACHINE_EPSILON_1000) { mLayoutEngine.SetDefaultLineSize(lineSize); - mRecalculateNaturalSize = true; - RelayoutForNewLineSize(); + RelayoutAllCharacters(); + return true; + } + return false; +} + +bool Controller::Impl::SetRelativeLineSize(float relativeLineSize) +{ + if(std::fabs(relativeLineSize - GetRelativeLineSize()) > Math::MACHINE_EPSILON_1000) + { + mLayoutEngine.SetRelativeLineSize(relativeLineSize); + + RelayoutAllCharacters(); return true; } return false; } +float Controller::Impl::GetRelativeLineSize() +{ + return mLayoutEngine.GetRelativeLineSize(); +} + string Controller::Impl::GetSelectedText() { string text; @@ -1199,7 +1215,10 @@ void Controller::Impl::GetCursorPosition(CharacterIndex logical, parameters.logical = logical; parameters.isMultiline = isMultiLine; + float defaultFontLineHeight = GetDefaultFontLineHeight(); + Text::GetCursorPosition(parameters, + defaultFontLineHeight, cursorInfo); // Adds Outline offset. @@ -1462,7 +1481,7 @@ void Controller::Impl::RequestRelayout() } } -void Controller::Impl::RelayoutForNewLineSize() +void Controller::Impl::RelayoutAllCharacters() { // relayout all characters mTextUpdateInfo.mCharacterIndex = 0; @@ -1470,8 +1489,13 @@ void Controller::Impl::RelayoutForNewLineSize() mTextUpdateInfo.mNumberOfCharactersToAdd = mModel->mLogicalModel->mText.Count(); mOperationsPending = static_cast(mOperationsPending | LAYOUT); + mTextUpdateInfo.mFullRelayoutNeeded = true; + + // Need to recalculate natural size + mRecalculateNaturalSize = true; + //remove selection - if(mEventData && mEventData->mState == EventData::SELECTING) + if((mEventData != nullptr) && (mEventData->mState == EventData::SELECTING)) { ChangeState(EventData::EDITING); } @@ -1493,7 +1517,7 @@ void Controller::Impl::ProcessInputStyleChangedSignals() // Emit the input style changed signal for each mask std::for_each(mEventData->mInputStyleChangedQueue.begin(), mEventData->mInputStyleChangedQueue.end(), - [&](const auto mask) { mEditableControlInterface->InputStyleChanged(mask); } ); + [&](const auto mask) { mEditableControlInterface->InputStyleChanged(mask); }); } mEventData->mInputStyleChangedQueue.Clear(); @@ -1612,13 +1636,60 @@ void Controller::Impl::CopyUnderlinedFromLogicalToVisualModels(bool shouldClearP { CharacterIndex characterIndex = it->characterRun.characterIndex; Length numberOfCharacters = it->characterRun.numberOfCharacters; - for(Length index = 0u; index < numberOfCharacters; index++) + + if(numberOfCharacters == 0) + { + continue; + } + + // Create one run for all glyphs of all run's characters that has same properties + // This enhance performance and reduce the needed memory to store glyphs-runs + UnderlinedGlyphRun underlineGlyphRun; + underlineGlyphRun.glyphRun.glyphIndex = charactersToGlyph[characterIndex]; + underlineGlyphRun.glyphRun.numberOfGlyphs = glyphsPerCharacter[characterIndex]; + //Copy properties (attributes) + underlineGlyphRun.properties = it->properties; + + for(Length index = 1u; index < numberOfCharacters; index++) + { + underlineGlyphRun.glyphRun.numberOfGlyphs += glyphsPerCharacter[characterIndex + index]; + } + + mModel->mVisualModel->mUnderlineRuns.PushBack(underlineGlyphRun); + } +} + +void Controller::Impl::CopyStrikethroughFromLogicalToVisualModels() +{ + //Strikethrough character runs from markup-processor + const Vector& strikethroughCharacterRuns = mModel->mLogicalModel->mStrikethroughCharacterRuns; + const Vector& charactersToGlyph = mModel->mVisualModel->mCharactersToGlyph; + const Vector& glyphsPerCharacter = mModel->mVisualModel->mGlyphsPerCharacter; + + mModel->mVisualModel->mStrikethroughRuns.Clear(); + + for(Vector::ConstIterator it = strikethroughCharacterRuns.Begin(), endIt = strikethroughCharacterRuns.End(); it != endIt; ++it) + { + CharacterIndex characterIndex = it->characterRun.characterIndex; + Length numberOfCharacters = it->characterRun.numberOfCharacters; + + if(numberOfCharacters == 0) + { + continue; + } + + StrikethroughGlyphRun strikethroughGlyphRun; + strikethroughGlyphRun.color = it->color; + strikethroughGlyphRun.isColorSet = it->isColorSet; + strikethroughGlyphRun.glyphRun.glyphIndex = charactersToGlyph[characterIndex]; + strikethroughGlyphRun.glyphRun.numberOfGlyphs = glyphsPerCharacter[characterIndex]; + + for(Length index = 1u; index < numberOfCharacters; index++) { - GlyphRun underlineGlyphRun; - underlineGlyphRun.glyphIndex = charactersToGlyph[characterIndex + index]; - underlineGlyphRun.numberOfGlyphs = glyphsPerCharacter[characterIndex + index]; - mModel->mVisualModel->mUnderlineRuns.PushBack(underlineGlyphRun); + strikethroughGlyphRun.glyphRun.numberOfGlyphs += glyphsPerCharacter[characterIndex + index]; } + + mModel->mVisualModel->mStrikethroughRuns.PushBack(strikethroughGlyphRun); } } @@ -1724,7 +1795,7 @@ void Controller::Impl::SetVerticalAlignment(VerticalAlignment::Type alignment) { // Set the alignment. mModel->mVerticalAlignment = alignment; - mOperationsPending = static_cast(mOperationsPending | ALIGN); + mOperationsPending = static_cast(mOperationsPending | ALIGN); RequestRelayout(); } } @@ -1802,9 +1873,9 @@ void Controller::Impl::ClearStyleData() { mModel->mLogicalModel->mColorRuns.Clear(); mModel->mLogicalModel->ClearFontDescriptionRuns(); + mModel->mLogicalModel->ClearStrikethroughRuns(); } - void Controller::Impl::ResetScrollPosition() { if(mEventData)