Merge "Added RenderTask WorldToViewport coordinates" into devel/master
[platform/core/uifw/dali-core.git] / dali / public-api / math / uint-16-pair.h
1 #ifndef __DALI_UINT_16_PAIR_H__
2 #define __DALI_UINT_16_PAIR_H__
3
4 /*
5  * Copyright (c) 2015 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 <stdint.h>
23
24 // INTERNAL INCLUDES
25 #include <dali/public-api/common/dali-common.h>
26 #include <dali/public-api/common/type-traits.h>
27
28 namespace Dali
29 {
30 /**
31  * @addtogroup dali_core_math
32  * @{
33  */
34
35 /**
36  * @brief Simple class for passing around pairs of small unsigned integers.
37  *
38  * Use this for integer dimensions and points with limited range such as image
39  * sizes and pixel coordinates where a pair of floating point numbers is
40  * inefficient and illogical (i.e. the data is inherently integer).
41  * These are immutable. If you want to change a value, make a whole new object.
42  * One of these can be passed in a single 32 bit integer register on
43  * common architectures.
44  */
45 class Uint16Pair
46 {
47 public:
48   /**
49    * @brief Default constructor for the (0, 0) vector.
50    */
51   Uint16Pair() : mData(0) {}
52
53   /**
54    * @brief Constructor taking separate x and y (width and height) parameters.
55    * @param[in] width The width or X dimension of the vector. Make sure it is less than 65536,
56    * @param[in] height The height or Y dimension of the vector. Make sure it is less than 65536,
57    */
58   Uint16Pair( uint32_t width, uint32_t height )
59   {
60     DALI_ASSERT_DEBUG( width < ( 1u << 16 ) && "Width parameter not representable." );
61     DALI_ASSERT_DEBUG( height < ( 1u << 16 ) && "Height parameter not representable." );
62
63     /* Do equivalent of the code below with one aligned memory access:
64      * mComponents[0] = width;
65      * mComponents[1] = height;
66      * Unit tests make sure this is equivalent.
67      **/
68     mData = (height << 16u) + width;
69   }
70
71   /**
72    * @brief Copy constructor.
73    * @param rhs to copy from
74    */
75   Uint16Pair( const Uint16Pair& rhs )
76   {
77     mData = rhs.mData;
78   }
79
80   /**
81    * @brief Sets the width
82    * @param width to set
83    */
84   void SetWidth( uint16_t width )
85   {
86     mComponents[0] = width;
87   }
88
89   /**
90    * @returns the x dimension stored in this 2-tuple.
91    */
92   uint16_t GetWidth() const
93   {
94     return mComponents[0];
95   }
96
97   /**
98    * @brief Sets the height
99    * @param height to set
100    */
101   void SetHeight( uint16_t height )
102   {
103     mComponents[1] = height;
104   }
105   /**
106    * @returns the y dimension stored in this 2-tuple.
107    */
108   uint16_t GetHeight() const
109   {
110     return mComponents[1];
111   }
112
113   /**
114    * @returns the x dimension stored in this 2-tuple.
115    */
116   uint16_t GetX()  const
117   {
118     return mComponents[0];
119   }
120
121   /**
122    * @returns the y dimension stored in this 2-tuple.
123    */
124   uint16_t GetY() const
125   {
126     return mComponents[1];
127   }
128
129   /**
130    * Assignment operator.
131    */
132   Uint16Pair& operator=( const Uint16Pair& rhs )
133   {
134     if( rhs != *this )
135     {
136       mData = rhs.mData;
137     }
138     return *this;
139   }
140
141   /**
142    * Equality operator.
143    */
144   bool operator==( const Uint16Pair& rhs ) const
145   {
146     return mData == rhs.mData;
147   }
148
149   /**
150    * Inequality operator.
151    */
152   bool operator!=( const Uint16Pair& rhs ) const
153   {
154     return mData != rhs.mData;
155   }
156
157   /**
158    * Less than comparison operator for storing in collections (not geometrically
159    * meaningful).
160    */
161   bool operator<( const Uint16Pair& rhs ) const
162   {
163     return mData < rhs.mData;
164   }
165
166   /**
167    * Greater than comparison operator for storing in collections (not
168    * geometrically meaningful).
169    */
170   bool operator>( const Uint16Pair& rhs ) const
171   {
172     return mData > rhs.mData;
173   }
174
175   /**
176    * @brief Create an instance by rounding a floating point vector to closest
177    * integers.
178    *
179    * Uses a template for loose coupling, to save a header include, and allow any
180    * vector type with .x and .y members to be converted.
181    */
182   template<typename FLOAT_VECTOR_N_TYPE>
183   static Uint16Pair FromFloatVec2( const FLOAT_VECTOR_N_TYPE& from )
184   {
185     DALI_ASSERT_DEBUG( from.x + 0.5f < 65536.0f );
186     DALI_ASSERT_DEBUG( from.y + 0.5f < 65536.0f );
187     return Uint16Pair( from.x + 0.5f, from.y + 0.5f );
188   }
189
190   /**
191    * @brief Create an instance by rounding a floating point array to closest
192    * integers.
193    *
194    * Uses a template to allow any vector type with operator [] to be converted
195    * in addition to plain arrays.
196    */
197   template<typename FLOAT_ARRAY>
198   static Uint16Pair FromFloatArray( const FLOAT_ARRAY& from )
199   {
200     DALI_ASSERT_DEBUG( from[0] + 0.5f < 65536.0f );
201     DALI_ASSERT_DEBUG( from[1] + 0.5f < 65536.0f );
202     return Uint16Pair( from[0] + 0.5f, from[1] + 0.5f );
203   }
204
205 private:
206   union
207   {
208     // Addressable view of X and Y:
209     uint16_t mComponents[2];
210     // Packed view of X and Y to force alignment and allow a faster copy:
211     uint32_t mData;
212   };
213 };
214
215 // Allow Uint16Pair to be treated as a POD type
216 template <> struct TypeTraits< Uint16Pair > : public BasicTypes< Uint16Pair > { enum { IS_TRIVIAL_TYPE = true }; };
217
218 /**
219  * @}
220  */
221 } // namespace Dali
222
223 #endif // __DALI_UINT_16_PAIR_H__