[dali_2.3.25] Merge branch 'devel/master'
[platform/core/uifw/dali-adaptor.git] / dali / internal / vector-animation / common / vector-animation-renderer-plugin-proxy.cpp
1 /*
2  * Copyright (c) 2023 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
36 } // namespace
37
38 VectorAnimationRendererPluginProxy::VectorAnimationRendererPluginProxy(const std::string& sharedObjectName)
39 : mSharedObjectName(),
40   mLibHandle(NULL),
41   mPlugin(NULL),
42   mCreateVectorAnimationRendererPtr(NULL),
43   mDefaultSignal()
44 {
45   if(!sharedObjectName.empty())
46   {
47     mSharedObjectName = sharedObjectName;
48   }
49   else
50   {
51     mSharedObjectName = DEFAULT_OBJECT_NAME;
52   }
53
54   Initialize();
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()
72 {
73   mLibHandle = dlopen(mSharedObjectName.c_str(), RTLD_LAZY);
74
75   char* error = dlerror();
76   if(mLibHandle == NULL || error != NULL)
77   {
78     DALI_LOG_ERROR("VectorAnimationRendererPluginProxy::Initialize: dlopen error [%s]\n", error);
79     return;
80   }
81
82   // load plugin
83   mCreateVectorAnimationRendererPtr = reinterpret_cast<CreateVectorAnimationRendererFunction>(dlsym(mLibHandle, "CreateVectorAnimationRendererPlugin"));
84
85   error = dlerror();
86   if(mCreateVectorAnimationRendererPtr == NULL || error != NULL)
87   {
88     DALI_LOG_ERROR("VectorAnimationRendererPluginProxy::Initialize: Cannot load symbol: %s\n", error);
89     return;
90   }
91
92   mPlugin = mCreateVectorAnimationRendererPtr();
93   if(!mPlugin)
94   {
95     DALI_LOG_ERROR("VectorAnimationRendererPluginProxy::Initialize: Plugin creation failed\n");
96     return;
97   }
98 }
99
100 void VectorAnimationRendererPluginProxy::Finalize()
101 {
102   if(mPlugin)
103   {
104     mPlugin->Finalize();
105   }
106 }
107
108 bool VectorAnimationRendererPluginProxy::Load(const std::string& url)
109 {
110   if(mPlugin)
111   {
112     return mPlugin->Load(url);
113   }
114   return false;
115 }
116
117 bool VectorAnimationRendererPluginProxy::Load(const Vector<uint8_t>& data)
118 {
119   if(mPlugin)
120   {
121     return mPlugin->Load(data);
122   }
123   return false;
124 }
125
126 void VectorAnimationRendererPluginProxy::SetRenderer(Dali::Renderer renderer)
127 {
128   if(mPlugin)
129   {
130     mPlugin->SetRenderer(renderer);
131   }
132 }
133
134 void VectorAnimationRendererPluginProxy::SetSize(uint32_t width, uint32_t height)
135 {
136   if(mPlugin)
137   {
138     mPlugin->SetSize(width, height);
139   }
140 }
141
142 bool VectorAnimationRendererPluginProxy::Render(uint32_t frameNumber)
143 {
144   if(mPlugin)
145   {
146     return mPlugin->Render(frameNumber);
147   }
148   return false;
149 }
150
151 void VectorAnimationRendererPluginProxy::RenderStopped()
152 {
153   if(mPlugin)
154   {
155     mPlugin->RenderStopped();
156   }
157 }
158
159 uint32_t VectorAnimationRendererPluginProxy::GetTotalFrameNumber() const
160 {
161   if(mPlugin)
162   {
163     return mPlugin->GetTotalFrameNumber();
164   }
165   return 0;
166 }
167
168 float VectorAnimationRendererPluginProxy::GetFrameRate() const
169 {
170   if(mPlugin)
171   {
172     return mPlugin->GetFrameRate();
173   }
174   return 0.0f;
175 }
176
177 void VectorAnimationRendererPluginProxy::GetDefaultSize(uint32_t& width, uint32_t& height) const
178 {
179   if(mPlugin)
180   {
181     mPlugin->GetDefaultSize(width, height);
182   }
183   else
184   {
185     width  = 0;
186     height = 0;
187   }
188 }
189
190 void VectorAnimationRendererPluginProxy::GetLayerInfo(Property::Map& map) const
191 {
192   if(mPlugin)
193   {
194     mPlugin->GetLayerInfo(map);
195   }
196 }
197
198 bool VectorAnimationRendererPluginProxy::GetMarkerInfo(const std::string& marker, uint32_t& startFrame, uint32_t& endFrame) const
199 {
200   if(mPlugin)
201   {
202     return mPlugin->GetMarkerInfo(marker, startFrame, endFrame);
203   }
204   return false;
205 }
206
207 void VectorAnimationRendererPluginProxy::GetMarkerInfo(Property::Map& map) const
208 {
209   if(mPlugin)
210   {
211     mPlugin->GetMarkerInfo(map);
212   }
213 }
214
215 void VectorAnimationRendererPluginProxy::InvalidateBuffer()
216 {
217   if(mPlugin)
218   {
219     mPlugin->InvalidateBuffer();
220   }
221 }
222
223 void VectorAnimationRendererPluginProxy::AddPropertyValueCallback(const std::string& keyPath, Dali::VectorAnimationRenderer::VectorProperty property, CallbackBase* callback, int32_t id)
224 {
225   if(mPlugin)
226   {
227     mPlugin->AddPropertyValueCallback(keyPath, property, callback, id);
228   }
229 }
230
231 void VectorAnimationRendererPluginProxy::KeepRasterizedBuffer()
232 {
233   if(mPlugin)
234   {
235     mPlugin->KeepRasterizedBuffer();
236   }
237 }
238
239 VectorAnimationRendererPlugin::UploadCompletedSignalType& VectorAnimationRendererPluginProxy::UploadCompletedSignal()
240 {
241   if(mPlugin)
242   {
243     return mPlugin->UploadCompletedSignal();
244   }
245   return mDefaultSignal;
246 }
247
248 } // namespace Adaptor
249
250 } // namespace Internal
251
252 } // namespace Dali