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/image/image_component.h"
18 #include "core/components_ng/pattern/image/image_model_ng.h"
19 #include "core/components_ng/pattern/text/image_span_view.h"
20
21 namespace OHOS::Ace::NG {
22 namespace {
23 constexpr int NUM_0 = 0;
24 constexpr int NUM_1 = 1;
25 constexpr int NUM_2 = 2;
26 constexpr int NUM_3 = 3;
27 constexpr int DEFAULT_LENGTH = 4;
28 constexpr int32_t LOAD_ERROR_CODE = 401;
29 constexpr int32_t IMAGE_LOAD_STATUS_INDEX = 0;
30 constexpr int32_t IMAGE_WIDTH_INDEX = 1;
31 constexpr int32_t IMAGE_HEIGHT_INDEX = 2;
32 constexpr int32_t IMAGE_COMPONENT_WIDTH_INDEX = 3;
33 constexpr int32_t IMAGE_COMPONENT_HEIGHT_INDEX = 4;
34 constexpr int32_t IMAGE_CONTENT_OFFSET_X_INDEX = 5;
35 constexpr int32_t IMAGE_CONTENT_OFFSET_Y_INDEX = 6;
36 constexpr int32_t IMAGE_CONTENT_WIDTH_INDEX = 7;
37 constexpr int32_t IMAGE_CONTENT_HEIGHT_INDEX = 8;
38 constexpr VerticalAlign DEFAULT_VERTICAL_ALIGN = VerticalAlign::BOTTOM;
39 constexpr ImageFit DEFAULT_OBJECT_FIT = ImageFit::COVER;
40 constexpr Dimension DEFAULT_BASELINE_OFFSET { 0.0, DimensionUnit::FP };
41 const std::vector<float> DEFAULT_COLOR_FILTER = {
42 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f,
43 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f
44 };
45
SetImageSpanVerticalAlign(ArkUINodeHandle node,int32_t value)46 void SetImageSpanVerticalAlign(ArkUINodeHandle node, int32_t value)
47 {
48 auto* frameNode = reinterpret_cast<FrameNode*>(node);
49 CHECK_NULL_VOID(frameNode);
50 ImageSpanView::SetVerticalAlign(frameNode, static_cast<VerticalAlign>(value));
51 }
52
GetImageSpanVerticalAlign(ArkUINodeHandle node)53 int32_t GetImageSpanVerticalAlign(ArkUINodeHandle node)
54 {
55 auto* frameNode = reinterpret_cast<FrameNode*>(node);
56 CHECK_NULL_RETURN(frameNode, static_cast<int32_t>(DEFAULT_VERTICAL_ALIGN));
57 return static_cast<int32_t>(ImageSpanView::GetVerticalAlign(frameNode));
58 }
59
ResetImageSpanVerticalAlign(ArkUINodeHandle node)60 void ResetImageSpanVerticalAlign(ArkUINodeHandle node)
61 {
62 auto* frameNode = reinterpret_cast<FrameNode*>(node);
63 CHECK_NULL_VOID(frameNode);
64 ImageSpanView::SetVerticalAlign(frameNode, DEFAULT_VERTICAL_ALIGN);
65 }
66
SetImageSpanObjectFit(ArkUINodeHandle node,int32_t value)67 void SetImageSpanObjectFit(ArkUINodeHandle node, int32_t value)
68 {
69 auto* frameNode = reinterpret_cast<FrameNode*>(node);
70 CHECK_NULL_VOID(frameNode);
71 ImageModelNG::SetImageFit(frameNode, static_cast<ImageFit>(value));
72 }
73
GetImageSpanObjectFit(ArkUINodeHandle node)74 int32_t GetImageSpanObjectFit(ArkUINodeHandle node)
75 {
76 int32_t defaultObjectFit = static_cast<int32_t>(DEFAULT_OBJECT_FIT);
77 auto* frameNode = reinterpret_cast<FrameNode*>(node);
78 CHECK_NULL_RETURN(frameNode, defaultObjectFit);
79 return static_cast<int32_t>(ImageModelNG::GetObjectFit(frameNode));
80 }
81
ResetImageSpanObjectFit(ArkUINodeHandle node)82 void ResetImageSpanObjectFit(ArkUINodeHandle node)
83 {
84 auto* frameNode = reinterpret_cast<FrameNode*>(node);
85 CHECK_NULL_VOID(frameNode);
86 ImageModelNG::SetImageFit(frameNode, DEFAULT_OBJECT_FIT);
87 }
88
SetImageSpanTextBackgroundStyle(ArkUINodeHandle node,ArkUI_Uint32 color,const ArkUI_Float32 * values,const ArkUI_Int32 * units,ArkUI_Int32 length)89 void SetImageSpanTextBackgroundStyle(
90 ArkUINodeHandle node, ArkUI_Uint32 color, const ArkUI_Float32* values, const ArkUI_Int32* units, ArkUI_Int32 length)
91 {
92 auto* frameNode = reinterpret_cast<FrameNode*>(node);
93 CHECK_NULL_VOID(frameNode);
94 if (length != DEFAULT_LENGTH) {
95 return;
96 }
97 TextBackgroundStyle font;
98 NG::BorderRadiusProperty borderRadius;
99 borderRadius.radiusTopLeft = Dimension(values[NUM_0], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_0]));
100 borderRadius.radiusTopRight = Dimension(values[NUM_1], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_1]));
101 borderRadius.radiusBottomLeft = Dimension(values[NUM_2], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_2]));
102 borderRadius.radiusBottomRight = Dimension(values[NUM_3], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_3]));
103 font.backgroundColor = Color(color);
104 font.backgroundRadius = borderRadius;
105 font.backgroundRadius->multiValued = true;
106 ImageSpanView::SetPlaceHolderStyle(frameNode, font);
107 }
108
ResetImageSpanTextBackgroundStyle(ArkUINodeHandle node)109 void ResetImageSpanTextBackgroundStyle(ArkUINodeHandle node)
110 {
111 auto* frameNode = reinterpret_cast<FrameNode*>(node);
112 CHECK_NULL_VOID(frameNode);
113 TextBackgroundStyle font;
114 NG::BorderRadiusProperty borderRadius;
115 borderRadius.radiusTopLeft = Dimension(0, OHOS::Ace::DimensionUnit::VP);
116 borderRadius.radiusTopRight = Dimension(0, OHOS::Ace::DimensionUnit::VP);
117 borderRadius.radiusBottomLeft = Dimension(0, OHOS::Ace::DimensionUnit::VP);
118 borderRadius.radiusBottomRight = Dimension(0, OHOS::Ace::DimensionUnit::VP);
119 font.backgroundColor = Color(0x00000000);
120 font.backgroundRadius = borderRadius;
121 font.backgroundRadius->multiValued = true;
122 ImageSpanView::SetPlaceHolderStyle(frameNode, font);
123 }
124
GetImageSpanTextBackgroundStyle(ArkUINodeHandle node,ArkUITextBackgroundStyleOptions * options)125 void GetImageSpanTextBackgroundStyle(ArkUINodeHandle node, ArkUITextBackgroundStyleOptions* options)
126 {
127 auto* frameNode = reinterpret_cast<FrameNode*>(node);
128 CHECK_NULL_VOID(frameNode);
129 auto styleOptions = ImageSpanView::GetSpanTextBackgroundStyle(frameNode);
130 options->color = styleOptions.backgroundColor->GetValue();
131 options->topLeft = styleOptions.backgroundRadius->radiusTopLeft->Value();
132 options->topRight = styleOptions.backgroundRadius->radiusTopRight->Value();
133 options->bottomLeft = styleOptions.backgroundRadius->radiusBottomLeft->Value();
134 options->bottomRight = styleOptions.backgroundRadius->radiusBottomRight->Value();
135 }
136
SetImageSpanBaselineOffset(ArkUINodeHandle node,ArkUI_Float32 value,ArkUI_Int32 unit)137 void SetImageSpanBaselineOffset(ArkUINodeHandle node, ArkUI_Float32 value, ArkUI_Int32 unit)
138 {
139 auto* frameNode = reinterpret_cast<FrameNode*>(node);
140 CHECK_NULL_VOID(frameNode);
141 ImageSpanView::SetBaselineOffset(frameNode, CalcDimension(value, (DimensionUnit)unit));
142 }
143
ResetImageSpanBaselineOffset(ArkUINodeHandle node)144 void ResetImageSpanBaselineOffset(ArkUINodeHandle node)
145 {
146 auto* frameNode = reinterpret_cast<FrameNode*>(node);
147 CHECK_NULL_VOID(frameNode);
148 ImageSpanView::SetBaselineOffset(frameNode, DEFAULT_BASELINE_OFFSET);
149 }
150
GetImageSpanBaselineOffset(ArkUINodeHandle node,ArkUI_Int32 unit)151 float GetImageSpanBaselineOffset(ArkUINodeHandle node, ArkUI_Int32 unit)
152 {
153 auto* frameNode = reinterpret_cast<FrameNode*>(node);
154 CHECK_NULL_RETURN(frameNode, 0.0f);
155 return ImageSpanView::GetBaselineOffset(frameNode, unit);
156 }
157
SetImageSpanOnComplete(ArkUINodeHandle node,void * callback)158 void SetImageSpanOnComplete(ArkUINodeHandle node, void *callback)
159 {
160 auto* frameNode = reinterpret_cast<FrameNode*>(node);
161 CHECK_NULL_VOID(frameNode);
162 if (callback) {
163 auto onComplete = reinterpret_cast<std::function<void(const LoadImageSuccessEvent&)>*>(callback);
164 ImageSpanView::SetOnComplete(frameNode, std::move(*onComplete));
165 } else {
166 ImageSpanView::SetOnComplete(frameNode, nullptr);
167 }
168 }
169
ResetImageSpanOnComplete(ArkUINodeHandle node)170 void ResetImageSpanOnComplete(ArkUINodeHandle node)
171 {
172 auto* frameNode = reinterpret_cast<FrameNode*>(node);
173 CHECK_NULL_VOID(frameNode);
174 ImageSpanView::SetOnComplete(frameNode, nullptr);
175 }
176
SetImageSpanOnError(ArkUINodeHandle node,void * callback)177 void SetImageSpanOnError(ArkUINodeHandle node, void *callback)
178 {
179 auto* frameNode = reinterpret_cast<FrameNode*>(node);
180 CHECK_NULL_VOID(frameNode);
181 if (callback) {
182 auto onError = reinterpret_cast<std::function<void(const LoadImageFailEvent&)>*>(callback);
183 ImageSpanView::SetOnError(frameNode, std::move(*onError));
184 } else {
185 ImageSpanView::SetOnError(frameNode, nullptr);
186 }
187 }
188
ResetImageSpanOnError(ArkUINodeHandle node)189 void ResetImageSpanOnError(ArkUINodeHandle node)
190 {
191 auto* frameNode = reinterpret_cast<FrameNode*>(node);
192 CHECK_NULL_VOID(frameNode);
193 ImageSpanView::SetOnError(frameNode, nullptr);
194 }
195
SetImageSpanColorFilter(ArkUINodeHandle node,const ArkUI_Float32 * array,int length)196 void SetImageSpanColorFilter(ArkUINodeHandle node, const ArkUI_Float32* array, int length)
197 {
198 CHECK_NULL_VOID(array);
199 if (length != COLOR_FILTER_MATRIX_SIZE) {
200 return;
201 }
202 auto* frameNode = reinterpret_cast<FrameNode*>(node);
203 CHECK_NULL_VOID(frameNode);
204 ImageModelNG::SetColorFilterMatrix(frameNode, std::vector<float>(array, array + length));
205 }
206
ResetImageSpanColorFilter(ArkUINodeHandle node)207 void ResetImageSpanColorFilter(ArkUINodeHandle node)
208 {
209 auto* frameNode = reinterpret_cast<FrameNode*>(node);
210 CHECK_NULL_VOID(frameNode);
211 ImageModelNG::SetColorFilterMatrix(frameNode, DEFAULT_COLOR_FILTER);
212 }
213
214 /**
215 * @param values radius values
216 * value[0] : radius value for TopLeft,value[1] : radius value for TopRight
217 * value[2] : radius value for BottomLeft,value[3] : radius value for BottomRight
218 * @param units radius units
219 * units[0]: radius unit for TopLeft ,units[1] : radius unit for TopRight
220 * units[2]: radius unit for BottomLeft, units[3] : radius unit for TopRight
221 */
SetImageSpanBorderRadius(ArkUINodeHandle node,const ArkUI_Float32 * values,const ArkUI_Int32 * units,ArkUI_Int32 length)222 void SetImageSpanBorderRadius(ArkUINodeHandle node, const ArkUI_Float32* values,
223 const ArkUI_Int32* units, ArkUI_Int32 length)
224 {
225 auto* frameNode = reinterpret_cast<FrameNode*>(node);
226 CHECK_NULL_VOID(frameNode);
227 if (length != DEFAULT_LENGTH) {
228 return;
229 }
230 NG::BorderRadiusProperty borderRadius;
231 borderRadius.radiusTopLeft = Dimension(values[NUM_0], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_0]));
232 borderRadius.radiusTopRight = Dimension(values[NUM_1], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_1]));
233 borderRadius.radiusBottomLeft = Dimension(values[NUM_2], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_2]));
234 borderRadius.radiusBottomRight = Dimension(values[NUM_3], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_3]));
235 borderRadius.multiValued = true;
236 ImageSpanView::SetBorderRadius(frameNode, borderRadius);
237 }
238
ResetImageSpanBorderRadius(ArkUINodeHandle node)239 void ResetImageSpanBorderRadius(ArkUINodeHandle node)
240 {
241 auto* frameNode = reinterpret_cast<FrameNode*>(node);
242 CHECK_NULL_VOID(frameNode);
243 ImageSpanView::ResetBorderRadius(frameNode);
244 }
245 } // namespace
246
247 namespace NodeModifier {
GetImageSpanModifier()248 const ArkUIImageSpanModifier* GetImageSpanModifier()
249 {
250 CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
251 static const ArkUIImageSpanModifier modifier = {
252 .setImageSpanVerticalAlign = SetImageSpanVerticalAlign,
253 .resetImageSpanVerticalAlign = ResetImageSpanVerticalAlign,
254 .setImageSpanObjectFit = SetImageSpanObjectFit,
255 .resetImageSpanObjectFit = ResetImageSpanObjectFit,
256 .getImageSpanVerticalAlign = GetImageSpanVerticalAlign,
257 .getImageSpanObjectFit = GetImageSpanObjectFit,
258 .setImageSpanTextBackgroundStyle = SetImageSpanTextBackgroundStyle,
259 .resetImageSpanTextBackgroundStyle = ResetImageSpanTextBackgroundStyle,
260 .getImageSpanTextBackgroundStyle = GetImageSpanTextBackgroundStyle,
261 .setImageSpanBaselineOffset = SetImageSpanBaselineOffset,
262 .resetImageSpanBaselineOffset = ResetImageSpanBaselineOffset,
263 .setImageSpanOnComplete = SetImageSpanOnComplete,
264 .resetImageSpanOnComplete = ResetImageSpanOnComplete,
265 .setImageSpanOnError = SetImageSpanOnError,
266 .resetImageSpanOnError = ResetImageSpanOnError,
267 .setImageSpanColorFilter = SetImageSpanColorFilter,
268 .resetImageSpanColorFilter = ResetImageSpanColorFilter,
269 .setImageSpanBorderRadius = SetImageSpanBorderRadius,
270 .resetImageSpanBorderRadius = ResetImageSpanBorderRadius,
271 .getImageSpanBaselineOffset = GetImageSpanBaselineOffset,
272 };
273 CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
274 return &modifier;
275 }
276
GetCJUIImageSpanModifier()277 const CJUIImageSpanModifier* GetCJUIImageSpanModifier()
278 {
279 CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
280 static const CJUIImageSpanModifier modifier = {
281 .setImageSpanVerticalAlign = SetImageSpanVerticalAlign,
282 .resetImageSpanVerticalAlign = ResetImageSpanVerticalAlign,
283 .setImageSpanObjectFit = SetImageSpanObjectFit,
284 .resetImageSpanObjectFit = ResetImageSpanObjectFit,
285 .getImageSpanVerticalAlign = GetImageSpanVerticalAlign,
286 .getImageSpanObjectFit = GetImageSpanObjectFit,
287 .setImageSpanTextBackgroundStyle = SetImageSpanTextBackgroundStyle,
288 .resetImageSpanTextBackgroundStyle = ResetImageSpanTextBackgroundStyle,
289 .getImageSpanTextBackgroundStyle = GetImageSpanTextBackgroundStyle,
290 .setImageSpanBaselineOffset = SetImageSpanBaselineOffset,
291 .resetImageSpanBaselineOffset = ResetImageSpanBaselineOffset,
292 .setImageSpanOnComplete = SetImageSpanOnComplete,
293 .resetImageSpanOnComplete = ResetImageSpanOnComplete,
294 .setImageSpanOnError = SetImageSpanOnError,
295 .resetImageSpanOnError = ResetImageSpanOnError,
296 };
297 CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
298 return &modifier;
299 }
300
SetImageSpanOnCompleteEvent(ArkUINodeHandle node,void * extraParam)301 void SetImageSpanOnCompleteEvent(ArkUINodeHandle node, void* extraParam)
302 {
303 auto* frameNode = reinterpret_cast<FrameNode*>(node);
304 CHECK_NULL_VOID(frameNode);
305 auto onEvent = [node, extraParam](const LoadImageSuccessEvent& info) {
306 ArkUINodeEvent event;
307 event.kind = COMPONENT_ASYNC_EVENT;
308 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
309 event.componentAsyncEvent.subKind = ON_IMAGE_SPAN_COMPLETE;
310 event.componentAsyncEvent.data[IMAGE_LOAD_STATUS_INDEX].i32 = info.GetLoadingStatus();
311 event.componentAsyncEvent.data[IMAGE_WIDTH_INDEX].f32 = info.GetWidth();
312 event.componentAsyncEvent.data[IMAGE_HEIGHT_INDEX].f32 = info.GetHeight();
313 event.componentAsyncEvent.data[IMAGE_COMPONENT_WIDTH_INDEX].f32 = info.GetComponentWidth();
314 event.componentAsyncEvent.data[IMAGE_COMPONENT_HEIGHT_INDEX].f32 = info.GetComponentHeight();
315 event.componentAsyncEvent.data[IMAGE_CONTENT_OFFSET_X_INDEX].f32 = info.GetContentOffsetX();
316 event.componentAsyncEvent.data[IMAGE_CONTENT_OFFSET_Y_INDEX].f32 = info.GetContentOffsetY();
317 event.componentAsyncEvent.data[IMAGE_CONTENT_WIDTH_INDEX].f32 = info.GetContentWidth();
318 event.componentAsyncEvent.data[IMAGE_CONTENT_HEIGHT_INDEX].f32 = info.GetContentHeight();
319 SendArkUISyncEvent(&event);
320 };
321 ImageSpanView::SetOnComplete(frameNode, std::move(onEvent));
322 }
323
SetImageSpanOnErrorEvent(ArkUINodeHandle node,void * extraParam)324 void SetImageSpanOnErrorEvent(ArkUINodeHandle node, void* extraParam)
325 {
326 auto* frameNode = reinterpret_cast<FrameNode*>(node);
327 CHECK_NULL_VOID(frameNode);
328 auto onEvent = [node, extraParam](const LoadImageFailEvent& info) {
329 ArkUINodeEvent event;
330 event.kind = COMPONENT_ASYNC_EVENT;
331 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
332 event.componentAsyncEvent.subKind = ON_IMAGE_SPAN_ERROR;
333 event.componentAsyncEvent.data[0].i32 = LOAD_ERROR_CODE;
334 SendArkUISyncEvent(&event);
335 };
336 ImageSpanView::SetOnError(frameNode, std::move(onEvent));
337 }
338 } // namespace NodeModifier
339 } // namespace OHOS::Ace::NG
340