Make some visual use DecoratedVisualRenderer
[platform/core/uifw/dali-toolkit.git] / dali-toolkit / internal / visuals / visual-base-impl.h
index 8fa2e5e..bdcb193 100644 (file)
@@ -2,7 +2,7 @@
 #define DALI_TOOLKIT_INTERNAL_VISUAL_H
 
 /*
- * Copyright (c) 2018 Samsung Electronics Co., Ltd.
+ * Copyright (c) 2022 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.
 #include <dali/public-api/rendering/shader.h>
 
 // INTERNAL INCLUDES
-#include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
+#include <dali-toolkit/devel-api/direction-enums.h>
 #include <dali-toolkit/devel-api/visual-factory/visual-base.h>
+#include <dali-toolkit/devel-api/visual-factory/visual-factory.h>
+#include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
 #include <dali-toolkit/internal/visuals/transition-data-impl.h>
 #include <dali-toolkit/internal/visuals/visual-factory-cache.h>
-#include <dali-toolkit/devel-api/direction-enums.h>
 #include <dali-toolkit/public-api/visuals/visual-properties.h>
-#include <dali-toolkit/devel-api/visuals/visual-properties-devel.h>
 
 namespace Dali
 {
-
 namespace Toolkit
 {
-
 namespace Internal
 {
-
 namespace Visual
 {
-
 class EventObserver;
 
 using FittingMode = DevelVisual::FittingMode;
@@ -74,17 +70,16 @@ using FittingMode = DevelVisual::FittingMode;
 class Base : public BaseObject
 {
 public:
-
   /**
    * Setting the properties of the visual, this API should only called by the VisualFactory
    * @param[in] propertyMap The properties for the requested Visual object.
    */
-  void SetProperties( const Property::Map& propertyMap );
+  void SetProperties(const Property::Map& propertyMap);
 
   /**
    * @copydoc Toolkit::Visual::Base::SetName
    */
-  void SetName( const std::string& name );
+  void SetName(const std::string& name);
 
   /**
    * @copydoc Toolkit::Visual::Base::GetName
@@ -94,35 +89,35 @@ public:
   /**
    * @copydoc Toolkit::Visual::Base::SetSize
    */
-  void SetTransformAndSize( const Property::Map& transform, Size controlSize );
+  void SetTransformAndSize(const Property::Map& transform, Size controlSize);
 
   /**
-   * @brief Performs an action on the visual with the given action name and attributes.
+   * @brief Performs an action on the visual with the given action id and attributes.
    *
-   * @param[in] actionName The name of the action to perform this API only takes an Index
+   * @param[in] actionId The id of the action to perform this API only takes an Index
    * @param[in] attributes The list of attributes for the action. ( optional for this data structure to have content )
    */
-  void DoAction( const Dali::Property::Index actionName, const Dali::Property::Value attributes );
+  void DoAction(const Dali::Property::Index actionId, const Dali::Property::Value attributes);
 
   /**
    * @copydoc Toolkit::Visual::Base::GetHeightForWidth
    */
-  virtual float GetHeightForWidth( float width );
+  virtual float GetHeightForWidth(float width);
 
   /**
    * @copydoc Toolkit::Visual::Base::GetWidthForHeight
    */
-  virtual float GetWidthForHeight( float height );
+  virtual float GetWidthForHeight(float height);
 
   /**
    * @copydoc Toolkit::Visual::Base::GetNaturalSize
    */
-  virtual void GetNaturalSize( Vector2& naturalSize );
+  virtual void GetNaturalSize(Vector2& naturalSize);
 
   /**
    * @copydoc Toolkit::Visual::Base::SetDepthIndex
    */
-  void SetDepthIndex( int index );
+  void SetDepthIndex(int index);
 
   /**
    * @copydoc Toolkit::Visual::Base::GetDepthIndex
@@ -133,17 +128,17 @@ public:
    * @copydoc Toolkit::Visual::Base::SetOnScene
    * @pre Impl->mGeometry must be created before this method is called
    */
-  void SetOnScene( Actor& actor );
+  void SetOnScene(Actor& actor);
 
   /**
    * @copydoc Toolkit::Visual::Base::SetOffScene
    */
-  void SetOffScene( Actor& actor );
+  void SetOffScene(Actor& actor);
 
   /**
    * @copydoc Toolkit::Visual::Base::CreatePropertyMap
    */
-  void CreatePropertyMap( Property::Map& map ) const;
+  void CreatePropertyMap(Property::Map& map) const;
 
   /**
    * @brief Create a property map containing per-instance visual properties.
@@ -153,14 +148,14 @@ public:
    * (e.g. for image visual, the desired size, and for text visual, the actual text).
    * @param[in] map The property map into which to write
    */
-  void CreateInstancePropertyMap( Property::Map& map ) const;
+  void CreateInstancePropertyMap(Property::Map& map) const;
 
   /**
    * @brief Set whether the Pre-multiplied Alpha Blending is required
    *
    * @param[in] preMultiplied whether alpha is pre-multiplied.
    */
-  void EnablePreMultipliedAlpha( bool preMultiplied );
+  virtual void EnablePreMultipliedAlpha(bool preMultiplied);
 
   /**
    * @brief Query whether alpha is pre-multiplied.
@@ -170,27 +165,20 @@ public:
   bool IsPreMultipliedAlphaEnabled() const;
 
   /**
-   * @brief Query whether advanced blend equation is applied.
-   *
-   * @return True is advanced blend equation is applied, false otherwise.
-   */
-  bool IsAdvancedBlendEquationApplied() const;
-
-  /**
    * @brief Sets properties of custom shader
    * @param[in] propertyMap Property map containing the custom shader data
    */
-  void SetCustomShader( const Property::Map& propertyMap );
+  void SetCustomShader(const Property::Map& propertyMap);
 
   /**
    * @copydoc Toolkit::Visual::Base::SetProperty
    */
-  void SetProperty( Dali::Property::Index index, const Dali::Property::Value& propertyValue );
+  void SetProperty(Dali::Property::Index index, const Dali::Property::Value& propertyValue);
 
   /**
    * @copydoc Toolkit::Visual::Base::GetProperty
    */
-  Dali::Property::Value GetProperty( Dali::Property::Index index );
+  Dali::Property::Value GetProperty(Dali::Property::Index index);
 
   /**
    * Gets currently staged renderer, or an empty handle if not staged
@@ -198,22 +186,23 @@ public:
   Renderer GetRenderer();
 
   /**
-   * Sets the mix color ( including opacity )  of the visual.
-   * @param[in] mixColor The new mix color
+   * Convert all string keys to int keys
+   * @param[in] key The key to convert
+   * @return the index key supplied or matching, or INVALID_INDEX if no match
    */
-  void SetMixColor( const Vector4& color );
+  static Property::Index GetIntKey(Property::Key key);
 
   /**
-   * Sets the mix color of the visual.
+   * Sets the mix color ( including opacity )  of the visual.
    * @param[in] mixColor The new mix color
    */
-  void SetMixColor( const Vector3& color );
+  void SetMixColor(const Vector4& color);
 
   /**
-   * Gets the mix color of the visual.
-   * @return The mix color
+   * Sets the mix color of the visual.
+   * @param[in] mixColor The new mix color
    */
-  const Vector4& GetMixColor() const;
+  void SetMixColor(const Vector3& color);
 
   /**
    * Animate the property if it exists in the visual or renderer.
@@ -230,28 +219,28 @@ public:
    * @param[in] transition The animation to create or attach to
    * @param[in] animator The animation parameters of the property.
    */
-  void AnimateProperty( Dali::Animation& transition,
-                        Internal::TransitionData::Animator& animator );
+  void AnimateProperty(Dali::Animation&                    transition,
+                       Internal::TransitionData::Animator& animator);
 
   /**
    * @brief Add an observer to watch for when the Visuals have events to notify
    * Currently only supports a single observer
    */
-  void AddEventObserver( Visual::EventObserver& observer );
+  void AddEventObserver(Visual::EventObserver& observer);
 
   /**
    * @brief Remove an observer
    */
-  void RemoveEventObserver( Visual::EventObserver& observer );
+  void RemoveEventObserver(Visual::EventObserver& observer);
 
   /**
    * @brief Called when the visuals resources are loaded / ready
    */
-  void ResourceReady( Toolkit::Visual::ResourceStatus resourceStatus );
+  void ResourceReady(Toolkit::Visual::ResourceStatus resourceStatus);
 
   /**
-   * @brief Called when the visuals resources are loaded / ready
-   * @return true if ready, false otherwise
+   * @brief Called when the visuals resources are loaded / ready or failed (mean, broken image ready)
+   * @return true if ready or failed (mean, broken image ready), false otherwise
    */
   virtual bool IsResourceReady() const;
 
@@ -286,8 +275,15 @@ public:
    */
   Toolkit::Visual::Type GetType() const;
 
- protected:
+  /**
+   * @brief Retrieve the property object associated with the property key.
+   *
+   * @param[in] key The Property key of the visual.
+   * @return The Property object
+   */
+  Dali::Property GetPropertyObject(Dali::Property::Key key);
 
+protected:
   /**
    * @brief Constructor.
    *
@@ -295,21 +291,30 @@ public:
    * @param[in] fittingMode The value that determines how the visual should be fit to the view
    * @param[in] type The type of the this visual
    */
-  Base( VisualFactoryCache& factoryCache, FittingMode fittingMode, Toolkit::Visual::Type type );
+  Base(VisualFactoryCache& factoryCache, FittingMode fittingMode, Toolkit::Visual::Type type);
 
   /**
    * @brief A reference counted object may only be deleted by calling Unreference().
    */
   ~Base() override;
 
+  /**
+   * @brief Second-phase constructor.
+   */
+  void Initialize();
+
 protected:
+  /**
+   * @brief Called by Initialize() allowing sub classes to initialize them.
+   */
+  virtual void OnInitialize() = 0;
 
   /**
    * @brief Called by CreatePropertyMap() allowing sub classes to respond to the CreatePropertyMap event
    *
    * @param[out] map The visual property map.
    */
-  virtual void DoCreatePropertyMap( Property::Map& map ) const = 0;
+  virtual void DoCreatePropertyMap(Property::Map& map) const = 0;
 
   /**
    * @brief Called by CreateInstancePropertyMap() allowing derived
@@ -318,14 +323,14 @@ protected:
    *
    * @param[out] map The visual property map
    */
-  virtual void DoCreateInstancePropertyMap( Property::Map& map ) const = 0;
+  virtual void DoCreateInstancePropertyMap(Property::Map& map) const = 0;
 
   /**
    * @brief Called by SetProperties() allowing sub classes to set their properties
    *
    * @param[in] propertyMap The properties for the requested Visual object.
    */
-  virtual void DoSetProperties( const Property::Map& propertyMap ) = 0;
+  virtual void DoSetProperties(const Property::Map& propertyMap) = 0;
 
   /**
    * @brief Called when transform or control size changes
@@ -340,14 +345,14 @@ protected:
    *
    * @param[in] actor The actor applying this visual.
    */
-  virtual void DoSetOnScene( Actor& actor ) = 0;
+  virtual void DoSetOnScene(Actor& actor) = 0;
 
   /**
    * @brief Called by SetOffScene() allowing sub classes to respond to the SetOffScene event
    *
    * @param[in] actor The actor applying this visual.
    */
-  virtual void DoSetOffScene( Actor& actor );
+  virtual void DoSetOffScene(Actor& actor);
 
   /**
    * @brief Called by DoAction() allowing sub classes to do the given action.
@@ -355,11 +360,39 @@ protected:
    * @param[in] actionId The action to perform
    * @param[in] attributes The list of attributes for the action. ( optional for this data structure to have content )
    */
-  virtual void OnDoAction( const Property::Index actionId, const Property::Value& attributes );
+  virtual void OnDoAction(const Property::Index actionId, const Property::Value& attributes);
 
-protected:
+  /**
+   * @brief Update the shader when some properties are changed.
+   */
+  virtual void UpdateShader()
+  {
+  }
+
+  /**
+   * @brief Generate a shader by the current properties from each sub classes's own shader-generate logic.
+   * @param[in] factoryCache The visual factory cache to store the generated shader.
+   * @return If the function defined, Generated shader by the current properties. Else, empty shader.
+   */
+  virtual Dali::Shader GenerateShader() const
+  {
+    return Dali::Shader();
+  }
 
   /**
+   * @brief Called by GetPropertyObject() allowing sub classes to respond to the GetPropertyObject event
+   * @note The derived class is required to register the given property.
+   * @param[in] key The key of the visual's property.
+   * @return The Property object
+   */
+  virtual Dali::Property OnGetPropertyObject(Dali::Property::Key key)
+  {
+    Handle handle;
+    return Dali::Property(handle, Property::INVALID_INDEX);
+  }
+
+protected:
+  /**
    * @brief Gets the on scene state for this Visual
    *
    * @return Returns true if this Visual is on the scene, false if it is off the scene
@@ -373,8 +406,14 @@ protected:
    */
   bool IsRoundedCornerRequired() const;
 
-private:
+  /**
+   * @brief Query whether the borderline of the visual requires to be rendered.
+   *
+   * @return Returns true if the outline is required, false otherwise.
+   */
+  bool IsBorderlineRequired() const;
 
+private:
   /**
    * Register the mix color uniform on the Renderer and store the property index.
    * Note, this is not used by Color or Primitive Visuals, which will use their
@@ -383,13 +422,18 @@ private:
   void RegisterMixColor();
 
   /**
+   * Register the uniform on the DecoratedVisualRenderer and store the property index if necessary.
+   */
+  void RegisterDecoration();
+
+  /**
    * Find the matching property on the renderer or shader. If it's a shader
    * property, register it on the renderer in order to animate it for this
    * visual independently.
    * @param[in] key The key to match.
    * @return the matching index, or INVALID_INDEX if it's not found
    */
-  Property::Index GetPropertyIndex( Property::Key key );
+  Property::Index GetPropertyIndex(Property::Key key);
 
   /**
    * Set up the transition. If no animation is required, then
@@ -401,11 +445,11 @@ private:
    * @param[in] initialValue The optional initial value
    * @param[in] targetValue The target value to use
    */
-  void SetupTransition( Dali::Animation& transition,
-                        Internal::TransitionData::Animator& animator,
-                        Property::Index index,
-                        Property::Value& initialValue,
-                        Property::Value& targetValue );
+  void SetupTransition(Dali::Animation&                    transition,
+                       Internal::TransitionData::Animator& animator,
+                       Property::Index                     index,
+                       Property::Value&                    initialValue,
+                       Property::Value&                    targetValue);
 
   /**
    * Animate the opacity property - Special handling to
@@ -416,8 +460,8 @@ private:
    * @param[in] transition The transition to use or set up.
    * @param[in] animator The animation data to use
    */
-  void AnimateOpacityProperty( Dali::Animation& transition,
-                               Internal::TransitionData::Animator& animator );
+  void AnimateOpacityProperty(Dali::Animation&                    transition,
+                              Internal::TransitionData::Animator& animator);
 
   /**
    * Animate the renderer property - no special handling
@@ -425,8 +469,8 @@ private:
    * @param[in] transition The transition to use or set up.
    * @param[in] animator The animation data to use
    */
-  void AnimateRendererProperty( Dali::Animation& transition,
-                                Internal::TransitionData::Animator& animator );
+  void AnimateRendererProperty(Dali::Animation&                    transition,
+                               Internal::TransitionData::Animator& animator);
 
   /**
    * Animate the mix color property.
@@ -439,49 +483,30 @@ private:
    * @param[in] transition The transition to use or set up.
    * @param[in] animator The animation data to use
    */
-  void AnimateMixColorProperty( Dali::Animation& transition,
-                                Internal::TransitionData::Animator& animator );
-
-  /**
-   * Set up the right blend mode if the opacity is being animated.
-   * Also ensure that when the animation finishes, the blend mode is
-   * set to the appropriate value. It also uses the target value as
-   * set into mMixColor.
-   *
-   * @param[in] transition The transition to listen to
-   * @param[in] isInitialOpaque Whether the initial value is opaque
-   * @param[in] animating If the transition animates the value.
-   */
-  void SetupBlendMode( Dali::Animation& transition,
-                       bool isInitialOpaque, bool animating );
-
-  /**
-   * When a mix color animation has finished, ensure the blend mode is set back
-   * to the right value for the target opacity.
-   */
-  void OnMixColorFinished( Animation& animation );
+  void AnimateMixColorProperty(Dali::Animation&                    transition,
+                               Internal::TransitionData::Animator& animator);
 
   // Undefined
-  Base( const Visual::Base& visual );
+  Base(const Visual::Base& visual);
 
   // Undefined
-  Base& operator=( const Visual::Base& visual );
+  Base& operator=(const Visual::Base& visual);
 
 protected:
   struct Impl;
-  Impl* mImpl;
+  Impl*               mImpl;
   VisualFactoryCache& mFactoryCache;
 };
 
 typedef IntrusivePtr<Base> BasePtr;
 
-} // namspace Visual
+} // namespace Visual
 
 } // namespace Internal
 
-inline const Internal::Visual::Base& GetImplementation(const Toolkit::Visual::Base& visualBase )
+inline const Internal::Visual::Base& GetImplementation(const Toolkit::Visual::Base& visualBase)
 {
-  DALI_ASSERT_ALWAYS( visualBase && "visual base handle is empty" );
+  DALI_ASSERT_ALWAYS(visualBase && "visual base handle is empty");
 
   const BaseObject& handle = visualBase.GetBaseObject();
 
@@ -490,7 +515,7 @@ inline const Internal::Visual::Base& GetImplementation(const Toolkit::Visual::Ba
 
 inline Internal::Visual::Base& GetImplementation(Toolkit::Visual::Base& visualBase)
 {
-  DALI_ASSERT_ALWAYS( visualBase && "visual base handle is empty" );
+  DALI_ASSERT_ALWAYS(visualBase && "visual base handle is empty");
 
   BaseObject& handle = visualBase.GetBaseObject();