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 REGION_H
17 #define REGION_H
18
19 #include "impl_interface/region_impl.h"
20 #include "utils/drawing_macros.h"
21
22 namespace OHOS {
23 namespace Rosen {
24 namespace Drawing {
25 enum class RegionOp {
26 DIFFERENCE,
27 INTERSECT,
28 UNION,
29 XOR,
30 REVERSE_DIFFERENCE,
31 REPLACE,
32 };
33 class DRAWING_API Region {
34 public:
35 Region();
36 Region(const Region& other);
37 Region& operator=(const Region& other);
38 virtual ~Region() = default;
39
Clone(const Region& other)40 void Clone(const Region& other)
41 {
42 impl_->Clone(other);
43 }
44
GetDrawingType() const45 virtual DrawingType GetDrawingType() const
46 {
47 return DrawingType::COMMON;
48 }
49
50 virtual bool Contains(int32_t x, int32_t y) const;
51
52 /**
53 * @brief Constructs a rectangular Region matching the bounds of rect.
54 * @param rectI Bounds of constructed Region.
55 * @return If rectI is empty, constructs empty and returns false.
56 */
57 virtual bool SetRect(const RectI& rectI);
58
59 /**
60 * @brief Constructs Region to match outline of path within clip.
61 * @param path Providing outline.
62 * @param clip Containing path.
63 * @return Return true if constructed Region is not empty.
64 */
65 virtual bool SetPath(const Path& path, const Region& clip);
66
67 /**
68 * @brief Appends outline of Region to path.
69 * @param path Path to append to.
70 * @return Return true if path changed.
71 */
72 bool GetBoundaryPath(Path* path) const;
73
74 /**
75 * @brief Determines whether it intersects other.
76 * @param other Other Region object.
77 * @return If true indicates that other and Region have area in common.
78 */
79 bool IsIntersects(const Region& other) const;
80
81 /**
82 * @brief Determines whether Region is empty.
83 * @return If true indicates that bounds has no width or height.
84 */
85 bool IsEmpty() const;
86
87 /**
88 * @brief Determines whether Region is one Rect with positive dimensions.
89 * @return If true indicates that Region contains one Rect.
90 */
91 bool IsRect() const;
92
93 /**
94 * @brief Determines whether other region is in the region.
95 * @param other Other region object.
96 * @return If true indicates that other and region have area in common.
97 */
98 virtual bool IsRegionContained(const Region& other) const;
99
100 /**
101 * @brief Replaces Region with the result of Region op region.
102 * @param region Operand.
103 * @param op Operation type.
104 * @return Returns true if replaced Region is not empty.
105 */
106 virtual bool Op(const Region& region, RegionOp op);
107
108 /**
109 * @brief Determines whether rect and region does not intersect.
110 * @param rectI RectI to intersect.
111 * @return Returns true if rect and region is not intersect.
112 */
113 virtual bool QuickReject(const RectI& rectI) const;
114
115 inline void Dump(std::string& out) const;
116
117 std::shared_ptr<Data> Serialize() const;
118 bool Deserialize(std::shared_ptr<Data> data);
119
120 /**
121 * @brief Get the adaptation layer instance, called in the adaptation layer.
122 * @return Adaptation Layer instance.
123 */
124 template<typename T>
GetImpl() const125 T* GetImpl() const
126 {
127 return impl_->DowncastingTo<T>();
128 }
129
130 private:
131 std::shared_ptr<RegionImpl> impl_;
132 };
133
Dump(std::string& out) const134 inline void Region::Dump(std::string& out) const
135 {
136 out += "[empty:" + std::string(impl_->IsEmpty() ? "true" : "false");
137 out += " isRect:" + std::string(impl_->IsRect() ? "true" : "false");
138 out += " BoundaryPath";
139 Path path;
140 impl_->GetBoundaryPath(&path);
141 path.Dump(out);
142 out += "]";
143 }
144 } // namespace Drawing
145 } // namespace Rosen
146 } // namespace OHOS
147 #endif
148