Reduce Visual::Base handle creation time + Implement SetTransformSize with empty... 91/320291/1
authorEunki, Hong <eunkiki.hong@samsung.com>
Wed, 26 Feb 2025 06:38:08 +0000 (15:38 +0900)
committerEunki, Hong <eunkiki.hong@samsung.com>
Wed, 26 Feb 2025 07:01:16 +0000 (16:01 +0900)
If we are try to use internal side visual operation required,
we can use BaseObjectPtr directly, instead of wrapping the handle.

Since atomic reference count spend time if we call it frequencly,
let we use some codes use Internal::Visual::Base directly.

+

Most of case, if fitting mode not applied, we only need the size of control
and don't care the transform map.

But the transform map is mendentary input. So their are several
process works to create empty map and destroy it again.

To avoid this logic, let we make Visual::Base::SetControlSize()
and make we re-use the empty property map here.

Change-Id: I379cc226cdf2af9fea12bc0e2c9ea17d62a696c5
Signed-off-by: Eunki, Hong <eunkiki.hong@samsung.com>
dali-toolkit/internal/controls/control/control-data-impl.cpp
dali-toolkit/internal/controls/control/control-data-impl.h
dali-toolkit/internal/controls/control/control-visual-data.cpp
dali-toolkit/internal/controls/control/control-visual-data.h
dali-toolkit/internal/controls/image-view/image-view-impl.cpp
dali-toolkit/internal/controls/image-view/image-view-impl.h
dali-toolkit/internal/visuals/visual-base-impl.cpp
dali-toolkit/internal/visuals/visual-base-impl.h
dali-toolkit/public-api/controls/control-impl.cpp

index dc2dfc44b719c3269127ba23f33994ea1b37394a..14b4451af6d04ba1d9f89cfaf93ae00bca05acf3 100644 (file)
@@ -540,12 +540,17 @@ void Control::Impl::UnregisterVisual(Property::Index index)
 }
 
 Toolkit::Visual::Base Control::Impl::GetVisual(Property::Index index) const
+{
+  return Toolkit::Visual::Base(GetVisualImplPtr(index));
+}
+
+Toolkit::Internal::Visual::Base* Control::Impl::GetVisualImplPtr(Property::Index index) const
 {
   if(DALI_LIKELY(mVisualData))
   {
-    return mVisualData->GetVisual(index);
+    return mVisualData->GetVisualImplPtr(index);
   }
-  return Toolkit::Visual::Base();
+  return nullptr;
 }
 
 bool Control::Impl::IsResourceReady() const
@@ -1175,10 +1180,10 @@ Property::Value Control::Impl::GetProperty(BaseObject* object, Property::Index i
 
         if(DALI_LIKELY(controlImpl.mImpl->mVisualData))
         {
-          Toolkit::Visual::Base visual = controlImpl.mImpl->mVisualData->GetVisual(Toolkit::Control::Property::BACKGROUND);
-          if(visual)
+          const Toolkit::Internal::Visual::Base* visualImplPtr = controlImpl.mImpl->mVisualData->GetVisualImplPtr(Toolkit::Control::Property::BACKGROUND);
+          if(visualImplPtr)
           {
-            visual.CreatePropertyMap(map);
+            visualImplPtr->CreatePropertyMap(map);
           }
         }
 
index 923cede64fd9c154101ec1b0fc8dcd5e20adf3d5..e2e9c10f3388e60f48b909b19d55e8525d8be2d1 100644 (file)
@@ -42,6 +42,11 @@ namespace Toolkit
 {
 namespace Internal
 {
+namespace Visual
+{
+class Base;
+}
+
 enum class TriStateProperty
 {
   AUTO = 0,
@@ -150,6 +155,16 @@ public:
    */
   Toolkit::Visual::Base GetVisual(Property::Index index) const;
 
+  /**
+   * @brief Get the raw pointer of visual impl.
+   * It will be used when we want to get visual infomations without increase reference counts.
+   * @note Only for internal usage.
+   *
+   * @param[in] index Index of parameter
+   * @return Raw pointer of visual base implements. nullptr if not exist.
+   */
+  Toolkit::Internal::Visual::Base* GetVisualImplPtr(Property::Index index) const;
+
   /**
    * @brief Sets the given visual to be ready transition
    *
index 56cefa63f38807eadeb16d168218feaef3bdc683..55ee07b1043b0f08f358094a22b3d2d716fc5060 100644 (file)
@@ -364,9 +364,11 @@ Toolkit::Visual::ResourceStatus Control::Impl::VisualData::GetVisualResourceStat
   RegisteredVisualContainer::Iterator iter;
   if(FindVisual(index, mVisuals, iter))
   {
-    const Toolkit::Visual::Base   visual     = (*iter)->visual;
-    const Internal::Visual::Base& visualImpl = Toolkit::GetImplementation(visual);
-    return visualImpl.GetResourceStatus();
+    if((*iter)->visual)
+    {
+      const Internal::Visual::Base& visualImpl = Toolkit::GetImplementation((*iter)->visual);
+      return visualImpl.GetResourceStatus();
+    }
   }
 
   return Toolkit::Visual::ResourceStatus::PREPARING;
@@ -577,14 +579,18 @@ void Control::Impl::VisualData::UnregisterVisual(Property::Index index)
 }
 
 Toolkit::Visual::Base Control::Impl::VisualData::GetVisual(Property::Index index) const
+{
+  return Toolkit::Visual::Base(GetVisualImplPtr(index));
+}
+
+Toolkit::Internal::Visual::Base* Control::Impl::VisualData::GetVisualImplPtr(Property::Index index) const
 {
   RegisteredVisualContainer::Iterator iter;
   if(FindVisual(index, mVisuals, iter))
   {
-    return (*iter)->visual;
+    return (*iter)->visual ? &Toolkit::GetImplementation((*iter)->visual) : nullptr;
   }
-
-  return Toolkit::Visual::Base();
+  return nullptr;
 }
 
 Toolkit::Visual::Base Control::Impl::VisualData::GetVisual(const std::string& name) const
@@ -911,7 +917,7 @@ void Control::Impl::VisualData::UpdateVisualProperties(const std::vector<std::pa
 
 void Control::Impl::VisualData::ApplyFittingMode(const Vector2& size)
 {
-  Actor self = mOuter.mControlImpl.Self();
+  Actor self;
   for(RegisteredVisualContainer::Iterator iter = mVisuals.Begin(); iter != mVisuals.End(); iter++)
   {
     // Check whether the visual is empty and enabled
@@ -925,19 +931,23 @@ void Control::Impl::VisualData::ApplyFittingMode(const Vector2& size)
         continue;
       }
 
-      Visual::FittingMode fittingMode  = visualImpl.GetFittingMode();
-      Property::Map       transformMap = Property::Map();
+      Visual::FittingMode fittingMode = visualImpl.GetFittingMode();
 
-      // If the fittingMode is DONT_CARE, we don't need to apply fittingMode, just Set empty transformMap
+      // If the fittingMode is DONT_CARE, we don't need to apply fittingMode, just Set the size of control
       if(fittingMode == Visual::FittingMode::DONT_CARE)
       {
         if(visualImpl.GetType() != Toolkit::Visual::Type::TEXT)
         {
-          ((*iter)->visual).SetTransformAndSize(transformMap, size);
+          visualImpl.SetControlSize(size);
         }
         continue;
       }
 
+      if(!self)
+      {
+        self = mOuter.mControlImpl.Self();
+      }
+
       Extents padding = self.GetProperty<Extents>(Toolkit::Control::Property::PADDING);
 
       bool zeroPadding = (padding == Extents());
@@ -959,6 +969,8 @@ void Control::Impl::VisualData::ApplyFittingMode(const Vector2& size)
         visualImpl.SetPixelAreaForFittingMode(FULL_TEXTURE_RECT);
       }
 
+      Property::Map transformMap = Property::Map();
+
       if((!zeroPadding) || // If padding is not zero
          (fittingMode != Visual::FittingMode::FILL))
       {
@@ -969,7 +981,7 @@ void Control::Impl::VisualData::ApplyFittingMode(const Vector2& size)
         // Skip GetNaturalSize
         if(fittingMode != Visual::FittingMode::FILL)
         {
-          ((*iter)->visual).GetNaturalSize(naturalSize);
+          visualImpl.GetNaturalSize(naturalSize);
         }
 
         // If FittingMode use FIT_WIDTH or FIT_HEIGTH, it need to change proper fittingMode
@@ -1087,7 +1099,7 @@ void Control::Impl::VisualData::ApplyFittingMode(const Vector2& size)
                Vector2(Toolkit::Visual::Transform::Policy::RELATIVE, Toolkit::Visual::Transform::Policy::RELATIVE));
       }
 
-      ((*iter)->visual).SetTransformAndSize(transformMap, size);
+      visualImpl.SetTransformAndSize(transformMap, size);
     }
   }
 }
index 8dbe094e07cea6f621a9d73d1bb637a3802e7133..07be3b05592ea01817a34b94536fe8f00b3a1eac 100644 (file)
@@ -36,6 +36,11 @@ namespace Toolkit
 {
 namespace Internal
 {
+namespace Visual
+{
+class Base;
+}
+
 /**
   * @brief Struct used to store Visual within the control, index is a unique key for each visual.
   */
@@ -149,6 +154,11 @@ public:
    */
   Toolkit::Visual::Base GetVisual(Property::Index index) const;
 
+  /**
+   * @copydoc Dali::Toolkit::Internal::Control::Impl::GetVisualImplPtr()
+   */
+  Toolkit::Internal::Visual::Base* GetVisualImplPtr(Property::Index index) const;
+
   /**
    * @brief Get visual by its name
    * @param[in] name Name of visual
index 486b4e949c6bd08395ff9cb5c38c3a9571a058f7..6d8b661eafd352682985bbb5bfca585827e6811e 100644 (file)
@@ -414,22 +414,6 @@ float ImageView::GetWidthForHeight(float height)
   }
 }
 
-void ImageView::OnRelayout(const Vector2& size, RelayoutContainer& container)
-{
-  Control::OnRelayout(size, container);
-  if(mVisual)
-  {
-    // mVisual is not updated util the resource is ready in the case of visual replacement.
-    // in this case, the Property Map must be initialized so that the previous value is not reused.
-    // after mVisual is updated, the correct value will be reset.
-    Toolkit::Visual::Base visual = DevelControl::GetVisual(*this, Toolkit::ImageView::Property::IMAGE);
-    if(visual && visual != mVisual)
-    {
-      visual.SetTransformAndSize(Property::Map(), size);
-    }
-  }
-}
-
 void ImageView::OnCreateTransitions(std::vector<std::pair<Dali::Property::Index, Dali::Property::Map>>& sourceProperties,
                                     std::vector<std::pair<Dali::Property::Index, Dali::Property::Map>>& destinationProperties,
                                     Dali::Toolkit::Control                                              source,
index 8deb323958ad9c9ba836863acb0675c6a8c81662..e24be4af7afe50ec7ec9629073f3f51a2701d82b 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_TOOLKIT_INTERNAL_IMAGE_VIEW_H
 
 /*
- * Copyright (c) 2023 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 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.
@@ -169,11 +169,6 @@ private: // From Control
    */
   float GetWidthForHeight(float height) override;
 
-  /**
-   * @copydoc Toolkit::Control::OnRelayout()
-   */
-  void OnRelayout(const Vector2& size, RelayoutContainer& container) override;
-
   /**
    * @copydoc Toolkit::Control::OnCreateTransitions()
    */
@@ -194,7 +189,7 @@ private:
    */
   void OnResourceReady(Toolkit::Control control);
 
-   /**
+  /**
    * @brief Create placeholder image if it set. placeholder image is shown when image view is waiting for the image to load.
    */
   void CreatePlaceholderImage();
@@ -229,17 +224,17 @@ private:
   Toolkit::Visual::Base mPreviousVisual;
   Toolkit::Visual::Base mPlaceholderVisual;
 
-  std::string     mUrl;                                    ///< the url for the image if the image came from a URL, empty otherwise
-  std::string     mPlaceholderUrl;                         ///< the url for the placeholder image if the image came from a PLACEHOLDER_IMAGE, empty otherwise
-  Property::Map   mPropertyMap;                            ///< the Property::Map if the image came from a Property::Map, empty otherwise
-  Property::Map   mShaderMap;                              ///< the Property::Map if the custom shader is set, empty otherwise
-  Property::Map   mTransitionEffectOptionMap;              ///< the Property::Map if the transition effect option is set, empty otherwise
-  ImageDimensions mImageSize;                              ///< the image size
-
-  Animation       mTransitionAnimation;                    ///< the animation for transition effect
-  float           mTransitionTargetAlpha;                  ///< Keep image's alpha value
-  bool            mTransitionEffect :1;                    ///< Flag to indicate TransitionEffect is enabled
-  bool            mImageReplaced:1;                        ///< Flag to indicate image is replaced
+  std::string     mUrl;                       ///< the url for the image if the image came from a URL, empty otherwise
+  std::string     mPlaceholderUrl;            ///< the url for the placeholder image if the image came from a PLACEHOLDER_IMAGE, empty otherwise
+  Property::Map   mPropertyMap;               ///< the Property::Map if the image came from a Property::Map, empty otherwise
+  Property::Map   mShaderMap;                 ///< the Property::Map if the custom shader is set, empty otherwise
+  Property::Map   mTransitionEffectOptionMap; ///< the Property::Map if the transition effect option is set, empty otherwise
+  ImageDimensions mImageSize;                 ///< the image size
+
+  Animation mTransitionAnimation;   ///< the animation for transition effect
+  float     mTransitionTargetAlpha; ///< Keep image's alpha value
+  bool      mTransitionEffect : 1;  ///< Flag to indicate TransitionEffect is enabled
+  bool      mImageReplaced : 1;     ///< Flag to indicate image is replaced
 };
 
 } // namespace Internal
index 5f69ef7eef3f3ec0b186b54b7ebfb26ea53ca418..b67016ffb5f2268123ec16df4831440050c0aa8e 100644 (file)
@@ -1001,6 +1001,12 @@ void Visual::Base::SetTransformMapUsageForFittingMode(bool used)
   mImpl->mTransformMapSetForFittingMode = used;
 }
 
+void Visual::Base::SetControlSize(Size controlSize)
+{
+  const static Property::Map emptyMap;
+  SetTransformAndSize(emptyMap, controlSize);
+}
+
 Visual::Base& Visual::Base::GetVisualObject()
 {
   return *this;
index 312923c9e2d74fb371513970866f5df1c1cb1543..d8ff84b23a56f2a80cb600a2b91d9eb64a92e9b6 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_TOOLKIT_INTERNAL_VISUAL_H
 
 /*
- * Copyright (c) 2024 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2025 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.
@@ -293,6 +293,14 @@ public:
    */
   void SetTransformMapUsageForFittingMode(bool used);
 
+  /**
+   * @brief Sets the control size
+   * It will call SetTransformAndSize with empty transform map.
+   *
+   * @param[in] controlSize The size of the parent control for visuals that need to scale internally.
+   */
+  void SetControlSize(Size controlSize);
+
   /**
    * @brief Get the actual Visual Object.
    * @return The actual visual object
index 2b9b4e702fb899f57289466b14f8bd4daafd7b26..003f0e501376876a67523b2fb02525ba15ed4c06 100644 (file)
@@ -135,11 +135,11 @@ void Control::SetBackgroundColor(const Vector4& color)
   map[Toolkit::Visual::Property::TYPE]           = Toolkit::Visual::COLOR;
   map[Toolkit::ColorVisual::Property::MIX_COLOR] = color;
 
-  Toolkit::Visual::Base visual = mImpl->GetVisual(Toolkit::Control::Property::BACKGROUND);
-  if(visual && visual.GetType() == Toolkit::Visual::COLOR)
+  Toolkit::Internal::Visual::Base* visualImplPtr = mImpl->GetVisualImplPtr(Toolkit::Control::Property::BACKGROUND);
+  if(visualImplPtr && visualImplPtr->GetType() == Toolkit::Visual::COLOR)
   {
     // Update background color only
-    mImpl->DoAction(Toolkit::Control::Property::BACKGROUND, DevelVisual::Action::UPDATE_PROPERTY, map);
+    visualImplPtr->DoAction(DevelVisual::Action::UPDATE_PROPERTY, map);
     return;
   }
 
@@ -642,15 +642,16 @@ void Control::OnPropertySet(Property::Index index, const Property::Value& proper
 
 void Control::OnSizeSet(const Vector3& targetSize)
 {
-  Vector2               size(targetSize);
-  Toolkit::Visual::Base visual = mImpl->GetVisual(Toolkit::Control::Property::BACKGROUND);
-  if(visual)
+  Vector2 size(targetSize);
+
+  Toolkit::Internal::Visual::Base* visualImplPtr = mImpl->GetVisualImplPtr(Toolkit::Control::Property::BACKGROUND);
+  if(visualImplPtr)
   {
-    visual.SetTransformAndSize(Property::Map(), size); // Send an empty map as we do not want to modify the visual's set transform
+    visualImplPtr->SetControlSize(size); // Send an empty map as we do not want to modify the visual's set transform
   }
 
   // Apply FittingMode here
-  mImpl->mSize = size;
+  mImpl->mSize = Vector2(targetSize);
   mImpl->RegisterProcessorOnce();
 }
 
@@ -735,11 +736,11 @@ void Control::OnSetResizePolicy(ResizePolicy::Type policy, Dimension::Type dimen
 Vector3 Control::GetNaturalSize()
 {
   DALI_LOG_INFO(gLogFilter, Debug::Verbose, "Control::GetNaturalSize for %s\n", Self().GetProperty<std::string>(Dali::Actor::Property::NAME).c_str());
-  Toolkit::Visual::Base visual = mImpl->GetVisual(Toolkit::Control::Property::BACKGROUND);
-  if(visual)
+  Toolkit::Internal::Visual::Base* visualImplPtr = mImpl->GetVisualImplPtr(Toolkit::Control::Property::BACKGROUND);
+  if(visualImplPtr)
   {
     Vector2 naturalSize;
-    visual.GetNaturalSize(naturalSize);
+    visualImplPtr->GetNaturalSize(naturalSize);
     naturalSize.width += (mImpl->mPadding.start + mImpl->mPadding.end);
     naturalSize.height += (mImpl->mPadding.top + mImpl->mPadding.bottom);
     return Vector3(naturalSize);