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