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 #include "core/interfaces/native/node/node_image_span_modifier.h"
16
17 #include "core/components/common/layout/constants.h"
18 #include "core/components_ng/base/frame_node.h"
19 #include "core/components_ng/base/view_abstract.h"
20 #include "core/components_ng/pattern/image/image_model_ng.h"
21 #include "core/components_ng/pattern/text/image_span_view.h"
22 #include "core/pipeline/base/element_register.h"
23
24 namespace OHOS::Ace::NG {
25 namespace {
26 constexpr int NUM_0 = 0;
27 constexpr int NUM_1 = 1;
28 constexpr int NUM_2 = 2;
29 constexpr int NUM_3 = 3;
30 constexpr int DEFAULT_LENGTH = 4;
31 constexpr VerticalAlign DEFAULT_VERTICAL_ALIGN = VerticalAlign::BOTTOM;
32 constexpr ImageFit DEFAULT_OBJECT_FIT = ImageFit::COVER;
33 constexpr Dimension DEFAULT_BASELINE_OFFSET { 0.0, DimensionUnit::FP };
34
SetImageSpanVerticalAlign(ArkUINodeHandle node,int32_t value)35 void SetImageSpanVerticalAlign(ArkUINodeHandle node, int32_t value)
36 {
37 auto* frameNode = reinterpret_cast<FrameNode*>(node);
38 CHECK_NULL_VOID(frameNode);
39 ImageSpanView::SetVerticalAlign(frameNode, static_cast<VerticalAlign>(value));
40 }
41
GetImageSpanVerticalAlign(ArkUINodeHandle node)42 int32_t GetImageSpanVerticalAlign(ArkUINodeHandle node)
43 {
44 auto* frameNode = reinterpret_cast<FrameNode*>(node);
45 CHECK_NULL_RETURN(frameNode, static_cast<int32_t>(DEFAULT_VERTICAL_ALIGN));
46 return static_cast<int32_t>(ImageSpanView::GetVerticalAlign(frameNode));
47 }
48
ResetImageSpanVerticalAlign(ArkUINodeHandle node)49 void ResetImageSpanVerticalAlign(ArkUINodeHandle node)
50 {
51 auto* frameNode = reinterpret_cast<FrameNode*>(node);
52 CHECK_NULL_VOID(frameNode);
53 ImageSpanView::SetVerticalAlign(frameNode, DEFAULT_VERTICAL_ALIGN);
54 }
55
SetImageSpanObjectFit(ArkUINodeHandle node,int32_t value)56 void SetImageSpanObjectFit(ArkUINodeHandle node, int32_t value)
57 {
58 auto* frameNode = reinterpret_cast<FrameNode*>(node);
59 CHECK_NULL_VOID(frameNode);
60 ImageModelNG::SetImageFit(frameNode, static_cast<ImageFit>(value));
61 }
62
GetImageSpanObjectFit(ArkUINodeHandle node)63 int32_t GetImageSpanObjectFit(ArkUINodeHandle node)
64 {
65 int32_t defaultObjectFit = static_cast<int32_t>(DEFAULT_OBJECT_FIT);
66 auto* frameNode = reinterpret_cast<FrameNode*>(node);
67 CHECK_NULL_RETURN(frameNode, defaultObjectFit);
68 return static_cast<int32_t>(ImageModelNG::GetObjectFit(frameNode));
69 }
70
ResetImageSpanObjectFit(ArkUINodeHandle node)71 void ResetImageSpanObjectFit(ArkUINodeHandle node)
72 {
73 auto* frameNode = reinterpret_cast<FrameNode*>(node);
74 CHECK_NULL_VOID(frameNode);
75 ImageModelNG::SetImageFit(frameNode, DEFAULT_OBJECT_FIT);
76 }
77
SetImageSpanTextBackgroundStyle(ArkUINodeHandle node,ArkUI_Uint32 color,const ArkUI_Float32 * values,const ArkUI_Int32 * units,ArkUI_Int32 length)78 void SetImageSpanTextBackgroundStyle(
79 ArkUINodeHandle node, ArkUI_Uint32 color, const ArkUI_Float32* values, const ArkUI_Int32* units, ArkUI_Int32 length)
80 {
81 auto* frameNode = reinterpret_cast<FrameNode*>(node);
82 CHECK_NULL_VOID(frameNode);
83 if (length != DEFAULT_LENGTH) {
84 return;
85 }
86 TextBackgroundStyle font;
87 NG::BorderRadiusProperty borderRadius;
88 borderRadius.radiusTopLeft = Dimension(values[NUM_0], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_0]));
89 borderRadius.radiusTopRight = Dimension(values[NUM_1], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_1]));
90 borderRadius.radiusBottomLeft = Dimension(values[NUM_2], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_2]));
91 borderRadius.radiusBottomRight = Dimension(values[NUM_3], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_3]));
92 font.backgroundColor = Color(color);
93 font.backgroundRadius = borderRadius;
94 font.backgroundRadius->multiValued = true;
95 ImageSpanView::SetPlaceHolderStyle(frameNode, font);
96 }
97
ResetImageSpanTextBackgroundStyle(ArkUINodeHandle node)98 void ResetImageSpanTextBackgroundStyle(ArkUINodeHandle node)
99 {
100 auto* frameNode = reinterpret_cast<FrameNode*>(node);
101 CHECK_NULL_VOID(frameNode);
102 TextBackgroundStyle font;
103 NG::BorderRadiusProperty borderRadius;
104 borderRadius.radiusTopLeft = Dimension(0, OHOS::Ace::DimensionUnit::VP);
105 borderRadius.radiusTopRight = Dimension(0, OHOS::Ace::DimensionUnit::VP);
106 borderRadius.radiusBottomLeft = Dimension(0, OHOS::Ace::DimensionUnit::VP);
107 borderRadius.radiusBottomRight = Dimension(0, OHOS::Ace::DimensionUnit::VP);
108 font.backgroundColor = Color(0x00000000);
109 font.backgroundRadius = borderRadius;
110 font.backgroundRadius->multiValued = true;
111 ImageSpanView::SetPlaceHolderStyle(frameNode, font);
112 }
113
GetImageSpanTextBackgroundStyle(ArkUINodeHandle node,ArkUITextBackgroundStyleOptions * options)114 void GetImageSpanTextBackgroundStyle(ArkUINodeHandle node, ArkUITextBackgroundStyleOptions* options)
115 {
116 auto* frameNode = reinterpret_cast<FrameNode*>(node);
117 CHECK_NULL_VOID(frameNode);
118 auto styleOptions = ImageSpanView::GetSpanTextBackgroundStyle(frameNode);
119 options->color = styleOptions.backgroundColor->GetValue();
120 options->topLeft = styleOptions.backgroundRadius->radiusTopLeft->Value();
121 options->topRight = styleOptions.backgroundRadius->radiusTopRight->Value();
122 options->bottomLeft = styleOptions.backgroundRadius->radiusBottomLeft->Value();
123 options->bottomLeft = styleOptions.backgroundRadius->radiusBottomLeft->Value();
124 }
125
SetImageSpanBaselineOffset(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit)126 void SetImageSpanBaselineOffset(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit)
127 {
128 auto* frameNode = reinterpret_cast<FrameNode*>(node);
129 CHECK_NULL_VOID(frameNode);
130 ImageSpanView::SetBaselineOffset(frameNode, CalcDimension(value, (DimensionUnit)unit));
131 }
132
ResetImageSpanBaselineOffset(ArkUINodeHandle node)133 void ResetImageSpanBaselineOffset(ArkUINodeHandle node)
134 {
135 auto* frameNode = reinterpret_cast<FrameNode*>(node);
136 CHECK_NULL_VOID(frameNode);
137 ImageSpanView::SetBaselineOffset(frameNode, DEFAULT_BASELINE_OFFSET);
138 }
139
GetImageSpanBaselineOffset(ArkUINodeHandle node,ArkUI_Int32 unit)140 float GetImageSpanBaselineOffset(ArkUINodeHandle node, ArkUI_Int32 unit)
141 {
142 auto* frameNode = reinterpret_cast<FrameNode*>(node);
143 CHECK_NULL_RETURN(frameNode, 0.0f);
144 return ImageSpanView::GetBaselineOffset(frameNode, unit);
145 }
146
SetImageSpanOnComplete(ArkUINodeHandle node,void * callback)147 void SetImageSpanOnComplete(ArkUINodeHandle node, void *callback)
148 {
149 auto* frameNode = reinterpret_cast<FrameNode*>(node);
150 CHECK_NULL_VOID(frameNode);
151 if (callback) {
152 auto onComplete = reinterpret_cast<std::function<void(const LoadImageSuccessEvent&)>*>(callback);
153 ImageSpanView::SetOnComplete(frameNode, std::move(*onComplete));
154 } else {
155 ImageSpanView::SetOnComplete(frameNode, nullptr);
156 }
157 }
158
ResetImageSpanOnComplete(ArkUINodeHandle node)159 void ResetImageSpanOnComplete(ArkUINodeHandle node)
160 {
161 auto* frameNode = reinterpret_cast<FrameNode*>(node);
162 CHECK_NULL_VOID(frameNode);
163 ImageSpanView::SetOnComplete(frameNode, nullptr);
164 }
165
SetImageSpanOnError(ArkUINodeHandle node,void * callback)166 void SetImageSpanOnError(ArkUINodeHandle node, void *callback)
167 {
168 auto* frameNode = reinterpret_cast<FrameNode*>(node);
169 CHECK_NULL_VOID(frameNode);
170 if (callback) {
171 auto onError = reinterpret_cast<std::function<void(const LoadImageFailEvent&)>*>(callback);
172 ImageSpanView::SetOnError(frameNode, std::move(*onError));
173 } else {
174 ImageSpanView::SetOnError(frameNode, nullptr);
175 }
176 }
177
ResetImageSpanOnError(ArkUINodeHandle node)178 void ResetImageSpanOnError(ArkUINodeHandle node)
179 {
180 auto* frameNode = reinterpret_cast<FrameNode*>(node);
181 CHECK_NULL_VOID(frameNode);
182 ImageSpanView::SetOnError(frameNode, nullptr);
183 }
184
SetImageSpanBorderRadius(ArkUINodeHandle node,const ArkUI_Float32 * values,const ArkUI_Int32 * units,ArkUI_Int32 length)185 void SetImageSpanBorderRadius(ArkUINodeHandle node, const ArkUI_Float32* values,
186 const ArkUI_Int32* units, ArkUI_Int32 length)
187 {
188 auto* frameNode = reinterpret_cast<FrameNode*>(node);
189 CHECK_NULL_VOID(frameNode);
190 if (length != DEFAULT_LENGTH) {
191 return;
192 }
193 NG::BorderRadiusProperty borderRadius;
194 borderRadius.radiusTopLeft = Dimension(values[NUM_0], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_0]));
195 borderRadius.radiusTopRight = Dimension(values[NUM_1], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_1]));
196 borderRadius.radiusBottomLeft = Dimension(values[NUM_2], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_2]));
197 borderRadius.radiusBottomRight = Dimension(values[NUM_3], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_3]));
198 borderRadius.multiValued = true;
199 ImageSpanView::SetBorderRadius(frameNode, borderRadius);
200 }
201
ResetImageSpanBorderRadius(ArkUINodeHandle node)202 void ResetImageSpanBorderRadius(ArkUINodeHandle node)
203 {
204 auto* frameNode = reinterpret_cast<FrameNode*>(node);
205 CHECK_NULL_VOID(frameNode);
206 ImageSpanView::ResetBorderRadius(frameNode);
207 }
208 } // namespace
209
210 namespace NodeModifier {
GetImageSpanModifier()211 const ArkUIImageSpanModifier* GetImageSpanModifier()
212 {
213 static const ArkUIImageSpanModifier modifier = { SetImageSpanVerticalAlign, ResetImageSpanVerticalAlign,
214 SetImageSpanObjectFit, ResetImageSpanObjectFit, GetImageSpanVerticalAlign, GetImageSpanObjectFit,
215 SetImageSpanTextBackgroundStyle, ResetImageSpanTextBackgroundStyle, GetImageSpanTextBackgroundStyle,
216 SetImageSpanBaselineOffset, ResetImageSpanBaselineOffset, SetImageSpanOnComplete, ResetImageSpanOnComplete,
217 SetImageSpanOnError, ResetImageSpanOnError, SetImageSpanBorderRadius, ResetImageSpanBorderRadius,
218 GetImageSpanBaselineOffset };
219 return &modifier;
220 }
221
GetCJUIImageSpanModifier()222 const CJUIImageSpanModifier* GetCJUIImageSpanModifier()
223 {
224 static const CJUIImageSpanModifier modifier = { SetImageSpanVerticalAlign, ResetImageSpanVerticalAlign,
225 SetImageSpanObjectFit, ResetImageSpanObjectFit, GetImageSpanVerticalAlign, GetImageSpanObjectFit,
226 SetImageSpanTextBackgroundStyle, ResetImageSpanTextBackgroundStyle, GetImageSpanTextBackgroundStyle,
227 SetImageSpanBaselineOffset, ResetImageSpanBaselineOffset, SetImageSpanOnComplete, ResetImageSpanOnComplete,
228 SetImageSpanOnError, ResetImageSpanOnError };
229 return &modifier;
230 }
231 } // namespace NodeModifier
232 } // namespace OHOS::Ace::NG