Prevent atlas block corruption issue when renderer is reset 11/319211/1
authorBowon Ryu <bowon.ryu@samsung.com>
Wed, 5 Feb 2025 11:20:15 +0000 (20:20 +0900)
committerBowon Ryu <bowon.ryu@samsung.com>
Wed, 5 Feb 2025 11:20:15 +0000 (20:20 +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 3691e3671cd972884a967d2cc1a4358e8ebe2ee0..62a1fbcb47a7a46eb80f49fc1b2e8dc8e736a7cf 100644 (file)
@@ -786,13 +786,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);
@@ -1416,8 +1411,7 @@ TextEditor::TextEditor(ControlBehaviour additionalBehaviour)
   mOldPosition(0u),
   mOldSelectionStart(0u),
   mOldSelectionEnd(0u),
-  mSelectionStarted(false),
-  mRenderRequired(false)
+  mSelectionStarted(false)
 {
 }
 
index c349327064de426b6c7009794247c93f80dd3174..89bd2a1988e9a000e3f3a06c2d33e98db3fb3f77 100644 (file)
@@ -651,7 +651,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 68c3555fde4d15d22ee22c09c3642299567958f0..70237504a86775a5022934cbf1684779da8afbaa 100644 (file)
@@ -697,13 +697,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);
@@ -1183,8 +1178,7 @@ TextField::TextField(ControlBehaviour additionalBehaviour)
   mOldPosition(0u),
   mOldSelectionStart(0u),
   mOldSelectionEnd(0u),
-  mSelectionStarted(false),
-  mRenderRequired(false)
+  mSelectionStarted(false)
 {
 }
 
index 59abb6767ff946626ae73ae1c02d1c5c1bad8378..9a3480a5b122e3712ae5d5a40869224a0cd28360 100644 (file)
@@ -591,7 +591,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 79242396158691888e365e369071660210b37bd6..2745a76bb0fe31be4d9e38725a5fb9f5865616ec 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;
     }