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