bee8d9a8acb6d18617c6e95a28c3ad1c90dbbb3a
[platform/core/uifw/dali-adaptor.git] / dali / internal / vector-animation / common / vector-animation-renderer-plugin-proxy.cpp
1 /*
2  * Copyright (c) 2021 Samsung Electronics Co., Ltd.
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  * http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  *
16  */
17
18 // CLASS HEADER
19 #include <dali/internal/vector-animation/common/vector-animation-renderer-plugin-proxy.h>
20
21 // EXTERNAL INCLUDES
22 #include <dali/integration-api/debug.h>
23 #include <dlfcn.h>
24
25 namespace Dali
26 {
27 namespace Internal
28 {
29 namespace Adaptor
30 {
31 namespace
32 {
33 // The default plugin name
34 const char* DEFAULT_OBJECT_NAME("libdali2-vector-animation-renderer-plugin.so");
35 // The rive animation plugin name
36 const char* RIVE_OBJECT_NAME("libdali2-rive-animation-renderer-plugin.so");
37
38 } // namespace
39
40 VectorAnimationRendererPluginProxy::VectorAnimationRendererPluginProxy(const std::string& sharedObjectName)
41 : mSharedObjectName(),
42   mLibHandle(NULL),
43   mPlugin(NULL),
44   mCreateVectorAnimationRendererPtr(NULL),
45   mDefaultSignal()
46 {
47   if(!sharedObjectName.empty())
48   {
49     mSharedObjectName = sharedObjectName;
50   }
51   else
52   {
53     mSharedObjectName = DEFAULT_OBJECT_NAME;
54   }
55 }
56
57 VectorAnimationRendererPluginProxy::~VectorAnimationRendererPluginProxy()
58 {
59   if(mPlugin)
60   {
61     delete mPlugin;
62     mPlugin = NULL;
63
64     if(mLibHandle && dlclose(mLibHandle))
65     {
66       DALI_LOG_ERROR("Error closing vector animation renderer plugin library: %s\n", dlerror());
67     }
68   }
69 }
70
71 void VectorAnimationRendererPluginProxy::Initialize(AnimationFormat format)
72 {
73   // initialization should be once
74   if(mPlugin)
75   {
76     return;
77   }
78
79   if(format == AnimationFormat::RIVE)
80   {
81     // for Rive
82     mSharedObjectName = RIVE_OBJECT_NAME;
83   }
84   else
85   {
86     // for Json
87     mSharedObjectName = DEFAULT_OBJECT_NAME;
88   }
89
90   mLibHandle = dlopen(mSharedObjectName.c_str(), RTLD_LAZY);
91
92   char* error = dlerror();
93   if(mLibHandle == NULL || error != NULL)
94   {
95     DALI_LOG_ERROR("VectorAnimationRendererPluginProxy::Initialize: dlopen error [%s]\n", error);
96     return;
97   }
98
99   // load plugin
100   mCreateVectorAnimationRendererPtr = reinterpret_cast<CreateVectorAnimationRendererFunction>(dlsym(mLibHandle, "CreateVectorAnimationRendererPlugin"));
101
102   error = dlerror();
103   if(mCreateVectorAnimationRendererPtr == NULL || error != NULL)
104   {
105     DALI_LOG_ERROR("VectorAnimationRendererPluginProxy::Initialize: Cannot load symbol: %s\n", error);
106     return;
107   }
108
109   mPlugin = mCreateVectorAnimationRendererPtr();
110   if(!mPlugin)
111   {
112     DALI_LOG_ERROR("VectorAnimationRendererPluginProxy::Initialize: Plugin creation failed\n");
113     return;
114   }
115 }
116
117 void VectorAnimationRendererPluginProxy::Finalize()
118 {
119   if(mPlugin)
120   {
121     mPlugin->Finalize();
122   }
123 }
124
125 bool VectorAnimationRendererPluginProxy::Load(const std::string& url)
126 {
127   AnimationFormat format;
128   std::string     extensionName = url.substr(url.find_last_of(".") + 1);
129   if(extensionName == "riv")
130   {
131     format = AnimationFormat::RIVE;
132   }
133   else
134   {
135     format = AnimationFormat::JSON;
136   }
137
138   Initialize(format);
139
140   if(mPlugin)
141   {
142     return mPlugin->Load(url);
143   }
144   return false;
145 }
146
147 void VectorAnimationRendererPluginProxy::SetRenderer(Dali::Renderer renderer)
148 {
149   if(mPlugin)
150   {
151     mPlugin->SetRenderer(renderer);
152   }
153 }
154
155 void VectorAnimationRendererPluginProxy::SetSize(uint32_t width, uint32_t height)
156 {
157   if(mPlugin)
158   {
159     mPlugin->SetSize(width, height);
160   }
161 }
162
163 bool VectorAnimationRendererPluginProxy::Render(uint32_t frameNumber)
164 {
165   if(mPlugin)
166   {
167     return mPlugin->Render(frameNumber);
168   }
169   return false;
170 }
171
172 uint32_t VectorAnimationRendererPluginProxy::GetTotalFrameNumber() const
173 {
174   if(mPlugin)
175   {
176     return mPlugin->GetTotalFrameNumber();
177   }
178   return 0;
179 }
180
181 float VectorAnimationRendererPluginProxy::GetFrameRate() const
182 {
183   if(mPlugin)
184   {
185     return mPlugin->GetFrameRate();
186   }
187   return 0.0f;
188 }
189
190 void VectorAnimationRendererPluginProxy::GetDefaultSize(uint32_t& width, uint32_t& height) const
191 {
192   if(mPlugin)
193   {
194     mPlugin->GetDefaultSize(width, height);
195   }
196 }
197
198 void VectorAnimationRendererPluginProxy::GetLayerInfo(Property::Map& map) const
199 {
200   if(mPlugin)
201   {
202     mPlugin->GetLayerInfo(map);
203   }
204 }
205
206 bool VectorAnimationRendererPluginProxy::GetMarkerInfo(const std::string& marker, uint32_t& startFrame, uint32_t& endFrame) const
207 {
208   if(mPlugin)
209   {
210     return mPlugin->GetMarkerInfo(marker, startFrame, endFrame);
211   }
212   return false;
213 }
214
215 void VectorAnimationRendererPluginProxy::IgnoreRenderedFrame()
216 {
217   if(mPlugin)
218   {
219     mPlugin->IgnoreRenderedFrame();
220   }
221 }
222
223 VectorAnimationRendererPlugin::UploadCompletedSignalType& VectorAnimationRendererPluginProxy::UploadCompletedSignal()
224 {
225   if(mPlugin)
226   {
227     return mPlugin->UploadCompletedSignal();
228   }
229   return mDefaultSignal;
230 }
231
232 } // namespace Adaptor
233
234 } // namespace Internal
235
236 } // namespace Dali