Introduce VectorImageRenderer 92/239592/22
authorJunsuChoi <jsuya.choi@samsung.com>
Mon, 27 Jul 2020 11:54:06 +0000 (20:54 +0900)
committerHeeyong Song <heeyong.song@samsung.com>
Tue, 22 Sep 2020 01:50:12 +0000 (01:50 +0000)
The SvgVisual of dali-toolkit will use this instead of nanovg.
And this will use dali-extension which is using tizenvg.

Change-Id: Ic9dc1c68cf3ab266036848b32276b72920c33a71

18 files changed:
build/tizen/module-list.cmake
build/tizen/profiles/android-profile.cmake
build/tizen/profiles/common-profile.cmake
build/tizen/profiles/ivi-profile.cmake
build/tizen/profiles/mobile-profile.cmake
build/tizen/profiles/tv-profile.cmake
build/tizen/profiles/ubuntu-profile.cmake
build/tizen/profiles/wearable-profile.cmake
build/tizen/profiles/windows-profile.cmake
dali/devel-api/adaptor-framework/vector-image-renderer-plugin.h [new file with mode: 0644]
dali/devel-api/adaptor-framework/vector-image-renderer.cpp [new file with mode: 0644]
dali/devel-api/adaptor-framework/vector-image-renderer.h [new file with mode: 0644]
dali/devel-api/file.list
dali/internal/vector-image/common/vector-image-renderer-impl.cpp [new file with mode: 0644]
dali/internal/vector-image/common/vector-image-renderer-impl.h [new file with mode: 0755]
dali/internal/vector-image/common/vector-image-renderer-plugin-proxy.cpp [new file with mode: 0644]
dali/internal/vector-image/common/vector-image-renderer-plugin-proxy.h [new file with mode: 0644]
dali/internal/vector-image/file.list [new file with mode: 0644]

index 161d1de..7d5c8ae 100644 (file)
@@ -58,6 +58,9 @@ include( ${ADAPTOR_ROOT}/dali/internal/thread/file.list )
 SET( adaptor_vector_animation_dir ${ADAPTOR_ROOT}/dali/internal/vector-animation )
 include( ${ADAPTOR_ROOT}/dali/internal/vector-animation/file.list )
 
+SET( adaptor_vector_image_dir ${ADAPTOR_ROOT}/dali/internal/vector-image )
+include( ${ADAPTOR_ROOT}/dali/internal/vector-image/file.list )
+
 SET( adaptor_public_api_dir ${ADAPTOR_ROOT}/dali/public-api )
 include( ${ADAPTOR_ROOT}/dali/public-api/file.list )
 
@@ -135,6 +138,9 @@ include( ${ADAPTOR_ROOT}/dali/internal/addons/file.list )
 SET( adaptor_vector_animation_dir ${ADAPTOR_ROOT}/dali/internal/vector-animation )
 include( ${ADAPTOR_ROOT}/dali/internal/vector-animation/file.list )
 
+SET( adaptor_vector_image_dir ${ADAPTOR_ROOT}/dali/internal/vector-image )
+include( ${ADAPTOR_ROOT}/dali/internal/vector-image/file.list )
+
 SET( adaptor_public_api_dir ${ADAPTOR_ROOT}/dali/public-api )
 include( ${ADAPTOR_ROOT}/dali/public-api/file.list )
 
index 5862cec..cca80f4 100644 (file)
@@ -33,6 +33,7 @@ SET( SOURCES
         ${adaptor_text_common_src_files}
         ${adaptor_resampler_src_files}
         ${adaptor_vector_animation_common_src_files}
+        ${adaptor_vector_image_common_src_files}
         ${adaptor_video_common_src_files}
         ${adaptor_web_engine_common_src_files}
         ${adaptor_window_system_common_src_files}
index e1afc1e..ecfe5d7 100644 (file)
@@ -33,6 +33,7 @@ SET( SOURCES
     ${adaptor_text_common_src_files}
     ${adaptor_resampler_src_files}
     ${adaptor_vector_animation_common_src_files}
+    ${adaptor_vector_image_common_src_files}
     ${adaptor_video_common_src_files}
     ${adaptor_web_engine_common_src_files}
     ${adaptor_window_system_common_src_files}
index aebd8b6..27a0e3b 100644 (file)
@@ -34,6 +34,7 @@ SET( SOURCES
      ${adaptor_text_common_src_files}
      ${adaptor_resampler_src_files}
      ${adaptor_vector_animation_common_src_files}
+     ${adaptor_vector_image_common_src_files}
      ${adaptor_video_common_src_files}
      ${adaptor_web_engine_common_src_files}
      ${adaptor_window_system_common_src_files}
index a53da27..86a3afd 100644 (file)
@@ -33,6 +33,7 @@ SET( SOURCES
         ${adaptor_text_common_src_files}
         ${adaptor_resampler_src_files}
         ${adaptor_vector_animation_common_src_files}
+        ${adaptor_vector_image_common_src_files}
         ${adaptor_video_common_src_files}
         ${adaptor_web_engine_common_src_files}
         ${adaptor_window_system_common_src_files}
index 2469de7..eb29538 100644 (file)
@@ -33,6 +33,7 @@ SET( SOURCES
     ${adaptor_text_common_src_files}
     ${adaptor_resampler_src_files}
     ${adaptor_vector_animation_common_src_files}
+    ${adaptor_vector_image_common_src_files}
     ${adaptor_video_common_src_files}
     ${adaptor_web_engine_common_src_files}
     ${adaptor_window_system_common_src_files}
index 82643fa..405b190 100644 (file)
@@ -33,6 +33,7 @@ SET( SOURCES
         ${adaptor_text_ubuntu_src_files}
         ${adaptor_resampler_src_files}
         ${adaptor_vector_animation_common_src_files}
+        ${adaptor_vector_image_common_src_files}
         ${adaptor_video_common_src_files}
         ${adaptor_web_engine_common_src_files}
         ${adaptor_window_system_common_src_files}
index 2a908d0..c01896f 100644 (file)
@@ -35,6 +35,7 @@ SET( SOURCES
     ${adaptor_text_common_src_files}
     ${adaptor_resampler_src_files}
     ${adaptor_vector_animation_common_src_files}
+    ${adaptor_vector_image_common_src_files}
     ${adaptor_video_common_src_files}
     ${adaptor_web_engine_common_src_files}
     ${adaptor_window_system_common_src_files}
index c39c3bd..b4b9b23 100644 (file)
@@ -25,6 +25,7 @@ SET( SOURCES
         ${adaptor_text_common_src_files}
         ${adaptor_resampler_src_files}
         ${adaptor_vector_animation_common_src_files}
+        ${adaptor_vector_image_common_src_files}
         ${adaptor_video_common_src_files}
         ${adaptor_web_engine_common_src_files}
         ${adaptor_window_system_common_src_files}
diff --git a/dali/devel-api/adaptor-framework/vector-image-renderer-plugin.h b/dali/devel-api/adaptor-framework/vector-image-renderer-plugin.h
new file mode 100644 (file)
index 0000000..0aa57cd
--- /dev/null
@@ -0,0 +1,101 @@
+#ifndef DALI_VECTOR_IMAGE_RENDERER_PLUGIN_H
+#define DALI_VECTOR_IMAGE_RENDERER_PLUGIN_H
+
+/*
+ * Copyright (c) 2020 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 <string>
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/vector-image-renderer.h>
+#include <dali/devel-api/adaptor-framework/pixel-buffer.h>
+
+namespace Dali
+{
+
+/**
+ * VectorImageRendererPlugin is an abstract interface, used by dali-adaptor to render a vector image(SVG).
+ * A concrete implementation must be created for each platform and provided as a dynamic library which
+ * will be loaded at run time by the adaptor.
+ */
+class VectorImageRendererPlugin
+{
+public:
+  /**
+   * @brief Constructor
+   */
+  VectorImageRendererPlugin() {}
+
+  /**
+   * @brief Destructor
+   */
+  virtual ~VectorImageRendererPlugin() {}
+
+  /**
+   * @brief Second-phase constructor.
+   */
+  virtual bool Initialize() = 0;
+
+  /**
+   * @brief Sets the target buffer.
+   *
+   * @param[in] buffer The target buffer
+   */
+  virtual void SetBuffer( Dali::Devel::PixelBuffer &buffer ) = 0;
+
+  /**
+   * @brief Renders the content to the target buffer synchronously.
+   *
+   * @param[in] scale The target image scale
+   * @return True if the rendering success, false otherwise.
+   */
+  virtual bool Render(float scale) = 0;
+
+  /**
+   * @brief Load vector image data form url.
+   *
+   * @param[in] url The url of the vector image file
+   * @return True if the load success, false otherwise.
+   */
+  virtual bool Load( const std::string& url ) = 0;
+
+  /**
+   * @brief Load vector image data directly.
+   *
+   * @param[in] data The memory data of vector image
+   * @param[in] size The size of memory data
+   * @return True if the load success, false otherwise.
+   */
+  virtual bool Load( const char *data, uint32_t size ) = 0;
+
+  /**
+   * @brief Gets the default size of the file.
+   *
+   * @param[out] width The default width of the file
+   * @param[out] height The default height of the file
+   */
+  virtual void GetDefaultSize( uint32_t& width, uint32_t& height ) const = 0;
+
+  /**
+   * @brief Function pointer called in adaptor to create a plugin instance.
+   */
+  using CreateVectorImageRendererFunction = VectorImageRendererPlugin* (*)();
+};
+
+} // namespace Dali
+#endif // DALI_VECTOR_IMAGE_RENDERER_PLUGIN_H
diff --git a/dali/devel-api/adaptor-framework/vector-image-renderer.cpp b/dali/devel-api/adaptor-framework/vector-image-renderer.cpp
new file mode 100644 (file)
index 0000000..8617ede
--- /dev/null
@@ -0,0 +1,76 @@
+/*
+ * Copyright (c) 2020 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/vector-image-renderer.h>
+
+// INTERNAL INCLUDES
+#include <dali/internal/vector-image/common/vector-image-renderer-impl.h>
+
+namespace Dali
+{
+
+VectorImageRenderer VectorImageRenderer::New()
+{
+  Internal::Adaptor::VectorImageRendererPtr imageRenderer = Internal::Adaptor::VectorImageRenderer::New();
+  if( imageRenderer )
+  {
+    imageRenderer->Initialize();
+  }
+
+  return VectorImageRenderer( imageRenderer.Get() );
+}
+
+VectorImageRenderer::VectorImageRenderer()
+{
+}
+
+VectorImageRenderer::~VectorImageRenderer()
+{
+}
+
+VectorImageRenderer::VectorImageRenderer( Internal::Adaptor::VectorImageRenderer* internal )
+: BaseHandle( internal )
+{
+}
+
+void VectorImageRenderer::SetBuffer( Dali::Devel::PixelBuffer &buffer )
+{
+  GetImplementation( *this ).SetBuffer( buffer );
+}
+
+bool VectorImageRenderer::Render(float scale)
+{
+  return GetImplementation( *this ).Render(scale);
+}
+
+bool VectorImageRenderer::Load( const std::string& url )
+{
+  return GetImplementation( *this ).Load( url );
+}
+
+bool VectorImageRenderer::Load( const char *data, uint32_t size )
+{
+  return GetImplementation( *this ).Load( data, size );
+}
+
+void VectorImageRenderer::GetDefaultSize( uint32_t& width, uint32_t& height ) const
+{
+  GetImplementation( *this ).GetDefaultSize( width, height );
+}
+
+} // namespace Dali
diff --git a/dali/devel-api/adaptor-framework/vector-image-renderer.h b/dali/devel-api/adaptor-framework/vector-image-renderer.h
new file mode 100644 (file)
index 0000000..92c8004
--- /dev/null
@@ -0,0 +1,143 @@
+#ifndef DALI_VECTOR_IMAGE_RENDERER_H
+#define DALI_VECTOR_IMAGE_RENDERER_H
+
+/*
+ * Copyright (c) 2020 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/public-api/dali-adaptor-common.h>
+#include <dali/devel-api/adaptor-framework/pixel-buffer.h>
+
+namespace Dali
+{
+/**
+ * @addtogroup dali_adaptor_framework
+ * @{
+ */
+
+namespace Internal DALI_INTERNAL
+{
+namespace Adaptor
+{
+class VectorImageRenderer;
+}
+}
+
+/**
+ * @brief Used for rendering a vector image file (SVG)
+ */
+class DALI_ADAPTOR_API VectorImageRenderer : public BaseHandle
+{
+public:
+
+  /**
+   * @brief Creates an initialized handle to a new VectorImageRenderer.
+   *
+   * @return A handle to a newly allocated VectorImageRenderer
+   */
+  static VectorImageRenderer New();
+
+
+  /**
+   * @brief Creates an empty handle.
+   * Use VectorImageRenderer::New() to create an initialized object.
+   */
+  VectorImageRenderer();
+
+  /**
+   * @brief Destructor.
+   */
+  ~VectorImageRenderer();
+
+  /**
+   * @brief This copy constructor is required for (smart) pointer semantics.
+   *
+   * @param[in] handle A reference to the copied handle
+   */
+  VectorImageRenderer( const VectorImageRenderer& handle ) = default;
+
+  /**
+   * @brief This assignment operator is required for (smart) pointer semantics.
+   *
+   * @param[in] rhs A reference to the copied handle
+   * @return A reference to this
+   */
+  VectorImageRenderer& operator=( const VectorImageRenderer& rhs ) = default;
+
+  /**
+   * @brief Sets the target buffer.
+   *
+   * @param[in] buffer The target buffer
+   */
+  void SetBuffer( Dali::Devel::PixelBuffer &buffer );
+
+  /**
+   * @brief Renders the content to the target buffer synchronously.
+   *
+   * @param[in] scale The target image scale
+   * @return True if the rendering success, false otherwise.
+   */
+  bool Render( float scale );
+
+  /**
+   * @brief Load vector image data form url.
+   *
+   * @param[in] url The url of the vector image file
+   * @return True if the rendering success, false otherwise.
+   */
+  bool Load( const std::string& url );
+
+  /**
+   * @brief Load vector image data directly.
+   *
+   * @param[in] data The memory data of vector image
+   * @param[in] size The size of memory data
+   * @return True if the load success, false otherwise.
+   */
+  bool Load( const char *data, uint32_t size );
+
+  /**
+   * @brief Gets the default size of the file.
+   *
+   * @param[out] width The default width of the file
+   * @param[out] height The default height of the file
+   */
+  void GetDefaultSize( uint32_t& width, uint32_t& height ) 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 VectorImageRenderer
+   */
+  explicit DALI_INTERNAL VectorImageRenderer( Internal::Adaptor::VectorImageRenderer* internal );
+  /// @endcond
+
+};
+
+/**
+ * @}
+ */
+} // namespace Dali
+
+#endif // DALI_VECTOR_IMAGE_RENDERER_H
index bfbccb5..0dcd1b8 100755 (executable)
@@ -29,6 +29,7 @@ SET( devel_api_src_files
   ${adaptor_devel_api_dir}/adaptor-framework/tilt-sensor.cpp
   ${adaptor_devel_api_dir}/adaptor-framework/lifecycle-controller.cpp
   ${adaptor_devel_api_dir}/adaptor-framework/vector-animation-renderer.cpp
+  ${adaptor_devel_api_dir}/adaptor-framework/vector-image-renderer.cpp
   ${adaptor_devel_api_dir}/adaptor-framework/video-player.cpp
   ${adaptor_devel_api_dir}/adaptor-framework/virtual-keyboard.cpp
   ${adaptor_devel_api_dir}/adaptor-framework/thread-settings.cpp
@@ -75,6 +76,8 @@ SET( devel_api_adaptor_framework_header_files
   ${adaptor_devel_api_dir}/adaptor-framework/tilt-sensor.h
   ${adaptor_devel_api_dir}/adaptor-framework/vector-animation-renderer.h
   ${adaptor_devel_api_dir}/adaptor-framework/vector-animation-renderer-plugin.h
+  ${adaptor_devel_api_dir}/adaptor-framework/vector-image-renderer.h
+  ${adaptor_devel_api_dir}/adaptor-framework/vector-image-renderer-plugin.h
   ${adaptor_devel_api_dir}/adaptor-framework/video-player.h
   ${adaptor_devel_api_dir}/adaptor-framework/video-player-plugin.h
   ${adaptor_devel_api_dir}/adaptor-framework/web-engine.h
diff --git a/dali/internal/vector-image/common/vector-image-renderer-impl.cpp b/dali/internal/vector-image/common/vector-image-renderer-impl.cpp
new file mode 100644 (file)
index 0000000..1a4a084
--- /dev/null
@@ -0,0 +1,93 @@
+/*
+ * Copyright (c) 2020 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/vector-image/common/vector-image-renderer-impl.h>
+
+// EXTERNAL INCLUDES
+#include <dali/public-api/object/type-registry.h>
+
+// INTERNAL INCLUDES
+
+namespace Dali
+{
+
+namespace Internal
+{
+
+namespace Adaptor
+{
+
+namespace // unnamed namespace
+{
+
+// Type Registration
+Dali::BaseHandle Create()
+{
+  return Dali::BaseHandle();
+}
+
+Dali::TypeRegistration type( typeid( Dali::VectorImageRenderer ), typeid( Dali::BaseHandle ), Create );
+
+} // unnamed namespace
+
+VectorImageRendererPtr VectorImageRenderer::New()
+{
+  VectorImageRendererPtr renderer = new VectorImageRenderer();
+  return renderer;
+}
+
+VectorImageRenderer::VectorImageRenderer()
+: mPlugin( std::string() )
+{
+}
+
+void VectorImageRenderer::Initialize()
+{
+  mPlugin.Initialize();
+}
+
+void VectorImageRenderer::SetBuffer( Dali::Devel::PixelBuffer &buffer )
+{
+  mPlugin.SetBuffer( buffer );
+}
+
+bool VectorImageRenderer::Render(float scale)
+{
+  return mPlugin.Render( scale );
+}
+
+bool VectorImageRenderer::Load( const std::string& url )
+{
+  return mPlugin.Load( url );
+}
+
+bool VectorImageRenderer::Load( const char *data, uint32_t size )
+{
+  return mPlugin.Load( data, size );
+}
+
+void VectorImageRenderer::GetDefaultSize( uint32_t& width, uint32_t& height ) const
+{
+  mPlugin.GetDefaultSize( width, height );
+}
+
+} // namespace Adaptor
+
+} // namespace internal
+
+} // namespace Dali
diff --git a/dali/internal/vector-image/common/vector-image-renderer-impl.h b/dali/internal/vector-image/common/vector-image-renderer-impl.h
new file mode 100755 (executable)
index 0000000..405de4a
--- /dev/null
@@ -0,0 +1,132 @@
+#ifndef DALI_INTERNAL_VECTOR_IMAGE_RENDERER_IMPL_H
+#define DALI_INTERNAL_VECTOR_IMAGE_RENDERER_IMPL_H
+
+/*
+ * Copyright (c) 2020 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>
+#include <dali/public-api/signals/connection-tracker.h>
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/vector-image-renderer.h>
+#include <dali/internal/vector-image/common/vector-image-renderer-plugin-proxy.h>
+#include <dali/devel-api/adaptor-framework/pixel-buffer.h>
+
+namespace Dali
+{
+
+namespace Internal
+{
+
+namespace Adaptor
+{
+
+class VectorImageRenderer;
+using VectorImageRendererPtr = IntrusivePtr< VectorImageRenderer >;
+
+/**
+ * Dali internal VectorImageRenderer.
+ */
+class VectorImageRenderer : public BaseObject, public ConnectionTracker
+{
+public:
+
+  /**
+   * @brief Creates a VectorImageRenderer object.
+   *
+   * @return A handle to a newly allocated VectorImageRenderer
+   */
+  static VectorImageRendererPtr New();
+
+  /**
+   * @brief Initializes member data.
+   */
+  void Initialize();
+
+  /**
+   * @copydoc Dali::VectorImageRenderer::SetBuffer()
+   */
+  void SetBuffer( Dali::Devel::PixelBuffer &buffer );
+
+  /**
+   * @copydoc Dali::VectorImageRenderer::Render()
+   */
+  bool Render(float scale);
+
+  /**
+   * @copydoc Dali::VectorImageRenderer::Load()
+   */
+  bool Load( const std::string& url );
+
+  /**
+   * @copydoc Dali::VectorImageRenderer::Load()
+   */
+  bool Load( const char *data, uint32_t size );
+
+  /**
+   * @copydoc Dali::VectorImageRenderer::GetDefaultSize()
+   */
+  void GetDefaultSize( uint32_t& width, uint32_t& height ) const;
+
+  VectorImageRenderer( const VectorImageRenderer& ) = delete;
+  VectorImageRenderer& operator=( VectorImageRenderer& )  = delete;
+  VectorImageRenderer( VectorImageRenderer&& ) = delete;
+  VectorImageRenderer& operator=( VectorImageRenderer&& )  = delete;
+
+private:
+
+  /**
+   * @brief Constructor
+   */
+  VectorImageRenderer();
+
+  /**
+   * @brief Destructor.
+   */
+  ~VectorImageRenderer() = default;
+
+private:
+
+  VectorImageRendererPluginProxy mPlugin;
+};
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+inline static Internal::Adaptor::VectorImageRenderer& GetImplementation( Dali::VectorImageRenderer& renderer )
+{
+  DALI_ASSERT_ALWAYS( renderer && "VectorImageRenderer handle is empty." );
+
+  BaseObject& handle = renderer.GetBaseObject();
+
+  return static_cast< Internal::Adaptor::VectorImageRenderer& >( handle );
+}
+
+inline static const Internal::Adaptor::VectorImageRenderer& GetImplementation( const Dali::VectorImageRenderer& renderer )
+{
+  DALI_ASSERT_ALWAYS( renderer && "VectorImageRenderer handle is empty." );
+
+  const BaseObject& handle = renderer.GetBaseObject();
+
+  return static_cast< const Internal::Adaptor::VectorImageRenderer& >( handle );
+}
+
+} // namespace Dali
+
+#endif // DALI_INTERNAL_VECTOR_IMAGE_RENDERER_IMPL_H
diff --git a/dali/internal/vector-image/common/vector-image-renderer-plugin-proxy.cpp b/dali/internal/vector-image/common/vector-image-renderer-plugin-proxy.cpp
new file mode 100644 (file)
index 0000000..a1e1e9a
--- /dev/null
@@ -0,0 +1,155 @@
+/*
+ * Copyright (c) 2020 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/vector-image/common/vector-image-renderer-plugin-proxy.h>
+
+// EXTERNAL INCLUDES
+#include <dlfcn.h>
+#include <dali/integration-api/debug.h>
+
+namespace Dali
+{
+
+namespace Internal
+{
+
+namespace Adaptor
+{
+
+namespace
+{
+
+// The default plugin name
+const char* DEFAULT_OBJECT_NAME( "libdali2-vector-image-renderer-plugin.so" );
+
+}
+
+VectorImageRendererPluginProxy::VectorImageRendererPluginProxy( std::string sharedObjectName )
+: mSharedObjectName(std::move(sharedObjectName)),
+  mLibHandle( nullptr ),
+  mPlugin( nullptr ),
+  mCreateVectorImageRendererPtr( nullptr )
+{
+  if( mSharedObjectName.empty() )
+  {
+    mSharedObjectName = DEFAULT_OBJECT_NAME;
+  }
+
+  InitializePlugin();
+}
+
+VectorImageRendererPluginProxy::~VectorImageRendererPluginProxy()
+{
+  if( mPlugin )
+  {
+    delete mPlugin;
+    mPlugin = nullptr;
+
+    if( mLibHandle && dlclose( mLibHandle ) )
+    {
+      DALI_LOG_ERROR( "Error closing vector image renderer plugin library: %s\n", dlerror() );
+    }
+  }
+}
+
+void VectorImageRendererPluginProxy::InitializePlugin()
+{
+  mLibHandle = dlopen( mSharedObjectName.c_str(), RTLD_LAZY );
+
+  char* error = dlerror();
+  if( mLibHandle == nullptr || error != nullptr )
+  {
+    DALI_LOG_ERROR( "VectorImageRendererPluginProxy::Initialize: dlopen error [%s]\n", error );
+    return;
+  }
+
+  // load plugin
+  mCreateVectorImageRendererPtr = reinterpret_cast< CreateVectorImageRendererFunction >( dlsym( mLibHandle, "CreateVectorImageRendererPlugin" ) );
+
+  error = dlerror();
+  if( mCreateVectorImageRendererPtr == nullptr || error != nullptr )
+  {
+    DALI_LOG_ERROR( "VectorImageRendererPluginProxy::Initialize: Cannot load symbol: %s\n", error );
+    return;
+  }
+
+  mPlugin = mCreateVectorImageRendererPtr();
+  if( !mPlugin )
+  {
+    DALI_LOG_ERROR("VectorImageRendererPluginProxy::Initialize: Plugin creation failed\n");
+    return;
+  }
+}
+
+bool VectorImageRendererPluginProxy::Initialize()
+{
+  if( mPlugin )
+  {
+    return mPlugin->Initialize();
+  }
+  return false;
+}
+
+void VectorImageRendererPluginProxy::SetBuffer( Dali::Devel::PixelBuffer &buffer )
+{
+  if( mPlugin )
+  {
+    mPlugin->SetBuffer( buffer );
+  }
+}
+
+bool VectorImageRendererPluginProxy::Render(float scale)
+{
+  if( mPlugin )
+  {
+    return mPlugin->Render( scale );
+  }
+  return false;
+}
+
+bool VectorImageRendererPluginProxy::Load( const std::string& url )
+{
+  if( mPlugin )
+  {
+    return mPlugin->Load( url );
+  }
+  return false;
+}
+
+bool VectorImageRendererPluginProxy::Load( const char *data, uint32_t size )
+{
+  if( mPlugin )
+  {
+    return mPlugin->Load( data, size );
+  }
+  return false;
+}
+
+void VectorImageRendererPluginProxy::GetDefaultSize( uint32_t& width, uint32_t& height ) const
+{
+  if( mPlugin )
+  {
+    mPlugin->GetDefaultSize( width, height );
+  }
+}
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
diff --git a/dali/internal/vector-image/common/vector-image-renderer-plugin-proxy.h b/dali/internal/vector-image/common/vector-image-renderer-plugin-proxy.h
new file mode 100644 (file)
index 0000000..f233403
--- /dev/null
@@ -0,0 +1,113 @@
+#ifndef DALI_INTERNAL_VECTOR_IMAGE_RENDERER_PLUGIN_PROXY_H
+#define DALI_INTERNAL_VECTOR_IMAGE_RENDERER_PLUGIN_PROXY_H
+
+/*
+ * Copyright (c) 2020 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.
+ *
+ */
+
+// INTERNAL INCLUDES
+#include <dali/devel-api/adaptor-framework/vector-image-renderer-plugin.h>
+#include <dali/devel-api/adaptor-framework/pixel-buffer.h>
+#include <memory>
+
+namespace Dali
+{
+
+namespace Internal
+{
+
+namespace Adaptor
+{
+
+/**
+ * Proxy class to dynamically load, use and unload vector image renderer plugin.
+ */
+class VectorImageRendererPluginProxy
+{
+public:
+
+  /**
+   * @brief Constructor
+   */
+  VectorImageRendererPluginProxy( std::string sharedObjectName );
+
+  /**
+   * @brief Destructor
+   */
+  ~VectorImageRendererPluginProxy();
+
+  /**
+   * @copydoc Dali::VectorImageRendererPlugin::Initialize()
+   */
+  bool Initialize();
+
+  /**
+   * @copydoc Dali::VectorImageRendererPlugin::SetBuffer()
+   */
+  void SetBuffer( Dali::Devel::PixelBuffer &buffer );
+
+  /**
+   * @copydoc Dali::VectorImageRendererPlugin::Render()
+   */
+  bool Render(float scale);
+
+  /**
+   * @copydoc Dali::VectorImageRendererPlugin::Load()
+   */
+  bool Load( const std::string& url );
+
+  /**
+   * @copydoc Dali::VectorImageRendererPlugin::Load()
+   */
+  bool Load( const char *data, uint32_t size );
+
+  /**
+   * @copydoc Dali::VectorImageRendererPlugin::GetDefaultSize()
+   */
+  void GetDefaultSize( uint32_t& width, uint32_t& height ) const;
+
+  // Not copyable or movable
+  VectorImageRendererPluginProxy( const VectorImageRendererPluginProxy& ) = delete; ///< Deleted copy constructor
+  VectorImageRendererPluginProxy( VectorImageRendererPluginProxy&& ) = delete; ///< Deleted move constructor
+  VectorImageRendererPluginProxy& operator=( const VectorImageRendererPluginProxy& ) = delete; ///< Deleted copy assignment operator
+  VectorImageRendererPluginProxy& operator=( VectorImageRendererPluginProxy&& ) = delete; ///< Deleted move assignment operator
+
+private:
+
+  /**
+   * Dynamically loads the plugin.
+   */
+  void InitializePlugin();
+
+private:
+
+  using CreateVectorImageRendererFunction = Dali::VectorImageRendererPlugin* (*)();
+
+  std::string                        mSharedObjectName;   ///< Shared object name
+  void*                              mLibHandle;          ///< Handle for the loaded library
+  Dali::VectorImageRendererPlugin*   mPlugin;             ///< Plugin handle
+
+  CreateVectorImageRendererFunction  mCreateVectorImageRendererPtr;   ///< Function pointer called in adaptor to create a plugin instance
+
+};
+
+} // namespace Adaptor
+
+} // namespace Internal
+
+} // namespace Dali
+
+#endif // DALI_INTERNAL_VECTOR_IMAGE_RENDERER_PLUGIN_PROXY_H
diff --git a/dali/internal/vector-image/file.list b/dali/internal/vector-image/file.list
new file mode 100644 (file)
index 0000000..f2c5f92
--- /dev/null
@@ -0,0 +1,7 @@
+
+# module: vector-image, backend: common
+SET( adaptor_vector_image_common_src_files
+    ${adaptor_vector_image_dir}/common/vector-image-renderer-impl.cpp
+    ${adaptor_vector_image_dir}/common/vector-image-renderer-plugin-proxy.cpp
+)
+