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