CanvasRenderer: Add Gradient, LinearGradient, RadialGradient classes 17/261217/15
authorJunsuChoi <jsuya.choi@samsung.com>
Tue, 13 Jul 2021 06:12:31 +0000 (15:12 +0900)
committerJunsuChoi <jsuya.choi@samsung.com>
Fri, 6 Aug 2021 06:49:05 +0000 (15:49 +0900)
Add Gradient, LinearGradient, and RadialGradient classes that
implement Linear and Radial Gradient features.
Each Gradient can be applied to Fill and Stroke of Shape after
setting Bounds and ColorStop suitable for style.

ex)
//Radial Gradient with Fill color
Dali::CanvasRenderer::RadialGradient radial = Dali::CanvasRenderer::RadialGradient::New();
Dali::Vector<Dali::CanvasRenderer::Gradient::ColorStop> stops;
stops.PushBack( {0.0f, Vector4(1.0f, 0.0f, 1.0f, 1.0f)} );
stops.PushBack( {1.0f, Vector4(0.5f, 1.0f, 0.0f, 1.0f)} );

radial.SetBounds(Vector2(110, 100), 50);
radial.SetColorStops(stops);
shape.SetFillGradient(radial);

//Linear Gradient with Stroke color
Dali::CanvasRenderer::LinearGradient linear = Dali::CanvasRenderer::LinearGradient::New();
Dali::Vector<Dali::CanvasRenderer::Gradient::ColorStop> stops;
stops.PushBack( {0.0f, Vector4(1.0f, 0.0f, 1.0f, 1.0f)} );
stops.PushBack( {1.0f, Vector4(0.5f, 1.0f, 0.0f, 1.0f)} );

linear.SetBounds(Vector2(10, 10), Vector2(100, 100));
linear.SetColorStops(stops);
shape.SetStrokeGradient(linear);

Change-Id: I747614bf1c6bcd59f30a74a23c4001cfdfe19d1a

55 files changed:
dali/devel-api/adaptor-framework/canvas-renderer-gradient.cpp [new file with mode: 0644]
dali/devel-api/adaptor-framework/canvas-renderer-gradient.h [new file with mode: 0644]
dali/devel-api/adaptor-framework/canvas-renderer-linear-gradient.cpp [new file with mode: 0644]
dali/devel-api/adaptor-framework/canvas-renderer-linear-gradient.h [new file with mode: 0644]
dali/devel-api/adaptor-framework/canvas-renderer-radial-gradient.cpp [new file with mode: 0644]
dali/devel-api/adaptor-framework/canvas-renderer-radial-gradient.h [new file with mode: 0644]
dali/devel-api/adaptor-framework/canvas-renderer-shape.cpp
dali/devel-api/adaptor-framework/canvas-renderer-shape.h
dali/devel-api/adaptor-framework/canvas-renderer.h
dali/devel-api/file.list
dali/internal/canvas-renderer/common/gradient-factory.h [new file with mode: 0644]
dali/internal/canvas-renderer/common/gradient-impl.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/common/gradient-impl.h [new file with mode: 0644]
dali/internal/canvas-renderer/common/linear-gradient-factory.h [new file with mode: 0644]
dali/internal/canvas-renderer/common/linear-gradient-impl.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/common/linear-gradient-impl.h [new file with mode: 0644]
dali/internal/canvas-renderer/common/radial-gradient-factory.h [new file with mode: 0644]
dali/internal/canvas-renderer/common/radial-gradient-impl.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/common/radial-gradient-impl.h [new file with mode: 0644]
dali/internal/canvas-renderer/common/shape-impl.cpp
dali/internal/canvas-renderer/common/shape-impl.h
dali/internal/canvas-renderer/file.list
dali/internal/canvas-renderer/generic/gradient-factory-generic.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/generic/gradient-impl-generic.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/generic/gradient-impl-generic.h [new file with mode: 0644]
dali/internal/canvas-renderer/generic/linear-gradient-factory-generic.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/generic/linear-gradient-impl-generic.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/generic/linear-gradient-impl-generic.h [new file with mode: 0644]
dali/internal/canvas-renderer/generic/radial-gradient-factory-generic.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/generic/radial-gradient-impl-generic.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/generic/radial-gradient-impl-generic.h [new file with mode: 0644]
dali/internal/canvas-renderer/tizen/canvas-renderer-impl-tizen.cpp
dali/internal/canvas-renderer/tizen/gradient-factory-tizen.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/tizen/gradient-impl-tizen.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/tizen/gradient-impl-tizen.h [new file with mode: 0644]
dali/internal/canvas-renderer/tizen/linear-gradient-factory-tizen.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/tizen/linear-gradient-impl-tizen.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/tizen/linear-gradient-impl-tizen.h [new file with mode: 0644]
dali/internal/canvas-renderer/tizen/radial-gradient-factory-tizen.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/tizen/radial-gradient-impl-tizen.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/tizen/radial-gradient-impl-tizen.h [new file with mode: 0644]
dali/internal/canvas-renderer/tizen/shape-impl-tizen.cpp
dali/internal/canvas-renderer/tizen/shape-impl-tizen.h
dali/internal/canvas-renderer/ubuntu/canvas-renderer-impl-ubuntu.cpp
dali/internal/canvas-renderer/ubuntu/gradient-factory-ubuntu.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/ubuntu/gradient-impl-ubuntu.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/ubuntu/gradient-impl-ubuntu.h [new file with mode: 0644]
dali/internal/canvas-renderer/ubuntu/linear-gradient-factory-ubuntu.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/ubuntu/linear-gradient-impl-ubuntu.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/ubuntu/linear-gradient-impl-ubuntu.h [new file with mode: 0644]
dali/internal/canvas-renderer/ubuntu/radial-gradient-factory-ubuntu.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/ubuntu/radial-gradient-impl-ubuntu.cpp [new file with mode: 0644]
dali/internal/canvas-renderer/ubuntu/radial-gradient-impl-ubuntu.h [new file with mode: 0644]
dali/internal/canvas-renderer/ubuntu/shape-impl-ubuntu.cpp
dali/internal/canvas-renderer/ubuntu/shape-impl-ubuntu.h

diff --git a/dali/devel-api/adaptor-framework/canvas-renderer-gradient.cpp b/dali/devel-api/adaptor-framework/canvas-renderer-gradient.cpp
new file mode 100644 (file)
index 0000000..0c38af4
--- /dev/null
@@ -0,0 +1,66 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali/devel-api/adaptor-framework/canvas-renderer-gradient.h>
+
+// INTERNAL INCLUDES
+#include <dali/internal/canvas-renderer/common/canvas-renderer-impl.h>
+#include <dali/internal/canvas-renderer/common/gradient-impl.h>
+
+namespace Dali
+{
+// CanvasRenderer::Gradient
+//
+CanvasRenderer::Gradient::Gradient()
+{
+}
+
+CanvasRenderer::Gradient::~Gradient()
+{
+}
+
+CanvasRenderer::Gradient::Gradient(Internal::Adaptor::Gradient* pImpl)
+: BaseHandle(pImpl)
+{
+}
+
+bool CanvasRenderer::Gradient::SetColorStops(Dali::CanvasRenderer::Gradient::ColorStops& colorStops)
+{
+  return GetImplementation(*this).SetColorStops(colorStops);
+}
+
+Dali::CanvasRenderer::Gradient::ColorStops CanvasRenderer::Gradient::GetColorStops() const
+{
+  return GetImplementation(*this).GetColorStops();
+}
+
+bool CanvasRenderer::Gradient::SetSpread(Dali::CanvasRenderer::Gradient::Spread spread)
+{
+  return GetImplementation(*this).SetSpread(spread);
+}
+
+Dali::CanvasRenderer::Gradient::Spread CanvasRenderer::Gradient::GetSpread() const
+{
+  return GetImplementation(*this).GetSpread();
+}
+
+CanvasRenderer::Gradient CanvasRenderer::Gradient::DownCast(BaseHandle handle)
+{
+  return CanvasRenderer::Gradient(dynamic_cast<Internal::Adaptor::Gradient*>(handle.GetObjectPtr()));
+}
+} // namespace Dali
diff --git a/dali/devel-api/adaptor-framework/canvas-renderer-gradient.h b/dali/devel-api/adaptor-framework/canvas-renderer-gradient.h
new file mode 100644 (file)
index 0000000..3f181fd
--- /dev/null
@@ -0,0 +1,151 @@
+#ifndef DALI_CANVAS_RENDERER_GRADIENT_H
+#define DALI_CANVAS_RENDERER_GRADIENT_H
+
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#include <dali/public-api/object/base-handle.h>
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer.h>
+#include <dali/public-api/dali-adaptor-common.h>
+
+namespace Dali
+{
+/**
+ * @addtogroup dali_adaptor_framework
+ * @{
+ */
+
+namespace Internal DALI_INTERNAL
+{
+namespace Adaptor
+{
+class CanvasRenderer;
+class Gradient;
+} // namespace Adaptor
+} // namespace DALI_INTERNAL
+
+/**
+ * @brief An abstract class representing the gradient fill of the Shape object.
+ *
+ * It contains the information about the gradient colors and their arrangement
+ * inside the gradient bounds. The gradients bounds are defined in the LinearGradient
+ * or RadialGradient class, depending on the type of the gradient to be used.
+ * It specifies the gradient behavior in case the area defined by the gradient bounds
+ * is smaller than the area to be filled.
+ */
+class DALI_ADAPTOR_API CanvasRenderer::Gradient : public BaseHandle
+{
+public:
+  /**
+   * @brief Constructor
+   */
+  Gradient();
+
+  /**
+   * @brief Destructor.
+   */
+  ~Gradient();
+
+  /**
+   * @brief This copy constructor is required for (smart) pointer semantics.
+   *
+   * @param[in] handle A reference to the copied handle
+   */
+  Gradient(const Gradient& handle) = default;
+
+public:
+  /**
+   * @brief Enumeration specifying how to fill the area outside the gradient bounds.
+   */
+  enum class Spread
+  {
+    PAD = 0, ///< The remaining area is filled with the closest stop color.
+    REFLECT, ///< The gradient pattern is reflected outside the gradient area until the expected region is filled.
+    REPEAT   ///< The gradient pattern is repeated continuously beyond the gradient area until the expected region is filled.
+  };
+
+  /**
+   * @brief A data structure storing the information about the color and its relative position inside the gradient bounds.
+   */
+  struct ColorStop
+  {
+    float   offset; /**< The relative position of the color. */
+    Vector4 color;  /**< The color value. */
+  };
+
+  /// @brief List of Colorstop.
+  using ColorStops = Dali::Vector<ColorStop>;
+
+public:
+  /**
+   * @brief Sets the parameters of the colors of the gradient and their position.
+   * @param[in] colorStops An array of ColorStop data structure.
+   * @return Result::Success when succeed.
+   */
+  bool SetColorStops(ColorStops& colorStops);
+
+  /**
+   * @brief Gets the parameters of the colors of the gradient, their position and number.
+   * @return Returns the colorstops list.
+   */
+  ColorStops GetColorStops() const;
+
+  /**
+   * @brief Set the spread.
+   * @param[in] spread The current spraed type of the shape.
+   * @return Returns True when it's successful. False otherwise.
+   */
+  bool SetSpread(Spread spread);
+
+  /**
+   * @brief Get the spread type
+   * @return Returns the current spread type of the shape.
+   */
+  Spread GetSpread() const;
+
+  /**
+   * @brief Downcast a handle to Gradient handle.
+   *
+   * If handle points to an InputMethodContext the downcast produces valid
+   * handle. If not the returned handle is left uninitialized.
+   *
+   * @param[in] handle Handle to an object.
+   * @return Handle to an Gradient or an uninitialized handle.
+   */
+  static Gradient DownCast(BaseHandle handle);
+
+public: // Not intended for application developers
+  /// @cond internal
+  /**
+   * @brief The constructor.
+   * @note  Not intended for application developers.
+   *
+   * @param[in] pointer A pointer to a newly allocated CanvasRenderer::Gradient
+   */
+  explicit DALI_INTERNAL Gradient(Internal::Adaptor::Gradient* pImpl);
+  /// @endcond
+};
+
+/**
+ * @}
+ */
+} // namespace Dali
+
+#endif // DALI_CANVAS_RENDERER_GRADIENT_H
diff --git a/dali/devel-api/adaptor-framework/canvas-renderer-linear-gradient.cpp b/dali/devel-api/adaptor-framework/canvas-renderer-linear-gradient.cpp
new file mode 100644 (file)
index 0000000..546a52f
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali/devel-api/adaptor-framework/canvas-renderer-linear-gradient.h>
+
+// INTERNAL INCLUDES
+#include <dali/internal/canvas-renderer/common/linear-gradient-factory.h>
+#include <dali/internal/canvas-renderer/common/linear-gradient-impl.h>
+
+namespace Dali
+{
+CanvasRenderer::LinearGradient CanvasRenderer::LinearGradient::New()
+{
+  return LinearGradient(Internal::Adaptor::LinearGradientFactory::New());
+}
+
+CanvasRenderer::LinearGradient::LinearGradient()
+{
+}
+
+CanvasRenderer::LinearGradient::~LinearGradient()
+{
+}
+
+CanvasRenderer::LinearGradient::LinearGradient(Internal::Adaptor::LinearGradient* impl)
+: CanvasRenderer::Gradient(impl)
+{
+}
+
+bool CanvasRenderer::LinearGradient::SetBounds(Vector2 firstPoint, Vector2 secondPoint)
+{
+  return GetImplementation(*this).SetBounds(firstPoint, secondPoint);
+}
+
+bool CanvasRenderer::LinearGradient::GetBounds(Vector2& firstPoint, Vector2& secondPoint) const
+{
+  return GetImplementation(*this).GetBounds(firstPoint, secondPoint);
+}
+
+} // namespace Dali
diff --git a/dali/devel-api/adaptor-framework/canvas-renderer-linear-gradient.h b/dali/devel-api/adaptor-framework/canvas-renderer-linear-gradient.h
new file mode 100644 (file)
index 0000000..d633f14
--- /dev/null
@@ -0,0 +1,115 @@
+#ifndef DALI_CANVAS_RENDERER_LINEAR_GRADIENT_H
+#define DALI_CANVAS_RENDERER_LINEAR_GRADIENT_H
+
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#include <dali/public-api/object/base-handle.h>
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer-gradient.h>
+#include <dali/devel-api/adaptor-framework/canvas-renderer.h>
+#include <dali/public-api/dali-adaptor-common.h>
+
+namespace Dali
+{
+/**
+ * @addtogroup dali_adaptor_framework
+ * @{
+ */
+
+namespace Internal DALI_INTERNAL
+{
+namespace Adaptor
+{
+class CanvasRenderer;
+class LinearGradient;
+} // namespace Adaptor
+} // namespace DALI_INTERNAL
+
+/**
+ * @brief A class representing the linear gradient fill of the Shape object.
+ *
+ * Besides the class inherited from the Gradient class, it enables setting and getting the linear gradient bounds.
+ * The behavior outside the gradient bounds depends on the value specified in the spread API.
+ */
+class DALI_ADAPTOR_API CanvasRenderer::LinearGradient : public CanvasRenderer::Gradient
+{
+public:
+  /**
+   * @brief Creates an initialized handle to a new CanvasRenderer::LinearGradient.
+   * @return A handle to a newly allocated LinearGradient
+   */
+  static LinearGradient New();
+
+public:
+  /**
+   * @brief Creates an empty handle. Use CanvasRenderer::LinearGradient::New() to create an initialized object.
+   */
+  LinearGradient();
+
+  /**
+   * @brief Destructor.
+   */
+  ~LinearGradient();
+
+  /**
+   * @brief This copy constructor is required for (smart) pointer semantics.
+   *
+   * @param[in] handle A reference to the copied handle
+   */
+  LinearGradient(const LinearGradient& handle) = default;
+
+public:
+  /**
+   * @brief Sets the linear gradient bounds.
+   * The bounds of the linear gradient are defined as a surface constrained by two parallel lines crossing
+   * the given points (@p x1, @p y1) and (@p x2, @p y2), respectively. Both lines are perpendicular to the line linking
+   * (@p x1, @p y1) and (@p x2, @p y2).
+   * @param[in] firstPoint The first point used to determine the gradient bounds.
+   * @param[in] secondPoint The second point used to determine the gradient bounds.
+   * @return Returns True when it's successful. False otherwise.
+   */
+  bool SetBounds(Vector2 firstPoint, Vector2 secondPoint);
+
+  /**
+   * @brief Gets the linear gradient bounds.
+   * @param[out] firstPoint The first point used to determine the gradient bounds.
+   * @param[out] secondPoint The second point used to determine the gradient bounds.
+   * @return Returns True when it's successful. False otherwise.
+   */
+  bool GetBounds(Vector2& firstPoint, Vector2& secondPoint) const;
+
+public: // Not intended for application developers
+  /// @cond internal
+  /**
+   * @brief The constructor.
+   * @note  Not intended for application developers.
+   *
+   * @param[in] pointer A pointer to a newly allocated CanvasRenderer::LinearGradient
+   */
+  explicit DALI_INTERNAL LinearGradient(Internal::Adaptor::LinearGradient* impl);
+  /// @endcond
+};
+
+/**
+ * @}
+ */
+} // namespace Dali
+
+#endif // DALI_CANVAS_RENDERER_LINEAR_GRADIENT_H
diff --git a/dali/devel-api/adaptor-framework/canvas-renderer-radial-gradient.cpp b/dali/devel-api/adaptor-framework/canvas-renderer-radial-gradient.cpp
new file mode 100644 (file)
index 0000000..35f1b77
--- /dev/null
@@ -0,0 +1,55 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali/devel-api/adaptor-framework/canvas-renderer-radial-gradient.h>
+
+// INTERNAL INCLUDES
+#include <dali/internal/canvas-renderer/common/radial-gradient-factory.h>
+#include <dali/internal/canvas-renderer/common/radial-gradient-impl.h>
+
+namespace Dali
+{
+CanvasRenderer::RadialGradient CanvasRenderer::RadialGradient::New()
+{
+  return RadialGradient(Internal::Adaptor::RadialGradientFactory::New());
+}
+
+CanvasRenderer::RadialGradient::RadialGradient()
+{
+}
+
+CanvasRenderer::RadialGradient::~RadialGradient()
+{
+}
+
+CanvasRenderer::RadialGradient::RadialGradient(Internal::Adaptor::RadialGradient* impl)
+: CanvasRenderer::Gradient(impl)
+{
+}
+
+bool CanvasRenderer::RadialGradient::SetBounds(Vector2 centerPoint, float radius)
+{
+  return GetImplementation(*this).SetBounds(centerPoint, radius);
+}
+
+bool CanvasRenderer::RadialGradient::GetBounds(Vector2& centerPoint, float& radius) const
+{
+  return GetImplementation(*this).GetBounds(centerPoint, radius);
+}
+
+} // namespace Dali
diff --git a/dali/devel-api/adaptor-framework/canvas-renderer-radial-gradient.h b/dali/devel-api/adaptor-framework/canvas-renderer-radial-gradient.h
new file mode 100644 (file)
index 0000000..da87b26
--- /dev/null
@@ -0,0 +1,110 @@
+#ifndef DALI_CANVAS_RENDERER_RADIAL_GRADIENT_H
+#define DALI_CANVAS_RENDERER_RADIAL_GRADIENT_H
+
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#include <dali/public-api/object/base-handle.h>
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer-gradient.h>
+#include <dali/devel-api/adaptor-framework/canvas-renderer.h>
+#include <dali/public-api/dali-adaptor-common.h>
+
+namespace Dali
+{
+/**
+ * @addtogroup dali_adaptor_framework
+ * @{
+ */
+
+namespace Internal DALI_INTERNAL
+{
+namespace Adaptor
+{
+class CanvasRenderer;
+class RadialGradient;
+} // namespace Adaptor
+} // namespace DALI_INTERNAL
+
+/**
+ * @brief A class representing the radial gradient fill of the Shape object.
+ */
+class DALI_ADAPTOR_API CanvasRenderer::RadialGradient : public CanvasRenderer::Gradient
+{
+public:
+  /**
+   * @brief Creates an initialized handle to a new CanvasRenderer::RadialGradient.
+   * @return A handle to a newly allocated RadialGradient
+   */
+  static RadialGradient New();
+
+public:
+  /**
+   * @brief Creates an empty handle. Use CanvasRenderer::RadialGradient::New() to create an initialized object.
+   */
+  RadialGradient();
+
+  /**
+   * @brief Destructor.
+   */
+  ~RadialGradient();
+
+  /**
+   * @brief This copy constructor is required for (smart) pointer semantics.
+   *
+   * @param[in] handle A reference to the copied handle
+   */
+  RadialGradient(const RadialGradient& handle) = default;
+
+public:
+  /**
+   * @brief Sets the radial gradient bounds.
+   * The radial gradient bounds are defined as a circle centered in a given point of a given radius.
+   * @param[in] centerPoint The point of the center of the bounding circle.
+   * @param[in] radius The radius of the bounding circle.
+   * @return Returns True when it's successful. False otherwise.
+   */
+  bool SetBounds(Vector2 centerPoint, float radius);
+
+  /**
+   * @brief Gets the radial gradient bounds.
+   * @param[out] centerPoint The point used to determine the gradient bounds.
+   * @param[out] radius The radius of the bounding circle.
+   * @return Returns True when it's successful. False otherwise.
+   */
+  bool GetBounds(Vector2& centerPoint, float& radius) const;
+
+public: // Not intended for application developers
+  /// @cond internal
+  /**
+   * @brief The constructor.
+   * @note  Not intended for application developers.
+   *
+   * @param[in] pointer A pointer to a newly allocated CanvasRenderer::RadialGradient
+   */
+  explicit DALI_INTERNAL RadialGradient(Internal::Adaptor::RadialGradient* impl);
+  /// @endcond
+};
+
+/**
+ * @}
+ */
+} // namespace Dali
+
+#endif // DALI_CANVAS_RENDERER_RADIAL_GRADIENT_H
index 56fc4ce..20ab50a 100644 (file)
@@ -93,6 +93,16 @@ Vector4 CanvasRenderer::Shape::GetFillColor() const
   return GetImplementation(*this).GetFillColor();
 }
 
+bool CanvasRenderer::Shape::SetFillGradient(CanvasRenderer::Gradient& gradient)
+{
+  return GetImplementation(*this).SetFillGradient(gradient);
+}
+
+CanvasRenderer::Gradient CanvasRenderer::Shape::GetFillGradient() const
+{
+  return GetImplementation(*this).GetFillGradient();
+}
+
 bool CanvasRenderer::Shape::SetFillRule(CanvasRenderer::Shape::FillRule rule)
 {
   return GetImplementation(*this).SetFillRule(rule);
@@ -123,6 +133,16 @@ Vector4 CanvasRenderer::Shape::GetStrokeColor() const
   return GetImplementation(*this).GetStrokeColor();
 }
 
+bool CanvasRenderer::Shape::SetStrokeGradient(CanvasRenderer::Gradient& gradient)
+{
+  return GetImplementation(*this).SetStrokeGradient(gradient);
+}
+
+CanvasRenderer::Gradient CanvasRenderer::Shape::GetStrokeGradient() const
+{
+  return GetImplementation(*this).GetStrokeGradient();
+}
+
 bool CanvasRenderer::Shape::SetStrokeDash(const Dali::Vector<float>& dashPattern)
 {
   return GetImplementation(*this).SetStrokeDash(dashPattern);
index 91ca295..892abb5 100644 (file)
@@ -200,6 +200,19 @@ public:
   Vector4 GetFillColor() const;
 
   /**
+   * @brief Set the gradient to use for filling the path.
+   * @param[in] gradient The gradient object.
+   * @return Returns True when it's successful. False otherwise.
+   */
+  bool SetFillGradient(CanvasRenderer::Gradient& gradient);
+
+  /**
+   * @brief Get the gradient to use for filling the path.
+   * @return Returns The gradient object.
+   */
+  CanvasRenderer::Gradient GetFillGradient() const;
+
+  /**
    * @brief Set the fill rule.
    * @param[in] rule The current fill rule of the shape.
    * @return Returns True when it's successful. False otherwise.
@@ -239,6 +252,19 @@ public:
   Vector4 GetStrokeColor() const;
 
   /**
+   * @brief Set the gradient to use for stroking the path.
+   * @param[in] gradient The gradient object.
+   * @return Returns True when it's successful. False otherwise.
+   */
+  bool SetStrokeGradient(CanvasRenderer::Gradient& gradient);
+
+  /**
+   * @brief Get the gradient to use for stroking the path.
+   * @return Returns The gradient object.
+   */
+  CanvasRenderer::Gradient GetStrokeGradient() const;
+
+  /**
    * @brief Sets the stroke dash pattern. The dash pattern is specified dash pattern.
    * @param[in] dashPattern Lenght and a gap list.
    * @return Returns True when it's successful. False otherwise.
index 8896223..b68208e 100644 (file)
@@ -86,6 +86,10 @@ public:
   class Shape;
   class DrawableGroup;
 
+  class Gradient;
+  class LinearGradient;
+  class RadialGradient;
+
 public:
   /**
    * @brief Prepare for drawing drawables added to CanvasRenderer on inner canvas.
index f1afaa7..5c2de65 100755 (executable)
@@ -8,8 +8,11 @@ SET( devel_api_src_files
   ${adaptor_devel_api_dir}/adaptor-framework/bitmap-saver.cpp
   ${adaptor_devel_api_dir}/adaptor-framework/canvas-renderer.cpp
   ${adaptor_devel_api_dir}/adaptor-framework/canvas-renderer-drawable.cpp
-  ${adaptor_devel_api_dir}/adaptor-framework/canvas-renderer-shape.cpp
   ${adaptor_devel_api_dir}/adaptor-framework/canvas-renderer-drawable-group.cpp
+  ${adaptor_devel_api_dir}/adaptor-framework/canvas-renderer-shape.cpp
+  ${adaptor_devel_api_dir}/adaptor-framework/canvas-renderer-gradient.cpp
+  ${adaptor_devel_api_dir}/adaptor-framework/canvas-renderer-linear-gradient.cpp
+  ${adaptor_devel_api_dir}/adaptor-framework/canvas-renderer-radial-gradient.cpp
   ${adaptor_devel_api_dir}/adaptor-framework/capture-devel.cpp
   ${adaptor_devel_api_dir}/adaptor-framework/clipboard.cpp
   ${adaptor_devel_api_dir}/adaptor-framework/clipboard-event-notifier.cpp
@@ -59,6 +62,9 @@ SET( devel_api_adaptor_framework_header_files
   ${adaptor_devel_api_dir}/adaptor-framework/canvas-renderer-drawable.h
   ${adaptor_devel_api_dir}/adaptor-framework/canvas-renderer-shape.h
   ${adaptor_devel_api_dir}/adaptor-framework/canvas-renderer-drawable-group.h
+  ${adaptor_devel_api_dir}/adaptor-framework/canvas-renderer-gradient.h
+  ${adaptor_devel_api_dir}/adaptor-framework/canvas-renderer-linear-gradient.h
+  ${adaptor_devel_api_dir}/adaptor-framework/canvas-renderer-radial-gradient.h
   ${adaptor_devel_api_dir}/adaptor-framework/capture-devel.h
   ${adaptor_devel_api_dir}/adaptor-framework/clipboard-event-notifier.h
   ${adaptor_devel_api_dir}/adaptor-framework/clipboard.h
diff --git a/dali/internal/canvas-renderer/common/gradient-factory.h b/dali/internal/canvas-renderer/common/gradient-factory.h
new file mode 100644 (file)
index 0000000..3fa7b9f
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef DALI_INTERNAL_GRADIENT_FACTORY_H
+#define DALI_INTERNAL_GRADIENT_FACTORY_H
+
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer-gradient.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace GradientFactory
+{
+/**
+ * @brief Creates new instance of Gradient implementation
+ * @return pointer to Gradient implementation instance
+ */
+Dali::Internal::Adaptor::Gradient* New();
+
+} // namespace GradientFactory
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
+
+#endif // DALI_INTERNAL_GRADIENT_FACTORY_H
diff --git a/dali/internal/canvas-renderer/common/gradient-impl.cpp b/dali/internal/canvas-renderer/common/gradient-impl.cpp
new file mode 100644 (file)
index 0000000..160ba4a
--- /dev/null
@@ -0,0 +1,127 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali/internal/canvas-renderer/common/gradient-factory.h>
+#include <dali/internal/canvas-renderer/common/gradient-impl.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+Gradient::Gradient() = default;
+
+Gradient::~Gradient()
+{
+  if(mImpl)
+  {
+    delete mImpl;
+  }
+}
+
+void Gradient::Create()
+{
+  if(!mImpl)
+  {
+    mImpl = Internal::Adaptor::GradientFactory::New();
+  }
+}
+
+bool Gradient::SetColorStops(Dali::CanvasRenderer::Gradient::ColorStops& colorStops)
+{
+  if(!mImpl)
+  {
+    return false;
+  }
+  return mImpl->SetColorStops(colorStops);
+}
+
+Dali::CanvasRenderer::Gradient::ColorStops Gradient::GetColorStops() const
+{
+  if(!mImpl)
+  {
+    return Dali::CanvasRenderer::Gradient::ColorStops();
+  }
+  return mImpl->GetColorStops();
+}
+
+bool Gradient::SetSpread(Dali::CanvasRenderer::Gradient::Spread spread)
+{
+  if(!mImpl)
+  {
+    return false;
+  }
+  return mImpl->SetSpread(spread);
+}
+
+Dali::CanvasRenderer::Gradient::Spread Gradient::GetSpread() const
+{
+  if(!mImpl)
+  {
+    return Dali::CanvasRenderer::Gradient::Spread::PAD;
+  }
+  return mImpl->GetSpread();
+}
+
+void* Gradient::GetObject() const
+{
+  if(!mImpl)
+  {
+    return nullptr;
+  }
+  return mImpl->GetObject();
+}
+
+void Gradient::SetObject(const void* object)
+{
+  if(!mImpl)
+  {
+    return;
+  }
+  mImpl->SetObject(object);
+}
+
+void Gradient::SetChanged(bool changed)
+{
+  if(!mImpl)
+  {
+    return;
+  }
+  mImpl->SetChanged(changed);
+}
+
+bool Gradient::GetChanged() const
+{
+  if(!mImpl)
+  {
+    return false;
+  }
+  return mImpl->GetChanged();
+}
+
+Dali::Internal::Adaptor::Gradient* Gradient::GetImplementation()
+{
+  return mImpl;
+}
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/common/gradient-impl.h b/dali/internal/canvas-renderer/common/gradient-impl.h
new file mode 100644 (file)
index 0000000..b422114
--- /dev/null
@@ -0,0 +1,138 @@
+#ifndef DALI_INTERNAL_GRADIENT_IMPL_H
+#define DALI_INTERNAL_GRADIENT_IMPL_H
+
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#include <dali/public-api/object/base-object.h>
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer-gradient.h>
+#include <dali/devel-api/adaptor-framework/canvas-renderer.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+/**
+ * Dali internal Gradient.
+ */
+class Gradient : public Dali::BaseObject
+{
+public:
+  /**
+   * @brief Constructor
+   */
+  Gradient();
+
+  /**
+   * @brief Destructor.
+   */
+  virtual ~Gradient() override;
+
+  /**
+   * @brief Create factory item(implementation) object.
+   */
+  void Create();
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Gradient::SetColorStops()
+   */
+  virtual bool SetColorStops(Dali::CanvasRenderer::Gradient::ColorStops& colorStops);
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Gradient::GetColorStops()
+   */
+  virtual Dali::CanvasRenderer::Gradient::ColorStops GetColorStops() const;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Gradient::SetSpread()
+   */
+  virtual bool SetSpread(Dali::CanvasRenderer::Gradient::Spread spread);
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Gradient::GetSpread()
+   */
+  virtual Dali::CanvasRenderer::Gradient::Spread GetSpread() const;
+
+  /**
+   * @brief Set a gradient object
+   * @param[in] object gradient object
+   */
+  virtual void SetObject(const void* object);
+
+  /**
+   * @brief Returns a gradient object pointer.
+   * @return Returns a gradient object pointer.
+   */
+  virtual void* GetObject() const;
+
+  /**
+   * @brief Set a changed state.
+   * @param[in] changed The state of changed.
+   */
+  virtual void SetChanged(bool changed);
+
+  /**
+   * @brief Get a changed state.
+   * @return Returns state of changed.
+   */
+  virtual bool GetChanged() const;
+
+  /**
+   * @brief Returns a gradient's implements object pointer.
+   * @return Returns a gradient's implements object pointer.
+   */
+  Dali::Internal::Adaptor::Gradient* GetImplementation();
+
+  Gradient(const Gradient&) = delete;
+  Gradient& operator=(Gradient&) = delete;
+  Gradient(Gradient&&)           = delete;
+  Gradient& operator=(Gradient&&) = delete;
+
+private:
+  Dali::Internal::Adaptor::Gradient* mImpl = nullptr;
+};
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+inline static Internal::Adaptor::Gradient& GetImplementation(Dali::CanvasRenderer::Gradient& gradient)
+{
+  DALI_ASSERT_ALWAYS(gradient && "Gradient handle is empty.");
+
+  BaseObject& handle = gradient.GetBaseObject();
+
+  return static_cast<Internal::Adaptor::Gradient&>(handle);
+}
+
+inline static const Internal::Adaptor::Gradient& GetImplementation(const Dali::CanvasRenderer::Gradient& gradient)
+{
+  DALI_ASSERT_ALWAYS(gradient && "Gradient handle is empty.");
+
+  const BaseObject& handle = gradient.GetBaseObject();
+
+  return static_cast<const Internal::Adaptor::Gradient&>(handle);
+}
+
+} // namespace Dali
+
+#endif // DALI_INTERNAL_GRADIENT_IMPL_H
diff --git a/dali/internal/canvas-renderer/common/linear-gradient-factory.h b/dali/internal/canvas-renderer/common/linear-gradient-factory.h
new file mode 100644 (file)
index 0000000..93e6c4d
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef DALI_INTERNAL_LINEAR_GRADIENT_FACTORY_H
+#define DALI_INTERNAL_LINEAR_GRADIENT_FACTORY_H
+
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer-linear-gradient.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace LinearGradientFactory
+{
+/**
+ * @brief Creates new instance of LinearGradient implementation
+ * @return pointer to LinearGradient implementation instance
+ */
+Dali::Internal::Adaptor::LinearGradient* New();
+
+} // namespace LinearGradientFactory
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
+
+#endif // DALI_INTERNAL_LINEAR_GRADIENT_FACTORY_H
diff --git a/dali/internal/canvas-renderer/common/linear-gradient-impl.cpp b/dali/internal/canvas-renderer/common/linear-gradient-impl.cpp
new file mode 100644 (file)
index 0000000..dbb5f5e
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali/internal/canvas-renderer/common/linear-gradient-impl.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+LinearGradient::LinearGradient() = default;
+
+LinearGradient::~LinearGradient() = default;
+
+bool LinearGradient::SetBounds(Vector2 firstPoint, Vector2 SecondPoint)
+{
+  return false;
+}
+
+bool LinearGradient::GetBounds(Vector2& firstPoint, Vector2& SecondPoint) const
+{
+  return false;
+}
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/common/linear-gradient-impl.h b/dali/internal/canvas-renderer/common/linear-gradient-impl.h
new file mode 100644 (file)
index 0000000..b91a538
--- /dev/null
@@ -0,0 +1,90 @@
+#ifndef DALI_INTERNAL_LINEAR_GRADIENT_IMPL_H
+#define DALI_INTERNAL_LINEAR_GRADIENT_IMPL_H
+
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#include <dali/public-api/object/base-object.h>
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer-linear-gradient.h>
+#include <dali/internal/canvas-renderer/common/gradient-impl.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+/**
+ * Dali internal LinearGradient.
+ */
+class LinearGradient : public Internal::Adaptor::Gradient
+{
+public:
+  /**
+   * @brief Constructor
+   */
+  LinearGradient();
+
+  /**
+   * @brief Destructor.
+   */
+  ~LinearGradient() override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::LinearGradient::SetBounds()
+   */
+  virtual bool SetBounds(Vector2 firstPoint, Vector2 SecondPoint);
+
+  /**
+   * @copydoc Dali::CanvasRenderer::LinearGradient::SetBounds()
+   */
+  virtual bool GetBounds(Vector2& firstPoint, Vector2& SecondPoint) const;
+
+  LinearGradient(const LinearGradient&) = delete;
+  LinearGradient& operator=(LinearGradient&) = delete;
+  LinearGradient(LinearGradient&&)           = delete;
+  LinearGradient& operator=(LinearGradient&&) = delete;
+};
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+inline static Internal::Adaptor::LinearGradient& GetImplementation(Dali::CanvasRenderer::LinearGradient& linearGradient)
+{
+  DALI_ASSERT_ALWAYS(linearGradient && "LinearGradient handle is empty.");
+
+  BaseObject& handle = linearGradient.GetBaseObject();
+
+  return static_cast<Internal::Adaptor::LinearGradient&>(handle);
+}
+
+inline static const Internal::Adaptor::LinearGradient& GetImplementation(const Dali::CanvasRenderer::LinearGradient& linearGradient)
+{
+  DALI_ASSERT_ALWAYS(linearGradient && "LinearGradient handle is empty.");
+
+  const BaseObject& handle = linearGradient.GetBaseObject();
+
+  return static_cast<const Internal::Adaptor::LinearGradient&>(handle);
+}
+
+} // namespace Dali
+
+#endif // DALI_INTERNAL_LINEAR_GRADIENT_IMPL_H
diff --git a/dali/internal/canvas-renderer/common/radial-gradient-factory.h b/dali/internal/canvas-renderer/common/radial-gradient-factory.h
new file mode 100644 (file)
index 0000000..7d49ddb
--- /dev/null
@@ -0,0 +1,46 @@
+#ifndef DALI_INTERNAL_RADIAL_GRADIENT_FACTORY_H
+#define DALI_INTERNAL_RADIAL_GRADIENT_FACTORY_H
+
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer-radial-gradient.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace RadialGradientFactory
+{
+/**
+ * @brief Creates new instance of RadialGradient implementation
+ * @return pointer to RadialGradient implementation instance
+ */
+Dali::Internal::Adaptor::RadialGradient* New();
+
+} // namespace RadialGradientFactory
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
+
+#endif // DALI_INTERNAL_RADIAL_GRADIENT_FACTORY_H
diff --git a/dali/internal/canvas-renderer/common/radial-gradient-impl.cpp b/dali/internal/canvas-renderer/common/radial-gradient-impl.cpp
new file mode 100644 (file)
index 0000000..bb75a9b
--- /dev/null
@@ -0,0 +1,45 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali/internal/canvas-renderer/common/radial-gradient-impl.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+RadialGradient::RadialGradient() = default;
+
+RadialGradient::~RadialGradient() = default;
+
+bool RadialGradient::SetBounds(const Vector2 centerPoint, float radius)
+{
+  return false;
+}
+
+bool RadialGradient::GetBounds(Vector2& centerPoint, float& radius) const
+{
+  return false;
+}
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/common/radial-gradient-impl.h b/dali/internal/canvas-renderer/common/radial-gradient-impl.h
new file mode 100644 (file)
index 0000000..19176b7
--- /dev/null
@@ -0,0 +1,90 @@
+#ifndef DALI_INTERNAL_RADIAL_GRADIENT_IMPL_H
+#define DALI_INTERNAL_RADIAL_GRADIENT_IMPL_H
+
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#include <dali/public-api/object/base-object.h>
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer-radial-gradient.h>
+#include <dali/internal/canvas-renderer/common/gradient-impl.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+/**
+ * Dali internal RadialGradient.
+ */
+class RadialGradient : public Internal::Adaptor::Gradient
+{
+public:
+  /**
+   * @brief Constructor
+   */
+  RadialGradient();
+
+  /**
+   * @brief Destructor.
+   */
+  ~RadialGradient() override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::RadialGradient::SetBounds()
+   */
+  virtual bool SetBounds(Vector2 centerPoint, float radius);
+
+  /**
+   * @copydoc Dali::CanvasRenderer::RadialGradient::SetBounds()
+   */
+  virtual bool GetBounds(Vector2& centerPoint, float& radius) const;
+
+  RadialGradient(const RadialGradient&) = delete;
+  RadialGradient& operator=(RadialGradient&) = delete;
+  RadialGradient(RadialGradient&&)           = delete;
+  RadialGradient& operator=(RadialGradient&&) = delete;
+};
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+inline static Internal::Adaptor::RadialGradient& GetImplementation(Dali::CanvasRenderer::RadialGradient& radialGradient)
+{
+  DALI_ASSERT_ALWAYS(radialGradient && "RadialGradient handle is empty.");
+
+  BaseObject& handle = radialGradient.GetBaseObject();
+
+  return static_cast<Internal::Adaptor::RadialGradient&>(handle);
+}
+
+inline static const Internal::Adaptor::RadialGradient& GetImplementation(const Dali::CanvasRenderer::RadialGradient& radialGradient)
+{
+  DALI_ASSERT_ALWAYS(radialGradient && "RadialGradient handle is empty.");
+
+  const BaseObject& handle = radialGradient.GetBaseObject();
+
+  return static_cast<const Internal::Adaptor::RadialGradient&>(handle);
+}
+
+} // namespace Dali
+
+#endif // DALI_INTERNAL_RADIAL_GRADIENT_IMPL_H
index b71e7a6..dd3bcae 100644 (file)
@@ -78,6 +78,16 @@ Vector4 Shape::GetFillColor() const
   return Vector4(0, 0, 0, 0);
 }
 
+bool Shape::SetFillGradient(Dali::CanvasRenderer::Gradient& gradient)
+{
+  return false;
+}
+
+Dali::CanvasRenderer::Gradient Shape::GetFillGradient() const
+{
+  return Dali::CanvasRenderer::Gradient();
+}
+
 bool Shape::SetFillRule(Dali::CanvasRenderer::Shape::FillRule rule)
 {
   return false;
@@ -108,6 +118,16 @@ Vector4 Shape::GetStrokeColor() const
   return Vector4(0, 0, 0, 0);
 }
 
+bool Shape::SetStrokeGradient(Dali::CanvasRenderer::Gradient& gradient)
+{
+  return false;
+}
+
+Dali::CanvasRenderer::Gradient Shape::GetStrokeGradient() const
+{
+  return Dali::CanvasRenderer::Gradient();
+}
+
 bool Shape::SetStrokeDash(const Dali::Vector<float> dashPattern)
 {
   return false;
index c230a6f..f4a0628 100644 (file)
@@ -23,6 +23,7 @@
 #include <dali/public-api/signals/connection-tracker.h>
 
 // INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer-gradient.h>
 #include <dali/devel-api/adaptor-framework/canvas-renderer-shape.h>
 #include <dali/internal/canvas-renderer/common/drawable-impl.h>
 
@@ -99,6 +100,16 @@ public:
   virtual Vector4 GetFillColor() const;
 
   /**
+   * @copydoc Dali::CanvasRenderer::Shape::SetFillGradient()
+   */
+  virtual bool SetFillGradient(Dali::CanvasRenderer::Gradient& gradient);
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Shape::GetFillGradient()
+   */
+  virtual Dali::CanvasRenderer::Gradient GetFillGradient() const;
+
+  /**
    * @copydoc Dali::CanvasRenderer::Shape::SetFillRule()
    */
   virtual bool SetFillRule(Dali::CanvasRenderer::Shape::FillRule rule);
@@ -129,6 +140,16 @@ public:
   virtual Vector4 GetStrokeColor() const;
 
   /**
+   * @copydoc Dali::CanvasRenderer::Shape::SetStrokeGradient()
+   */
+  virtual bool SetStrokeGradient(Dali::CanvasRenderer::Gradient& gradient);
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Shape::GetStrokeGradient()
+   */
+  virtual Dali::CanvasRenderer::Gradient GetStrokeGradient() const;
+
+  /**
    * @copydoc Dali::CanvasRenderer::Shape::SetStrokeDash()
    */
   virtual bool SetStrokeDash(const Dali::Vector<float> dashPattern);
index 4dafd14..a941e5d 100644 (file)
@@ -16,6 +16,18 @@ SET( adaptor_canvas_renderer_generic_src_files
     ${adaptor_canvas_renderer_dir}/common/drawable-group-impl.cpp
     ${adaptor_canvas_renderer_dir}/generic/drawable-group-factory-generic.cpp
     ${adaptor_canvas_renderer_dir}/generic/drawable-group-impl-generic.cpp
+
+    ${adaptor_canvas_renderer_dir}/common/gradient-impl.cpp
+    ${adaptor_canvas_renderer_dir}/generic/gradient-factory-generic.cpp
+    ${adaptor_canvas_renderer_dir}/generic/gradient-impl-generic.cpp
+
+    ${adaptor_canvas_renderer_dir}/common/linear-gradient-impl.cpp
+    ${adaptor_canvas_renderer_dir}/generic/linear-gradient-factory-generic.cpp
+    ${adaptor_canvas_renderer_dir}/generic/linear-gradient-impl-generic.cpp
+
+    ${adaptor_canvas_renderer_dir}/common/radial-gradient-impl.cpp
+    ${adaptor_canvas_renderer_dir}/generic/radial-gradient-factory-generic.cpp
+    ${adaptor_canvas_renderer_dir}/generic/radial-gradient-impl-generic.cpp
 )
 
 # module: canvas-renderer, backend: ubuntu
@@ -35,6 +47,18 @@ SET( adaptor_canvas_renderer_ubuntu_src_files
     ${adaptor_canvas_renderer_dir}/common/drawable-group-impl.cpp
     ${adaptor_canvas_renderer_dir}/ubuntu/drawable-group-factory-ubuntu.cpp
     ${adaptor_canvas_renderer_dir}/ubuntu/drawable-group-impl-ubuntu.cpp
+
+    ${adaptor_canvas_renderer_dir}/common/gradient-impl.cpp
+    ${adaptor_canvas_renderer_dir}/ubuntu/gradient-factory-ubuntu.cpp
+    ${adaptor_canvas_renderer_dir}/ubuntu/gradient-impl-ubuntu.cpp
+
+    ${adaptor_canvas_renderer_dir}/common/linear-gradient-impl.cpp
+    ${adaptor_canvas_renderer_dir}/ubuntu/linear-gradient-factory-ubuntu.cpp
+    ${adaptor_canvas_renderer_dir}/ubuntu/linear-gradient-impl-ubuntu.cpp
+
+    ${adaptor_canvas_renderer_dir}/common/radial-gradient-impl.cpp
+    ${adaptor_canvas_renderer_dir}/ubuntu/radial-gradient-factory-ubuntu.cpp
+    ${adaptor_canvas_renderer_dir}/ubuntu/radial-gradient-impl-ubuntu.cpp
 )
 
 # module: canvas-renderer, backend: tizen (generic, ivi, mobile, tizen-post, tv, wearable)
@@ -54,4 +78,17 @@ SET( adaptor_canvas_renderer_tizen_src_files
     ${adaptor_canvas_renderer_dir}/common/drawable-group-impl.cpp
     ${adaptor_canvas_renderer_dir}/tizen/drawable-group-factory-tizen.cpp
     ${adaptor_canvas_renderer_dir}/tizen/drawable-group-impl-tizen.cpp
+
+    ${adaptor_canvas_renderer_dir}/common/gradient-impl.cpp
+    ${adaptor_canvas_renderer_dir}/tizen/gradient-factory-tizen.cpp
+    ${adaptor_canvas_renderer_dir}/tizen/gradient-impl-tizen.cpp
+
+    ${adaptor_canvas_renderer_dir}/common/linear-gradient-impl.cpp
+    ${adaptor_canvas_renderer_dir}/tizen/linear-gradient-factory-tizen.cpp
+    ${adaptor_canvas_renderer_dir}/tizen/linear-gradient-impl-tizen.cpp
+
+    ${adaptor_canvas_renderer_dir}/common/radial-gradient-impl.cpp
+    ${adaptor_canvas_renderer_dir}/tizen/radial-gradient-factory-tizen.cpp
+    ${adaptor_canvas_renderer_dir}/tizen/radial-gradient-impl-tizen.cpp
+
 )
diff --git a/dali/internal/canvas-renderer/generic/gradient-factory-generic.cpp b/dali/internal/canvas-renderer/generic/gradient-factory-generic.cpp
new file mode 100644 (file)
index 0000000..a7a1780
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <dali/internal/canvas-renderer/generic/gradient-impl-generic.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace GradientFactory
+{
+Dali::Internal::Adaptor::Gradient* New()
+{
+  return Dali::Internal::Adaptor::GradientGeneric::New();
+}
+
+} // namespace GradientFactory
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/generic/gradient-impl-generic.cpp b/dali/internal/canvas-renderer/generic/gradient-impl-generic.cpp
new file mode 100644 (file)
index 0000000..4114a71
--- /dev/null
@@ -0,0 +1,98 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali/internal/canvas-renderer/generic/gradient-impl-generic.h>
+
+// EXTERNAL INCLUDES
+#include <dali/devel-api/common/stage.h>
+#include <dali/integration-api/debug.h>
+#include <dali/public-api/object/type-registry.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace // unnamed namespace
+{
+// Type Registration
+Dali::BaseHandle Create()
+{
+  return Dali::BaseHandle();
+}
+
+Dali::TypeRegistration type(typeid(Dali::CanvasRenderer::Gradient), typeid(Dali::BaseHandle), Create);
+
+} // unnamed namespace
+
+GradientGeneric* GradientGeneric::New()
+{
+  return new GradientGeneric();
+}
+
+GradientGeneric::GradientGeneric()
+{
+}
+
+GradientGeneric::~GradientGeneric()
+{
+}
+
+bool GradientGeneric::SetColorStops(Dali::CanvasRenderer::Gradient::ColorStops& colorStops)
+{
+  return false;
+}
+
+Dali::CanvasRenderer::Gradient::ColorStops GradientGeneric::GetColorStops() const
+{
+  return Dali::CanvasRenderer::Gradient::ColorStops();
+}
+
+bool GradientGeneric::SetSpread(Dali::CanvasRenderer::Gradient::Spread spread)
+{
+  return false;
+}
+
+Dali::CanvasRenderer::Gradient::Spread GradientGeneric::GetSpread() const
+{
+  return Dali::CanvasRenderer::Gradient::Spread::PAD;
+}
+
+void GradientGeneric::SetObject(const void* object)
+{
+}
+
+void* GradientGeneric::GetObject() const
+{
+  return nullptr;
+}
+
+void GradientGeneric::SetChanged(bool changed)
+{
+}
+
+bool GradientGeneric::GetChanged() const
+{
+  return false;
+}
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/generic/gradient-impl-generic.h b/dali/internal/canvas-renderer/generic/gradient-impl-generic.h
new file mode 100644 (file)
index 0000000..1f58daf
--- /dev/null
@@ -0,0 +1,111 @@
+#ifndef DALI_INTERNAL_GENERIC_GRADIENT_IMPL_GENERIC_H
+#define DALI_INTERNAL_GENERIC_GRADIENT_IMPL_GENERIC_H
+
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#include <dali/public-api/object/base-object.h>
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer-gradient.h>
+#include <dali/devel-api/adaptor-framework/canvas-renderer.h>
+#include <dali/internal/canvas-renderer/common/gradient-impl.h>
+#include <dali/internal/canvas-renderer/generic/canvas-renderer-impl-generic.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+/**
+ * Dali internal Gradient.
+ */
+class GradientGeneric : public Dali::Internal::Adaptor::Gradient
+{
+public:
+  /**
+   * @brief Creates a Gradient object.
+   * @return A pointer to a newly allocated Gradient
+   */
+  static GradientGeneric* New();
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Gradient::SetColorStops()
+   */
+  bool SetColorStops(Dali::CanvasRenderer::Gradient::ColorStops& colorStops) override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Gradient::GetColorStops()
+   */
+  Dali::CanvasRenderer::Gradient::ColorStops GetColorStops() const override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Gradient::SetSpread()
+   */
+  bool SetSpread(Dali::CanvasRenderer::Gradient::Spread spread) override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Gradient::GetSpread()
+   */
+  Dali::CanvasRenderer::Gradient::Spread GetSpread() const override;
+
+  /**
+   * @copydoc Internal::Adaptor::Gradient::GetObject()
+   */
+  void SetObject(const void* object) override;
+
+  /**
+   * @copydoc Internal::Adaptor::Gradient::SetObject()
+   */
+  void* GetObject() const override;
+
+  /**
+   * @copydoc Internal::Adaptor::Gradient::SetChanged()
+   */
+  void SetChanged(bool changed) override;
+
+  /**
+   * @copydoc Internal::Adaptor::Gradient::GetChanged()
+   */
+  bool GetChanged() const override;
+
+  GradientGeneric(const Gradient&) = delete;
+  GradientGeneric& operator=(Gradient&) = delete;
+  GradientGeneric(Gradient&&)           = delete;
+  GradientGeneric& operator=(Gradient&&) = delete;
+
+protected:
+  /**
+   * @brief Constructor
+   */
+  GradientGeneric();
+
+  /**
+   * @brief Destructor.
+   */
+  virtual ~GradientGeneric() override;
+};
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
+
+#endif // DALI_INTERNAL_GENERIC_GRADIENT_IMPL_GENERIC_H
diff --git a/dali/internal/canvas-renderer/generic/linear-gradient-factory-generic.cpp b/dali/internal/canvas-renderer/generic/linear-gradient-factory-generic.cpp
new file mode 100644 (file)
index 0000000..1f74ed6
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <dali/internal/canvas-renderer/generic/linear-gradient-impl-generic.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace LinearGradientFactory
+{
+Dali::Internal::Adaptor::LinearGradient* New()
+{
+  return Dali::Internal::Adaptor::LinearGradientGeneric::New();
+}
+
+} // namespace LinearGradientFactory
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/generic/linear-gradient-impl-generic.cpp b/dali/internal/canvas-renderer/generic/linear-gradient-impl-generic.cpp
new file mode 100644 (file)
index 0000000..0f9a7eb
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali/internal/canvas-renderer/generic/linear-gradient-impl-generic.h>
+
+// EXTERNAL INCLUDES
+#include <dali/integration-api/debug.h>
+#include <dali/public-api/object/type-registry.h>
+
+// INTERNAL INCLUDES
+#include <dali/internal/canvas-renderer/common/gradient-impl.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace // unnamed namespace
+{
+// Type Registration
+Dali::BaseHandle Create()
+{
+  return Dali::BaseHandle();
+}
+
+Dali::TypeRegistration type(typeid(Dali::CanvasRenderer::LinearGradient), typeid(Dali::BaseHandle), Create);
+
+} // unnamed namespace
+
+LinearGradientGeneric* LinearGradientGeneric::New()
+{
+  return new LinearGradientGeneric();
+}
+
+LinearGradientGeneric::LinearGradientGeneric()
+{
+}
+
+LinearGradientGeneric::~LinearGradientGeneric()
+{
+}
+
+bool LinearGradientGeneric::SetBounds(Vector2 firstPoint, Vector2 secondPoint)
+{
+  return false;
+}
+
+bool LinearGradientGeneric::GetBounds(Vector2& firstPoint, Vector2& secondPoint) const
+{
+  return false;
+}
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/generic/linear-gradient-impl-generic.h b/dali/internal/canvas-renderer/generic/linear-gradient-impl-generic.h
new file mode 100644 (file)
index 0000000..7cb48a8
--- /dev/null
@@ -0,0 +1,79 @@
+#ifndef DALI_INTERNAL_GENERIC_LINEAR_GRADIENT_IMPL_GENERIC_H
+#define DALI_INTERNAL_GENERIC_LINEAR_GRADIENT_IMPL_GENERIC_H
+
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#include <dali/public-api/object/base-object.h>
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer-linear-gradient.h>
+#include <dali/internal/canvas-renderer/common/linear-gradient-impl.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+/**
+ * Dali internal LinearGradient.
+ */
+class LinearGradientGeneric : public Dali::Internal::Adaptor::LinearGradient
+{
+public:
+  /**
+   * @brief Creates a LinearGradient object.
+   * @return A pointer to a newly allocated drawablegroup
+   */
+  static LinearGradientGeneric* New();
+
+  /**
+   * @copydoc Dali::CanvasRenderer::LinearGradient::SetBounds()
+   */
+  bool SetBounds(Vector2 firstPoint, Vector2 secondPoint) override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::LinearGradient::SetBounds()
+   */
+  bool GetBounds(Vector2& firstPoint, Vector2& secondPoint) const override;
+
+private:
+  LinearGradientGeneric(const LinearGradientGeneric&) = delete;
+  LinearGradientGeneric& operator=(LinearGradientGeneric&) = delete;
+  LinearGradientGeneric(LinearGradientGeneric&&)           = delete;
+  LinearGradientGeneric& operator=(LinearGradientGeneric&&) = delete;
+
+  /**
+   * @brief Constructor
+   */
+  LinearGradientGeneric();
+
+  /**
+   * @brief Destructor.
+   */
+  virtual ~LinearGradientGeneric() override;
+};
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
+
+#endif // DALI_INTERNAL_GENERIC_LINEAR_GRADIENT_IMPL_GENERIC_H
diff --git a/dali/internal/canvas-renderer/generic/radial-gradient-factory-generic.cpp b/dali/internal/canvas-renderer/generic/radial-gradient-factory-generic.cpp
new file mode 100644 (file)
index 0000000..1cc5fb6
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <dali/internal/canvas-renderer/generic/radial-gradient-impl-generic.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace RadialGradientFactory
+{
+Dali::Internal::Adaptor::RadialGradient* New()
+{
+  return Dali::Internal::Adaptor::RadialGradientGeneric::New();
+}
+
+} // namespace RadialGradientFactory
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/generic/radial-gradient-impl-generic.cpp b/dali/internal/canvas-renderer/generic/radial-gradient-impl-generic.cpp
new file mode 100644 (file)
index 0000000..e5dab10
--- /dev/null
@@ -0,0 +1,73 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali/internal/canvas-renderer/generic/radial-gradient-impl-generic.h>
+
+// EXTERNAL INCLUDES
+#include <dali/integration-api/debug.h>
+#include <dali/public-api/object/type-registry.h>
+
+// INTERNAL INCLUDES
+#include <dali/internal/canvas-renderer/common/gradient-impl.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace // unnamed namespace
+{
+// Type Registration
+Dali::BaseHandle Create()
+{
+  return Dali::BaseHandle();
+}
+
+Dali::TypeRegistration type(typeid(Dali::CanvasRenderer::RadialGradient), typeid(Dali::BaseHandle), Create);
+
+} // unnamed namespace
+
+RadialGradientGeneric* RadialGradientGeneric::New()
+{
+  return new RadialGradientGeneric();
+}
+
+RadialGradientGeneric::RadialGradientGeneric()
+{
+}
+
+RadialGradientGeneric::~RadialGradientGeneric()
+{
+}
+
+bool RadialGradientGeneric::SetBounds(Vector2 centerPoint, float radius)
+{
+  return false;
+}
+
+bool RadialGradientGeneric::GetBounds(Vector2& centerPoint, float& radius) const
+{
+  return false;
+}
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/generic/radial-gradient-impl-generic.h b/dali/internal/canvas-renderer/generic/radial-gradient-impl-generic.h
new file mode 100644 (file)
index 0000000..0d87c45
--- /dev/null
@@ -0,0 +1,79 @@
+#ifndef DALI_INTERNAL_GENERIC_RADIAL_GRADIENT_IMPL_GENERIC_H
+#define DALI_INTERNAL_GENERIC_RADIAL_GRADIENT_IMPL_GENERIC_H
+
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#include <dali/public-api/object/base-object.h>
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer-radial-gradient.h>
+#include <dali/internal/canvas-renderer/common/radial-gradient-impl.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+/**
+ * Dali internal RadialGradient.
+ */
+class RadialGradientGeneric : public Dali::Internal::Adaptor::RadialGradient
+{
+public:
+  /**
+   * @brief Creates a RadialGradient object.
+   * @return A pointer to a newly allocated drawablegroup
+   */
+  static RadialGradientGeneric* New();
+
+  /**
+   * @copydoc Dali::CanvasRenderer::RadialGradient::SetBounds()
+   */
+  bool SetBounds(Vector2 centerPoint, float radius) override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::RadialGradient::SetBounds()
+   */
+  bool GetBounds(Vector2& centerPoint, float& radius) const override;
+
+private:
+  RadialGradientGeneric(const RadialGradientGeneric&) = delete;
+  RadialGradientGeneric& operator=(RadialGradientGeneric&) = delete;
+  RadialGradientGeneric(RadialGradientGeneric&&)           = delete;
+  RadialGradientGeneric& operator=(RadialGradientGeneric&&) = delete;
+
+  /**
+   * @brief Constructor
+   */
+  RadialGradientGeneric();
+
+  /**
+   * @brief Destructor.
+   */
+  virtual ~RadialGradientGeneric() override;
+};
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
+
+#endif // DALI_INTERNAL_GENERIC_RADIAL_GRADIENT_IMPL_GENERIC_H
index 2739449..fc8a51a 100644 (file)
@@ -26,6 +26,8 @@
 #include <dali/devel-api/adaptor-framework/pixel-buffer.h>
 #include <dali/internal/canvas-renderer/common/drawable-group-impl.h>
 #include <dali/internal/canvas-renderer/common/drawable-impl.h>
+#include <dali/internal/canvas-renderer/common/gradient-impl.h>
+#include <dali/internal/canvas-renderer/common/shape-impl.h>
 #include <dali/internal/imaging/common/pixel-buffer-impl.h>
 
 namespace Dali
@@ -216,6 +218,29 @@ bool CanvasRendererTizen::HaveDrawablesChanged(const Dali::CanvasRenderer::Drawa
       }
     }
   }
+  else if(drawableImpl.GetType() == Drawable::Types::SHAPE)
+  {
+    const Dali::CanvasRenderer::Shape& shape        = static_cast<const Dali::CanvasRenderer::Shape&>(drawable);
+    Dali::CanvasRenderer::Gradient     fillGradient = shape.GetFillGradient();
+    if(DALI_UNLIKELY(fillGradient))
+    {
+      Internal::Adaptor::Gradient& fillGradientImpl = Dali::GetImplementation(fillGradient);
+      if(fillGradientImpl.GetChanged())
+      {
+        return true;
+      }
+    }
+
+    Dali::CanvasRenderer::Gradient strokeGradient = shape.GetStrokeGradient();
+    if(DALI_UNLIKELY(strokeGradient))
+    {
+      Internal::Adaptor::Gradient& strokeGradientImpl = Dali::GetImplementation(strokeGradient);
+      if(strokeGradientImpl.GetChanged())
+      {
+        return true;
+      }
+    }
+  }
 
   return false;
 }
@@ -242,6 +267,23 @@ void CanvasRendererTizen::UpdateDrawablesChanged(Dali::CanvasRenderer::Drawable&
       UpdateDrawablesChanged(it, changed);
     }
   }
+  else if(drawableImpl.GetType() == Drawable::Types::SHAPE)
+  {
+    Dali::CanvasRenderer::Shape&   shape        = static_cast<Dali::CanvasRenderer::Shape&>(drawable);
+    Dali::CanvasRenderer::Gradient fillGradient = shape.GetFillGradient();
+    if(DALI_UNLIKELY(fillGradient))
+    {
+      Internal::Adaptor::Gradient& fillGradientImpl = Dali::GetImplementation(fillGradient);
+      fillGradientImpl.SetChanged(changed);
+    }
+
+    Dali::CanvasRenderer::Gradient strokeGradient = shape.GetStrokeGradient();
+    if(DALI_UNLIKELY(strokeGradient))
+    {
+      Internal::Adaptor::Gradient& strokeGradientImpl = Dali::GetImplementation(strokeGradient);
+      strokeGradientImpl.SetChanged(changed);
+    }
+  }
 }
 #endif
 
@@ -402,6 +444,45 @@ void CanvasRendererTizen::PushDrawableToGroup(Dali::CanvasRenderer::Drawable& dr
       PushDrawableToGroup(it, static_cast<tvg::Scene*>(tvgDuplicatedObject));
     }
   }
+  else if(type == Drawable::Types::SHAPE)
+  {
+    //FillGradient
+    Dali::CanvasRenderer::Shape&   shape        = static_cast<Dali::CanvasRenderer::Shape&>(drawable);
+    Dali::CanvasRenderer::Gradient fillGradient = shape.GetFillGradient();
+    if(DALI_UNLIKELY(fillGradient))
+    {
+      Internal::Adaptor::Gradient& fillGradientImpl          = Dali::GetImplementation(fillGradient);
+      tvg::Fill*                   tvgDuplicatedFillGradient = static_cast<tvg::Fill*>(fillGradientImpl.GetObject())->duplicate();
+      if(!tvgDuplicatedFillGradient)
+      {
+        DALI_LOG_ERROR("Invalid gradient object [%p]\n", this);
+        return;
+      }
+      if(static_cast<tvg::Shape*>(tvgDuplicatedObject)->fill(std::unique_ptr<tvg::Fill>(tvgDuplicatedFillGradient)) != tvg::Result::Success)
+      {
+        DALI_LOG_ERROR("Tvg gradient set fail [%p]\n", this);
+        return;
+      }
+    }
+
+    //StrokeGradient
+    Dali::CanvasRenderer::Gradient strokeGradient = shape.GetStrokeGradient();
+    if(DALI_UNLIKELY(strokeGradient))
+    {
+      Internal::Adaptor::Gradient& strokeGradientImpl          = Dali::GetImplementation(strokeGradient);
+      tvg::Fill*                   tvgDuplicatedStrokeGradient = static_cast<tvg::Fill*>(strokeGradientImpl.GetObject())->duplicate();
+      if(!tvgDuplicatedStrokeGradient)
+      {
+        DALI_LOG_ERROR("Invalid gradient object [%p]\n", this);
+        return;
+      }
+      if(static_cast<tvg::Shape*>(tvgDuplicatedObject)->stroke(std::unique_ptr<tvg::Fill>(tvgDuplicatedStrokeGradient)) != tvg::Result::Success)
+      {
+        DALI_LOG_ERROR("Tvg gradient set fail [%p]\n", this);
+        return;
+      }
+    }
+  }
 
   Dali::CanvasRenderer::Drawable compositeDrawable = drawableImpl.GetCompositionDrawable();
   if(DALI_UNLIKELY(compositeDrawable))
diff --git a/dali/internal/canvas-renderer/tizen/gradient-factory-tizen.cpp b/dali/internal/canvas-renderer/tizen/gradient-factory-tizen.cpp
new file mode 100644 (file)
index 0000000..251ed1f
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <dali/internal/canvas-renderer/tizen/gradient-impl-tizen.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace GradientFactory
+{
+Dali::Internal::Adaptor::Gradient* New()
+{
+  return Dali::Internal::Adaptor::GradientTizen::New();
+}
+
+} // namespace GradientFactory
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/tizen/gradient-impl-tizen.cpp b/dali/internal/canvas-renderer/tizen/gradient-impl-tizen.cpp
new file mode 100644 (file)
index 0000000..562b739
--- /dev/null
@@ -0,0 +1,207 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali/internal/canvas-renderer/tizen/gradient-impl-tizen.h>
+
+// EXTERNAL INCLUDES
+#include <dali/devel-api/common/stage.h>
+#include <dali/integration-api/debug.h>
+#include <dali/public-api/object/type-registry.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace // unnamed namespace
+{
+// Type Registration
+Dali::BaseHandle Create()
+{
+  return Dali::BaseHandle();
+}
+
+Dali::TypeRegistration type(typeid(Dali::CanvasRenderer::Gradient), typeid(Dali::BaseHandle), Create);
+
+} // unnamed namespace
+
+GradientTizen* GradientTizen::New()
+{
+  return new GradientTizen();
+}
+
+GradientTizen::GradientTizen()
+: mChanged(false)
+#ifdef THORVG_SUPPORT
+  ,
+  mTvgFill(nullptr)
+#endif
+{
+}
+
+GradientTizen::~GradientTizen()
+{
+#ifdef THORVG_SUPPORT
+  if(mTvgFill)
+  {
+    delete mTvgFill;
+  }
+#endif
+}
+
+bool GradientTizen::SetColorStops(Dali::CanvasRenderer::Gradient::ColorStops& colorStops)
+{
+#ifdef THORVG_SUPPORT
+  if(!mTvgFill)
+  {
+    DALI_LOG_ERROR("Fill(Gradient) is null [%p]\n", this);
+    return false;
+  }
+  SetChanged(true);
+
+  tvg::Fill::ColorStop* tvgColorStops = (tvg::Fill::ColorStop*)alloca(sizeof(tvg::Fill::ColorStop) * colorStops.Count());
+
+  for(unsigned int i = 0u; i < colorStops.Count(); ++i)
+  {
+    tvgColorStops[i].offset = colorStops[i].offset;
+    tvgColorStops[i].r      = colorStops[i].color.r * 255.0f;
+    tvgColorStops[i].g      = colorStops[i].color.g * 255.0f;
+    tvgColorStops[i].b      = colorStops[i].color.b * 255.0f;
+    tvgColorStops[i].a      = colorStops[i].color.a * 255.0f;
+  }
+
+  if(mTvgFill->colorStops(tvgColorStops, colorStops.Count()) != tvg::Result::Success)
+  {
+    DALI_LOG_ERROR("SetColorStops() fail.\n");
+    return false;
+  }
+
+  return true;
+#else
+  return false;
+#endif
+}
+
+Dali::CanvasRenderer::Gradient::ColorStops GradientTizen::GetColorStops() const
+{
+#ifdef THORVG_SUPPORT
+  if(!mTvgFill)
+  {
+    DALI_LOG_ERROR("Fill(Gradient) is null [%p]\n", this);
+    return Dali::CanvasRenderer::Gradient::ColorStops();
+  }
+
+  const tvg::Fill::ColorStop* tvgColorStops = nullptr;
+  uint32_t                    count         = 0;
+
+  count = mTvgFill->colorStops(&tvgColorStops);
+  if(!tvgColorStops || count <= 0)
+  {
+    DALI_LOG_ERROR("GetColorStops() fail.\n");
+    return Dali::CanvasRenderer::Gradient::ColorStops();
+  }
+
+  Dali::CanvasRenderer::Gradient::ColorStops colorStops;
+
+  colorStops.Reserve(count);
+
+  for(unsigned int i = 0u; i < count; ++i)
+  {
+    Dali::CanvasRenderer::Gradient::ColorStop stop = {tvgColorStops[i].offset, Vector4(tvgColorStops[i].r / 255.0f, tvgColorStops[i].g / 255.0f, tvgColorStops[i].b / 255.0f, tvgColorStops[i].a / 255.0f)};
+
+    colorStops.PushBack(stop);
+  }
+  return colorStops;
+#else
+  return Dali::CanvasRenderer::Gradient::ColorStops();
+#endif
+}
+
+bool GradientTizen::SetSpread(Dali::CanvasRenderer::Gradient::Spread spread)
+{
+#ifdef THORVG_SUPPORT
+  if(!mTvgFill)
+  {
+    DALI_LOG_ERROR("Fill(Gradient) is null [%p]\n", this);
+    return false;
+  }
+  if(mTvgFill->spread(static_cast<tvg::FillSpread>(spread)) != tvg::Result::Success)
+  {
+    DALI_LOG_ERROR("SetSpread() fail.\n");
+    return false;
+  }
+  SetChanged(true);
+
+  return true;
+#else
+  return false;
+#endif
+}
+
+Dali::CanvasRenderer::Gradient::Spread GradientTizen::GetSpread() const
+{
+#ifdef THORVG_SUPPORT
+  if(!mTvgFill)
+  {
+    DALI_LOG_ERROR("Fill(Gradient) is null [%p]\n", this);
+    return Dali::CanvasRenderer::Gradient::Spread::PAD;
+  }
+
+  tvg::FillSpread spread = mTvgFill->spread();
+
+  return static_cast<Dali::CanvasRenderer::Gradient::Spread>(spread);
+#else
+  return Dali::CanvasRenderer::Gradient::Spread::PAD;
+#endif
+}
+
+void GradientTizen::SetObject(const void* object)
+{
+#ifdef THORVG_SUPPORT
+  if(object)
+  {
+    mTvgFill = static_cast<tvg::Fill*>((void*)object);
+  }
+#endif
+}
+
+void* GradientTizen::GetObject() const
+{
+#ifdef THORVG_SUPPORT
+  return static_cast<void*>(mTvgFill);
+#else
+  return nullptr;
+#endif
+}
+
+void GradientTizen::SetChanged(bool changed)
+{
+  if(!mChanged && changed) Dali::Stage::GetCurrent().KeepRendering(0.0f);
+  mChanged = !!changed;
+}
+
+bool GradientTizen::GetChanged() const
+{
+  return mChanged;
+}
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/tizen/gradient-impl-tizen.h b/dali/internal/canvas-renderer/tizen/gradient-impl-tizen.h
new file mode 100644 (file)
index 0000000..717a948
--- /dev/null
@@ -0,0 +1,120 @@
+#ifndef DALI_INTERNAL_TIZEN_GRADIENT_IMPL_TIZEN_H
+#define DALI_INTERNAL_TIZEN_GRADIENT_IMPL_TIZEN_H
+
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#ifdef THORVG_SUPPORT
+#include <thorvg.h>
+#endif
+#include <dali/public-api/object/base-object.h>
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer-gradient.h>
+#include <dali/devel-api/adaptor-framework/canvas-renderer.h>
+#include <dali/internal/canvas-renderer/common/gradient-impl.h>
+#include <dali/internal/canvas-renderer/tizen/canvas-renderer-impl-tizen.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+/**
+ * Dali internal Gradient.
+ */
+class GradientTizen : public Dali::Internal::Adaptor::Gradient
+{
+public:
+  /**
+   * @brief Creates a Gradient object.
+   * @return A pointer to a newly allocated Gradient
+   */
+  static GradientTizen* New();
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Gradient::SetColorStops()
+   */
+  bool SetColorStops(Dali::CanvasRenderer::Gradient::ColorStops& colorStops) override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Gradient::GetColorStops()
+   */
+  Dali::CanvasRenderer::Gradient::ColorStops GetColorStops() const override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Gradient::SetSpread()
+   */
+  bool SetSpread(Dali::CanvasRenderer::Gradient::Spread spread) override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Gradient::GetSpread()
+   */
+  Dali::CanvasRenderer::Gradient::Spread GetSpread() const override;
+
+  /**
+   * @copydoc Internal::Adaptor::Gradient::GetObject()
+   */
+  void SetObject(const void* object) override;
+
+  /**
+   * @copydoc Internal::Adaptor::Gradient::SetObject()
+   */
+  void* GetObject() const override;
+
+  /**
+   * @copydoc Internal::Adaptor::Gradient::SetChanged()
+   */
+  void SetChanged(bool changed) override;
+
+  /**
+   * @copydoc Internal::Adaptor::Gradient::GetChanged()
+   */
+  bool GetChanged() const override;
+
+  GradientTizen(const Gradient&) = delete;
+  GradientTizen& operator=(Gradient&) = delete;
+  GradientTizen(Gradient&&)           = delete;
+  GradientTizen& operator=(Gradient&&) = delete;
+
+protected:
+  /**
+   * @brief Constructor
+   */
+  GradientTizen();
+
+  /**
+   * @brief Destructor.
+   */
+  virtual ~GradientTizen() override;
+
+private:
+  bool mChanged;
+#ifdef THORVG_SUPPORT
+  tvg::Fill* mTvgFill;
+#endif
+};
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
+
+#endif // DALI_INTERNAL_TIZEN_GRADIENT_IMPL_TIZEN_H
diff --git a/dali/internal/canvas-renderer/tizen/linear-gradient-factory-tizen.cpp b/dali/internal/canvas-renderer/tizen/linear-gradient-factory-tizen.cpp
new file mode 100644 (file)
index 0000000..9cb43a3
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <dali/internal/canvas-renderer/tizen/linear-gradient-impl-tizen.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace LinearGradientFactory
+{
+Dali::Internal::Adaptor::LinearGradient* New()
+{
+  return Dali::Internal::Adaptor::LinearGradientTizen::New();
+}
+
+} // namespace LinearGradientFactory
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/tizen/linear-gradient-impl-tizen.cpp b/dali/internal/canvas-renderer/tizen/linear-gradient-impl-tizen.cpp
new file mode 100644 (file)
index 0000000..88a0089
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali/internal/canvas-renderer/tizen/linear-gradient-impl-tizen.h>
+
+// EXTERNAL INCLUDES
+#include <dali/integration-api/debug.h>
+#include <dali/public-api/object/type-registry.h>
+
+// INTERNAL INCLUDES
+#include <dali/internal/canvas-renderer/common/gradient-impl.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace // unnamed namespace
+{
+// Type Registration
+Dali::BaseHandle Create()
+{
+  return Dali::BaseHandle();
+}
+
+Dali::TypeRegistration type(typeid(Dali::CanvasRenderer::LinearGradient), typeid(Dali::BaseHandle), Create);
+
+} // unnamed namespace
+
+LinearGradientTizen* LinearGradientTizen::New()
+{
+  return new LinearGradientTizen();
+}
+
+LinearGradientTizen::LinearGradientTizen()
+#ifdef THORVG_SUPPORT
+: mTvgLinearGradient(nullptr)
+#endif
+{
+  Initialize();
+}
+
+LinearGradientTizen::~LinearGradientTizen()
+{
+}
+
+void LinearGradientTizen::Initialize()
+{
+#ifdef THORVG_SUPPORT
+  mTvgLinearGradient = tvg::LinearGradient::gen().release();
+  if(!mTvgLinearGradient)
+  {
+    DALI_LOG_ERROR("LinearGradient is null [%p]\n", this);
+  }
+
+  Gradient::Create();
+  Gradient::SetObject(static_cast<void*>(mTvgLinearGradient));
+#endif
+}
+
+bool LinearGradientTizen::SetBounds(Vector2 firstPoint, Vector2 secondPoint)
+{
+#ifdef THORVG_SUPPORT
+  if(!Gradient::GetObject() || !mTvgLinearGradient)
+  {
+    DALI_LOG_ERROR("LinearGradient is null\n");
+    return false;
+  }
+
+  if(mTvgLinearGradient->linear(firstPoint.x, firstPoint.y, secondPoint.x, secondPoint.y) != tvg::Result::Success)
+  {
+    DALI_LOG_ERROR("SetBounds() fail.\n");
+    return false;
+  }
+
+  Gradient::SetChanged(true);
+
+  return true;
+#else
+  return false;
+#endif
+}
+
+bool LinearGradientTizen::GetBounds(Vector2& firstPoint, Vector2& secondPoint) const
+{
+#ifdef THORVG_SUPPORT
+  if(!Gradient::GetObject() || !mTvgLinearGradient)
+  {
+    DALI_LOG_ERROR("LinearGradient is null\n");
+    return false;
+  }
+
+  if(mTvgLinearGradient->linear(&firstPoint.x, &firstPoint.y, &secondPoint.x, &secondPoint.y) != tvg::Result::Success)
+  {
+    DALI_LOG_ERROR("GetBounds() fail.\n");
+    return false;
+  }
+
+  return true;
+#else
+  return false;
+#endif
+}
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/tizen/linear-gradient-impl-tizen.h b/dali/internal/canvas-renderer/tizen/linear-gradient-impl-tizen.h
new file mode 100644 (file)
index 0000000..74b79fb
--- /dev/null
@@ -0,0 +1,94 @@
+#ifndef DALI_INTERNAL_TIZEN_LINEAR_GRADIENT_IMPL_TIZEN_H
+#define DALI_INTERNAL_TIZEN_LINEAR_GRADIENT_IMPL_TIZEN_H
+
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#ifdef THORVG_SUPPORT
+#include <thorvg.h>
+#endif
+#include <dali/public-api/object/base-object.h>
+#include <dali/public-api/object/weak-handle.h>
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer-linear-gradient.h>
+#include <dali/internal/canvas-renderer/common/linear-gradient-impl.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+/**
+ * Dali internal LinearGradient.
+ */
+class LinearGradientTizen : public Dali::Internal::Adaptor::LinearGradient
+{
+public:
+  /**
+   * @brief Creates a LinearGradient object.
+   * @return A pointer to a newly allocated drawablegroup
+   */
+  static LinearGradientTizen* New();
+
+  /**
+   * @copydoc Dali::CanvasRenderer::LinearGradient::SetBounds()
+   */
+  bool SetBounds(Vector2 firstPoint, Vector2 secondPoint) override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::LinearGradient::SetBounds()
+   */
+  bool GetBounds(Vector2& firstPoint, Vector2& secondPoint) const override;
+
+private:
+  LinearGradientTizen(const LinearGradientTizen&) = delete;
+  LinearGradientTizen& operator=(LinearGradientTizen&) = delete;
+  LinearGradientTizen(LinearGradientTizen&&)           = delete;
+  LinearGradientTizen& operator=(LinearGradientTizen&&) = delete;
+
+  /**
+   * @brief Constructor
+   */
+  LinearGradientTizen();
+
+  /**
+   * @brief Destructor.
+   */
+  virtual ~LinearGradientTizen() override;
+
+private:
+  /**
+   * @brief Initializes member data.
+   */
+  void Initialize();
+
+private:
+#ifdef THORVG_SUPPORT
+  tvg::LinearGradient* mTvgLinearGradient;
+#endif
+};
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
+
+#endif // DALI_INTERNAL_TIZEN_LINEAR_GRADIENT_IMPL_TIZEN_H
diff --git a/dali/internal/canvas-renderer/tizen/radial-gradient-factory-tizen.cpp b/dali/internal/canvas-renderer/tizen/radial-gradient-factory-tizen.cpp
new file mode 100644 (file)
index 0000000..f7b3a17
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <dali/internal/canvas-renderer/tizen/radial-gradient-impl-tizen.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace RadialGradientFactory
+{
+Dali::Internal::Adaptor::RadialGradient* New()
+{
+  return Dali::Internal::Adaptor::RadialGradientTizen::New();
+}
+
+} // namespace RadialGradientFactory
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/tizen/radial-gradient-impl-tizen.cpp b/dali/internal/canvas-renderer/tizen/radial-gradient-impl-tizen.cpp
new file mode 100644 (file)
index 0000000..e8cad02
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali/internal/canvas-renderer/tizen/radial-gradient-impl-tizen.h>
+
+// EXTERNAL INCLUDES
+#include <dali/integration-api/debug.h>
+#include <dali/public-api/object/type-registry.h>
+
+// INTERNAL INCLUDES
+#include <dali/internal/canvas-renderer/common/gradient-impl.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace // unnamed namespace
+{
+// Type Registration
+Dali::BaseHandle Create()
+{
+  return Dali::BaseHandle();
+}
+
+Dali::TypeRegistration type(typeid(Dali::CanvasRenderer::RadialGradient), typeid(Dali::BaseHandle), Create);
+
+} // unnamed namespace
+
+RadialGradientTizen* RadialGradientTizen::New()
+{
+  return new RadialGradientTizen();
+}
+
+RadialGradientTizen::RadialGradientTizen()
+#ifdef THORVG_SUPPORT
+: mTvgRadialGradient(nullptr)
+#endif
+{
+  Initialize();
+}
+
+RadialGradientTizen::~RadialGradientTizen()
+{
+}
+
+void RadialGradientTizen::Initialize()
+{
+#ifdef THORVG_SUPPORT
+  mTvgRadialGradient = tvg::RadialGradient::gen().release();
+  if(!mTvgRadialGradient)
+  {
+    DALI_LOG_ERROR("RadialGradient is null [%p]\n", this);
+  }
+
+  Gradient::Create();
+  Gradient::SetObject(static_cast<void*>(mTvgRadialGradient));
+#endif
+}
+
+bool RadialGradientTizen::SetBounds(Vector2 centerPoint, float radius)
+{
+#ifdef THORVG_SUPPORT
+  if(!Gradient::GetObject() || !mTvgRadialGradient)
+  {
+    DALI_LOG_ERROR("RadialGradient is null\n");
+    return false;
+  }
+
+  if(mTvgRadialGradient->radial(centerPoint.x, centerPoint.y, radius) != tvg::Result::Success)
+  {
+    DALI_LOG_ERROR("SetBounds() fail.\n");
+    return false;
+  }
+
+  Gradient::SetChanged(true);
+
+  return true;
+#else
+  return false;
+#endif
+}
+
+bool RadialGradientTizen::GetBounds(Vector2& centerPoint, float& radius) const
+{
+#ifdef THORVG_SUPPORT
+  if(!Gradient::GetObject() || !mTvgRadialGradient)
+  {
+    DALI_LOG_ERROR("RadialGradient is null\n");
+    return false;
+  }
+
+  if(mTvgRadialGradient->radial(&centerPoint.x, &centerPoint.y, &radius) != tvg::Result::Success)
+  {
+    DALI_LOG_ERROR("GetBounds() fail.\n");
+    return false;
+  }
+
+  return true;
+#else
+  return false;
+#endif
+}
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/tizen/radial-gradient-impl-tizen.h b/dali/internal/canvas-renderer/tizen/radial-gradient-impl-tizen.h
new file mode 100644 (file)
index 0000000..430dfe5
--- /dev/null
@@ -0,0 +1,93 @@
+#ifndef DALI_INTERNAL_TIZEN_RADIAL_GRADIENT_IMPL_TIZEN_H
+#define DALI_INTERNAL_TIZEN_RADIAL_GRADIENT_IMPL_TIZEN_H
+
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#ifdef THORVG_SUPPORT
+#include <thorvg.h>
+#endif
+#include <dali/public-api/object/base-object.h>
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer-radial-gradient.h>
+#include <dali/internal/canvas-renderer/common/radial-gradient-impl.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+/**
+ * Dali internal RadialGradient.
+ */
+class RadialGradientTizen : public Dali::Internal::Adaptor::RadialGradient
+{
+public:
+  /**
+   * @brief Creates a RadialGradient object.
+   * @return A pointer to a newly allocated drawablegroup
+   */
+  static RadialGradientTizen* New();
+
+  /**
+   * @copydoc Dali::CanvasRenderer::RadialGradient::SetBounds()
+   */
+  bool SetBounds(Vector2 centerPoint, float radius) override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::RadialGradient::SetBounds()
+   */
+  bool GetBounds(Vector2& centerPoint, float& radius) const override;
+
+private:
+  RadialGradientTizen(const RadialGradientTizen&) = delete;
+  RadialGradientTizen& operator=(RadialGradientTizen&) = delete;
+  RadialGradientTizen(RadialGradientTizen&&)           = delete;
+  RadialGradientTizen& operator=(RadialGradientTizen&&) = delete;
+
+  /**
+   * @brief Constructor
+   */
+  RadialGradientTizen();
+
+  /**
+   * @brief Destructor.
+   */
+  virtual ~RadialGradientTizen() override;
+
+private:
+  /**
+   * @brief Initializes member data.
+   */
+  void Initialize();
+
+private:
+#ifdef THORVG_SUPPORT
+  tvg::RadialGradient* mTvgRadialGradient;
+#endif
+};
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
+
+#endif // DALI_INTERNAL_TIZEN_RADIAL_GRADIENT_IMPL_TIZEN_H
index 014af70..9e5946e 100644 (file)
@@ -46,8 +46,11 @@ ShapeTizen* ShapeTizen::New()
 }
 
 ShapeTizen::ShapeTizen()
+: mFillGradient(),
+  mStrokeGradient()
 #ifdef THORVG_SUPPORT
-: mTvgShape(nullptr)
+  ,
+  mTvgShape(nullptr)
 #endif
 {
   Initialize();
@@ -280,6 +283,27 @@ Vector4 ShapeTizen::GetFillColor() const
 #endif
 }
 
+bool ShapeTizen::SetFillGradient(Dali::CanvasRenderer::Gradient& gradient)
+{
+#ifdef THORVG_SUPPORT
+  if(!Drawable::GetObject() || !mTvgShape)
+  {
+    DALI_LOG_ERROR("Shape is null [%p]\n", this);
+    return false;
+  }
+  mFillGradient = gradient;
+  Drawable::SetChanged(true);
+  return true;
+#else
+  return false;
+#endif
+}
+
+Dali::CanvasRenderer::Gradient ShapeTizen::GetFillGradient() const
+{
+  return mFillGradient;
+}
+
 bool ShapeTizen::SetFillRule(Dali::CanvasRenderer::Shape::FillRule rule)
 {
 #ifdef THORVG_SUPPORT
@@ -394,6 +418,27 @@ Vector4 ShapeTizen::GetStrokeColor() const
 #endif
 }
 
+bool ShapeTizen::SetStrokeGradient(Dali::CanvasRenderer::Gradient& gradient)
+{
+#ifdef THORVG_SUPPORT
+  if(!Drawable::GetObject() || !mTvgShape)
+  {
+    DALI_LOG_ERROR("Shape is null [%p]\n", this);
+    return false;
+  }
+  mStrokeGradient = gradient;
+  Drawable::SetChanged(true);
+  return true;
+#else
+  return false;
+#endif
+}
+
+Dali::CanvasRenderer::Gradient ShapeTizen::GetStrokeGradient() const
+{
+  return mStrokeGradient;
+}
+
 bool ShapeTizen::SetStrokeDash(const Dali::Vector<float> dashPattern)
 {
 #ifdef THORVG_SUPPORT
index 01de532..28026e5 100644 (file)
@@ -98,6 +98,16 @@ public:
   Vector4 GetFillColor() const override;
 
   /**
+   * @copydoc Dali::CanvasRenderer::Shape::SetFillGradient()
+   */
+  bool SetFillGradient(Dali::CanvasRenderer::Gradient& gradient) override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Shape::GetFillGradient()
+   */
+  Dali::CanvasRenderer::Gradient GetFillGradient() const override;
+
+  /**
    * @copydoc Dali::CanvasRenderer::Shape::SetFillRule()
    */
   bool SetFillRule(Dali::CanvasRenderer::Shape::FillRule rule) override;
@@ -128,6 +138,16 @@ public:
   Vector4 GetStrokeColor() const override;
 
   /**
+   * @copydoc Dali::CanvasRenderer::Shape::SetStrokeGradient()
+   */
+  bool SetStrokeGradient(Dali::CanvasRenderer::Gradient& gradient) override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Shape::GetStrokeGradient()
+   */
+  Dali::CanvasRenderer::Gradient GetStrokeGradient() const override;
+
+  /**
    * @copydoc Dali::CanvasRenderer::Shape::SetStrokeDash()
    */
   bool SetStrokeDash(const Dali::Vector<float> dashPattern) override;
@@ -179,8 +199,10 @@ private:
    */
   void Initialize();
 
-#ifdef THORVG_SUPPORT
 private:
+  Dali::CanvasRenderer::Gradient mFillGradient;
+  Dali::CanvasRenderer::Gradient mStrokeGradient;
+#ifdef THORVG_SUPPORT
   tvg::Shape* mTvgShape;
 #endif
 };
index 82eb352..e5a318d 100644 (file)
@@ -26,6 +26,8 @@
 #include <dali/devel-api/adaptor-framework/pixel-buffer.h>
 #include <dali/internal/canvas-renderer/common/drawable-group-impl.h>
 #include <dali/internal/canvas-renderer/common/drawable-impl.h>
+#include <dali/internal/canvas-renderer/common/gradient-impl.h>
+#include <dali/internal/canvas-renderer/common/shape-impl.h>
 #include <dali/internal/imaging/common/pixel-buffer-impl.h>
 
 namespace Dali
@@ -216,6 +218,29 @@ bool CanvasRendererUbuntu::HaveDrawablesChanged(const Dali::CanvasRenderer::Draw
       }
     }
   }
+  else if(drawableImpl.GetType() == Drawable::Types::SHAPE)
+  {
+    const Dali::CanvasRenderer::Shape& shape        = static_cast<const Dali::CanvasRenderer::Shape&>(drawable);
+    Dali::CanvasRenderer::Gradient     fillGradient = shape.GetFillGradient();
+    if(DALI_UNLIKELY(fillGradient))
+    {
+      Internal::Adaptor::Gradient& fillGradientImpl = Dali::GetImplementation(fillGradient);
+      if(fillGradientImpl.GetChanged())
+      {
+        return true;
+      }
+    }
+
+    Dali::CanvasRenderer::Gradient strokeGradient = shape.GetStrokeGradient();
+    if(DALI_UNLIKELY(strokeGradient))
+    {
+      Internal::Adaptor::Gradient& strokeGradientImpl = Dali::GetImplementation(strokeGradient);
+      if(strokeGradientImpl.GetChanged())
+      {
+        return true;
+      }
+    }
+  }
 
   return false;
 }
@@ -242,6 +267,23 @@ void CanvasRendererUbuntu::UpdateDrawablesChanged(Dali::CanvasRenderer::Drawable
       UpdateDrawablesChanged(it, changed);
     }
   }
+  else if(drawableImpl.GetType() == Drawable::Types::SHAPE)
+  {
+    Dali::CanvasRenderer::Shape&   shape        = static_cast<Dali::CanvasRenderer::Shape&>(drawable);
+    Dali::CanvasRenderer::Gradient fillGradient = shape.GetFillGradient();
+    if(DALI_UNLIKELY(fillGradient))
+    {
+      Internal::Adaptor::Gradient& fillGradientImpl = Dali::GetImplementation(fillGradient);
+      fillGradientImpl.SetChanged(changed);
+    }
+
+    Dali::CanvasRenderer::Gradient strokeGradient = shape.GetStrokeGradient();
+    if(DALI_UNLIKELY(strokeGradient))
+    {
+      Internal::Adaptor::Gradient& strokeGradientImpl = Dali::GetImplementation(strokeGradient);
+      strokeGradientImpl.SetChanged(changed);
+    }
+  }
 }
 #endif
 
@@ -402,6 +444,45 @@ void CanvasRendererUbuntu::PushDrawableToGroup(Dali::CanvasRenderer::Drawable& d
       PushDrawableToGroup(it, static_cast<tvg::Scene*>(tvgDuplicatedObject));
     }
   }
+  else if(type == Drawable::Types::SHAPE)
+  {
+    //FillGradient
+    Dali::CanvasRenderer::Shape&   shape        = static_cast<Dali::CanvasRenderer::Shape&>(drawable);
+    Dali::CanvasRenderer::Gradient fillGradient = shape.GetFillGradient();
+    if(DALI_UNLIKELY(fillGradient))
+    {
+      Internal::Adaptor::Gradient& fillGradientImpl          = Dali::GetImplementation(fillGradient);
+      tvg::Fill*                   tvgDuplicatedFillGradient = static_cast<tvg::Fill*>(fillGradientImpl.GetObject())->duplicate();
+      if(!tvgDuplicatedFillGradient)
+      {
+        DALI_LOG_ERROR("Invalid gradient object [%p]\n", this);
+        return;
+      }
+      if(static_cast<tvg::Shape*>(tvgDuplicatedObject)->fill(std::unique_ptr<tvg::Fill>(tvgDuplicatedFillGradient)) != tvg::Result::Success)
+      {
+        DALI_LOG_ERROR("Tvg gradient set fail [%p]\n", this);
+        return;
+      }
+    }
+
+    //StrokeGradient
+    Dali::CanvasRenderer::Gradient strokeGradient = shape.GetStrokeGradient();
+    if(DALI_UNLIKELY(strokeGradient))
+    {
+      Internal::Adaptor::Gradient& strokeGradientImpl          = Dali::GetImplementation(strokeGradient);
+      tvg::Fill*                   tvgDuplicatedStrokeGradient = static_cast<tvg::Fill*>(strokeGradientImpl.GetObject())->duplicate();
+      if(!tvgDuplicatedStrokeGradient)
+      {
+        DALI_LOG_ERROR("Invalid gradient object [%p]\n", this);
+        return;
+      }
+      if(static_cast<tvg::Shape*>(tvgDuplicatedObject)->stroke(std::unique_ptr<tvg::Fill>(tvgDuplicatedStrokeGradient)) != tvg::Result::Success)
+      {
+        DALI_LOG_ERROR("Tvg gradient set fail [%p]\n", this);
+        return;
+      }
+    }
+  }
 
   Dali::CanvasRenderer::Drawable compositeDrawable = drawableImpl.GetCompositionDrawable();
   if(DALI_UNLIKELY(compositeDrawable))
diff --git a/dali/internal/canvas-renderer/ubuntu/gradient-factory-ubuntu.cpp b/dali/internal/canvas-renderer/ubuntu/gradient-factory-ubuntu.cpp
new file mode 100644 (file)
index 0000000..f336bce
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <dali/internal/canvas-renderer/ubuntu/gradient-impl-ubuntu.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace GradientFactory
+{
+Dali::Internal::Adaptor::Gradient* New()
+{
+  return Dali::Internal::Adaptor::GradientUbuntu::New();
+}
+
+} // namespace GradientFactory
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/ubuntu/gradient-impl-ubuntu.cpp b/dali/internal/canvas-renderer/ubuntu/gradient-impl-ubuntu.cpp
new file mode 100644 (file)
index 0000000..350a2c1
--- /dev/null
@@ -0,0 +1,207 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali/internal/canvas-renderer/ubuntu/gradient-impl-ubuntu.h>
+
+// EXTERNAL INCLUDES
+#include <dali/devel-api/common/stage.h>
+#include <dali/integration-api/debug.h>
+#include <dali/public-api/object/type-registry.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace // unnamed namespace
+{
+// Type Registration
+Dali::BaseHandle Create()
+{
+  return Dali::BaseHandle();
+}
+
+Dali::TypeRegistration type(typeid(Dali::CanvasRenderer::Gradient), typeid(Dali::BaseHandle), Create);
+
+} // unnamed namespace
+
+GradientUbuntu* GradientUbuntu::New()
+{
+  return new GradientUbuntu();
+}
+
+GradientUbuntu::GradientUbuntu()
+: mChanged(false)
+#ifdef THORVG_SUPPORT
+  ,
+  mTvgFill(nullptr)
+#endif
+{
+}
+
+GradientUbuntu::~GradientUbuntu()
+{
+#ifdef THORVG_SUPPORT
+  if(mTvgFill)
+  {
+    delete mTvgFill;
+  }
+#endif
+}
+
+bool GradientUbuntu::SetColorStops(Dali::CanvasRenderer::Gradient::ColorStops& colorStops)
+{
+#ifdef THORVG_SUPPORT
+  if(!mTvgFill)
+  {
+    DALI_LOG_ERROR("Fill(Gradient) is null [%p]\n", this);
+    return false;
+  }
+  SetChanged(true);
+
+  tvg::Fill::ColorStop* tvgColorStops = (tvg::Fill::ColorStop*)alloca(sizeof(tvg::Fill::ColorStop) * colorStops.Count());
+
+  for(unsigned int i = 0u; i < colorStops.Count(); ++i)
+  {
+    tvgColorStops[i].offset = colorStops[i].offset;
+    tvgColorStops[i].r      = colorStops[i].color.r * 255.0f;
+    tvgColorStops[i].g      = colorStops[i].color.g * 255.0f;
+    tvgColorStops[i].b      = colorStops[i].color.b * 255.0f;
+    tvgColorStops[i].a      = colorStops[i].color.a * 255.0f;
+  }
+
+  if(mTvgFill->colorStops(tvgColorStops, colorStops.Count()) != tvg::Result::Success)
+  {
+    DALI_LOG_ERROR("SetColorStops() fail.\n");
+    return false;
+  }
+
+  return true;
+#else
+  return false;
+#endif
+}
+
+Dali::CanvasRenderer::Gradient::ColorStops GradientUbuntu::GetColorStops() const
+{
+#ifdef THORVG_SUPPORT
+  if(!mTvgFill)
+  {
+    DALI_LOG_ERROR("Fill(Gradient) is null [%p]\n", this);
+    return Dali::CanvasRenderer::Gradient::ColorStops();
+  }
+
+  const tvg::Fill::ColorStop* tvgColorStops = nullptr;
+  uint32_t                    count         = 0;
+
+  count = mTvgFill->colorStops(&tvgColorStops);
+  if(!tvgColorStops || count <= 0)
+  {
+    DALI_LOG_ERROR("GetColorStops() fail.\n");
+    return Dali::CanvasRenderer::Gradient::ColorStops();
+  }
+
+  Dali::CanvasRenderer::Gradient::ColorStops colorStops;
+
+  colorStops.Reserve(count);
+
+  for(unsigned int i = 0u; i < count; ++i)
+  {
+    Dali::CanvasRenderer::Gradient::ColorStop stop = {tvgColorStops[i].offset, Vector4(tvgColorStops[i].r / 255.0f, tvgColorStops[i].g / 255.0f, tvgColorStops[i].b / 255.0f, tvgColorStops[i].a / 255.0f)};
+
+    colorStops.PushBack(stop);
+  }
+  return colorStops;
+#else
+  return Dali::CanvasRenderer::Gradient::ColorStops();
+#endif
+}
+
+bool GradientUbuntu::SetSpread(Dali::CanvasRenderer::Gradient::Spread spread)
+{
+#ifdef THORVG_SUPPORT
+  if(!mTvgFill)
+  {
+    DALI_LOG_ERROR("Fill(Gradient) is null [%p]\n", this);
+    return false;
+  }
+  if(mTvgFill->spread(static_cast<tvg::FillSpread>(spread)) != tvg::Result::Success)
+  {
+    DALI_LOG_ERROR("SetSpread() fail.\n");
+    return false;
+  }
+  SetChanged(true);
+
+  return true;
+#else
+  return false;
+#endif
+}
+
+Dali::CanvasRenderer::Gradient::Spread GradientUbuntu::GetSpread() const
+{
+#ifdef THORVG_SUPPORT
+  if(!mTvgFill)
+  {
+    DALI_LOG_ERROR("Fill(Gradient) is null [%p]\n", this);
+    return Dali::CanvasRenderer::Gradient::Spread::PAD;
+  }
+
+  tvg::FillSpread spread = mTvgFill->spread();
+
+  return static_cast<Dali::CanvasRenderer::Gradient::Spread>(spread);
+#else
+  return Dali::CanvasRenderer::Gradient::Spread::PAD;
+#endif
+}
+
+void GradientUbuntu::SetObject(const void* object)
+{
+#ifdef THORVG_SUPPORT
+  if(object)
+  {
+    mTvgFill = static_cast<tvg::Fill*>((void*)object);
+  }
+#endif
+}
+
+void* GradientUbuntu::GetObject() const
+{
+#ifdef THORVG_SUPPORT
+  return static_cast<void*>(mTvgFill);
+#else
+  return nullptr;
+#endif
+}
+
+void GradientUbuntu::SetChanged(bool changed)
+{
+  if(!mChanged && changed) Dali::Stage::GetCurrent().KeepRendering(0.0f);
+  mChanged = !!changed;
+}
+
+bool GradientUbuntu::GetChanged() const
+{
+  return mChanged;
+}
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/ubuntu/gradient-impl-ubuntu.h b/dali/internal/canvas-renderer/ubuntu/gradient-impl-ubuntu.h
new file mode 100644 (file)
index 0000000..02d3196
--- /dev/null
@@ -0,0 +1,120 @@
+#ifndef DALI_INTERNAL_UBUNTU_GRADIENT_IMPL_UBUNTU_H
+#define DALI_INTERNAL_UBUNTU_GRADIENT_IMPL_UBUNTU_H
+
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#ifdef THORVG_SUPPORT
+#include <thorvg.h>
+#endif
+#include <dali/public-api/object/base-object.h>
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer-gradient.h>
+#include <dali/devel-api/adaptor-framework/canvas-renderer.h>
+#include <dali/internal/canvas-renderer/common/gradient-impl.h>
+#include <dali/internal/canvas-renderer/ubuntu/canvas-renderer-impl-ubuntu.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+/**
+ * Dali internal Gradient.
+ */
+class GradientUbuntu : public Dali::Internal::Adaptor::Gradient
+{
+public:
+  /**
+   * @brief Creates a Gradient object.
+   * @return A pointer to a newly allocated Gradient
+   */
+  static GradientUbuntu* New();
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Gradient::SetColorStops()
+   */
+  bool SetColorStops(Dali::CanvasRenderer::Gradient::ColorStops& colorStops) override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Gradient::GetColorStops()
+   */
+  Dali::CanvasRenderer::Gradient::ColorStops GetColorStops() const override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Gradient::SetSpread()
+   */
+  bool SetSpread(Dali::CanvasRenderer::Gradient::Spread spread) override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Gradient::GetSpread()
+   */
+  Dali::CanvasRenderer::Gradient::Spread GetSpread() const override;
+
+  /**
+   * @copydoc Internal::Adaptor::Gradient::GetObject()
+   */
+  void SetObject(const void* object) override;
+
+  /**
+   * @copydoc Internal::Adaptor::Gradient::SetObject()
+   */
+  void* GetObject() const override;
+
+  /**
+   * @copydoc Internal::Adaptor::Gradient::SetChanged()
+   */
+  void SetChanged(bool changed) override;
+
+  /**
+   * @copydoc Internal::Adaptor::Gradient::GetChanged()
+   */
+  bool GetChanged() const override;
+
+  GradientUbuntu(const Gradient&) = delete;
+  GradientUbuntu& operator=(Gradient&) = delete;
+  GradientUbuntu(Gradient&&)           = delete;
+  GradientUbuntu& operator=(Gradient&&) = delete;
+
+protected:
+  /**
+   * @brief Constructor
+   */
+  GradientUbuntu();
+
+  /**
+   * @brief Destructor.
+   */
+  virtual ~GradientUbuntu() override;
+
+private:
+  bool mChanged;
+#ifdef THORVG_SUPPORT
+  tvg::Fill* mTvgFill;
+#endif
+};
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
+
+#endif // DALI_INTERNAL_UBUNTU_GRADIENT_IMPL_UBUNTU_H
diff --git a/dali/internal/canvas-renderer/ubuntu/linear-gradient-factory-ubuntu.cpp b/dali/internal/canvas-renderer/ubuntu/linear-gradient-factory-ubuntu.cpp
new file mode 100644 (file)
index 0000000..9d66d1f
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <dali/internal/canvas-renderer/ubuntu/linear-gradient-impl-ubuntu.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace LinearGradientFactory
+{
+Dali::Internal::Adaptor::LinearGradient* New()
+{
+  return Dali::Internal::Adaptor::LinearGradientUbuntu::New();
+}
+
+} // namespace LinearGradientFactory
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/ubuntu/linear-gradient-impl-ubuntu.cpp b/dali/internal/canvas-renderer/ubuntu/linear-gradient-impl-ubuntu.cpp
new file mode 100644 (file)
index 0000000..c0e7acc
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali/internal/canvas-renderer/ubuntu/linear-gradient-impl-ubuntu.h>
+
+// EXTERNAL INCLUDES
+#include <dali/integration-api/debug.h>
+#include <dali/public-api/object/type-registry.h>
+
+// INTERNAL INCLUDES
+#include <dali/internal/canvas-renderer/common/gradient-impl.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace // unnamed namespace
+{
+// Type Registration
+Dali::BaseHandle Create()
+{
+  return Dali::BaseHandle();
+}
+
+Dali::TypeRegistration type(typeid(Dali::CanvasRenderer::LinearGradient), typeid(Dali::BaseHandle), Create);
+
+} // unnamed namespace
+
+LinearGradientUbuntu* LinearGradientUbuntu::New()
+{
+  return new LinearGradientUbuntu();
+}
+
+LinearGradientUbuntu::LinearGradientUbuntu()
+#ifdef THORVG_SUPPORT
+: mTvgLinearGradient(nullptr)
+#endif
+{
+  Initialize();
+}
+
+LinearGradientUbuntu::~LinearGradientUbuntu()
+{
+}
+
+void LinearGradientUbuntu::Initialize()
+{
+#ifdef THORVG_SUPPORT
+  mTvgLinearGradient = tvg::LinearGradient::gen().release();
+  if(!mTvgLinearGradient)
+  {
+    DALI_LOG_ERROR("LinearGradient is null [%p]\n", this);
+  }
+
+  Gradient::Create();
+  Gradient::SetObject(static_cast<void*>(mTvgLinearGradient));
+#endif
+}
+
+bool LinearGradientUbuntu::SetBounds(Vector2 firstPoint, Vector2 secondPoint)
+{
+#ifdef THORVG_SUPPORT
+  if(!Gradient::GetObject() || !mTvgLinearGradient)
+  {
+    DALI_LOG_ERROR("LinearGradient is null\n");
+    return false;
+  }
+
+  if(mTvgLinearGradient->linear(firstPoint.x, firstPoint.y, secondPoint.x, secondPoint.y) != tvg::Result::Success)
+  {
+    DALI_LOG_ERROR("SetBounds() fail.\n");
+    return false;
+  }
+
+  Gradient::SetChanged(true);
+
+  return true;
+#else
+  return false;
+#endif
+}
+
+bool LinearGradientUbuntu::GetBounds(Vector2& firstPoint, Vector2& secondPoint) const
+{
+#ifdef THORVG_SUPPORT
+  if(!Gradient::GetObject() || !mTvgLinearGradient)
+  {
+    DALI_LOG_ERROR("LinearGradient is null\n");
+    return false;
+  }
+
+  if(mTvgLinearGradient->linear(&firstPoint.x, &firstPoint.y, &secondPoint.x, &secondPoint.y) != tvg::Result::Success)
+  {
+    DALI_LOG_ERROR("GetBounds() fail.\n");
+    return false;
+  }
+
+  return true;
+#else
+  return false;
+#endif
+}
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/ubuntu/linear-gradient-impl-ubuntu.h b/dali/internal/canvas-renderer/ubuntu/linear-gradient-impl-ubuntu.h
new file mode 100644 (file)
index 0000000..d735328
--- /dev/null
@@ -0,0 +1,94 @@
+#ifndef DALI_INTERNAL_UBUNTU_LINEAR_GRADIENT_IMPL_UBUNTU_H
+#define DALI_INTERNAL_UBUNTU_LINEAR_GRADIENT_IMPL_UBUNTU_H
+
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#ifdef THORVG_SUPPORT
+#include <thorvg.h>
+#endif
+#include <dali/public-api/object/base-object.h>
+#include <dali/public-api/object/weak-handle.h>
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer-linear-gradient.h>
+#include <dali/internal/canvas-renderer/common/linear-gradient-impl.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+/**
+ * Dali internal LinearGradient.
+ */
+class LinearGradientUbuntu : public Dali::Internal::Adaptor::LinearGradient
+{
+public:
+  /**
+   * @brief Creates a LinearGradient object.
+   * @return A pointer to a newly allocated drawablegroup
+   */
+  static LinearGradientUbuntu* New();
+
+  /**
+   * @copydoc Dali::CanvasRenderer::LinearGradient::SetBounds()
+   */
+  bool SetBounds(Vector2 firstPoint, Vector2 secondPoint) override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::LinearGradient::SetBounds()
+   */
+  bool GetBounds(Vector2& firstPoint, Vector2& secondPoint) const override;
+
+private:
+  LinearGradientUbuntu(const LinearGradientUbuntu&) = delete;
+  LinearGradientUbuntu& operator=(LinearGradientUbuntu&) = delete;
+  LinearGradientUbuntu(LinearGradientUbuntu&&)           = delete;
+  LinearGradientUbuntu& operator=(LinearGradientUbuntu&&) = delete;
+
+  /**
+   * @brief Constructor
+   */
+  LinearGradientUbuntu();
+
+  /**
+   * @brief Destructor.
+   */
+  virtual ~LinearGradientUbuntu() override;
+
+private:
+  /**
+   * @brief Initializes member data.
+   */
+  void Initialize();
+
+private:
+#ifdef THORVG_SUPPORT
+  tvg::LinearGradient* mTvgLinearGradient;
+#endif
+};
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
+
+#endif // DALI_INTERNAL_UBUNTU_LINEAR_GRADIENT_IMPL_UBUNTU_H
diff --git a/dali/internal/canvas-renderer/ubuntu/radial-gradient-factory-ubuntu.cpp b/dali/internal/canvas-renderer/ubuntu/radial-gradient-factory-ubuntu.cpp
new file mode 100644 (file)
index 0000000..8144f63
--- /dev/null
@@ -0,0 +1,39 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+#include <dali/internal/canvas-renderer/ubuntu/radial-gradient-impl-ubuntu.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace RadialGradientFactory
+{
+Dali::Internal::Adaptor::RadialGradient* New()
+{
+  return Dali::Internal::Adaptor::RadialGradientUbuntu::New();
+}
+
+} // namespace RadialGradientFactory
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/ubuntu/radial-gradient-impl-ubuntu.cpp b/dali/internal/canvas-renderer/ubuntu/radial-gradient-impl-ubuntu.cpp
new file mode 100644 (file)
index 0000000..c46e4c8
--- /dev/null
@@ -0,0 +1,125 @@
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// CLASS HEADER
+#include <dali/internal/canvas-renderer/ubuntu/radial-gradient-impl-ubuntu.h>
+
+// EXTERNAL INCLUDES
+#include <dali/integration-api/debug.h>
+#include <dali/public-api/object/type-registry.h>
+
+// INTERNAL INCLUDES
+#include <dali/internal/canvas-renderer/common/gradient-impl.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+namespace // unnamed namespace
+{
+// Type Registration
+Dali::BaseHandle Create()
+{
+  return Dali::BaseHandle();
+}
+
+Dali::TypeRegistration type(typeid(Dali::CanvasRenderer::RadialGradient), typeid(Dali::BaseHandle), Create);
+
+} // unnamed namespace
+
+RadialGradientUbuntu* RadialGradientUbuntu::New()
+{
+  return new RadialGradientUbuntu();
+}
+
+RadialGradientUbuntu::RadialGradientUbuntu()
+#ifdef THORVG_SUPPORT
+: mTvgRadialGradient(nullptr)
+#endif
+{
+  Initialize();
+}
+
+RadialGradientUbuntu::~RadialGradientUbuntu()
+{
+}
+
+void RadialGradientUbuntu::Initialize()
+{
+#ifdef THORVG_SUPPORT
+  mTvgRadialGradient = tvg::RadialGradient::gen().release();
+  if(!mTvgRadialGradient)
+  {
+    DALI_LOG_ERROR("RadialGradient is null [%p]\n", this);
+  }
+
+  Gradient::Create();
+  Gradient::SetObject(static_cast<void*>(mTvgRadialGradient));
+#endif
+}
+
+bool RadialGradientUbuntu::SetBounds(Vector2 centerPoint, float radius)
+{
+#ifdef THORVG_SUPPORT
+  if(!Gradient::GetObject() || !mTvgRadialGradient)
+  {
+    DALI_LOG_ERROR("RadialGradient is null\n");
+    return false;
+  }
+
+  if(mTvgRadialGradient->radial(centerPoint.x, centerPoint.y, radius) != tvg::Result::Success)
+  {
+    DALI_LOG_ERROR("SetBounds() fail.\n");
+    return false;
+  }
+
+  Gradient::SetChanged(true);
+
+  return true;
+#else
+  return false;
+#endif
+}
+
+bool RadialGradientUbuntu::GetBounds(Vector2& centerPoint, float& radius) const
+{
+#ifdef THORVG_SUPPORT
+  if(!Gradient::GetObject() || !mTvgRadialGradient)
+  {
+    DALI_LOG_ERROR("RadialGradient is null\n");
+    return false;
+  }
+
+  if(mTvgRadialGradient->radial(&centerPoint.x, &centerPoint.y, &radius) != tvg::Result::Success)
+  {
+    DALI_LOG_ERROR("GetBounds() fail.\n");
+    return false;
+  }
+
+  return true;
+#else
+  return false;
+#endif
+}
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/canvas-renderer/ubuntu/radial-gradient-impl-ubuntu.h b/dali/internal/canvas-renderer/ubuntu/radial-gradient-impl-ubuntu.h
new file mode 100644 (file)
index 0000000..efee704
--- /dev/null
@@ -0,0 +1,93 @@
+#ifndef DALI_INTERNAL_UBUNTU_RADIAL_GRADIENT_IMPL_UBUNTU_H
+#define DALI_INTERNAL_UBUNTU_RADIAL_GRADIENT_IMPL_UBUNTU_H
+
+/*
+ * Copyright (c) 2021 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.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ *
+ */
+
+// EXTERNAL INCLUDES
+#ifdef THORVG_SUPPORT
+#include <thorvg.h>
+#endif
+#include <dali/public-api/object/base-object.h>
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/canvas-renderer-radial-gradient.h>
+#include <dali/internal/canvas-renderer/common/radial-gradient-impl.h>
+
+namespace Dali
+{
+namespace Internal
+{
+namespace Adaptor
+{
+/**
+ * Dali internal RadialGradient.
+ */
+class RadialGradientUbuntu : public Dali::Internal::Adaptor::RadialGradient
+{
+public:
+  /**
+   * @brief Creates a RadialGradient object.
+   * @return A pointer to a newly allocated drawablegroup
+   */
+  static RadialGradientUbuntu* New();
+
+  /**
+   * @copydoc Dali::CanvasRenderer::RadialGradient::SetBounds()
+   */
+  bool SetBounds(Vector2 centerPoint, float radius) override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::RadialGradient::SetBounds()
+   */
+  bool GetBounds(Vector2& centerPoint, float& radius) const override;
+
+private:
+  RadialGradientUbuntu(const RadialGradientUbuntu&) = delete;
+  RadialGradientUbuntu& operator=(RadialGradientUbuntu&) = delete;
+  RadialGradientUbuntu(RadialGradientUbuntu&&)           = delete;
+  RadialGradientUbuntu& operator=(RadialGradientUbuntu&&) = delete;
+
+  /**
+   * @brief Constructor
+   */
+  RadialGradientUbuntu();
+
+  /**
+   * @brief Destructor.
+   */
+  virtual ~RadialGradientUbuntu() override;
+
+private:
+  /**
+   * @brief Initializes member data.
+   */
+  void Initialize();
+
+private:
+#ifdef THORVG_SUPPORT
+  tvg::RadialGradient* mTvgRadialGradient;
+#endif
+};
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
+
+#endif // DALI_INTERNAL_UBUNTU_RADIAL_GRADIENT_IMPL_UBUNTU_H
index 3ed67e7..2c5bb2f 100644 (file)
@@ -46,8 +46,11 @@ ShapeUbuntu* ShapeUbuntu::New()
 }
 
 ShapeUbuntu::ShapeUbuntu()
+: mFillGradient(),
+  mStrokeGradient()
 #ifdef THORVG_SUPPORT
-: mTvgShape(nullptr)
+  ,
+  mTvgShape(nullptr)
 #endif
 {
   Initialize();
@@ -280,6 +283,27 @@ Vector4 ShapeUbuntu::GetFillColor() const
 #endif
 }
 
+bool ShapeUbuntu::SetFillGradient(Dali::CanvasRenderer::Gradient& gradient)
+{
+#ifdef THORVG_SUPPORT
+  if(!Drawable::GetObject() || !mTvgShape)
+  {
+    DALI_LOG_ERROR("Shape is null [%p]\n", this);
+    return false;
+  }
+  mFillGradient = gradient;
+  Drawable::SetChanged(true);
+  return true;
+#else
+  return false;
+#endif
+}
+
+Dali::CanvasRenderer::Gradient ShapeUbuntu::GetFillGradient() const
+{
+  return mFillGradient;
+}
+
 bool ShapeUbuntu::SetFillRule(Dali::CanvasRenderer::Shape::FillRule rule)
 {
 #ifdef THORVG_SUPPORT
@@ -394,6 +418,27 @@ Vector4 ShapeUbuntu::GetStrokeColor() const
 #endif
 }
 
+bool ShapeUbuntu::SetStrokeGradient(Dali::CanvasRenderer::Gradient& gradient)
+{
+#ifdef THORVG_SUPPORT
+  if(!Drawable::GetObject() || !mTvgShape)
+  {
+    DALI_LOG_ERROR("Shape is null [%p]\n", this);
+    return false;
+  }
+  mStrokeGradient = gradient;
+  Drawable::SetChanged(true);
+  return true;
+#else
+  return false;
+#endif
+}
+
+Dali::CanvasRenderer::Gradient ShapeUbuntu::GetStrokeGradient() const
+{
+  return mStrokeGradient;
+}
+
 bool ShapeUbuntu::SetStrokeDash(const Dali::Vector<float> dashPattern)
 {
 #ifdef THORVG_SUPPORT
index c52cf9e..de0be0a 100644 (file)
@@ -98,6 +98,16 @@ public:
   Vector4 GetFillColor() const override;
 
   /**
+   * @copydoc Dali::CanvasRenderer::Shape::SetFillGradient()
+   */
+  bool SetFillGradient(Dali::CanvasRenderer::Gradient& gradient) override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Shape::GetFillGradient()
+   */
+  Dali::CanvasRenderer::Gradient GetFillGradient() const override;
+
+  /**
    * @copydoc Dali::CanvasRenderer::Shape::SetFillRule()
    */
   bool SetFillRule(Dali::CanvasRenderer::Shape::FillRule rule) override;
@@ -128,6 +138,16 @@ public:
   Vector4 GetStrokeColor() const override;
 
   /**
+   * @copydoc Dali::CanvasRenderer::Shape::SetStrokeGradient()
+   */
+  bool SetStrokeGradient(Dali::CanvasRenderer::Gradient& gradient) override;
+
+  /**
+   * @copydoc Dali::CanvasRenderer::Shape::GetStrokeGradient()
+   */
+  Dali::CanvasRenderer::Gradient GetStrokeGradient() const override;
+
+  /**
    * @copydoc Dali::CanvasRenderer::Shape::SetStrokeDash()
    */
   bool SetStrokeDash(const Dali::Vector<float> dashPattern) override;
@@ -179,8 +199,10 @@ private:
    */
   void Initialize();
 
-#ifdef THORVG_SUPPORT
 private:
+  Dali::CanvasRenderer::Gradient mFillGradient;
+  Dali::CanvasRenderer::Gradient mStrokeGradient;
+#ifdef THORVG_SUPPORT
   tvg::Shape* mTvgShape;
 #endif
 };