CanvasRenderer: Add Drawable::SetMask() API 33/261133/6
authorJunsuChoi <jsuya.choi@samsung.com>
Mon, 12 Jul 2021 08:30:40 +0000 (17:30 +0900)
committerJunsuChoi <jsuya.choi@samsung.com>
Wed, 21 Jul 2021 05:53:29 +0000 (14:53 +0900)
Add masking API to support masking using drawable.
Currently, alpha and inverse alpha masking are supported.
This property may be further increased in the future.

+) Mask and clippath cannot be used together yet.
This will be improved with additional patches once the Spec is decided.

Change-Id: Idd4c88097d8db5ce36ac028b8ae47a6a01669f41

dali/devel-api/adaptor-framework/canvas-renderer-drawable.cpp
dali/devel-api/adaptor-framework/canvas-renderer-drawable.h
dali/internal/canvas-renderer/common/drawable-impl.cpp
dali/internal/canvas-renderer/common/drawable-impl.h
dali/internal/canvas-renderer/generic/drawable-impl-generic.cpp
dali/internal/canvas-renderer/generic/drawable-impl-generic.h
dali/internal/canvas-renderer/tizen/drawable-impl-tizen.cpp
dali/internal/canvas-renderer/tizen/drawable-impl-tizen.h
dali/internal/canvas-renderer/ubuntu/drawable-impl-ubuntu.cpp
dali/internal/canvas-renderer/ubuntu/drawable-impl-ubuntu.h

index d29c004..8963ccc 100644 (file)
@@ -79,6 +79,11 @@ bool CanvasRenderer::Drawable::SetClipPath(Drawable& clip)
   return GetImplementation(*this).SetClipPath(clip);
 }
 
+bool CanvasRenderer::Drawable::SetMask(Drawable& mask, MaskType type)
+{
+  return GetImplementation(*this).SetMask(mask, type);
+}
+
 CanvasRenderer::Drawable CanvasRenderer::Drawable::DownCast(BaseHandle handle)
 {
   return CanvasRenderer::Drawable(dynamic_cast<Internal::Adaptor::Drawable*>(handle.GetObjectPtr()));
index 6251375..1eae7b4 100644 (file)
@@ -67,6 +67,16 @@ public:
 
 public:
   /**
+   * @brief Enumeration indicating the type used in the masking of two objects - the mask drawable and the own drawable.
+   */
+  enum class MaskType
+  {
+    ALPHA = 0,    ///< The pixels of the own drawable and the mask drawable are alpha blended. As a result, only the part of the own drawable, which intersects with the mask drawable is visible.
+    ALPHA_INVERSE ///< The pixels of the own drawable and the complement to the mask drawable's pixels are alpha blended. As a result, only the part of the own which is not covered by the mask is visible.
+  };
+
+public:
+  /**
    * @brief Set the transparency value
    * @param[in] opacity The transparency level [0 ~ 1.0], 0 means totally transparent, while 1 means opaque.
    * @return Returns True when it's successful. False otherwise.
@@ -122,6 +132,14 @@ public:
   bool SetClipPath(Drawable& clip);
 
   /**
+   * @brief The pixels of mask drawable and own drawable are blended according to MaskType.
+   * @param[in] mask The mask drawable object.
+   * @param[in] type The masking type.
+   * @return Returns True when it's successful. False otherwise.
+   */
+  bool SetMask(Drawable& mask, MaskType type);
+
+  /**
    * @brief Downcast a handle to Drawable handle.
    *
    * If handle points to an InputMethodContext the downcast produces valid
index d8d5a57..834a34d 100644 (file)
@@ -115,6 +115,15 @@ bool Drawable::SetClipPath(Dali::CanvasRenderer::Drawable& clip)
   return mImpl->SetClipPath(clip);
 }
 
+bool Drawable::SetMask(Dali::CanvasRenderer::Drawable& mask, Dali::CanvasRenderer::Drawable::MaskType type)
+{
+  if(!mImpl)
+  {
+    return false;
+  }
+  return mImpl->SetMask(mask, type);
+}
+
 Dali::CanvasRenderer::Drawable Drawable::GetCompositionDrawable() const
 {
   if(!mImpl)
index d9fd55e..8526dec 100644 (file)
@@ -115,6 +115,11 @@ public:
   virtual bool SetClipPath(Dali::CanvasRenderer::Drawable& clip);
 
   /**
+   * @copydoc Dali::CanvasRenderer::Drawable::SetMask()
+   */
+  virtual bool SetMask(Dali::CanvasRenderer::Drawable& mask, Dali::CanvasRenderer::Drawable::MaskType type);
+
+  /**
    * @brief Returns a composition drawble object.
    * @return Returns a composition drawble object.
    */
index d162f59..3d2f71a 100644 (file)
@@ -93,6 +93,11 @@ bool DrawableGeneric::SetClipPath(Dali::CanvasRenderer::Drawable& clip)
   return false;
 }
 
+bool DrawableGeneric::SetMask(Dali::CanvasRenderer::Drawable& mask, Dali::CanvasRenderer::Drawable::MaskType type)
+{
+  return false;
+}
+
 Dali::CanvasRenderer::Drawable DrawableGeneric::GetCompositionDrawable() const
 {
   return Dali::CanvasRenderer::Drawable();
index 2b299dd..0f65e17 100644 (file)
@@ -85,6 +85,11 @@ public:
   bool SetClipPath(Dali::CanvasRenderer::Drawable& clip) override;
 
   /**
+   * @copydoc Dali::CanvasRenderer::Drawable::SetMask()
+   */
+  bool SetMask(Dali::CanvasRenderer::Drawable& mask, Dali::CanvasRenderer::Drawable::MaskType type) override;
+
+  /**
    * @copydoc Internal::Adaptor::Drawable::GetCompositionDrawable()
    */
   Dali::CanvasRenderer::Drawable GetCompositionDrawable() const override;
index 9333c75..b4a53bd 100644 (file)
@@ -239,6 +239,50 @@ bool DrawableTizen::SetClipPath(Dali::CanvasRenderer::Drawable& clip)
 #endif
 }
 
+bool DrawableTizen::SetMask(Dali::CanvasRenderer::Drawable& mask, Dali::CanvasRenderer::Drawable::MaskType type)
+{
+#ifdef THORVG_SUPPORT
+  if(!mTvgPaint)
+  {
+    DALI_LOG_ERROR("Drawable is null\n");
+    return false;
+  }
+
+  Internal::Adaptor::Drawable& drawableImpl = Dali::GetImplementation(mask);
+  if(drawableImpl.IsAdded())
+  {
+    DALI_LOG_ERROR("Already used [%p][%p]\n", this, &mask);
+    return false;
+  }
+
+  drawableImpl.SetAdded(true);
+  mCompositionDrawable = mask;
+  switch(type)
+  {
+    case Dali::CanvasRenderer::Drawable::MaskType::ALPHA:
+    {
+      mCompositionType = Drawable::CompositionType::ALPHA_MASK;
+      break;
+    }
+    case Dali::CanvasRenderer::Drawable::MaskType::ALPHA_INVERSE:
+    {
+      mCompositionType = Drawable::CompositionType::ALPHA_MASK_INVERSE;
+      break;
+    }
+    default:
+    {
+      mCompositionType = Drawable::CompositionType::ALPHA_MASK;
+      break;
+    }
+  }
+  Drawable::SetChanged(true);
+
+  return true;
+#else
+  return false;
+#endif
+}
+
 Dali::CanvasRenderer::Drawable DrawableTizen::GetCompositionDrawable() const
 {
   return mCompositionDrawable;
index f1cd7a7..b37ae2d 100644 (file)
@@ -88,6 +88,11 @@ public:
   bool SetClipPath(Dali::CanvasRenderer::Drawable& clip) override;
 
   /**
+   * @copydoc Dali::CanvasRenderer::Drawable::SetMask()
+   */
+  bool SetMask(Dali::CanvasRenderer::Drawable& mask, Dali::CanvasRenderer::Drawable::MaskType type) override;
+
+  /**
    * @copydoc Internal::Adaptor::Drawable::GetCompositionDrawable()
    */
   Dali::CanvasRenderer::Drawable GetCompositionDrawable() const override;
index f4cb431..3808448 100644 (file)
@@ -239,6 +239,50 @@ bool DrawableUbuntu::SetClipPath(Dali::CanvasRenderer::Drawable& clip)
 #endif
 }
 
+bool DrawableUbuntu::SetMask(Dali::CanvasRenderer::Drawable& mask, Dali::CanvasRenderer::Drawable::MaskType type)
+{
+#ifdef THORVG_SUPPORT
+  if(!mTvgPaint)
+  {
+    DALI_LOG_ERROR("Drawable is null\n");
+    return false;
+  }
+
+  Internal::Adaptor::Drawable& drawableImpl = Dali::GetImplementation(mask);
+  if(drawableImpl.IsAdded())
+  {
+    DALI_LOG_ERROR("Already used [%p][%p]\n", this, &mask);
+    return false;
+  }
+
+  drawableImpl.SetAdded(true);
+  mCompositionDrawable = mask;
+  switch(type)
+  {
+    case Dali::CanvasRenderer::Drawable::MaskType::ALPHA:
+    {
+      mCompositionType = Drawable::CompositionType::ALPHA_MASK;
+      break;
+    }
+    case Dali::CanvasRenderer::Drawable::MaskType::ALPHA_INVERSE:
+    {
+      mCompositionType = Drawable::CompositionType::ALPHA_MASK_INVERSE;
+      break;
+    }
+    default:
+    {
+      mCompositionType = Drawable::CompositionType::ALPHA_MASK;
+      break;
+    }
+  }
+  Drawable::SetChanged(true);
+
+  return true;
+#else
+  return false;
+#endif
+}
+
 Dali::CanvasRenderer::Drawable DrawableUbuntu::GetCompositionDrawable() const
 {
   return mCompositionDrawable;
index 45bdc3d..742ff74 100644 (file)
@@ -89,6 +89,11 @@ public:
   bool SetClipPath(Dali::CanvasRenderer::Drawable& clip) override;
 
   /**
+   * @copydoc Dali::CanvasRenderer::Drawable::SetMask()
+   */
+  bool SetMask(Dali::CanvasRenderer::Drawable& mask, Dali::CanvasRenderer::Drawable::MaskType type) override;
+
+  /**
    * @copydoc Internal::Adaptor::Drawable::GetCompositionDrawable()
    */
   Dali::CanvasRenderer::Drawable GetCompositionDrawable() const override;