• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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