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
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()));
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.
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
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)
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.
*/
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();
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;
#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;
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;
#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;
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;