1 /*
2  * Copyright (c) 2022 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_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PAINTS_RENDER_PROPERTY_H
17 #define FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PAINTS_RENDER_PROPERTY_H
18 
19 #include "base/geometry/ng/offset_t.h"
20 #include "base/geometry/ng/vector.h"
21 #include "core/components/common/layout/position_param.h"
22 #include "core/components/common/properties/clip_path.h"
23 #include "core/components/common/properties/color.h"
24 #include "core/components/common/properties/decoration.h"
25 #include "core/components/common/properties/shadow.h"
26 #include "core/components/common/properties/blend_mode.h"
27 #include "core/components_ng/base/inspector_filter.h"
28 #include "core/components_ng/property/border_property.h"
29 #include "core/components_ng/property/gradient_property.h"
30 #include "core/components_ng/property/overlay_property.h"
31 #include "core/components_ng/property/property.h"
32 #include "core/components_ng/property/transition_property.h"
33 #include "core/image/image_source_info.h"
34 
35 namespace OHOS::Ace {
36 enum class BlurStyle;
37 } // namespace OHOS::Ace
38 
39 namespace OHOS::Ace::NG {
40 
41 struct BackgroundProperty {
42     ACE_DEFINE_PROPERTY_GROUP_ITEM(BackgroundImage, ImageSourceInfo);
43     ACE_DEFINE_PROPERTY_GROUP_ITEM(BackgroundImageRepeat, ImageRepeat);
44     ACE_DEFINE_PROPERTY_GROUP_ITEM(BackgroundImageSize, BackgroundImageSize);
45     ACE_DEFINE_PROPERTY_GROUP_ITEM(BackgroundImagePosition, BackgroundImagePosition);
46     ACE_DEFINE_PROPERTY_GROUP_ITEM(BackgroundImageResizableSlice, ImageResizableSlice);
CheckBlurStyleOptionBackgroundProperty47     bool CheckBlurStyleOption(const std::optional<BlurStyleOption>& option) const
48     {
49         if (!option.has_value()) {
50             return false;
51         }
52         if (!propBlurStyleOption.has_value()) {
53             return false;
54         }
55         return NearEqual(propBlurStyleOption.value(), option.value());
56     }
CheckBlurRadiusBackgroundProperty57     bool CheckBlurRadius(const Dimension& radius) const
58     {
59         if (!propBlurRadius.has_value()) {
60             return false;
61         }
62         return NearEqual(propBlurRadius.value(), radius);
63     }
CheckEffectOptionBackgroundProperty64     bool CheckEffectOption(const std::optional<EffectOption>& effectOption) const
65     {
66         if (!effectOption.has_value()) {
67             return false;
68         }
69         if (!propEffectOption.has_value()) {
70             return false;
71         }
72         return NearEqual(propEffectOption.value(), effectOption.value());
73     }
74     std::optional<BlurStyleOption> propBlurStyleOption;
75     std::optional<Dimension> propBlurRadius;
76     std::optional<EffectOption> propEffectOption;
77 
78     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const;
79 };
80 
81 struct CustomBackgroundProperty {
82     ACE_DEFINE_PROPERTY_GROUP_ITEM(BackgroundPixelMap, RefPtr<PixelMap>);
83     ACE_DEFINE_PROPERTY_GROUP_ITEM(BackgroundAlign, Alignment);
84 
85     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const;
86 };
87 
88 struct ForegroundProperty {
89     ACE_DEFINE_PROPERTY_GROUP_ITEM(MotionBlur, MotionBlurOption);
CheckBlurStyleOptionForegroundProperty90     bool CheckBlurStyleOption(const std::optional<BlurStyleOption>& option) const
91     {
92         if (!option.has_value()) {
93             return false;
94         }
95         if (!propBlurStyleOption.has_value()) {
96             return false;
97         }
98         return NearEqual(propBlurStyleOption.value(), option.value());
99     }
CheckBlurRadiusForegroundProperty100     bool CheckBlurRadius(const Dimension& radius) const
101     {
102         if (!propBlurRadius.has_value()) {
103             return false;
104         }
105         return NearEqual(propBlurRadius.value(), radius);
106     }
107     std::optional<BlurStyleOption> propBlurStyleOption;
108     std::optional<Dimension> propBlurRadius;
109     ACE_DEFINE_PROPERTY_GROUP_ITEM(ForegroundEffect, float);
110     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const;
111 };
112 
113 struct BorderImageProperty {
114     ACE_DEFINE_PROPERTY_GROUP_ITEM(BorderImage, RefPtr<BorderImage>);
115     ACE_DEFINE_PROPERTY_GROUP_ITEM(BorderImageSource, ImageSourceInfo);
116     ACE_DEFINE_PROPERTY_GROUP_ITEM(HasBorderImageSlice, bool);
117     ACE_DEFINE_PROPERTY_GROUP_ITEM(HasBorderImageWidth, bool);
118     ACE_DEFINE_PROPERTY_GROUP_ITEM(HasBorderImageOutset, bool);
119     ACE_DEFINE_PROPERTY_GROUP_ITEM(HasBorderImageRepeat, bool);
120     ACE_DEFINE_PROPERTY_GROUP_ITEM(BorderImageGradient, Gradient);
121     ACE_DEFINE_PROPERTY_GROUP_ITEM(BorderSourceFromImage, bool);
122 
ToJsonValueBorderImageProperty123     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const
124     {
125         static const char* REPEAT_MODE[] = {
126             "RepeatMode.Space",
127             "RepeatMode.Stretch",
128             "RepeatMode.Repeat",
129             "RepeatMode.Round",
130         };
131         auto jsonBorderImage = JsonUtil::Create(true);
132         jsonBorderImage->Put("source", propBorderImage.value_or(AceType::MakeRefPtr<BorderImage>())->GetSrc().c_str());
133         jsonBorderImage->Put(
134             "slice", propBorderImage.value_or(AceType::MakeRefPtr<BorderImage>())->SliceToString().c_str());
135         jsonBorderImage->Put(
136             "width", propBorderImage.value_or(AceType::MakeRefPtr<BorderImage>())->WidthToString().c_str());
137         jsonBorderImage->Put(
138             "outset", propBorderImage.value_or(AceType::MakeRefPtr<BorderImage>())->OutsetToString().c_str());
139         jsonBorderImage->Put("repeat", REPEAT_MODE[static_cast<int>(
140             propBorderImage.value_or(AceType::MakeRefPtr<BorderImage>())->GetRepeatMode())]);
141         jsonBorderImage->Put("fill", propBorderImage.value_or(AceType::MakeRefPtr<BorderImage>())
142             ->GetNeedFillCenter() ? "true" : "false");
143         json->PutExtAttr("borderImage", jsonBorderImage->ToString().c_str(), filter);
144     }
145 };
146 
147 struct BorderProperty {
148     ACE_DEFINE_PROPERTY_GROUP_ITEM(BorderRadius, BorderRadiusProperty);
149     ACE_DEFINE_PROPERTY_GROUP_ITEM(BorderColor, BorderColorProperty);
150     ACE_DEFINE_PROPERTY_GROUP_ITEM(BorderStyle, BorderStyleProperty);
151     ACE_DEFINE_PROPERTY_GROUP_ITEM(BorderWidth, BorderWidthProperty);
152     ACE_DEFINE_PROPERTY_GROUP_ITEM(DashGap, BorderWidthProperty);
153     ACE_DEFINE_PROPERTY_GROUP_ITEM(DashWidth, BorderWidthProperty);
154 
155     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const;
156 };
157 
158 struct PointLightProperty {
159     ACE_DEFINE_PROPERTY_GROUP_ITEM(LightPosition, TranslateOptions);
160     ACE_DEFINE_PROPERTY_GROUP_ITEM(LightIntensity, float);
161     ACE_DEFINE_PROPERTY_GROUP_ITEM(LightColor, Color);
162     ACE_DEFINE_PROPERTY_GROUP_ITEM(LightIlluminated, uint32_t);
163     ACE_DEFINE_PROPERTY_GROUP_ITEM(IlluminatedBorderWidth, Dimension);
164     ACE_DEFINE_PROPERTY_GROUP_ITEM(Bloom, float);
165 
166     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const;
167 };
168 
169 struct OuterBorderProperty {
170     ACE_DEFINE_PROPERTY_GROUP_ITEM(OuterBorderRadius, BorderRadiusProperty);
171     ACE_DEFINE_PROPERTY_GROUP_ITEM(OuterBorderColor, BorderColorProperty);
172     ACE_DEFINE_PROPERTY_GROUP_ITEM(OuterBorderStyle, BorderStyleProperty);
173     ACE_DEFINE_PROPERTY_GROUP_ITEM(OuterBorderWidth, BorderWidthProperty);
174 
175     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const;
176 };
177 
178 struct TransformProperty {
179     ACE_DEFINE_PROPERTY_GROUP_ITEM(TransformScale, VectorF);
180     ACE_DEFINE_PROPERTY_GROUP_ITEM(TransformCenter, DimensionOffset);
181     ACE_DEFINE_PROPERTY_GROUP_ITEM(TransformTranslate, TranslateOptions);
182     ACE_DEFINE_PROPERTY_GROUP_ITEM(TransformRotate, Vector5F);
183 
184     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const;
185 };
186 
187 struct GraphicsProperty {
188     ACE_DEFINE_PROPERTY_GROUP_ITEM(FrontBrightness, Dimension);
189     ACE_DEFINE_PROPERTY_GROUP_ITEM(FrontGrayScale, Dimension);
190     ACE_DEFINE_PROPERTY_GROUP_ITEM(FrontContrast, Dimension);
191     ACE_DEFINE_PROPERTY_GROUP_ITEM(FrontSaturate, Dimension);
192     ACE_DEFINE_PROPERTY_GROUP_ITEM(FrontSepia, Dimension);
193     ACE_DEFINE_PROPERTY_GROUP_ITEM(FrontInvert, InvertVariant);
194     ACE_DEFINE_PROPERTY_GROUP_ITEM(SystemBarEffect, bool);
195     ACE_DEFINE_PROPERTY_GROUP_ITEM(FrontHueRotate, float);
196     ACE_DEFINE_PROPERTY_GROUP_ITEM(FrontColorBlend, Color);
197     ACE_DEFINE_PROPERTY_GROUP_ITEM(FrontBlurRadius, Dimension);
198     ACE_DEFINE_PROPERTY_GROUP_ITEM(LinearGradientBlur, NG::LinearGradientBlurPara);
199     ACE_DEFINE_PROPERTY_GROUP_ITEM(Magnifier, MagnifierParams);
200     ACE_DEFINE_PROPERTY_GROUP_ITEM(DynamicLightUpRate, float);
201     ACE_DEFINE_PROPERTY_GROUP_ITEM(DynamicLightUpDegree, float);
202     ACE_DEFINE_PROPERTY_GROUP_ITEM(BgDynamicBrightnessOption, BrightnessOption);
203     ACE_DEFINE_PROPERTY_GROUP_ITEM(FgDynamicBrightnessOption, BrightnessOption);
204     ACE_DEFINE_PROPERTY_GROUP_ITEM(DynamicDimDegree, float);
205     ACE_DEFINE_PROPERTY_GROUP_ITEM(BackShadow, Shadow);
206     ACE_DEFINE_PROPERTY_GROUP_ITEM(BackBlendMode, BlendMode);
207     ACE_DEFINE_PROPERTY_GROUP_ITEM(BackBlendApplyType, BlendApplyType);
208 
209     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const;
210 };
211 
212 struct RenderPositionProperty {
213     ACE_DEFINE_PROPERTY_GROUP_ITEM(Position, OffsetT<Dimension>);
214     ACE_DEFINE_PROPERTY_GROUP_ITEM(Offset, OffsetT<Dimension>);
215     ACE_DEFINE_PROPERTY_GROUP_ITEM(PositionEdges, EdgesParam);
216     ACE_DEFINE_PROPERTY_GROUP_ITEM(OffsetEdges, EdgesParam);
217     ACE_DEFINE_PROPERTY_GROUP_ITEM(Anchor, OffsetT<Dimension>);
218 
219     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const;
220 };
221 
222 struct ClipProperty {
223     ACE_DEFINE_PROPERTY_GROUP_ITEM(ClipShape, RefPtr<BasicShape>);
224     ACE_DEFINE_PROPERTY_GROUP_ITEM(ClipEdge, bool);
225     ACE_DEFINE_PROPERTY_GROUP_ITEM(ClipMask, RefPtr<BasicShape>);
226 
227     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const;
228 };
229 
230 struct GradientProperty {
231     ACE_DEFINE_PROPERTY_GROUP_ITEM(LinearGradient, NG::Gradient);
232     ACE_DEFINE_PROPERTY_GROUP_ITEM(SweepGradient, NG::Gradient);
233     ACE_DEFINE_PROPERTY_GROUP_ITEM(RadialGradient, NG::Gradient);
234     ACE_DEFINE_PROPERTY_GROUP_ITEM(LastGradientType, NG::GradientType);
235 
236     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const;
237 };
238 
239 struct OverlayProperty {
240     ACE_DEFINE_PROPERTY_GROUP_ITEM(OverlayText, OverlayOptions);
241 
ToJsonValueOverlayProperty242     void ToJsonValue(std::unique_ptr<JsonValue>& json, const InspectorFilter& filter) const
243     {
244         propOverlayText.value_or(OverlayOptions()).ToJsonValue(json, filter);
245     }
246 };
247 
248 struct MotionPathProperty {
249     ACE_DEFINE_PROPERTY_GROUP_ITEM(MotionPath, MotionPathOption);
250 };
251 
252 } // namespace OHOS::Ace::NG
253 
254 #endif // FOUNDATION_ACE_FRAMEWORKS_CORE_COMPONENTS_NG_PAINTS_RENDER_PROPERTY_H
255