1 #ifndef __DALI_UINT_16_PAIR_H__
2 #define __DALI_UINT_16_PAIR_H__
5 * Copyright (c) 2015 Samsung Electronics Co., Ltd.
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
11 * http://www.apache.org/licenses/LICENSE-2.0
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.
25 #include <dali/public-api/common/dali-common.h>
26 #include <dali/public-api/common/type-traits.h>
31 * @addtogroup dali_core_math
36 * @brief Simple class for passing around pairs of small unsigned integers.
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 * One of these can be passed in a single 32 bit integer register on
42 * common architectures.
49 * @brief Default constructor for the (0, 0) tuple.
52 Uint16Pair() : mData(0) {}
55 * @brief Constructor taking separate x and y (width and height) parameters.
57 * @param[in] width The width or X dimension of the tuple. Make sure it is less than 65536,
58 * @param[in] height The height or Y dimension of the tuple. Make sure it is less than 65536,
60 Uint16Pair( uint32_t width, uint32_t height )
62 DALI_ASSERT_DEBUG( width < ( 1u << 16 ) && "Width parameter not representable." );
63 DALI_ASSERT_DEBUG( height < ( 1u << 16 ) && "Height parameter not representable." );
65 /* Do equivalent of the code below with one aligned memory access:
66 * mComponents[0] = width;
67 * mComponents[1] = height;
68 * Unit tests make sure this is equivalent.
70 mData = (height << 16u) + width;
74 * @brief Copy constructor.
76 * @param[in] rhs A reference to assign
78 Uint16Pair( const Uint16Pair& rhs )
84 * @brief Sets the width.
86 * @param[in] width The x dimension to be stored in this 2-tuple.
88 void SetWidth( uint16_t width )
90 mComponents[0] = width;
94 * @brief Get the width.
96 * @return the x dimension stored in this 2-tuple
98 uint16_t GetWidth() const
100 return mComponents[0];
104 * @brief Sets the height.
106 * @param[in] height The y dimension to be stored in this 2-tuple.
108 void SetHeight( uint16_t height )
110 mComponents[1] = height;
114 * @brief Returns the y dimension stored in this 2-tuple.
118 uint16_t GetHeight() const
120 return mComponents[1];
124 * @brief Sets the x dimension (same as width).
126 * @param[in] x The x dimension to be stored in this 2-tuple.
128 void SetX( uint16_t x )
134 * @brief Returns the x dimension stored in this 2-tuple.
138 uint16_t GetX() const
140 return mComponents[0];
144 * @brief Sets the y dimension (same as height).
146 * @param[in] y The y dimension to be stored in this 2-tuple.
148 void SetY( uint16_t y )
154 * @brief Returns the y dimension stored in this 2-tuple.
158 uint16_t GetY() const
160 return mComponents[1];
164 * @brief Assignment operator.
166 * @param[in] rhs Handle to an object
167 * @return A reference to this
169 Uint16Pair& operator=( const Uint16Pair& rhs )
179 * @brief Equality operator.
181 * @param[in] rhs A reference for comparison
182 * @return True if same
184 bool operator==( const Uint16Pair& rhs ) const
186 return mData == rhs.mData;
190 * @brief Inequality operator.
192 * @param[in] rhs A reference for comparison
193 * @return True if different
195 bool operator!=( const Uint16Pair& rhs ) const
197 return mData != rhs.mData;
201 * @brief Less than comparison operator for storing in collections (not geometrically
204 * @param[in] rhs A reference for comparison
205 * @return True if less
207 bool operator<( const Uint16Pair& rhs ) const
209 return mData < rhs.mData;
213 * @brief Greater than comparison operator for storing in collections (not
214 * geometrically meaningful).
216 * @param[in] rhs A reference for comparison
217 * @return True if greater
219 bool operator>( const Uint16Pair& rhs ) const
221 return mData > rhs.mData;
225 * @brief Create an instance by rounding a floating point vector to closest
228 * Uses a template for loose coupling, to save a header include, and allow any
229 * vector type with .x and .y members to be converted.
231 * @param[in] from Floating point vector2
232 * @return Closest integer value.
234 template<typename FLOAT_VECTOR_N_TYPE>
235 static Uint16Pair FromFloatVec2( const FLOAT_VECTOR_N_TYPE& from )
237 DALI_ASSERT_DEBUG( from.x + 0.5f < 65536.0f );
238 DALI_ASSERT_DEBUG( from.y + 0.5f < 65536.0f );
239 return Uint16Pair( from.x + 0.5f, from.y + 0.5f );
243 * @brief Create an instance by rounding a floating point array to closest
246 * Uses a template to allow any vector type with operator [] to be converted
247 * in addition to plain arrays.
249 * @param[in] from Floating point array
250 * @return Closest integer value.
252 template<typename FLOAT_ARRAY>
253 static Uint16Pair FromFloatArray( const FLOAT_ARRAY& from )
255 DALI_ASSERT_DEBUG( from[0] + 0.5f < 65536.0f );
256 DALI_ASSERT_DEBUG( from[1] + 0.5f < 65536.0f );
257 return Uint16Pair( from[0] + 0.5f, from[1] + 0.5f );
263 // Addressable view of X and Y:
264 uint16_t mComponents[2];
265 // Packed view of X and Y to force alignment and allow a faster copy:
270 // Allow Uint16Pair to be treated as a POD type
271 template <> struct TypeTraits< Uint16Pair > : public BasicTypes< Uint16Pair > { enum { IS_TRIVIAL_TYPE = true }; };
278 #endif // __DALI_UINT_16_PAIR_H__