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