From: Bowon Ryu Date: Wed, 12 Feb 2025 05:33:16 +0000 (+0900) Subject: [Tizen] Fix bidirectional line info index issue X-Git-Tag: accepted/tizen/9.0/unified/20250220.165938~4 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=45c5b163399b77e5cedee17f197a22c1ac93212c;p=platform%2Fcore%2Fuifw%2Fdali-toolkit.git [Tizen] Fix bidirectional line info index issue In the RTL case, when text is inserted or removed in the middle of a bidi paragraph, the character index of line info is not updated, so there is a problem that the line info is damaged in reorders. This patch updates the index of line info based on the bidi paragraph info updated in SetBidirectionalInfo. Change-Id: Ifc1ddfa5f15ce89be967ce57241a093030be323d Signed-off-by: Bowon Ryu --- diff --git a/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/toolkit-text-utils.cpp b/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/toolkit-text-utils.cpp index efa834e061..20dcdd4950 100644 --- a/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/toolkit-text-utils.cpp +++ b/automated-tests/src/dali-toolkit-internal/dali-toolkit-test-utils/toolkit-text-utils.cpp @@ -263,7 +263,8 @@ void CreateTextModel(const std::string& text, lineBreakInfo, 0u, characterCount, - bidirectionalInfo); + bidirectionalInfo, + logicalModel->mBidirectionalLineInfo); // Create the paragraph info. logicalModel->CreateParagraphInfo(0u, diff --git a/automated-tests/src/dali-toolkit-internal/utc-Dali-BidirectionalSupport.cpp b/automated-tests/src/dali-toolkit-internal/utc-Dali-BidirectionalSupport.cpp index 90b729f26c..2e91f1f965 100644 --- a/automated-tests/src/dali-toolkit-internal/utc-Dali-BidirectionalSupport.cpp +++ b/automated-tests/src/dali-toolkit-internal/utc-Dali-BidirectionalSupport.cpp @@ -139,7 +139,8 @@ bool SetBidirectionalInfoTest(const SetBidirectionalInfoData& data) logicalModel->mLineBreakInfo, data.startIndex, data.numberOfCharacters, - bidirectionalInfo); + bidirectionalInfo, + logicalModel->mBidirectionalLineInfo); // 4) Compare with the expected results. if(data.numberOfParagraphs != bidirectionalInfo.Count()) diff --git a/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp b/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp index d63762feb1..b4ca2efe13 100644 --- a/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp +++ b/automated-tests/src/dali-toolkit/utc-Dali-TextEditor.cpp @@ -2734,6 +2734,13 @@ int utcDaliTextEditorEvent06(void) DALI_TEST_EQUALS("Hello\nworld\nHello world", editor.GetProperty(TextEditor::Property::TEXT), TEST_LOCATION); // For coverage + editor.SetProperty(TextEditor::Property::TEXT, "الاخيرالسطر1\nالاخيرالسطر2\nالاخيرالسطر3\nالاخيرالسطر4"); + application.SendNotification(); + application.Render(); + + application.ProcessEvent(GenerateKey("d", "", "ㅁ", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "ㅁ", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.ProcessEvent(GenerateKey("d", "", "ኢ", KEY_D_CODE, 0, 0, Integration::KeyEvent::DOWN, "ኢ", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); + application.ProcessEvent(GenerateKey("", "", "", 0, 0, 0, Integration::KeyEvent::DOWN, "", DEFAULT_DEVICE_NAME, Device::Class::NONE, Device::Subclass::NONE)); application.SendNotification(); application.Render(); diff --git a/dali-toolkit/devel-api/text/text-utils-devel.cpp b/dali-toolkit/devel-api/text/text-utils-devel.cpp index 483fc3f60c..8a4153013f 100644 --- a/dali-toolkit/devel-api/text/text-utils-devel.cpp +++ b/dali-toolkit/devel-api/text/text-utils-devel.cpp @@ -314,7 +314,8 @@ void ShapeTextPreprocess(const RendererParameters& textParameters, TextAbstracti lineBreakInfo, 0u, numberOfCharacters, - bidirectionalInfo); + bidirectionalInfo, + textModel->mLogicalModel->mBidirectionalLineInfo); const bool hasBidirectionalText = 0u != bidirectionalInfo.Count(); if(hasBidirectionalText) diff --git a/dali-toolkit/internal/text/async-text/async-text-loader-impl.cpp b/dali-toolkit/internal/text/async-text/async-text-loader-impl.cpp index 8ad19ef51d..3023b9af50 100644 --- a/dali-toolkit/internal/text/async-text/async-text-loader-impl.cpp +++ b/dali-toolkit/internal/text/async-text/async-text-loader-impl.cpp @@ -147,6 +147,9 @@ void AsyncTextLoader::ClearTextModelData() free(bidiLineInfo.visualToLogicalMap); bidiLineInfo.visualToLogicalMap = NULL; + + free(bidiLineInfo.visualToLogicalMapSecondHalf); + bidiLineInfo.visualToLogicalMapSecondHalf = NULL; } mTextModel->mLogicalModel->mBidirectionalLineInfo.Clear(); @@ -399,6 +402,7 @@ void AsyncTextLoader::Update(AsyncTextParameters& parameters) 0u, numberOfCharacters, bidirectionalInfo, + mTextModel->mLogicalModel->mBidirectionalLineInfo, (mTextModel->mMatchLayoutDirection != DevelText::MatchLayoutDirection::CONTENTS), parameters.layoutDirection); diff --git a/dali-toolkit/internal/text/bidirectional-support.cpp b/dali-toolkit/internal/text/bidirectional-support.cpp index 2b3c87e776..a5700ab816 100644 --- a/dali-toolkit/internal/text/bidirectional-support.cpp +++ b/dali-toolkit/internal/text/bidirectional-support.cpp @@ -35,6 +35,7 @@ void SetBidirectionalInfo(TextAbstraction::BidirectionalSupport& bidirectionalSu CharacterIndex startIndex, Length numberOfCharacters, Vector& bidirectionalInfo, + Vector& lineInfoRuns, bool matchLayoutDirection, Dali::LayoutDirection::Type layoutDirection) { @@ -128,6 +129,10 @@ void SetBidirectionalInfo(TextAbstraction::BidirectionalSupport& bidirectionalSu } } + // Find the first bidi line index to update. + bool updateLineInfoRuns = false; + BidirectionalLineRunIndex updateLineInfoIndex = 0u; + // Update indices of the bidi runs. for(Vector::Iterator it = bidirectionalInfo.Begin() + bidiInfoIndex, endIt = bidirectionalInfo.End(); @@ -136,8 +141,31 @@ void SetBidirectionalInfo(TextAbstraction::BidirectionalSupport& bidirectionalSu { BidirectionalParagraphInfoRun& run = *it; + if(!updateLineInfoRuns) + { + updateLineInfoRuns = true; + updateLineInfoIndex = run.characterRun.characterIndex; + } + run.characterRun.characterIndex += numberOfCharacters; } + + // Update indices of the bidi line runs. + if(updateLineInfoRuns) + { + bool firstLineFound = false; + for(auto& lineInfoRun : lineInfoRuns) + { + if(lineInfoRun.characterRun.characterIndex == updateLineInfoIndex) + { + firstLineFound = true; + } + if(firstLineFound) + { + lineInfoRun.characterRun.characterIndex += numberOfCharacters; + } + } + } } void ReorderLine(TextAbstraction::BidirectionalSupport& bidirectionalSupport, diff --git a/dali-toolkit/internal/text/bidirectional-support.h b/dali-toolkit/internal/text/bidirectional-support.h index c44e232593..b4228e8125 100644 --- a/dali-toolkit/internal/text/bidirectional-support.h +++ b/dali-toolkit/internal/text/bidirectional-support.h @@ -45,6 +45,7 @@ namespace Text * @param[in] startIndex The character from where the bidirectional info is set. * @param[in] numberOfCharacters The number of characters. * @param[out] bidirectionalInfo Vector with the bidirectional infor for each paragraph. + * @param[out] lineInfoRuns Line runs with the visual to logical conversion maps. * @param[in] matchLayoutDirection Whether match for layout direction or not. * @param[in] layoutDirection The direction of the layout. */ @@ -55,6 +56,7 @@ void SetBidirectionalInfo(TextAbstraction::BidirectionalSupport& bidirectionalSu CharacterIndex startIndex, Length numberOfCharacters, Vector& bidirectionalInfo, + Vector& lineInfoRuns, bool matchLayoutDirection = false, Dali::LayoutDirection::Type layoutDirection = LayoutDirection::LEFT_TO_RIGHT); diff --git a/dali-toolkit/internal/text/controller/text-controller-impl-data-clearer.cpp b/dali-toolkit/internal/text/controller/text-controller-impl-data-clearer.cpp index 3822fb305a..a5de333e8d 100644 --- a/dali-toolkit/internal/text/controller/text-controller-impl-data-clearer.cpp +++ b/dali-toolkit/internal/text/controller/text-controller-impl-data-clearer.cpp @@ -65,6 +65,9 @@ void ControllerImplDataClearer::ClearFullModelData(Controller::Impl& impl, Contr free(bidiLineInfo.visualToLogicalMap); bidiLineInfo.visualToLogicalMap = NULL; + + free(bidiLineInfo.visualToLogicalMapSecondHalf); + bidiLineInfo.visualToLogicalMapSecondHalf = NULL; } model->mLogicalModel->mBidirectionalLineInfo.Clear(); } @@ -165,6 +168,9 @@ void ControllerImplDataClearer::ClearCharacterModelData(Controller::Impl& impl, free(bidiLineInfo.visualToLogicalMap); bidiLineInfo.visualToLogicalMap = NULL; + + free(bidiLineInfo.visualToLogicalMapSecondHalf); + bidiLineInfo.visualToLogicalMapSecondHalf = NULL; } model->mLogicalModel->mBidirectionalLineInfo.Erase(bidirectionalLineInfoBuffer + startRemoveIndex, diff --git a/dali-toolkit/internal/text/controller/text-controller-impl-model-updater.cpp b/dali-toolkit/internal/text/controller/text-controller-impl-model-updater.cpp index a87a8704c0..9e710d9b29 100644 --- a/dali-toolkit/internal/text/controller/text-controller-impl-model-updater.cpp +++ b/dali-toolkit/internal/text/controller/text-controller-impl-model-updater.cpp @@ -306,6 +306,7 @@ bool ControllerImplModelUpdater::Update(Controller::Impl& impl, OperationsMask o startIndex, requestedNumberOfCharacters, bidirectionalInfo, + impl.mModel->mLogicalModel->mBidirectionalLineInfo, (impl.mModel->mMatchLayoutDirection != DevelText::MatchLayoutDirection::CONTENTS), impl.mLayoutDirection);