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>
31 * @brief Simple class for passing around pairs of small unsigned integers.
33 * Use this for integer dimensions and points with limited range such as image
34 * sizes and pixel coordinates where a pair of floating point numbers is
35 * inefficient and illogical (i.e. the data is inherently integer).
36 * These are immutable. If you want to change a value, make a whole new object.
37 * One of these can be passed in a single 32 bit integer register on
38 * common architectures.
44 * @brief Default constructor for the (0, 0) vector.
46 Uint16Pair() : mData(0) {}
49 * @brief Constructor taking separate x and y (width and height) parameters.
50 * @param[in] width The width or X dimension of the vector. Make sure it is less than 65536,
51 * @param[in] height The height or Y dimension of the vector. Make sure it is less than 65536,
53 Uint16Pair( uint32_t width, uint32_t height )
55 DALI_ASSERT_DEBUG( width < ( 1u << 16 ) && "Width parameter not representable." );
56 DALI_ASSERT_DEBUG( height < ( 1u << 16 ) && "Height parameter not representable." );
58 /* Do equivalent of the code below with one aligned memory access:
59 * mComponents[0] = width;
60 * mComponents[1] = height;
61 * Unit tests make sure this is equivalent.
63 mData = (height << 16u) + width;
67 * @brief Copy constructor.
69 Uint16Pair( const Uint16Pair& rhs )
75 * @returns the x dimension stored in this 2-tuple.
77 uint16_t GetWidth() const
79 return mComponents[0];
83 * @returns the y dimension stored in this 2-tuple.
85 uint16_t GetHeight() const
87 return mComponents[1];
91 * @returns the x dimension stored in this 2-tuple.
95 return mComponents[0];
99 * @returns the y dimension stored in this 2-tuple.
101 uint16_t GetY() const
103 return mComponents[1];
109 bool operator==( const Uint16Pair& rhs ) const
111 return mData == rhs.mData;
115 * Inequality operator.
117 bool operator!=( const Uint16Pair& rhs ) const
119 return mData != rhs.mData;
123 * Less than comparison operator for storing in collections (not geometrically
126 bool operator<( const Uint16Pair& rhs ) const
128 return mData < rhs.mData;
132 * Greater than comparison operator for storing in collections (not
133 * geometrically meaningful).
135 bool operator>( const Uint16Pair& rhs ) const
137 return mData > rhs.mData;
141 * @brief Create an instance by rounding a floating point vector to closest
144 * Uses a template for loose coupling, to save a header include, and allow any
145 * vector type with .x and .y members to be converted.
147 template<typename FLOAT_VECTOR_N_TYPE>
148 static Uint16Pair FromFloatVec2( const FLOAT_VECTOR_N_TYPE& from )
150 DALI_ASSERT_DEBUG( from.x + 0.5f < 65536.0f );
151 DALI_ASSERT_DEBUG( from.y + 0.5f < 65536.0f );
152 return Uint16Pair( from.x + 0.5f, from.y + 0.5f );
156 * @brief Create an instance by rounding a floating point array to closest
159 * Uses a template to allow any vector type with operator [] to be converted
160 * in addition to plain arrays.
162 template<typename FLOAT_ARRAY>
163 static Uint16Pair FromFloatArray( const FLOAT_ARRAY& from )
165 DALI_ASSERT_DEBUG( from[0] + 0.5f < 65536.0f );
166 DALI_ASSERT_DEBUG( from[1] + 0.5f < 65536.0f );
167 return Uint16Pair( from[0] + 0.5f, from[1] + 0.5f );
173 // Addressable view of X and Y:
174 uint16_t mComponents[2];
175 // Packed view of X and Y to force alignment and allow a faster copy:
182 #endif // __DALI_UINT_16_PAIR_H__