1/*
2 * Copyright (c) 2023 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 OHOS_ROSEN_SESSION_HELPER_H
17#define OHOS_ROSEN_SESSION_HELPER_H
18
19#include <pointer_event.h>
20
21#include <string>
22#include "ws_common.h"
23#include "ws_common_inner.h"
24#include "wm_common.h"
25#include "wm_common_inner.h"
26
27namespace OHOS {
28namespace Rosen {
29class SessionHelper {
30public:
31    static WSRect GetOverlap(const WSRect& rect1, const WSRect& rect2, int offsetX, int offsetY)
32    {
33        int32_t x_begin = std::max(rect1.posX_, rect2.posX_);
34        int32_t x_end = std::min(rect1.posX_ + static_cast<int32_t>(rect1.width_),
35            rect2.posX_ + static_cast<int32_t>(rect2.width_));
36        int32_t y_begin = std::max(rect1.posY_, rect2.posY_);
37        int32_t y_end = std::min(rect1.posY_ + static_cast<int32_t>(rect1.height_),
38            rect2.posY_ + static_cast<int32_t>(rect2.height_));
39        if (y_begin >= y_end || x_begin >= x_end) {
40            return { 0, 0, 0, 0 };
41        }
42        return { x_begin - offsetX, y_begin - offsetY,
43            static_cast<uint32_t>(x_end - x_begin), static_cast<uint32_t>(y_end - y_begin) };
44    }
45
46    static inline bool IsEmptyRect(const WSRect& r)
47    {
48        return (r.posX_ == 0 && r.posY_ == 0 && r.width_ == 0 && r.height_ == 0);
49    }
50
51    static bool IsPointInRect(int32_t pointPosX, int32_t pointPosY, const Rect& rect)
52    {
53        if ((pointPosX > rect.posX_) &&
54            (pointPosX < (rect.posX_ + static_cast<int32_t>(rect.width_)) - 1) &&
55            (pointPosY > rect.posY_) &&
56            (pointPosY < (rect.posY_ + static_cast<int32_t>(rect.height_)) - 1)) {
57            return true;
58        }
59        return false;
60    }
61
62    static inline WSRect TransferToWSRect(const Rect& rect)
63    {
64        WSRect r;
65        r.height_ = rect.height_;
66        r.width_ = rect.width_;
67        r.posX_ = rect.posX_;
68        r.posY_ = rect.posY_;
69        return r;
70    }
71
72    static inline Rect TransferToRect(const WSRect& rect)
73    {
74        Rect r;
75        r.height_ = rect.height_;
76        r.width_ = rect.width_;
77        r.posX_ = rect.posX_;
78        r.posY_ = rect.posY_;
79        return r;
80    }
81
82    static inline bool IsBelowSystemWindow(WindowType type)
83    {
84        return (type >= WindowType::BELOW_APP_SYSTEM_WINDOW_BASE && type < WindowType::BELOW_APP_SYSTEM_WINDOW_END);
85    }
86
87    static inline bool IsAboveSystemWindow(WindowType type)
88    {
89        return (type >= WindowType::ABOVE_APP_SYSTEM_WINDOW_BASE && type < WindowType::ABOVE_APP_SYSTEM_WINDOW_END);
90    }
91
92    static inline bool IsSystemSubWindow(WindowType type)
93    {
94        return (type >= WindowType::SYSTEM_SUB_WINDOW_BASE && type < WindowType::SYSTEM_SUB_WINDOW_END);
95    }
96
97    static inline bool IsSystemWindow(WindowType type)
98    {
99        return (IsBelowSystemWindow(type) || IsAboveSystemWindow(type) || IsSystemSubWindow(type));
100    }
101
102    static inline bool IsMainWindow(WindowType type)
103    {
104        return (type >= WindowType::APP_MAIN_WINDOW_BASE && type < WindowType::APP_MAIN_WINDOW_END);
105    }
106
107    static inline bool IsSubWindow(WindowType type)
108    {
109        return (type >= WindowType::APP_SUB_WINDOW_BASE && type < WindowType::APP_SUB_WINDOW_END);
110    }
111
112    static inline bool IsNonSecureToUIExtension(WindowType type)
113    {
114        return IsSubWindow(type) || type == WindowType::WINDOW_TYPE_DIALOG;
115    }
116
117    static AreaType GetAreaType(int32_t pointWinX, int32_t pointWinY,
118        int32_t sourceType, int outside, float vpr, const WSRect& rect)
119    {
120        int32_t insideCorner = WINDOW_FRAME_CORNER_WIDTH * vpr;
121        int32_t insideEdge = WINDOW_FRAME_WIDTH * vpr;
122        int32_t leftOut = -outside;
123        int32_t leftIn = insideEdge;
124        int32_t leftCorner = insideCorner;
125        int32_t rightCorner = rect.width_ - insideCorner;
126        int32_t rightIn = rect.width_ - insideEdge;
127        int32_t rightOut = rect.width_ + outside;
128        int32_t topOut = -outside;
129        int32_t topIn = insideEdge;
130        int32_t topCorner = insideCorner;
131        int32_t bottomCorner = rect.height_ - insideCorner;
132        int32_t bottomIn = rect.height_ - insideEdge;
133        int32_t bottomOut = rect.height_ + outside;
134
135        auto isInRange = [](int32_t min, int32_t max, int32_t value) { return min <= value && value <= max; };
136
137        AreaType type;
138        if (isInRange(leftOut, leftCorner, pointWinX) && isInRange(topOut, topCorner, pointWinY)) {
139            type = AreaType::LEFT_TOP;
140        } else if (isInRange(rightCorner, rightOut, pointWinX) && isInRange(topOut, topCorner, pointWinY)) {
141            type = AreaType::RIGHT_TOP;
142        } else if (isInRange(rightCorner, rightOut, pointWinX) && isInRange(bottomCorner, bottomOut, pointWinY)) {
143            type = AreaType::RIGHT_BOTTOM;
144        } else if (isInRange(leftOut, leftCorner, pointWinX) && isInRange(bottomCorner, bottomOut, pointWinY)) {
145            type = AreaType::LEFT_BOTTOM;
146        } else if (isInRange(leftOut, leftIn, pointWinX)) {
147            type = AreaType::LEFT;
148        } else if (isInRange(topOut, topIn, pointWinY)) {
149            type = AreaType::TOP;
150        } else if (isInRange(rightIn, rightOut, pointWinX)) {
151            type = AreaType::RIGHT;
152        } else if (isInRange(bottomIn, bottomOut, pointWinY)) {
153            type = AreaType::BOTTOM;
154        } else {
155            type = AreaType::UNDEFINED;
156        }
157        return type;
158    }
159};
160} // Rosen
161} // OHOS
162#endif // OHOS_ROSEN_SESSION_HELPER_H