Fix TextUpdateInfo::Clear() issue 67/282967/2
authorBowon Ryu <bowon.ryu@samsung.com>
Fri, 14 Oct 2022 02:43:59 +0000 (11:43 +0900)
committerBowon Ryu <bowon.ryu@samsung.com>
Fri, 14 Oct 2022 05:05:13 +0000 (14:05 +0900)
The Clear method sets (uint)mCharacterIndex to -1,
so it makes a maximum uint value.
This causes many problems, but since it was implemented,
all index logic is related to it, so it is difficult to fix.

This patch avoids this issue by backup/restore of mCharacterIndex like TextEditor.
But we should consider changing mCharacterIndex to an integer.

Change-Id: Ida2c2af83438e71f6f05713a7de927f7b15aa7bd
Signed-off-by: Bowon Ryu <bowon.ryu@samsung.com>
dali-toolkit/internal/text/controller/text-controller-relayouter.cpp

index 0d2f765..c759051 100644 (file)
@@ -86,6 +86,10 @@ Size Controller::Relayouter::CalculateLayoutSizeOnRequiredControllerSize(Control
   // Store the actual control's size to restore later.
   const Size actualControlSize = visualModel->mControlSize;
 
+  // This is to keep Index to the first character to be updated.
+  // Then restore it after calling Clear method.
+  auto updateInfoCharIndexBackup = textUpdateInfo.mCharacterIndex;
+
   // Whether the text control is editable
   const bool isEditable = NULL != impl.mEventData;
 
@@ -109,10 +113,6 @@ Size Controller::Relayouter::CalculateLayoutSizeOnRequiredControllerSize(Control
   }
   else
   {
-    // This is to keep Index to the first character to be updated.
-    // Then restore it after calling Clear method.
-    auto updateInfoCharIndexBackup = textUpdateInfo.mCharacterIndex;
-
     // Layout the text for the new width.
     // Apply the pending operations, requested operations and the only once operations.
     // Then remove onlyOnceOperations
@@ -133,16 +133,16 @@ Size Controller::Relayouter::CalculateLayoutSizeOnRequiredControllerSize(Control
     //TODO: then calculate GlyphPositions. Lines, Size, Layout for Natural-Size
     //TODO: and utilize the values in OperationsPending and TextUpdateInfo without changing the original one.
     //TODO: Also it will improve performance because there is no need todo FullRelyout on the next need for layouting.
+  }
 
-    // FullRelayoutNeeded should be true because DoRelayout is MAX_FLOAT, MAX_FLOAT.
-    // By this no need to take backup and restore it.
-    textUpdateInfo.mFullRelayoutNeeded = true;
+  // FullRelayoutNeeded should be true because DoRelayout is MAX_FLOAT, MAX_FLOAT.
+  // By this no need to take backup and restore it.
+  textUpdateInfo.mFullRelayoutNeeded = true;
 
-    // Restore mCharacterIndex. Because "Clear" set it to the maximum integer.
-    // The "CalculateTextUpdateIndices" does not work proprely because the mCharacterIndex will be greater than mPreviousNumberOfCharacters.
-    // Which apply an assumption to update only the last  paragraph. That could cause many of out of index crashes.
-    textUpdateInfo.mCharacterIndex = updateInfoCharIndexBackup;
-  }
+  // Restore mCharacterIndex. Because "Clear" set it to the maximum integer.
+  // The "CalculateTextUpdateIndices" does not work proprely because the mCharacterIndex will be greater than mPreviousNumberOfCharacters.
+  // Which apply an assumption to update only the last  paragraph. That could cause many of out of index crashes.
+  textUpdateInfo.mCharacterIndex = updateInfoCharIndexBackup;
 
   // Do the size related operations again.
   operationsPending = static_cast<OperationsMask>(operationsPending | sizeOperations);