1c29fa5a6Sopenharmony_ci/* 2c29fa5a6Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd. 3c29fa5a6Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4c29fa5a6Sopenharmony_ci * you may not use this file except in compliance with the License. 5c29fa5a6Sopenharmony_ci * You may obtain a copy of the License at 6c29fa5a6Sopenharmony_ci * 7c29fa5a6Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8c29fa5a6Sopenharmony_ci * 9c29fa5a6Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10c29fa5a6Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11c29fa5a6Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12c29fa5a6Sopenharmony_ci * See the License for the specific language governing permissions and 13c29fa5a6Sopenharmony_ci * limitations under the License. 14c29fa5a6Sopenharmony_ci */ 15c29fa5a6Sopenharmony_ci 16c29fa5a6Sopenharmony_ci#ifndef MMI_VECTOR2_H 17c29fa5a6Sopenharmony_ci#define MMI_VECTOR2_H 18c29fa5a6Sopenharmony_ci 19c29fa5a6Sopenharmony_ci#include <cmath> 20c29fa5a6Sopenharmony_ci 21c29fa5a6Sopenharmony_ci#include "util.h" 22c29fa5a6Sopenharmony_ci 23c29fa5a6Sopenharmony_cinamespace OHOS { 24c29fa5a6Sopenharmony_cinamespace MMI { 25c29fa5a6Sopenharmony_citemplate<typename T> 26c29fa5a6Sopenharmony_ciclass Vector2 { 27c29fa5a6Sopenharmony_cipublic: 28c29fa5a6Sopenharmony_ci union { 29c29fa5a6Sopenharmony_ci struct { 30c29fa5a6Sopenharmony_ci T x_; 31c29fa5a6Sopenharmony_ci T y_; 32c29fa5a6Sopenharmony_ci }; 33c29fa5a6Sopenharmony_ci T data_[2]; 34c29fa5a6Sopenharmony_ci }; 35c29fa5a6Sopenharmony_ci 36c29fa5a6Sopenharmony_ci Vector2(); 37c29fa5a6Sopenharmony_ci Vector2(T x, T y); 38c29fa5a6Sopenharmony_ci explicit Vector2(const T* v); 39c29fa5a6Sopenharmony_ci virtual ~Vector2(); 40c29fa5a6Sopenharmony_ci 41c29fa5a6Sopenharmony_ci Vector2 Normalized() const; 42c29fa5a6Sopenharmony_ci T Dot(const Vector2<T>& other) const; 43c29fa5a6Sopenharmony_ci T Cross(const Vector2<T>& other) const; 44c29fa5a6Sopenharmony_ci Vector2 operator-() const; 45c29fa5a6Sopenharmony_ci Vector2 operator-(const Vector2<T>& other) const; 46c29fa5a6Sopenharmony_ci Vector2 operator+(const Vector2<T>& other) const; 47c29fa5a6Sopenharmony_ci Vector2 operator/(T scale) const; 48c29fa5a6Sopenharmony_ci Vector2 operator*(T scale) const; 49c29fa5a6Sopenharmony_ci Vector2 operator*(const Vector2<T>& other) const; 50c29fa5a6Sopenharmony_ci Vector2& operator*=(const Vector2<T>& other); 51c29fa5a6Sopenharmony_ci Vector2& operator+=(const Vector2<T>& other); 52c29fa5a6Sopenharmony_ci Vector2& operator=(const Vector2& other); 53c29fa5a6Sopenharmony_ci T operator[](int index) const; 54c29fa5a6Sopenharmony_ci T& operator[](int index); 55c29fa5a6Sopenharmony_ci bool operator==(const Vector2& other) const; 56c29fa5a6Sopenharmony_ci bool operator!=(const Vector2& other) const; 57c29fa5a6Sopenharmony_ci bool IsNearEqual(const Vector2& other, T threshold = std::numeric_limits<T>::epsilon()) const; 58c29fa5a6Sopenharmony_ci 59c29fa5a6Sopenharmony_ci T* GetData(); 60c29fa5a6Sopenharmony_ci 61c29fa5a6Sopenharmony_ci T GetLength() const; 62c29fa5a6Sopenharmony_ci T GetSqrLength() const; 63c29fa5a6Sopenharmony_ci T Normalize(); 64c29fa5a6Sopenharmony_ci bool IsInfinite() const; 65c29fa5a6Sopenharmony_ci bool IsNaN() const; 66c29fa5a6Sopenharmony_ci}; 67c29fa5a6Sopenharmony_ci 68c29fa5a6Sopenharmony_citypedef Vector2<int> UIPoint; 69c29fa5a6Sopenharmony_citypedef Vector2<float> Vector2f; 70c29fa5a6Sopenharmony_citypedef Vector2<double> Vector2d; 71c29fa5a6Sopenharmony_citemplate<typename T> 72c29fa5a6Sopenharmony_ciVector2<T>::Vector2() 73c29fa5a6Sopenharmony_ci{} 74c29fa5a6Sopenharmony_ci 75c29fa5a6Sopenharmony_citemplate<typename T> 76c29fa5a6Sopenharmony_ciVector2<T>::Vector2(T x, T y) 77c29fa5a6Sopenharmony_ci{ 78c29fa5a6Sopenharmony_ci data_[0] = x; 79c29fa5a6Sopenharmony_ci data_[1] = y; 80c29fa5a6Sopenharmony_ci} 81c29fa5a6Sopenharmony_ci 82c29fa5a6Sopenharmony_citemplate<typename T> 83c29fa5a6Sopenharmony_ciVector2<T>::Vector2(const T* v) 84c29fa5a6Sopenharmony_ci{ 85c29fa5a6Sopenharmony_ci data_[0] = v[0]; 86c29fa5a6Sopenharmony_ci data_[1] = v[1]; 87c29fa5a6Sopenharmony_ci} 88c29fa5a6Sopenharmony_ci 89c29fa5a6Sopenharmony_citemplate<typename T> 90c29fa5a6Sopenharmony_ciVector2<T>::~Vector2() 91c29fa5a6Sopenharmony_ci{} 92c29fa5a6Sopenharmony_ci 93c29fa5a6Sopenharmony_citemplate<typename T> 94c29fa5a6Sopenharmony_ciVector2<T> Vector2<T>::Normalized() const 95c29fa5a6Sopenharmony_ci{ 96c29fa5a6Sopenharmony_ci Vector2<T> rNormalize(*this); 97c29fa5a6Sopenharmony_ci rNormalize.Normalize(); 98c29fa5a6Sopenharmony_ci return rNormalize; 99c29fa5a6Sopenharmony_ci} 100c29fa5a6Sopenharmony_ci 101c29fa5a6Sopenharmony_citemplate<typename T> 102c29fa5a6Sopenharmony_ciT Vector2<T>::Dot(const Vector2<T>& other) const 103c29fa5a6Sopenharmony_ci{ 104c29fa5a6Sopenharmony_ci const T* oData = other.data_; 105c29fa5a6Sopenharmony_ci T sum = data_[0] * oData[0]; 106c29fa5a6Sopenharmony_ci sum += data_[1] * oData[1]; 107c29fa5a6Sopenharmony_ci return sum; 108c29fa5a6Sopenharmony_ci} 109c29fa5a6Sopenharmony_ci 110c29fa5a6Sopenharmony_citemplate<typename T> 111c29fa5a6Sopenharmony_ciT Vector2<T>::Cross(const Vector2<T>& other) const 112c29fa5a6Sopenharmony_ci{ 113c29fa5a6Sopenharmony_ci const T* oData = other.data_; 114c29fa5a6Sopenharmony_ci 115c29fa5a6Sopenharmony_ci return data_[0] * oData[1] - data_[1] * oData[0]; 116c29fa5a6Sopenharmony_ci} 117c29fa5a6Sopenharmony_ci 118c29fa5a6Sopenharmony_citemplate<typename T> 119c29fa5a6Sopenharmony_ciVector2<T> Vector2<T>::operator-() const 120c29fa5a6Sopenharmony_ci{ 121c29fa5a6Sopenharmony_ci Vector2<T> rNeg; 122c29fa5a6Sopenharmony_ci T* rData = rNeg.data_; 123c29fa5a6Sopenharmony_ci rData[0] = -data_[0]; 124c29fa5a6Sopenharmony_ci rData[1] = -data_[1]; 125c29fa5a6Sopenharmony_ci return rNeg; 126c29fa5a6Sopenharmony_ci} 127c29fa5a6Sopenharmony_ci 128c29fa5a6Sopenharmony_citemplate<typename T> 129c29fa5a6Sopenharmony_ciVector2<T> Vector2<T>::operator-(const Vector2<T>& other) const 130c29fa5a6Sopenharmony_ci{ 131c29fa5a6Sopenharmony_ci Vector2<T> rSub(*this); 132c29fa5a6Sopenharmony_ci T* rData = rSub.data_; 133c29fa5a6Sopenharmony_ci const T* oData = other.data_; 134c29fa5a6Sopenharmony_ci rData[0] -= oData[0]; 135c29fa5a6Sopenharmony_ci rData[1] -= oData[1]; 136c29fa5a6Sopenharmony_ci return rSub; 137c29fa5a6Sopenharmony_ci} 138c29fa5a6Sopenharmony_ci 139c29fa5a6Sopenharmony_citemplate<typename T> 140c29fa5a6Sopenharmony_ciVector2<T> Vector2<T>::operator+(const Vector2<T>& other) const 141c29fa5a6Sopenharmony_ci{ 142c29fa5a6Sopenharmony_ci Vector2<T> rAdd(*this); 143c29fa5a6Sopenharmony_ci return rAdd += other; 144c29fa5a6Sopenharmony_ci} 145c29fa5a6Sopenharmony_ci 146c29fa5a6Sopenharmony_citemplate<typename T> 147c29fa5a6Sopenharmony_ciVector2<T> Vector2<T>::operator/(T scale) const 148c29fa5a6Sopenharmony_ci{ 149c29fa5a6Sopenharmony_ci if (MMI_EQ(scale, 0)) { 150c29fa5a6Sopenharmony_ci return *this; 151c29fa5a6Sopenharmony_ci } 152c29fa5a6Sopenharmony_ci const T invScale = 1.0f / scale; 153c29fa5a6Sopenharmony_ci return (*this) * invScale; 154c29fa5a6Sopenharmony_ci} 155c29fa5a6Sopenharmony_ci 156c29fa5a6Sopenharmony_citemplate<typename T> 157c29fa5a6Sopenharmony_ciVector2<T> Vector2<T>::operator*(T scale) const 158c29fa5a6Sopenharmony_ci{ 159c29fa5a6Sopenharmony_ci Vector2<T> rMult(*this); 160c29fa5a6Sopenharmony_ci T* rData = rMult.data_; 161c29fa5a6Sopenharmony_ci 162c29fa5a6Sopenharmony_ci rData[0] *= scale; 163c29fa5a6Sopenharmony_ci rData[1] *= scale; 164c29fa5a6Sopenharmony_ci return rMult; 165c29fa5a6Sopenharmony_ci} 166c29fa5a6Sopenharmony_ci 167c29fa5a6Sopenharmony_citemplate<typename T> 168c29fa5a6Sopenharmony_ciVector2<T> Vector2<T>::operator*(const Vector2<T>& other) const 169c29fa5a6Sopenharmony_ci{ 170c29fa5a6Sopenharmony_ci Vector2<T> rMult(*this); 171c29fa5a6Sopenharmony_ci return rMult *= other; 172c29fa5a6Sopenharmony_ci} 173c29fa5a6Sopenharmony_ci 174c29fa5a6Sopenharmony_citemplate<typename T> 175c29fa5a6Sopenharmony_ciVector2<T>& Vector2<T>::operator*=(const Vector2<T>& other) 176c29fa5a6Sopenharmony_ci{ 177c29fa5a6Sopenharmony_ci const T* oData = other.data_; 178c29fa5a6Sopenharmony_ci data_[0] *= oData[0]; 179c29fa5a6Sopenharmony_ci data_[1] *= oData[1]; 180c29fa5a6Sopenharmony_ci return *this; 181c29fa5a6Sopenharmony_ci} 182c29fa5a6Sopenharmony_ci 183c29fa5a6Sopenharmony_citemplate<typename T> 184c29fa5a6Sopenharmony_ciVector2<T>& Vector2<T>::operator+=(const Vector2<T>& other) 185c29fa5a6Sopenharmony_ci{ 186c29fa5a6Sopenharmony_ci data_[0] += other.data_[0]; 187c29fa5a6Sopenharmony_ci data_[1] += other.data_[1]; 188c29fa5a6Sopenharmony_ci return *this; 189c29fa5a6Sopenharmony_ci} 190c29fa5a6Sopenharmony_ci 191c29fa5a6Sopenharmony_citemplate<typename T> 192c29fa5a6Sopenharmony_ciVector2<T>& Vector2<T>::operator=(const Vector2<T>& other) 193c29fa5a6Sopenharmony_ci{ 194c29fa5a6Sopenharmony_ci const T* oData = other.data_; 195c29fa5a6Sopenharmony_ci data_[0] = oData[0]; 196c29fa5a6Sopenharmony_ci data_[1] = oData[1]; 197c29fa5a6Sopenharmony_ci return *this; 198c29fa5a6Sopenharmony_ci} 199c29fa5a6Sopenharmony_ci 200c29fa5a6Sopenharmony_citemplate<typename T> 201c29fa5a6Sopenharmony_ciT Vector2<T>::operator[](int index) const 202c29fa5a6Sopenharmony_ci{ 203c29fa5a6Sopenharmony_ci return data_[index]; 204c29fa5a6Sopenharmony_ci} 205c29fa5a6Sopenharmony_ci 206c29fa5a6Sopenharmony_citemplate<typename T> 207c29fa5a6Sopenharmony_ciinline T& Vector2<T>::operator[](int index) 208c29fa5a6Sopenharmony_ci{ 209c29fa5a6Sopenharmony_ci return data_[index]; 210c29fa5a6Sopenharmony_ci} 211c29fa5a6Sopenharmony_ci 212c29fa5a6Sopenharmony_citemplate<typename T> 213c29fa5a6Sopenharmony_ciinline bool Vector2<T>::operator==(const Vector2& other) const 214c29fa5a6Sopenharmony_ci{ 215c29fa5a6Sopenharmony_ci const T* oData = other.data_; 216c29fa5a6Sopenharmony_ci 217c29fa5a6Sopenharmony_ci return (MMI_EQ<T>(data_[0], oData[0])) && (MMI_EQ<T>(data_[1], oData[1])); 218c29fa5a6Sopenharmony_ci} 219c29fa5a6Sopenharmony_ci 220c29fa5a6Sopenharmony_citemplate<typename T> 221c29fa5a6Sopenharmony_ciinline bool Vector2<T>::operator!=(const Vector2& other) const 222c29fa5a6Sopenharmony_ci{ 223c29fa5a6Sopenharmony_ci const T* oData = other.data_; 224c29fa5a6Sopenharmony_ci 225c29fa5a6Sopenharmony_ci return (!MMI_EQ<T>(data_[0], oData[0])) || (!MMI_EQ<T>(data_[1], oData[1])); 226c29fa5a6Sopenharmony_ci} 227c29fa5a6Sopenharmony_ci 228c29fa5a6Sopenharmony_citemplate<typename T> 229c29fa5a6Sopenharmony_cibool Vector2<T>::IsNearEqual(const Vector2& other, T threshold) const 230c29fa5a6Sopenharmony_ci{ 231c29fa5a6Sopenharmony_ci const T* otherData = other.data_; 232c29fa5a6Sopenharmony_ci 233c29fa5a6Sopenharmony_ci return (MMI_EQ<T>(data_[0], otherData[0], threshold)) && (MMI_EQ<T>(data_[1], otherData[1], threshold)); 234c29fa5a6Sopenharmony_ci} 235c29fa5a6Sopenharmony_ci 236c29fa5a6Sopenharmony_citemplate<typename T> 237c29fa5a6Sopenharmony_ciinline T* Vector2<T>::GetData() 238c29fa5a6Sopenharmony_ci{ 239c29fa5a6Sopenharmony_ci return data_; 240c29fa5a6Sopenharmony_ci} 241c29fa5a6Sopenharmony_ci 242c29fa5a6Sopenharmony_citemplate<typename T> 243c29fa5a6Sopenharmony_ciT Vector2<T>::GetLength() const 244c29fa5a6Sopenharmony_ci{ 245c29fa5a6Sopenharmony_ci return sqrt(GetSqrLength()); 246c29fa5a6Sopenharmony_ci} 247c29fa5a6Sopenharmony_ci 248c29fa5a6Sopenharmony_citemplate<typename T> 249c29fa5a6Sopenharmony_ciT Vector2<T>::GetSqrLength() const 250c29fa5a6Sopenharmony_ci{ 251c29fa5a6Sopenharmony_ci T sum = data_[0] * data_[0]; 252c29fa5a6Sopenharmony_ci sum += data_[1] * data_[1]; 253c29fa5a6Sopenharmony_ci return sum; 254c29fa5a6Sopenharmony_ci} 255c29fa5a6Sopenharmony_ci 256c29fa5a6Sopenharmony_citemplate<typename T> 257c29fa5a6Sopenharmony_ciT Vector2<T>::Normalize() 258c29fa5a6Sopenharmony_ci{ 259c29fa5a6Sopenharmony_ci T l = GetLength(); 260c29fa5a6Sopenharmony_ci if (MMI_EQ<T>(l, 0.0)) { 261c29fa5a6Sopenharmony_ci return 0.0f; 262c29fa5a6Sopenharmony_ci } 263c29fa5a6Sopenharmony_ci 264c29fa5a6Sopenharmony_ci const T invLen = 1.0f / l; 265c29fa5a6Sopenharmony_ci 266c29fa5a6Sopenharmony_ci data_[0] *= invLen; 267c29fa5a6Sopenharmony_ci data_[1] *= invLen; 268c29fa5a6Sopenharmony_ci return l; 269c29fa5a6Sopenharmony_ci} 270c29fa5a6Sopenharmony_ci 271c29fa5a6Sopenharmony_citemplate<typename T> 272c29fa5a6Sopenharmony_cibool Vector2<T>::IsInfinite() const 273c29fa5a6Sopenharmony_ci{ 274c29fa5a6Sopenharmony_ci return std::isinf(data_[0]) || std::isinf(data_[1]); 275c29fa5a6Sopenharmony_ci} 276c29fa5a6Sopenharmony_ci 277c29fa5a6Sopenharmony_citemplate<typename T> 278c29fa5a6Sopenharmony_cibool Vector2<T>::IsNaN() const 279c29fa5a6Sopenharmony_ci{ 280c29fa5a6Sopenharmony_ci return IsNan(data_[0]) || IsNan(data_[1]); 281c29fa5a6Sopenharmony_ci} 282c29fa5a6Sopenharmony_ci} // namespace Rosen 283c29fa5a6Sopenharmony_ci} // namespace OHOS 284c29fa5a6Sopenharmony_ci#endif // RENDER_SERVICE_CLIENT_CORE_COMMON_RS_VECTOR2_H 285