• 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/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