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 FOUNDATION_DMSERVER_FOLD_SCREEN_INFO_H
17 #define FOUNDATION_DMSERVER_FOLD_SCREEN_INFO_H
18 
19 #include <parcel.h>
20 
21 #include "class_var_definition.h"
22 #include "cutout_info.h"
23 #include "dm_common.h"
24 
25 namespace OHOS::Rosen {
26 /**
27  * @brief Fold Crease Region
28  */
29 class FoldCreaseRegion : public Parcelable {
30 public:
31     FoldCreaseRegion() = default;
32 
FoldCreaseRegion(DisplayId displayId,const std::vector<DMRect> & creaseRects)33     FoldCreaseRegion(DisplayId displayId, const std::vector<DMRect>& creaseRects)
34         : displayId_(displayId), creaseRects_(creaseRects) {}
35 
36     ~FoldCreaseRegion() override = default;
37 
Marshalling(Parcel & parcel)38     bool Marshalling(Parcel& parcel) const override
39     {
40         return parcel.WriteUint64(displayId_) &&
41         WriteCreaseRectVector(creaseRects_, parcel);
42     }
43 
Unmarshalling(Parcel & parcel)44     static FoldCreaseRegion *Unmarshalling(Parcel& parcel)
45     {
46         DisplayId displayId = DISPLAY_ID_INVALID;
47         std::vector<DMRect> creaseRects;
48         parcel.ReadUint64(displayId);
49         ReadCreaseRectVector(creaseRects, parcel);
50         auto* region = new FoldCreaseRegion(displayId, creaseRects);
51         return region;
52     }
53 
DEFINE_VAR_DEFAULT_FUNC_GET_SET(DisplayId,DisplayId,displayId,DISPLAY_ID_INVALID)54 DEFINE_VAR_DEFAULT_FUNC_GET_SET(DisplayId, DisplayId, displayId, DISPLAY_ID_INVALID)
55 
56 DEFINE_VAR_FUNC_GET(std::vector<DMRect>, CreaseRects, creaseRects)
57 
58     void SetCreaseRects(std::vector<DMRect> value)
59     { creaseRects_ = std::move(value); }
60 private:
61     const static uint32_t MAX_CREASE_REGION_SIZE = 20;
62 
WriteCreaseRectVector(const std::vector<DMRect> & creaseRects,Parcel & parcel)63     static bool WriteCreaseRectVector(const std::vector<DMRect>& creaseRects, Parcel& parcel)
64     {
65         auto size = static_cast<uint32_t>(creaseRects.size());
66         if (!parcel.WriteUint32(size)) {
67             return false;
68         }
69         if (size > MAX_CREASE_REGION_SIZE) {
70             return false;
71         }
72         for (auto rect : creaseRects) {
73             if (!(parcel.WriteInt32(rect.posX_) && parcel.WriteInt32(rect.posY_) &&
74                 parcel.WriteUint32(rect.width_) && parcel.WriteUint32(rect.height_))) {
75                 return false;
76             }
77         }
78         return true;
79     }
80 
ReadCreaseRectVector(std::vector<DMRect> & creaseRects,Parcel & parcel)81     static bool ReadCreaseRectVector(std::vector<DMRect>& creaseRects, Parcel& parcel)
82     {
83         uint32_t size;
84         if (!parcel.ReadUint32(size)) {
85             return false;
86         }
87         if (size > MAX_CREASE_REGION_SIZE) {
88             return false;
89         }
90         for (uint32_t index = 0; index < size; index++) {
91             int32_t posX;
92             int32_t posY;
93             uint32_t width;
94             uint32_t height;
95             if (!(parcel.ReadInt32(posX) && parcel.ReadInt32(posY) &&
96                 parcel.ReadUint32(width) && parcel.ReadUint32(height))) {
97                 return false;
98             }
99             DMRect rect = {posX, posY, width, height};
100             creaseRects.push_back(rect);
101         }
102         return true;
103     }
104 };
105 } // namespace OHOS::Rosen
106 #endif // FOUNDATION_DMSERVER_FOLD_SCREEN_INFO_H