1 /* 2 * Copyright (c) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef GEOMETRY_OFFSET_H 17 #define GEOMETRY_OFFSET_H 18 19 #include <limits> 20 21 #include "size.h" 22 #include "utils.h" 23 24 namespace OHOS::uitest { 25 class Offset { 26 public: 27 Offset() = default; 28 ~Offset() = default; Offset(double deltaX,double deltaY)29 Offset(double deltaX, double deltaY) : deltaX_(deltaX), deltaY_(deltaY) {} 30 Resets()31 void Resets() 32 { 33 deltaX_ = 0.0; 34 deltaY_ = 0.0; 35 } 36 Zero()37 static Offset Zero() 38 { 39 return Offset(); 40 } 41 ErrorOffset()42 static Offset ErrorOffset() 43 { 44 return Offset((std::numeric_limits<double>::max)(), (std::numeric_limits<double>::max)()); 45 } 46 IsZero()47 bool IsZero() const 48 { 49 return operator==(Offset()); 50 } 51 IsErrorOffset()52 bool IsErrorOffset() const 53 { 54 return operator==(ErrorOffset()); 55 } 56 GetX()57 double GetX() const 58 { 59 return deltaX_; 60 } 61 GetY()62 double GetY() const 63 { 64 return deltaY_; 65 } 66 GetDistance()67 double GetDistance() const 68 { 69 return std::sqrt((deltaX_ * deltaX_) + (deltaY_ * deltaY_)); 70 } 71 72 Offset operator+(const Offset& offset) const 73 { 74 return Offset(deltaX_ + offset.deltaX_, deltaY_ + offset.deltaY_); 75 } 76 77 Offset operator+(const Size& size) const 78 { 79 return Offset(deltaX_ + size.Width(), deltaY_ + size.Height()); 80 } 81 82 Offset operator-(const Offset& offset) const 83 { 84 return Offset(deltaX_ - offset.deltaX_, deltaY_ - offset.deltaY_); 85 } 86 87 Offset operator-(const Size& size) const 88 { 89 return Offset(deltaX_ - size.Width(), deltaY_ - size.Height()); 90 } 91 92 Offset operator*(double value) const 93 { 94 return Offset(deltaX_ * value, deltaY_ * value); 95 } 96 97 Offset operator/(double value) const 98 { 99 if (NearZero(value)) { 100 return ErrorOffset(); 101 } 102 return Offset(deltaX_ / value, deltaY_ / value); 103 } 104 105 Offset& operator+=(const Offset& offset) 106 { 107 deltaX_ += offset.deltaX_; 108 deltaY_ += offset.deltaY_; 109 return *this; 110 } 111 112 Offset& operator-=(const Offset& offset) 113 { 114 deltaX_ -= offset.deltaX_; 115 deltaY_ -= offset.deltaY_; 116 return *this; 117 } 118 119 bool operator==(const Offset& offset) const 120 { 121 return NearEqual(deltaX_, offset.deltaX_) && NearEqual(deltaY_, offset.deltaY_); 122 } 123 124 bool operator!=(const Offset& offset) const 125 { 126 return !operator==(offset); 127 } 128 ToString()129 std::string ToString() const 130 { 131 std::stringstream ss; 132 ss << "Offset (" << std::fixed << std::setprecision(TWO) << deltaX_ << ", " << deltaY_ << ")"; 133 std::string output = ss.str(); 134 return output; 135 } 136 IsPositiveOffset()137 bool IsPositiveOffset() const 138 { 139 return deltaX_ >= 0 && deltaY_ >= 0; 140 } 141 142 private: 143 double deltaX_ = 0.0; 144 double deltaY_ = 0.0; 145 }; 146 } // namespace OHOS::uitest 147 148 #endif // GEOMETRY_OFFSET_H 149