License conversion from Flora to Apache 2.0
[platform/core/uifw/dali-core.git] / dali / internal / event / actors / layer-impl.h
1 #ifndef __DALI_INTERNAL_LAYER_H__
2 #define __DALI_INTERNAL_LAYER_H__
3
4 /*
5  * Copyright (c) 2014 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 // INTERNAL INCLUDES
22 #include <dali/public-api/actors/layer.h>
23 #include <dali/internal/event/actors/actor-impl.h>
24 #include <dali/internal/event/actors/actor-declarations.h>
25 #include <dali/internal/event/images/frame-buffer-image-impl.h>
26
27 namespace Dali
28 {
29
30 namespace Internal
31 {
32
33 class LayerList;
34
35 namespace SceneGraph
36 {
37 class UpdateManager;
38 class Layer;
39 }
40
41 typedef Dali::ClippingBox ClippingBox;
42
43 class Layer : public Actor
44 {
45 public:
46
47   /**
48    * @copydoc Dali::Layer::ZValue(const Vector3&, float)
49    */
50   static float ZValue(const Vector3& position, float sortModifier)
51   {
52     // inlined so we avoid a function call when sorting renderers
53     return position.z + sortModifier;
54   }
55
56   /**
57    * Create a new Layer.
58    * @return A smart-pointer to the newly allocated Layer.
59    */
60   static LayerPtr New();
61
62   /**
63    * Create a new root layer; this is typically owned by the stage.
64    * @param[in] stage The owning stage.
65    * @param[in] layerList The layer will be added to this ordered list.
66    * @param[in] manager The update manager to install a root node with.
67    * @param[in] systemLevel True if using the SystemOverlay API; see Integration::GetSystemOverlay() for more details.
68    * @return A smart-pointer to the newly allocated Actor.
69    */
70   static LayerPtr NewRoot( Stage& stage, LayerList& layerList, SceneGraph::UpdateManager& manager, bool systemLevel );
71
72   /**
73    * @copydoc Dali::Internal::Actor::OnInitialize
74    */
75   void OnInitialize();
76
77    /**
78    * Query the current depth of the layer
79    */
80   unsigned int GetDepth() const;
81
82   /**
83    * @copydoc Dali::Layer::Raise
84    */
85   void Raise();
86
87   /**
88    * @copydoc Dali::Layer::Lower
89    */
90   void Lower();
91
92   /**
93    * @copydoc Dali::Layer::RaiseAbove
94    */
95   void RaiseAbove( const Internal::Layer& target );
96
97   /**
98    * @copydoc Dali::Layer::LowerBelow
99    */
100   void LowerBelow( const Internal::Layer& target );
101
102   /**
103    * @copydoc Dali::Layer::RaiseToTop
104    */
105   void RaiseToTop();
106
107   /**
108    * @copydoc Dali::Layer::LowerToBottom
109    */
110   void LowerToBottom();
111
112   /**
113    * @copydoc Dali::Layer::MoveAbove
114    */
115   void MoveAbove( const Internal::Layer& target );
116
117   /**
118    * @copydoc Dali::Layer::MoveAbove
119    */
120   void MoveBelow( const Internal::Layer& target );
121
122   /**
123    * @copydoc Dali::Layer::SetClipping()
124    */
125   void SetClipping(bool enabled);
126
127   /**
128    * @copydoc Dali::Layer::IsClipping()
129    */
130   bool IsClipping() const
131   {
132     return mIsClipping; // Actor-side has most up-to-date value
133   }
134
135   /**
136    * @copydoc Dali::Layer::SetClippingBox()
137    */
138   void SetClippingBox(int x, int y, int width, int height);
139
140   /**
141    * @copydoc Dali::Layer::GetClippingBox()
142    */
143   const Dali::ClippingBox& GetClippingBox() const
144   {
145     return mClippingBox; // Actor-side has most up-to-date value
146   }
147
148   /**
149    * @copydoc Dali::Layer::SetDepthTestDisabled()
150    */
151   void SetDepthTestDisabled( bool disable );
152
153   /**
154    * @copydoc Dali::Layer::IsDepthTestDisabled()
155    */
156   bool IsDepthTestDisabled() const;
157
158   /**
159    * @copydoc Dali::Layer::SetSortFunction()
160    */
161   void SetSortFunction(Dali::Layer::SortFunctionType function);
162
163   /**
164    * Helper function to get the scene object.
165    * This should only be called by Stage
166    * @return the scene object for the layer.
167    */
168   const SceneGraph::Layer& GetSceneLayerOnStage() const;
169
170   /**
171    * @copydoc Dali::Internal::Actor::DoAction()
172    */
173   static bool DoAction(BaseObject* object, const std::string& actionName, const std::vector<Property::Value>& attributes);
174
175 public: // Default property extensions from ProxyObject
176   /**
177    * @copydoc Dali::Internal::ProxyObject::GetDefaultPropertyCount()
178    */
179   virtual unsigned int GetDefaultPropertyCount() const;
180
181   /**
182    * @copydoc Dali::Internal::ProxyObject::GetDefaultPropertyIndices()
183    */
184   virtual void GetDefaultPropertyIndices( Property::IndexContainer& indices ) const;
185
186   /**
187    * @copydoc Dali::Internal::ProxyObject::GetDefaultPropertyName()
188    */
189   virtual const std::string& GetDefaultPropertyName(Property::Index index) const;
190
191   /**
192    * @copydoc Dali::Internal::ProxyObject::GetDefaultPropertyIndex()
193    */
194   virtual Property::Index GetDefaultPropertyIndex(const std::string& name) const;
195
196   /**
197    * @copydoc Dali::Internal::ProxyObject::IsDefaultPropertyWritable()
198    */
199   virtual bool IsDefaultPropertyWritable(Property::Index index) const;
200
201   /**
202    * @copydoc Dali::Internal::ProxyObject::IsDefaultPropertyAnimatable()
203    */
204   virtual bool IsDefaultPropertyAnimatable(Property::Index index) const;
205
206   /**
207    * @copydoc Dali::Internal::ProxyObject::IsDefaultPropertyAConstraintInput()
208    */
209   virtual bool IsDefaultPropertyAConstraintInput( Property::Index index ) const;
210
211   /**
212    * @copydoc Dali::Internal::ProxyObject::GetDefaultPropertyType()
213    */
214   virtual Property::Type GetDefaultPropertyType(Property::Index index) const;
215
216   /**
217    * @copydoc Dali::Internal::ProxyObject::SetDefaultProperty()
218    */
219   virtual void SetDefaultProperty(Property::Index index, const Property::Value& propertyValue);
220
221   /**
222    * @copydoc Dali::Internal::ProxyObject::GetDefaultProperty()
223    */
224   virtual Property::Value GetDefaultProperty( Property::Index index ) const;
225
226 protected:
227
228   /**
229    * Construct a new layer.
230    * @param[in] type Either Actor::LAYER or Actor::ROOT_LAYER if this is the root actor.
231    */
232   Layer( Actor::DerivedType type );
233
234   /**
235    * A reference counted object may only be deleted by calling Unreference()
236    */
237   virtual ~Layer();
238
239 private: // From Actor
240
241   /**
242    * From Actor; create a node to represent the layer in the scene-graph.
243    * @return A newly allocated layer node.
244    */
245   virtual SceneGraph::Node* CreateNode() const;
246
247   /**
248    * From Actor.
249    */
250   virtual void OnStageConnectionInternal();
251
252   /**
253    * From Actor.
254    */
255   virtual void OnStageDisconnectionInternal();
256
257 private:
258
259   LayerList* mLayerList; ///< Only valid when layer is on-stage
260
261   // These properties not animatable; the actor side has the most up-to-date values
262   FrameBufferImagePtr mFrameBufferImage;        ///< Ticket for offscreen render target
263   ClippingBox mClippingBox;                     ///< The clipping box, in window coordinates
264   Dali::Layer::SortFunctionType mSortFunction;  ///< Used to sort semi-transparent geometry
265
266   bool mIsClipping:1;                           ///< True when clipping is enabled
267   bool mDepthTestDisabled:1;                    ///< Whether depth test is disabled.
268
269   static bool mFirstInstance;
270   static DefaultPropertyLookup* mDefaultLayerPropertyLookup; ///< Default properties
271 };
272
273 } // namespace Internal
274
275 // Helpers for public-api forwarding methods
276
277 inline Internal::Layer& GetImplementation(Dali::Layer& layer)
278 {
279   DALI_ASSERT_ALWAYS(layer && "Layer handle is empty");
280
281   BaseObject& handle = layer.GetBaseObject();
282
283   return static_cast<Internal::Layer&>(handle);
284 }
285
286 inline const Internal::Layer& GetImplementation(const Dali::Layer& layer)
287 {
288   DALI_ASSERT_ALWAYS(layer && "Layer handle is empty");
289
290   const BaseObject& handle = layer.GetBaseObject();
291
292   return static_cast<const Internal::Layer&>(handle);
293 }
294
295 } // namespace Dali
296
297
298 #endif //__DALI_INTERNAL_LAYER_H__