1886da342Sopenharmony_ci/* 2886da342Sopenharmony_ci * Copyright (c) 2022 Huawei Device Co., Ltd. 3886da342Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4886da342Sopenharmony_ci * you may not use this file except in compliance with the License. 5886da342Sopenharmony_ci * You may obtain a copy of the License at 6886da342Sopenharmony_ci * 7886da342Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8886da342Sopenharmony_ci * 9886da342Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10886da342Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11886da342Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12886da342Sopenharmony_ci * See the License for the specific language governing permissions and 13886da342Sopenharmony_ci * limitations under the License. 14886da342Sopenharmony_ci */ 15886da342Sopenharmony_ci 16886da342Sopenharmony_ci#ifndef GEOMETRY_OFFSET_H 17886da342Sopenharmony_ci#define GEOMETRY_OFFSET_H 18886da342Sopenharmony_ci 19886da342Sopenharmony_ci#include <limits> 20886da342Sopenharmony_ci 21886da342Sopenharmony_ci#include "size.h" 22886da342Sopenharmony_ci#include "utils.h" 23886da342Sopenharmony_ci#include "ui_model.h" 24886da342Sopenharmony_ci 25886da342Sopenharmony_cinamespace OHOS::uitest { 26886da342Sopenharmony_ciclass Offset { 27886da342Sopenharmony_cipublic: 28886da342Sopenharmony_ci Offset() = default; 29886da342Sopenharmony_ci ~Offset() = default; 30886da342Sopenharmony_ci Offset(double deltaX, double deltaY) : deltaX_(deltaX), deltaY_(deltaY) {} 31886da342Sopenharmony_ci Offset(Point p1, Point p2) : deltaX_(p2.px_-p1.px_), deltaY_(p2.py_-p1.py_) {} 32886da342Sopenharmony_ci 33886da342Sopenharmony_ci void Resets() 34886da342Sopenharmony_ci { 35886da342Sopenharmony_ci deltaX_ = 0.0; 36886da342Sopenharmony_ci deltaY_ = 0.0; 37886da342Sopenharmony_ci } 38886da342Sopenharmony_ci 39886da342Sopenharmony_ci static Offset Zero() 40886da342Sopenharmony_ci { 41886da342Sopenharmony_ci return Offset(); 42886da342Sopenharmony_ci } 43886da342Sopenharmony_ci 44886da342Sopenharmony_ci static Offset ErrorOffset() 45886da342Sopenharmony_ci { 46886da342Sopenharmony_ci return Offset((std::numeric_limits<double>::max)(), (std::numeric_limits<double>::max)()); 47886da342Sopenharmony_ci } 48886da342Sopenharmony_ci 49886da342Sopenharmony_ci bool IsZero() const 50886da342Sopenharmony_ci { 51886da342Sopenharmony_ci return operator==(Offset()); 52886da342Sopenharmony_ci } 53886da342Sopenharmony_ci 54886da342Sopenharmony_ci bool IsErrorOffset() const 55886da342Sopenharmony_ci { 56886da342Sopenharmony_ci return operator==(ErrorOffset()); 57886da342Sopenharmony_ci } 58886da342Sopenharmony_ci 59886da342Sopenharmony_ci double GetX() const 60886da342Sopenharmony_ci { 61886da342Sopenharmony_ci return deltaX_; 62886da342Sopenharmony_ci } 63886da342Sopenharmony_ci 64886da342Sopenharmony_ci double GetY() const 65886da342Sopenharmony_ci { 66886da342Sopenharmony_ci return deltaY_; 67886da342Sopenharmony_ci } 68886da342Sopenharmony_ci 69886da342Sopenharmony_ci double GetDistance() const 70886da342Sopenharmony_ci { 71886da342Sopenharmony_ci return std::sqrt((deltaX_ * deltaX_) + (deltaY_ * deltaY_)); 72886da342Sopenharmony_ci } 73886da342Sopenharmony_ci 74886da342Sopenharmony_ci Offset operator+(const Offset& offset) const 75886da342Sopenharmony_ci { 76886da342Sopenharmony_ci return Offset(deltaX_ + offset.deltaX_, deltaY_ + offset.deltaY_); 77886da342Sopenharmony_ci } 78886da342Sopenharmony_ci 79886da342Sopenharmony_ci Offset operator+(const Size& size) const 80886da342Sopenharmony_ci { 81886da342Sopenharmony_ci return Offset(deltaX_ + size.Width(), deltaY_ + size.Height()); 82886da342Sopenharmony_ci } 83886da342Sopenharmony_ci 84886da342Sopenharmony_ci Offset operator-(const Offset& offset) const 85886da342Sopenharmony_ci { 86886da342Sopenharmony_ci return Offset(deltaX_ - offset.deltaX_, deltaY_ - offset.deltaY_); 87886da342Sopenharmony_ci } 88886da342Sopenharmony_ci 89886da342Sopenharmony_ci Offset operator-(const Size& size) const 90886da342Sopenharmony_ci { 91886da342Sopenharmony_ci return Offset(deltaX_ - size.Width(), deltaY_ - size.Height()); 92886da342Sopenharmony_ci } 93886da342Sopenharmony_ci 94886da342Sopenharmony_ci Offset operator*(double value) const 95886da342Sopenharmony_ci { 96886da342Sopenharmony_ci return Offset(deltaX_ * value, deltaY_ * value); 97886da342Sopenharmony_ci } 98886da342Sopenharmony_ci 99886da342Sopenharmony_ci Offset operator/(double value) const 100886da342Sopenharmony_ci { 101886da342Sopenharmony_ci if (NearZero(value)) { 102886da342Sopenharmony_ci return ErrorOffset(); 103886da342Sopenharmony_ci } 104886da342Sopenharmony_ci return Offset(deltaX_ / value, deltaY_ / value); 105886da342Sopenharmony_ci } 106886da342Sopenharmony_ci 107886da342Sopenharmony_ci Offset& operator+=(const Offset& offset) 108886da342Sopenharmony_ci { 109886da342Sopenharmony_ci deltaX_ += offset.deltaX_; 110886da342Sopenharmony_ci deltaY_ += offset.deltaY_; 111886da342Sopenharmony_ci return *this; 112886da342Sopenharmony_ci } 113886da342Sopenharmony_ci 114886da342Sopenharmony_ci Offset& operator-=(const Offset& offset) 115886da342Sopenharmony_ci { 116886da342Sopenharmony_ci deltaX_ -= offset.deltaX_; 117886da342Sopenharmony_ci deltaY_ -= offset.deltaY_; 118886da342Sopenharmony_ci return *this; 119886da342Sopenharmony_ci } 120886da342Sopenharmony_ci 121886da342Sopenharmony_ci bool operator==(const Offset& offset) const 122886da342Sopenharmony_ci { 123886da342Sopenharmony_ci return NearEqual(deltaX_, offset.deltaX_) && NearEqual(deltaY_, offset.deltaY_); 124886da342Sopenharmony_ci } 125886da342Sopenharmony_ci 126886da342Sopenharmony_ci bool operator!=(const Offset& offset) const 127886da342Sopenharmony_ci { 128886da342Sopenharmony_ci return !operator==(offset); 129886da342Sopenharmony_ci } 130886da342Sopenharmony_ci 131886da342Sopenharmony_ci std::string ToString() const 132886da342Sopenharmony_ci { 133886da342Sopenharmony_ci std::stringstream ss; 134886da342Sopenharmony_ci ss << "Offset (" << std::fixed << std::setprecision(TWO) << deltaX_ << ", " << deltaY_ << ")"; 135886da342Sopenharmony_ci std::string output = ss.str(); 136886da342Sopenharmony_ci return output; 137886da342Sopenharmony_ci } 138886da342Sopenharmony_ci 139886da342Sopenharmony_ci bool IsPositiveOffset() const 140886da342Sopenharmony_ci { 141886da342Sopenharmony_ci return deltaX_ >= 0 && deltaY_ >= 0; 142886da342Sopenharmony_ci } 143886da342Sopenharmony_ci 144886da342Sopenharmony_ciprivate: 145886da342Sopenharmony_ci double deltaX_ = 0.0; 146886da342Sopenharmony_ci double deltaY_ = 0.0; 147886da342Sopenharmony_ci}; 148886da342Sopenharmony_ci} // namespace OHOS::uitest 149886da342Sopenharmony_ci 150886da342Sopenharmony_ci#endif // GEOMETRY_OFFSET_H 151