[Tizen] Prevent atlas block corruption issue when renderer is reset 27/319227/1 accepted/tizen/8.0/unified/20250227.155239
authorBowon Ryu <bowon.ryu@samsung.com>
Wed, 5 Feb 2025 11:20:15 +0000 (20:20 +0900)
committerBowon Ryu <bowon.ryu@samsung.com>
Thu, 6 Feb 2025 02:39:00 +0000 (11:39 +0900)
If UpdateTextType is NONE_UPDATED when Renderer is reset, RenderText does not perform rendering.
This causes several problems with atlas operation.

When the renderer is reset, all caches used by the text field are removed from AtlasManager.
At this time, if a cache of an ID that was previously used (now removed) by another editable text is created and used,
the atlas block of the existing text field will be damaged.

At least until the cache structure is improved, render must be performed when the renderer is reset.

Change-Id: Ic5f939e81920ab59e676ee50f450c6ffbb1259e3
Signed-off-by: Bowon Ryu <bowon.ryu@samsung.com>
dali-toolkit/internal/controls/text-controls/text-editor-impl.cpp
dali-toolkit/internal/controls/text-controls/text-editor-impl.h
dali-toolkit/internal/controls/text-controls/text-editor-property-handler.cpp
dali-toolkit/internal/controls/text-controls/text-field-impl.cpp
dali-toolkit/internal/controls/text-controls/text-field-impl.h
dali-toolkit/internal/controls/text-controls/text-field-property-handler.cpp

index 061355dfde4c9d0fed4cca2f3eeaa8dbc2a8d38b..27c47387ab61b86ae0442558bb8c4d175f89ff5d 100644 (file)
@@ -787,13 +787,8 @@ void TextEditor::OnRelayout(const Vector2& size, RelayoutContainer& container)
 
     if(!mRenderer)
     {
-      mRenderer = Backend::Get().NewRenderer(mRenderingBackend);
-    }
-
-    if(mRenderRequired)
-    {
+      mRenderer      = Backend::Get().NewRenderer(mRenderingBackend);
       updateTextType = static_cast<Text::Controller::UpdateTextType>(updateTextType | Text::Controller::MODEL_UPDATED);
-      mRenderRequired = false;
     }
 
     RenderText(updateTextType);
@@ -1443,8 +1438,7 @@ TextEditor::TextEditor(ControlBehaviour additionalBehaviour)
   mOldPosition(0u),
   mOldSelectionStart(0u),
   mOldSelectionEnd(0u),
-  mSelectionStarted(false),
-  mRenderRequired(false)
+  mSelectionStarted(false)
 {
 }
 
index 8483daba20935b4d167280ebc9d0c9f55bc74e00..14cef45038b95f081a496fe34e015be0416109c5 100644 (file)
@@ -652,7 +652,6 @@ private: // Data
   uint32_t mOldSelectionEnd;
 
   bool mSelectionStarted : 1; ///< If true, emits SelectionStartedSignal at the end of OnRelayout().
-  bool mRenderRequired   : 1; ///< If true, text rendering required.
 
   struct PropertyHandler;
 
index 708e803a630cd4a7c77cec5cc7e58692e299f9e3..edafd6acb0efae5e7cb7e37fc8cc0dd95e2b0c91 100644 (file)
@@ -372,7 +372,6 @@ void TextEditor::PropertyHandler::SetProperty(Toolkit::TextEditor textEditor, Pr
       if(update)
       {
         impl.mRenderer.Reset();
-        impl.mRenderRequired = true;
       }
       break;
     }
@@ -391,7 +390,6 @@ void TextEditor::PropertyHandler::SetProperty(Toolkit::TextEditor textEditor, Pr
       if(update)
       {
         impl.mRenderer.Reset();
-        impl.mRenderRequired = true;
       }
       break;
     }
@@ -428,7 +426,6 @@ void TextEditor::PropertyHandler::SetProperty(Toolkit::TextEditor textEditor, Pr
       if(update)
       {
         impl.mRenderer.Reset();
-        impl.mRenderRequired = true;
       }
       break;
     }
@@ -717,7 +714,6 @@ void TextEditor::PropertyHandler::SetProperty(Toolkit::TextEditor textEditor, Pr
       if(update)
       {
         impl.mRenderer.Reset();
-        impl.mRenderRequired = true;
       }
       break;
     }
index 41ffcbc68f5199cf39cb0903d8e6ac31d994eed0..62c6e73936081954cd8c229a3f9c67a9f5d512ff 100644 (file)
@@ -698,13 +698,8 @@ void TextField::OnRelayout(const Vector2& size, RelayoutContainer& container)
 
     if(!mRenderer)
     {
-      mRenderer = Backend::Get().NewRenderer(mRenderingBackend);
-    }
-
-    if(mRenderRequired)
-    {
+      mRenderer      = Backend::Get().NewRenderer(mRenderingBackend);
       updateTextType = static_cast<Text::Controller::UpdateTextType>(updateTextType | Text::Controller::MODEL_UPDATED);
-      mRenderRequired = false;
     }
 
     RenderText(updateTextType);
@@ -1210,8 +1205,7 @@ TextField::TextField(ControlBehaviour additionalBehaviour)
   mOldPosition(0u),
   mOldSelectionStart(0u),
   mOldSelectionEnd(0u),
-  mSelectionStarted(false),
-  mRenderRequired(false)
+  mSelectionStarted(false)
 {
 }
 
index 31efbcc7d0b7aee916a9517a3c7920b5fc60bdc8..babde4554f822f1fbc1a4f4be35a694093fa755f 100644 (file)
@@ -599,7 +599,6 @@ private: // Data
   uint32_t mOldSelectionEnd;
 
   bool mSelectionStarted : 1; ///< If true, emits SelectionStartedSignal at the end of OnRelayout().
-  bool mRenderRequired   : 1; ///< If true, text rendering required.
 
 protected:
   struct PropertyHandler;
index 22202c84f712bb35ce58407c0ace8c9a69246a62..2646a5379a2d02a22e7ff081ac986cf993ba1b45 100644 (file)
@@ -437,7 +437,6 @@ void TextField::PropertyHandler::SetProperty(Toolkit::TextField textField, Prope
       if(update)
       {
         impl.mRenderer.Reset();
-        impl.mRenderRequired = true;
       }
       break;
     }
@@ -456,7 +455,6 @@ void TextField::PropertyHandler::SetProperty(Toolkit::TextField textField, Prope
       if(update)
       {
         impl.mRenderer.Reset();
-        impl.mRenderRequired = true;
       }
       break;
     }
@@ -493,7 +491,6 @@ void TextField::PropertyHandler::SetProperty(Toolkit::TextField textField, Prope
       if(update)
       {
         impl.mRenderer.Reset();
-        impl.mRenderRequired = true;
       }
       break;
     }
@@ -683,7 +680,6 @@ void TextField::PropertyHandler::SetProperty(Toolkit::TextField textField, Prope
       if(update)
       {
         impl.mRenderer.Reset();
-        impl.mRenderRequired = true;
       }
       break;
     }