8289c9e5d853bb38015a2561f37265d2f3411e77
[platform/core/uifw/dali-adaptor.git] / dali / integration-api / adaptor-framework / scene-holder-impl.h
1 #ifndef DALI_INTEGRATION_INTERNAL_SCENEHOLDER_H
2 #define DALI_INTEGRATION_INTERNAL_SCENEHOLDER_H
3
4 /*
5  * Copyright (c) 2020 Samsung Electronics Co., Ltd.
6  *
7  * Licensed under the Apache License, Version 2.0 (the "License");
8  * you may not use this file except in compliance with the License.
9  * You may obtain a copy of the License at
10  *
11  * http://www.apache.org/licenses/LICENSE-2.0
12  *
13  * Unless required by applicable law or agreed to in writing, software
14  * distributed under the License is distributed on an "AS IS" BASIS,
15  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16  * See the License for the specific language governing permissions and
17  * limitations under the License.
18  *
19  */
20
21 // EXTERNAL INCLUDES
22 #include <memory>
23 #include <vector>
24 #include <atomic>
25 #include <dali/public-api/object/base-object.h>
26 #include <dali/public-api/common/intrusive-ptr.h>
27 #include <dali/public-api/math/uint-16-pair.h>
28 #include <dali/integration-api/scene.h>
29 #include <dali/integration-api/events/key-event-integ.h>
30 #include <dali/integration-api/events/point.h>
31 #include <dali/integration-api/events/touch-event-combiner.h>
32
33 // INTERNAL INCLUDES
34 #include <dali/integration-api/adaptor-framework/render-surface-interface.h>
35 #include <dali/integration-api/adaptor-framework/scene-holder.h>
36
37 namespace Dali
38 {
39
40 class Any;
41 class Adaptor;
42 class Actor;
43 class Layer;
44 class WheelEvent;
45 struct TouchPoint;
46 class KeyEvent;
47
48 namespace Integration
49 {
50
51 class Scene;
52 struct Point;
53 struct KeyEvent;
54 struct WheelEvent;
55
56 }
57
58 namespace Internal
59 {
60
61 namespace Adaptor
62 {
63
64 class Adaptor;
65 class SceneHolder;
66 using SceneHolderPtr = IntrusivePtr< SceneHolder >;
67
68 /**
69  * @brief SceneHolder creates a Scene for rendering.
70  */
71 class DALI_ADAPTOR_API SceneHolder : public BaseObject
72 {
73
74 public:
75
76   /**
77    * @copydoc Dali::Integration::SceneHolder::Add
78    */
79   void Add( Dali::Actor actor );
80
81   /**
82    * @copydoc Dali::Integration::SceneHolder::Remove
83    */
84   void Remove( Dali::Actor actor );
85
86   /**
87    * @copydoc Dali::Integration::SceneHolder::GetRootLayer
88    */
89   Dali::Layer GetRootLayer() const;
90
91   /**
92    * @brief Gets the window name.
93    * @return The name of the window
94    */
95   std::string GetName() const;
96
97   /**
98    * @brief Retrieve the unique ID of the window.
99    * @return The ID
100    */
101   uint32_t GetId() const;
102
103   /**
104    * @brief Retrieve the Scene.
105    * @return The Scene
106    */
107   Dali::Integration::Scene GetScene();
108
109   /**
110    * @brief Retrieves the DPI of this sceneholder.
111    * @return The DPI.
112    */
113   Uint16Pair GetDpi() const;
114
115   /**
116    * @brief Set the render surface
117    * @param[in] surface The render surface
118    */
119   void SetSurface( Dali::RenderSurfaceInterface* surface );
120
121   /**
122    * @brief Called when the surface set is resized.
123    */
124   void SurfaceResized();
125
126   /**
127    * @brief Get the render surface
128    * @return The render surface
129    */
130   Dali::RenderSurfaceInterface* GetSurface() const;
131
132   /**
133    * @brief Set the adaptor to the scene holder
134    * @param[in] adaptor An initialized adaptor
135    */
136   void SetAdaptor( Dali::Adaptor& adaptor );
137
138   /**
139    * @copydoc Dali::Integration::SceneHolder::SetBackgroundColor
140    */
141   void SetBackgroundColor( const Dali::Vector4& color );
142
143   /**
144    * @copydoc Dali::Integration::SceneHolder::GetBackgroundColor
145    */
146   Vector4 GetBackgroundColor() const;
147
148   /**
149    * @brief Pause the rendering of the scene holder.
150    */
151   void Pause();
152
153   /**
154    * @brief Resume the rendering of the scene holder (from pause).
155    */
156   void Resume();
157
158   /**
159    * @brief Checks whether this scene holder is being deleted in the event thread.
160    *
161    * @return true if this scene holder is being deleted in the event thread, or false if not.
162    */
163   bool IsBeingDeleted() const { return mIsBeingDeleted; }
164
165   /**
166    * @copydoc Dali::Integration::SceneHolder::FeedTouchPoint
167    */
168   void FeedTouchPoint( Dali::Integration::Point& point, int timeStamp );
169
170   /**
171    * @copydoc Dali::Integration::SceneHolder::FeedWheelEvent
172    */
173   void FeedWheelEvent( Dali::Integration::WheelEvent& wheelEvent );
174
175   /**
176    * @copydoc Dali::Integration::SceneHolder::FeedKeyEvent
177    */
178   void FeedKeyEvent( Dali::Integration::KeyEvent& keyEvent );
179
180   /**
181    * @brief Adds a callback that is called when the frame rendering is done by the graphics driver.
182    *
183    * @param[in] callback The function to call
184    * @param[in] frameId The Id to specify the frame. It will be passed when the callback is called.
185    *
186    * @note A callback of the following type may be used:
187    * @code
188    *   void MyFunction( int frameId );
189    * @endcode
190    * This callback will be deleted once it is called.
191    *
192    * @note Ownership of the callback is passed onto this class.
193    */
194   void AddFrameRenderedCallback( std::unique_ptr< CallbackBase > callback, int32_t frameId );
195
196   /**
197    * @brief Adds a callback that is called when the frame rendering is done by the graphics driver.
198    *
199    * @param[in] callback The function to call
200    * @param[in] frameId The Id to specify the frame. It will be passed when the callback is called.
201    *
202    * @note A callback of the following type may be used:
203    * @code
204    *   void MyFunction( int frameId );
205    * @endcode
206    * This callback will be deleted once it is called.
207    *
208    * @note Ownership of the callback is passed onto this class.
209    */
210   void AddFramePresentedCallback( std::unique_ptr< CallbackBase > callback, int32_t frameId );
211
212   /**
213    * @copydoc Dali::Integration::SceneHolder::Get()
214    */
215   static Dali::Integration::SceneHolder Get( Dali::Actor actor );
216
217   /**
218    * @copydoc Dali::Integration::SceneHolder::KeyEventSignal()
219    */
220   Dali::Integration::SceneHolder::KeyEventSignalType& KeyEventSignal() { return mScene.KeyEventSignal(); }
221
222   /**
223    * @copydoc Dali::Integration::SceneHolder::KeyEventGeneratedSignal()
224    */
225   Dali::Integration::SceneHolder::KeyEventGeneratedSignalType& KeyEventGeneratedSignal() { return mScene.KeyEventGeneratedSignal(); }
226
227   /**
228    * @copydoc Dali::Integration::SceneHolder::TouchedSignal()
229    */
230   Dali::Integration::SceneHolder::TouchEventSignalType& TouchedSignal() { return mScene.TouchedSignal(); }
231
232   /**
233    * @copydoc Dali::Integration::SceneHolder::WheelEventSignal()
234    */
235   Dali::Integration::SceneHolder::WheelEventSignalType& WheelEventSignal() { return mScene.WheelEventSignal(); }
236
237 public: // The following methods can be overridden if required
238
239   /**
240    * @brief Returns whether the Scene is visible or not.
241    * @return True if the Scene is visible, false otherwise.
242    */
243   virtual bool IsVisible() const;
244
245 public: // The following methods must be overridden
246
247   /**
248    * @copydoc Dali::Integration::SceneHolder::GetNativeHandle
249    */
250   virtual Dali::Any GetNativeHandle() const = 0;
251
252 protected:
253
254   // Constructor
255   SceneHolder();
256
257   // Undefined
258   SceneHolder(const SceneHolder&) = delete;
259
260   // Undefined
261   SceneHolder& operator=(const SceneHolder& rhs) = delete;
262
263   /**
264    * virtual destructor
265    */
266   ~SceneHolder() override;
267
268 private: // The following methods can be overridden if required
269
270   /**
271    * @brief Called by the base class to inform deriving classes that the adaptor has been set.
272    * @param[in] adaptor The adaptor
273    */
274   virtual void OnAdaptorSet( Dali::Adaptor& adaptor ) {};
275
276   /**
277    * @brief Called by the base class to inform deriving classes that a new surface has been set.
278    * @param[in] surface The new render surface
279    */
280   virtual void OnSurfaceSet( Dali::RenderSurfaceInterface* surface ) {};
281
282   /**
283    * @brief Called by the base class to inform deriving classes that we are being paused.
284    */
285   virtual void OnPause() {};
286
287   /**
288    * @brief Called by the base class to inform deriving classes that we are resuming from a paused state.
289    */
290   virtual void OnResume() {};
291
292   /**
293    * Recalculate the touch position if required
294    * @param[in,out] point The touch point
295    */
296   virtual void RecalculateTouchPosition( Integration::Point& point ) {};
297
298 private:
299
300   /**
301    * Resets the event handling.
302    */
303   void Reset();
304
305   /**
306    * Initializes the DPI for this object.
307    */
308   void InitializeDpi();
309
310 private:
311
312   static uint32_t                                 mSceneHolderCounter; ///< A counter to track the SceneHolder creation
313
314   class SceneHolderLifeCycleObserver;
315   std::unique_ptr< SceneHolderLifeCycleObserver > mLifeCycleObserver;  ///< The adaptor life cycle observer
316
317 protected:
318
319   uint32_t                                        mId;                 ///< A unique ID to identify the SceneHolder starting from 0
320   Dali::Integration::Scene                        mScene;              ///< The Scene
321   std::string                                     mName;               ///< The name of the SceneHolder
322
323   std::unique_ptr< Dali::RenderSurfaceInterface > mSurface;            ///< The window rendering surface
324   Adaptor*                                        mAdaptor;            ///< The adaptor
325
326   Dali::Integration::TouchEventCombiner           mCombiner;           ///< Combines multi-touch events.
327
328
329   Uint16Pair                                      mDpi;                ///< The DPI for this SceneHolder.
330
331   std::atomic<bool>                               mIsBeingDeleted;     ///< This is set only from the event thread and read only from the render thread
332
333   bool                                            mAdaptorStarted:1;   ///< Whether the adaptor has started or not
334   bool                                            mVisible:1;          ///< Whether the scene is visible or not
335 };
336
337 } // Adaptor
338
339 } // Internal
340
341 // Get impl of handle
342 inline Internal::Adaptor::SceneHolder& GetImplementation( Dali::Integration::SceneHolder& sceneHolder )
343 {
344   DALI_ASSERT_ALWAYS( sceneHolder && "SceneHolder handle is empty" );
345   Dali::RefObject& object = sceneHolder.GetBaseObject();
346   return static_cast<Internal::Adaptor::SceneHolder&>( object );
347 }
348
349 inline const Internal::Adaptor::SceneHolder& GetImplementation( const Dali::Integration::SceneHolder& sceneHolder )
350 {
351   DALI_ASSERT_ALWAYS( sceneHolder && "SceneHolder handle is empty" );
352   const Dali::RefObject& object = sceneHolder.GetBaseObject();
353   return static_cast<const Internal::Adaptor::SceneHolder&>( object );
354 }
355
356 } // Dali
357
358 #endif // DALI_INTEGRATION_INTERNAL_SCENEHOLDER_H