Inline default layer sort function to avoid unnecessary function call
[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 Flora License, Version 1.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://floralicense.org/license/
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 // INTERNAL INCLUDES
21 #include <dali/public-api/actors/layer.h>
22 #include <dali/internal/event/actors/actor-impl.h>
23 #include <dali/internal/event/actors/actor-declarations.h>
24 #include <dali/internal/event/images/frame-buffer-image-impl.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::GetDefaultPropertyType()
207    */
208   virtual Property::Type GetDefaultPropertyType(Property::Index index) const;
209
210   /**
211    * @copydoc Dali::Internal::ProxyObject::SetDefaultProperty()
212    */
213   virtual void SetDefaultProperty(Property::Index index, const Property::Value& propertyValue);
214
215   /**
216    * @copydoc Dali::Internal::ProxyObject::GetDefaultProperty()
217    */
218   virtual Property::Value GetDefaultProperty( Property::Index index ) const;
219
220 protected:
221
222   /**
223    * Construct a new layer.
224    * @param[in] type Either Actor::LAYER or Actor::ROOT_LAYER if this is the root actor.
225    */
226   Layer( Actor::DerivedType type );
227
228   /**
229    * A reference counted object may only be deleted by calling Unreference()
230    */
231   virtual ~Layer();
232
233 private: // From Actor
234
235   /**
236    * From Actor; create a node to represent the layer in the scene-graph.
237    * @return A newly allocated layer node.
238    */
239   virtual SceneGraph::Node* CreateNode() const;
240
241   /**
242    * From Actor.
243    */
244   virtual void OnStageConnectionInternal();
245
246   /**
247    * From Actor.
248    */
249   virtual void OnStageDisconnectionInternal();
250
251 private:
252
253   LayerList* mLayerList; ///< Only valid when layer is on-stage
254
255   // These properties not animatable; the actor side has the most up-to-date values
256   FrameBufferImagePtr mFrameBufferImage;        ///< Ticket for offscreen render target
257   ClippingBox mClippingBox;                     ///< The clipping box, in window coordinates
258   Dali::Layer::SortFunctionType mSortFunction;  ///< Used to sort semi-transparent geometry
259
260   bool mIsClipping:1;                           ///< True when clipping is enabled
261   bool mDepthTestDisabled:1;                    ///< Whether depth test is disabled.
262
263   static bool mFirstInstance;
264   static DefaultPropertyLookup* mDefaultLayerPropertyLookup; ///< Default properties
265 };
266
267 } // namespace Internal
268
269 // Helpers for public-api forwarding methods
270
271 inline Internal::Layer& GetImplementation(Dali::Layer& layer)
272 {
273   DALI_ASSERT_ALWAYS(layer && "Layer handle is empty");
274
275   BaseObject& handle = layer.GetBaseObject();
276
277   return static_cast<Internal::Layer&>(handle);
278 }
279
280 inline const Internal::Layer& GetImplementation(const Dali::Layer& layer)
281 {
282   DALI_ASSERT_ALWAYS(layer && "Layer handle is empty");
283
284   const BaseObject& handle = layer.GetBaseObject();
285
286   return static_cast<const Internal::Layer&>(handle);
287 }
288
289 } // namespace Dali
290
291
292 #endif //__DALI_INTERNAL_LAYER_H__