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_modifier.h"
16 
17 #include <cstdint>
18 
19 #include "base/utils/utils.h"
20 #include "base/image/drawing_color_filter.h"
21 #include "core/components/common/properties/alignment.h"
22 #include "core/components/image/image_component.h"
23 #include "core/components/image/image_theme.h"
24 #include "core/components_ng/base/frame_node.h"
25 #include "core/components_ng/base/view_abstract.h"
26 #include "core/components_ng/pattern/image/image_model_ng.h"
27 #include "core/pipeline/base/element_register.h"
28 #include "frameworks/core/components/common/layout/constants.h"
29 
30 #include "effect/color_filter.h"
31 
32 namespace OHOS::Ace::NG {
33 namespace {
34 constexpr int NUM_0 = 1;
35 constexpr int NUM_1 = 1;
36 constexpr int NUM_2 = 2;
37 constexpr int NUM_3 = 3;
38 constexpr int NUM_12 = 8;
39 constexpr int DEFAULT_LENGTH = 4;
40 constexpr int RESIZEABLE_VEC_LENGTH = 12;
41 constexpr CopyOptions DEFAULT_IMAGE_COPYOPTION = CopyOptions::None;
42 constexpr bool DEFAULT_SYNC_LOAD_VALUE = false;
43 constexpr ImageFit DEFAULT_OBJECT_FIT_VALUE = ImageFit::COVER;
44 constexpr bool DEFAULT_FIT_ORIGINAL_SIZE = false;
45 constexpr bool DEFAULT_DRAGGABLE = false;
46 constexpr bool DEFAULT_IMAGE_SENSITIVE = false;
47 constexpr ArkUI_Float32 DEFAULT_IMAGE_EDGE_ANTIALIASING = 0;
48 constexpr ImageResizableSlice DEFAULT_IMAGE_SLICE;
49 const std::vector<float> DEFAULT_COLOR_FILTER = { 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0 };
50 constexpr int32_t LOAD_ERROR_CODE = 401;
51 constexpr int32_t IMAGE_LOAD_STATUS_INDEX = 0;
52 constexpr int32_t IMAGE_WIDTH_INDEX = 1;
53 constexpr int32_t IMAGE_HEIGHT_INDEX = 2;
54 constexpr int32_t IMAGE_COMPONENT_WIDTH_INDEX = 3;
55 constexpr int32_t IMAGE_COMPONENT_HEIGHT_INDEX = 4;
56 constexpr int32_t IMAGE_CONTENT_OFFSET_X_INDEX = 5;
57 constexpr int32_t IMAGE_CONTENT_OFFSET_Y_INDEX = 6;
58 constexpr int32_t IMAGE_CONTENT_WIDTH_INDEX = 7;
59 constexpr int32_t IMAGE_CONTENT_HEIGHT_INDEX = 8;
60 constexpr uint32_t MAX_COLOR_FILTER_SIZE = 20;
61 constexpr uint32_t ERROR_UINT_CODE = -1;
62 constexpr int32_t DEFAULT_FALSE = 0;
63 const std::vector<ResizableOption> directions = { ResizableOption::TOP, ResizableOption::RIGHT,
64     ResizableOption::BOTTOM, ResizableOption::LEFT };
65 std::string g_strValue;
66 
SetOptionalBorder(std::optional<Dimension> & optionalDimension,const ArkUI_Float32 * values,ArkUI_Int32 valuesSize,ArkUI_Int32 & offset)67 void SetOptionalBorder(std::optional<Dimension>& optionalDimension, const ArkUI_Float32* values, ArkUI_Int32 valuesSize,
68     ArkUI_Int32& offset)
69 {
70     bool hasValue = static_cast<bool>(values[offset]);
71     if (hasValue) {
72         optionalDimension =
73             Dimension(values[offset + NUM_1], static_cast<OHOS::Ace::DimensionUnit>(values[offset + NUM_2]));
74     }
75     offset = offset + NUM_3;
76 }
77 
SetCalcDimension(std::optional<CalcDimension> & optDimension,const ArkUIStringAndFloat * options,ArkUI_Int32 optionsLength,ArkUI_Int32 offset)78 bool SetCalcDimension(std::optional<CalcDimension>& optDimension, const ArkUIStringAndFloat* options,
79     ArkUI_Int32 optionsLength, ArkUI_Int32 offset)
80 {
81     if ((options == nullptr) || (offset < 0) || ((offset + NUM_3) > optionsLength)) {
82         return false;
83     }
84     auto hasValue = options[offset];
85     auto value = options[offset + NUM_1];
86     auto unit = options[offset + NUM_2];
87     if (static_cast<bool>(hasValue.value)) {
88         auto unitValue = static_cast<DimensionUnit>(unit.value);
89         if (unitValue == DimensionUnit::CALC) {
90             std::string str;
91             if (value.valueStr != nullptr) {
92                 str = value.valueStr;
93             }
94             CalcDimension calcDimension(str, unitValue);
95             optDimension = calcDimension;
96         } else {
97             CalcDimension calcDimension(value.value, unitValue);
98             optDimension = calcDimension;
99         }
100     }
101     return true;
102 }
103 
SetResizableFromVec(ImageResizableSlice & resizable,const ArkUIStringAndFloat * options)104 void SetResizableFromVec(ImageResizableSlice& resizable, const ArkUIStringAndFloat* options)
105 {
106     for (unsigned int index = 0; index < RESIZEABLE_VEC_LENGTH; index += NUM_3) {
107         std::optional<CalcDimension> optDimension;
108         SetCalcDimension(optDimension, options, RESIZEABLE_VEC_LENGTH, index);
109         if (optDimension.has_value()) {
110             auto direction = directions[index / NUM_3];
111             resizable.SetEdgeSlice(direction, optDimension.value());
112         }
113     }
114 }
115 
SetImageSrc(ArkUINodeHandle node,const char * value)116 void SetImageSrc(ArkUINodeHandle node, const char* value)
117 {
118     auto* frameNode = reinterpret_cast<FrameNode*>(node);
119     CHECK_NULL_VOID(frameNode);
120     std::string src(value);
121     ImageModelNG::InitImage(frameNode, src);
122 }
123 
GetImageSrc(ArkUINodeHandle node)124 const char* GetImageSrc(ArkUINodeHandle node)
125 {
126     auto* frameNode = reinterpret_cast<FrameNode*>(node);
127     CHECK_NULL_RETURN(frameNode, nullptr);
128     g_strValue = ImageModelNG::GetSrc(frameNode).GetSrc();
129     return g_strValue.c_str();
130 }
131 
SetCopyOption(ArkUINodeHandle node,ArkUI_Int32 copyOption)132 void SetCopyOption(ArkUINodeHandle node, ArkUI_Int32 copyOption)
133 {
134     auto* frameNode = reinterpret_cast<FrameNode*>(node);
135     CHECK_NULL_VOID(frameNode);
136     auto copyOptions = static_cast<CopyOptions>(copyOption);
137     if (copyOptions < CopyOptions::None || copyOptions > CopyOptions::Distributed) {
138         copyOptions = DEFAULT_IMAGE_COPYOPTION;
139     }
140     ImageModelNG::SetCopyOption(frameNode, copyOptions);
141 }
142 
SetImageShowSrc(ArkUINodeHandle node,ArkUI_CharPtr src,ArkUI_CharPtr bundleName,ArkUI_CharPtr moduleName,ArkUI_Bool isUriPureNumber)143 void SetImageShowSrc(ArkUINodeHandle node, ArkUI_CharPtr src, ArkUI_CharPtr bundleName, ArkUI_CharPtr moduleName,
144     ArkUI_Bool isUriPureNumber)
145 {
146     auto* frameNode = reinterpret_cast<FrameNode*>(node);
147     CHECK_NULL_VOID(frameNode);
148     ImageModelNG::SetInitialSrc(frameNode, src, bundleName, moduleName, isUriPureNumber);
149 }
150 
ResetCopyOption(ArkUINodeHandle node)151 void ResetCopyOption(ArkUINodeHandle node)
152 {
153     auto* frameNode = reinterpret_cast<FrameNode*>(node);
154     CHECK_NULL_VOID(frameNode);
155     ImageModelNG::SetCopyOption(frameNode, DEFAULT_IMAGE_COPYOPTION);
156 }
157 
SetAutoResize(ArkUINodeHandle node,ArkUI_Bool autoResize)158 void SetAutoResize(ArkUINodeHandle node, ArkUI_Bool autoResize)
159 {
160     auto* frameNode = reinterpret_cast<FrameNode*>(node);
161     CHECK_NULL_VOID(frameNode);
162     ImageModelNG::SetAutoResize(frameNode, autoResize);
163 }
164 
GetAutoResize(ArkUINodeHandle node)165 int32_t GetAutoResize(ArkUINodeHandle node)
166 {
167     auto* frameNode = reinterpret_cast<FrameNode*>(node);
168     CHECK_NULL_RETURN(frameNode, true);
169     return ImageModelNG::GetAutoResize(frameNode);
170 }
171 
ResetAutoResize(ArkUINodeHandle node)172 void ResetAutoResize(ArkUINodeHandle node)
173 {
174     auto* frameNode = reinterpret_cast<FrameNode*>(node);
175     CHECK_NULL_VOID(frameNode);
176     ImageModelNG::ResetAutoResize(frameNode);
177 }
178 
SetObjectRepeat(ArkUINodeHandle node,ArkUI_Int32 imageRepeat)179 void SetObjectRepeat(ArkUINodeHandle node, ArkUI_Int32 imageRepeat)
180 {
181     auto* frameNode = reinterpret_cast<FrameNode*>(node);
182     CHECK_NULL_VOID(frameNode);
183     auto repeat = static_cast<ImageRepeat>(imageRepeat);
184     if (repeat < ImageRepeat::NO_REPEAT || repeat > ImageRepeat::REPEAT) {
185         repeat = ImageRepeat::NO_REPEAT;
186     }
187     ImageModelNG::SetImageRepeat(frameNode, repeat);
188 }
189 
GetObjectRepeat(ArkUINodeHandle node)190 int32_t GetObjectRepeat(ArkUINodeHandle node)
191 {
192     int32_t defaultObjectRepeat = static_cast<int32_t>(ImageRepeat::NO_REPEAT);
193     auto* frameNode = reinterpret_cast<FrameNode*>(node);
194     CHECK_NULL_RETURN(frameNode, defaultObjectRepeat);
195     return static_cast<int32_t>(ImageModelNG::GetObjectRepeat(frameNode));
196 }
197 
ResetObjectRepeat(ArkUINodeHandle node)198 void ResetObjectRepeat(ArkUINodeHandle node)
199 {
200     auto* frameNode = reinterpret_cast<FrameNode*>(node);
201     CHECK_NULL_VOID(frameNode);
202     ImageModelNG::SetImageRepeat(frameNode, ImageRepeat::NO_REPEAT);
203 }
204 
SetRenderMode(ArkUINodeHandle node,ArkUI_Int32 imageRenderMode)205 void SetRenderMode(ArkUINodeHandle node, ArkUI_Int32 imageRenderMode)
206 {
207     auto* frameNode = reinterpret_cast<FrameNode*>(node);
208     CHECK_NULL_VOID(frameNode);
209     auto renderMode = static_cast<ImageRenderMode>(imageRenderMode);
210     if (renderMode < ImageRenderMode::ORIGINAL || renderMode > ImageRenderMode::TEMPLATE) {
211         renderMode = ImageRenderMode::ORIGINAL;
212     }
213     ImageModelNG::SetImageRenderMode(frameNode, renderMode);
214 }
215 
ResetRenderMode(ArkUINodeHandle node)216 void ResetRenderMode(ArkUINodeHandle node)
217 {
218     auto* frameNode = reinterpret_cast<FrameNode*>(node);
219     CHECK_NULL_VOID(frameNode);
220     ImageModelNG::SetImageRenderMode(frameNode, ImageRenderMode::ORIGINAL);
221 }
222 
GetRenderMode(ArkUINodeHandle node)223 int32_t GetRenderMode(ArkUINodeHandle node)
224 {
225     int32_t defaultRenderMode = static_cast<int32_t>(ImageRenderMode::ORIGINAL);
226     auto* frameNode = reinterpret_cast<FrameNode*>(node);
227     CHECK_NULL_RETURN(frameNode, defaultRenderMode);
228     return static_cast<int32_t>(ImageModelNG::GetImageRenderMode(frameNode));
229 }
230 
SetSyncLoad(ArkUINodeHandle node,ArkUI_Bool syncLoadValue)231 void SetSyncLoad(ArkUINodeHandle node, ArkUI_Bool syncLoadValue)
232 {
233     auto* frameNode = reinterpret_cast<FrameNode*>(node);
234     CHECK_NULL_VOID(frameNode);
235     ImageModelNG::SetSyncMode(frameNode, syncLoadValue);
236 }
237 
ResetSyncLoad(ArkUINodeHandle node)238 void ResetSyncLoad(ArkUINodeHandle node)
239 {
240     auto* frameNode = reinterpret_cast<FrameNode*>(node);
241     CHECK_NULL_VOID(frameNode);
242     ImageModelNG::SetSyncMode(frameNode, DEFAULT_SYNC_LOAD_VALUE);
243 }
244 
SetObjectFit(ArkUINodeHandle node,ArkUI_Int32 objectFitNumber)245 void SetObjectFit(ArkUINodeHandle node, ArkUI_Int32 objectFitNumber)
246 {
247     auto* frameNode = reinterpret_cast<FrameNode*>(node);
248     CHECK_NULL_VOID(frameNode);
249     ImageFit objectFitValue = static_cast<ImageFit>(objectFitNumber);
250     ImageModelNG::SetImageFit(frameNode, objectFitValue);
251 }
252 
GetObjectFit(ArkUINodeHandle node)253 int32_t GetObjectFit(ArkUINodeHandle node)
254 {
255     int32_t defaultObjectFit = static_cast<int32_t>(ImageFit::COVER);
256     auto* frameNode = reinterpret_cast<FrameNode*>(node);
257     CHECK_NULL_RETURN(frameNode, defaultObjectFit);
258     return static_cast<int32_t>(ImageModelNG::GetObjectFit(frameNode));
259 }
260 
ResetObjectFit(ArkUINodeHandle node)261 void ResetObjectFit(ArkUINodeHandle node)
262 {
263     auto* frameNode = reinterpret_cast<FrameNode*>(node);
264     CHECK_NULL_VOID(frameNode);
265     ImageModelNG::SetImageFit(frameNode, DEFAULT_OBJECT_FIT_VALUE);
266 }
267 
SetFitOriginalSize(ArkUINodeHandle node,ArkUI_Bool fitOriginalSizeValue)268 void SetFitOriginalSize(ArkUINodeHandle node, ArkUI_Bool fitOriginalSizeValue)
269 {
270     auto* frameNode = reinterpret_cast<FrameNode*>(node);
271     CHECK_NULL_VOID(frameNode);
272     ImageModelNG::SetFitOriginSize(frameNode, fitOriginalSizeValue);
273 }
274 
ResetFitOriginalSize(ArkUINodeHandle node)275 void ResetFitOriginalSize(ArkUINodeHandle node)
276 {
277     auto* frameNode = reinterpret_cast<FrameNode*>(node);
278     CHECK_NULL_VOID(frameNode);
279     ImageModelNG::SetFitOriginSize(frameNode, DEFAULT_FIT_ORIGINAL_SIZE);
280 }
281 
SetSourceSize(ArkUINodeHandle node,ArkUI_Float32 width,ArkUI_Float32 height)282 void SetSourceSize(ArkUINodeHandle node, ArkUI_Float32 width, ArkUI_Float32 height)
283 {
284     auto* frameNode = reinterpret_cast<FrameNode*>(node);
285     CHECK_NULL_VOID(frameNode);
286     CalcDimension widthObj(width, DimensionUnit::VP);
287     CalcDimension heightObj(height, DimensionUnit::VP);
288     ImageModelNG::SetImageSourceSize(frameNode, std::pair<CalcDimension, CalcDimension>(widthObj, heightObj));
289 }
290 
ResetSourceSize(ArkUINodeHandle node)291 void ResetSourceSize(ArkUINodeHandle node)
292 {
293     auto* frameNode = reinterpret_cast<FrameNode*>(node);
294     CHECK_NULL_VOID(frameNode);
295     ImageModelNG::SetImageSourceSize(frameNode, std::pair<CalcDimension, CalcDimension>());
296 }
297 
SetMatchTextDirection(ArkUINodeHandle node,ArkUI_Uint32 value)298 void SetMatchTextDirection(ArkUINodeHandle node, ArkUI_Uint32 value)
299 {
300     auto* frameNode = reinterpret_cast<FrameNode*>(node);
301     CHECK_NULL_VOID(frameNode);
302     ImageModelNG::SetMatchTextDirection(frameNode, static_cast<bool>(value));
303 }
304 
ResetMatchTextDirection(ArkUINodeHandle node)305 void ResetMatchTextDirection(ArkUINodeHandle node)
306 {
307     auto* frameNode = reinterpret_cast<FrameNode*>(node);
308     CHECK_NULL_VOID(frameNode);
309     ImageModelNG::SetMatchTextDirection(frameNode, false);
310 }
311 
SetFillColor(ArkUINodeHandle node,ArkUI_Uint32 value)312 void SetFillColor(ArkUINodeHandle node, ArkUI_Uint32 value)
313 {
314     auto* frameNode = reinterpret_cast<FrameNode*>(node);
315     CHECK_NULL_VOID(frameNode);
316     ImageModelNG::SetImageFill(frameNode, Color(value));
317 }
318 
ResetFillColor(ArkUINodeHandle node)319 void ResetFillColor(ArkUINodeHandle node)
320 {
321     auto* frameNode = reinterpret_cast<FrameNode*>(node);
322     CHECK_NULL_VOID(frameNode);
323     auto pipelineContext = frameNode->GetContext();
324     CHECK_NULL_VOID(pipelineContext);
325     auto theme = pipelineContext->GetTheme<ImageTheme>();
326     CHECK_NULL_VOID(theme);
327     ImageModelNG::SetImageFill(frameNode, theme->GetFillColor());
328 }
329 
SetAlt(ArkUINodeHandle node,const char * src,const char * bundleName,const char * moduleName)330 void SetAlt(ArkUINodeHandle node, const char* src, const char* bundleName, const char* moduleName)
331 {
332     if (ImageSourceInfo::ResolveURIType(src) == SrcType::NETWORK) {
333         return;
334     }
335 
336     auto* frameNode = reinterpret_cast<FrameNode*>(node);
337     CHECK_NULL_VOID(frameNode);
338     ImageModelNG::SetAlt(frameNode, ImageSourceInfo { src, bundleName, moduleName });
339 }
340 
GetAlt(ArkUINodeHandle node)341 const char* GetAlt(ArkUINodeHandle node)
342 {
343     auto* frameNode = reinterpret_cast<FrameNode*>(node);
344     CHECK_NULL_RETURN(frameNode, nullptr);
345     g_strValue = ImageModelNG::GetAlt(frameNode).GetSrc();
346     return g_strValue.c_str();
347 }
348 
ResetAlt(ArkUINodeHandle node)349 void ResetAlt(ArkUINodeHandle node)
350 {
351     auto* frameNode = reinterpret_cast<FrameNode*>(node);
352     CHECK_NULL_VOID(frameNode);
353     ImageModelNG::ResetImageAlt(frameNode);
354 }
355 
SetImageInterpolation(ArkUINodeHandle node,ArkUI_Int32 value)356 void SetImageInterpolation(ArkUINodeHandle node, ArkUI_Int32 value)
357 {
358     auto* frameNode = reinterpret_cast<FrameNode*>(node);
359     CHECK_NULL_VOID(frameNode);
360     auto interpolation = static_cast<Ace::ImageInterpolation>(value);
361     if (interpolation < Ace::ImageInterpolation::NONE || interpolation > Ace::ImageInterpolation::HIGH) {
362         interpolation = Ace::ImageInterpolation::NONE;
363     }
364     ImageModelNG::SetImageInterpolation(frameNode, interpolation);
365 }
366 
GetImageInterpolation(ArkUINodeHandle node)367 int32_t GetImageInterpolation(ArkUINodeHandle node)
368 {
369     int32_t defaultInterpolation = static_cast<int32_t>(ImageInterpolation::NONE);
370     auto* frameNode = reinterpret_cast<FrameNode*>(node);
371     CHECK_NULL_RETURN(frameNode, defaultInterpolation);
372     return static_cast<int32_t>(ImageModelNG::GetInterpolation(frameNode));
373 }
374 
ResetImageInterpolation(ArkUINodeHandle node)375 void ResetImageInterpolation(ArkUINodeHandle node)
376 {
377     auto* frameNode = reinterpret_cast<FrameNode*>(node);
378     CHECK_NULL_VOID(frameNode);
379     ImageModelNG::ResetImageInterpolation(frameNode);
380 }
381 
SetColorFilter(ArkUINodeHandle node,const ArkUI_Float32 * array,int length)382 void SetColorFilter(ArkUINodeHandle node, const ArkUI_Float32* array, int length)
383 {
384     CHECK_NULL_VOID(array);
385     if (length != COLOR_FILTER_MATRIX_SIZE) {
386         return;
387     }
388     auto* frameNode = reinterpret_cast<FrameNode*>(node);
389     CHECK_NULL_VOID(frameNode);
390     ImageModelNG::SetColorFilterMatrix(frameNode, std::vector<float>(array, array + length));
391 }
392 
GetColorFilter(ArkUINodeHandle node,ArkUIFilterColorType * colorFilter)393 void GetColorFilter(ArkUINodeHandle node, ArkUIFilterColorType* colorFilter)
394 {
395     CHECK_NULL_VOID(colorFilter);
396     auto* frameNode = reinterpret_cast<FrameNode*>(node);
397     CHECK_NULL_VOID(frameNode);
398     auto filterFloatArray = ImageModelNG::GetColorFilter(frameNode);
399     colorFilter->filterSize = filterFloatArray.size() < MAX_COLOR_FILTER_SIZE
400                                   ? static_cast<int32_t>(filterFloatArray.size())
401                                   : static_cast<int32_t>(MAX_COLOR_FILTER_SIZE);
402     for (size_t i = 0; i < static_cast<size_t>(colorFilter->filterSize) && i < MAX_COLOR_FILTER_SIZE; i++) {
403         *(colorFilter->filterArray+i) = filterFloatArray[i];
404     }
405 }
406 
ResetColorFilter(ArkUINodeHandle node)407 void ResetColorFilter(ArkUINodeHandle node)
408 {
409     auto* frameNode = reinterpret_cast<FrameNode*>(node);
410     CHECK_NULL_VOID(frameNode);
411     ImageModelNG::SetColorFilterMatrix(frameNode, DEFAULT_COLOR_FILTER);
412 }
413 
SetDrawingColorFilter(ArkUINodeHandle node,void * colorFilter)414 void SetDrawingColorFilter(ArkUINodeHandle node, void* colorFilter)
415 {
416     auto* frameNode = reinterpret_cast<FrameNode*>(node);
417     CHECK_NULL_VOID(frameNode);
418     auto filter = reinterpret_cast<OHOS::Rosen::Drawing::ColorFilter*>(colorFilter);
419     auto filterPtr = std::make_shared<OHOS::Rosen::Drawing::ColorFilter>(*filter);
420     auto drawingColorFilter = DrawingColorFilter::CreateDrawingColorFilterFromNative(static_cast<void*>(&filterPtr));
421     ImageModelNG::SetDrawingColorFilter(frameNode, drawingColorFilter);
422 }
423 
GetDrawingColorFilter(ArkUINodeHandle node)424 void* GetDrawingColorFilter(ArkUINodeHandle node)
425 {
426     auto* frameNode = reinterpret_cast<FrameNode*>(node);
427     CHECK_NULL_RETURN(frameNode, nullptr);
428     auto drawingColorFilter = ImageModelNG::GetDrawingColorFilter(frameNode);
429     CHECK_NULL_RETURN(drawingColorFilter, nullptr);
430     auto filterSptr = reinterpret_cast<std::shared_ptr<OHOS::Rosen::Drawing::ColorFilter>*>(
431         drawingColorFilter->GetDrawingColorFilterSptrAddr());
432     CHECK_NULL_RETURN(filterSptr, nullptr);
433     return (*filterSptr).get();
434 }
435 
SetImageSyncLoad(ArkUINodeHandle node,ArkUI_Bool syncLoadValue)436 void SetImageSyncLoad(ArkUINodeHandle node, ArkUI_Bool syncLoadValue)
437 {
438     auto* frameNode = reinterpret_cast<FrameNode*>(node);
439     CHECK_NULL_VOID(frameNode);
440     ImageModelNG::SetSyncMode(frameNode, syncLoadValue);
441 }
442 
ResetImageSyncLoad(ArkUINodeHandle node)443 void ResetImageSyncLoad(ArkUINodeHandle node)
444 {
445     auto* frameNode = reinterpret_cast<FrameNode*>(node);
446     CHECK_NULL_VOID(frameNode);
447     ImageModelNG::SetSyncMode(frameNode, DEFAULT_SYNC_LOAD_VALUE);
448 }
449 
SetImageObjectFit(ArkUINodeHandle node,ArkUI_Int32 objectFitNumber)450 void SetImageObjectFit(ArkUINodeHandle node, ArkUI_Int32 objectFitNumber)
451 {
452     auto* frameNode = reinterpret_cast<FrameNode*>(node);
453     CHECK_NULL_VOID(frameNode);
454     ImageFit objectFitValue = static_cast<ImageFit>(objectFitNumber);
455     ImageModelNG::SetImageFit(frameNode, objectFitValue);
456 }
457 
ResetImageObjectFit(ArkUINodeHandle node)458 void ResetImageObjectFit(ArkUINodeHandle node)
459 {
460     auto* frameNode = reinterpret_cast<FrameNode*>(node);
461     CHECK_NULL_VOID(frameNode);
462     ImageModelNG::SetImageFit(frameNode, DEFAULT_OBJECT_FIT_VALUE);
463 }
464 
SetImageFitOriginalSize(ArkUINodeHandle node,ArkUI_Bool fitOriginalSizeValue)465 void SetImageFitOriginalSize(ArkUINodeHandle node, ArkUI_Bool fitOriginalSizeValue)
466 {
467     auto* frameNode = reinterpret_cast<FrameNode*>(node);
468     CHECK_NULL_VOID(frameNode);
469     ImageModelNG::SetFitOriginSize(frameNode, fitOriginalSizeValue);
470 }
471 
ResetImageFitOriginalSize(ArkUINodeHandle node)472 void ResetImageFitOriginalSize(ArkUINodeHandle node)
473 {
474     auto* frameNode = reinterpret_cast<FrameNode*>(node);
475     CHECK_NULL_VOID(frameNode);
476     ImageModelNG::SetFitOriginSize(frameNode, DEFAULT_FIT_ORIGINAL_SIZE);
477 }
478 
SetImageDraggable(ArkUINodeHandle node,ArkUI_Bool value)479 void SetImageDraggable(ArkUINodeHandle node, ArkUI_Bool value)
480 {
481     auto* frameNode = reinterpret_cast<FrameNode*>(node);
482     CHECK_NULL_VOID(frameNode);
483     ImageModelNG::SetDraggable(frameNode, value);
484 }
485 
ResetImageDraggable(ArkUINodeHandle node)486 void ResetImageDraggable(ArkUINodeHandle node)
487 {
488     auto* frameNode = reinterpret_cast<FrameNode*>(node);
489     CHECK_NULL_VOID(frameNode);
490     ImageModelNG::SetDraggable(frameNode, DEFAULT_DRAGGABLE);
491 }
492 
GetImageDraggable(ArkUINodeHandle node)493 int32_t GetImageDraggable(ArkUINodeHandle node)
494 {
495     auto* frameNode = reinterpret_cast<FrameNode*>(node);
496     CHECK_NULL_RETURN(frameNode, DEFAULT_DRAGGABLE);
497     return ImageModelNG::GetDraggable(frameNode);
498 }
499 
500 /**
501  * @param values radius values
502  * value[0] : radius value for TopLeft,value[1] : radius value for TopRight
503  * value[2] : radius value for BottomLeft,value[3] : radius value for BottomRight
504  * @param units radius units
505  * units[0]: radius unit for TopLeft ,units[1] : radius unit for TopRight
506  * units[2]: radius unit for BottomLeft, units[3] : radius unit for TopRight
507  */
SetImageBorderRadius(ArkUINodeHandle node,const ArkUI_Float32 * values,const int * units,ArkUI_Int32 length)508 void SetImageBorderRadius(ArkUINodeHandle node, const ArkUI_Float32* values, const int* units, ArkUI_Int32 length)
509 {
510     GetArkUINodeModifiers()->getCommonModifier()->setBorderRadius(node, values, units, length);
511     auto* frameNode = reinterpret_cast<FrameNode*>(node);
512     CHECK_NULL_VOID(frameNode);
513     if (!Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_FOURTEEN)) {
514         ImageModelNG::SetBackBorder(frameNode);
515         return;
516     }
517     if (length != DEFAULT_LENGTH) {
518         return;
519     }
520     NG::BorderRadiusProperty borderRadius;
521     borderRadius.radiusTopLeft = Dimension(values[NUM_0], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_0]));
522     borderRadius.radiusTopRight = Dimension(values[NUM_1], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_1]));
523     borderRadius.radiusBottomLeft = Dimension(values[NUM_2], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_2]));
524     borderRadius.radiusBottomRight = Dimension(values[NUM_3], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_3]));
525     borderRadius.multiValued = true;
526     ImageModelNG::SetBorderRadius(frameNode, borderRadius);
527 }
528 
529 
ResetImageBorderRadius(ArkUINodeHandle node)530 void ResetImageBorderRadius(ArkUINodeHandle node)
531 {
532     GetArkUINodeModifiers()->getCommonModifier()->resetBorderRadius(node);
533     auto* frameNode = reinterpret_cast<FrameNode*>(node);
534     CHECK_NULL_VOID(frameNode);
535     if (!Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_FOURTEEN)) {
536         ImageModelNG::SetBackBorder(frameNode);
537         return;
538     }
539     OHOS::Ace::CalcDimension reset;
540     ImageModelNG::SetBorderRadius(frameNode, reset);
541 }
542 
SetImageBorderWithValues(ArkUINodeHandle node,const ArkUI_Float32 * values,ArkUI_Int32 valuesSize)543 void SetImageBorderWithValues(ArkUINodeHandle node, const ArkUI_Float32* values, ArkUI_Int32 valuesSize)
544 {
545     auto* frameNode = reinterpret_cast<FrameNode*>(node);
546     CHECK_NULL_VOID(frameNode);
547     if ((values == nullptr) || (valuesSize != NUM_12)) {
548         return;
549     }
550 
551     int32_t offset = NUM_0;
552     NG::BorderRadiusProperty borderRadius;
553     SetOptionalBorder(borderRadius.radiusTopLeft, values, valuesSize, offset);
554     SetOptionalBorder(borderRadius.radiusTopRight, values, valuesSize, offset);
555     SetOptionalBorder(borderRadius.radiusBottomLeft, values, valuesSize, offset);
556     SetOptionalBorder(borderRadius.radiusBottomRight, values, valuesSize, offset);
557 
558     borderRadius.multiValued = true;
559     if (borderRadius.radiusTopLeft.has_value() || borderRadius.radiusTopRight.has_value() ||
560         borderRadius.radiusBottomLeft.has_value() || borderRadius.radiusBottomRight.has_value()) {
561         ImageModelNG::SetBorderRadius(frameNode, borderRadius);
562     }
563 }
564 
SetImageBorder(ArkUINodeHandle node)565 void SetImageBorder(ArkUINodeHandle node)
566 {
567     auto* frameNode = reinterpret_cast<FrameNode*>(node);
568     CHECK_NULL_VOID(frameNode);
569     ImageModelNG::SetBackBorder(frameNode);
570 }
571 
ResetImageBorder(ArkUINodeHandle node)572 void ResetImageBorder(ArkUINodeHandle node)
573 {
574     auto* frameNode = reinterpret_cast<FrameNode*>(node);
575     CHECK_NULL_VOID(frameNode);
576     if (!Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_FOURTEEN)) {
577         ImageModelNG::SetBackBorder(frameNode);
578         return;
579     }
580     GetArkUINodeModifiers()->getCommonModifier()->resetBorder(node);
581     CalcDimension borderRadius;
582     ImageModelNG::SetBorderRadius(frameNode, borderRadius);
583 }
584 
SetImageOpacity(ArkUINodeHandle node,ArkUI_Float32 opacity)585 void SetImageOpacity(ArkUINodeHandle node, ArkUI_Float32 opacity)
586 {
587     auto* frameNode = reinterpret_cast<FrameNode*>(node);
588     CHECK_NULL_VOID(frameNode);
589     auto opacityValue = static_cast<float>(opacity);
590     if ((LessNotEqual(opacityValue, 0.0)) || GreatNotEqual(opacityValue, 1.0)) {
591         opacityValue = 0.0f;
592     }
593     ViewAbstract::SetOpacity(frameNode, opacityValue);
594 }
595 
ResetImageOpacity(ArkUINodeHandle node)596 void ResetImageOpacity(ArkUINodeHandle node)
597 {
598     auto* frameNode = reinterpret_cast<FrameNode*>(node);
599     CHECK_NULL_VOID(frameNode);
600     ViewAbstract::SetOpacity(frameNode, 0.0f);
601 }
602 
SetEdgeAntialiasing(ArkUINodeHandle node,ArkUI_Float32 edgeAntialiasing)603 void SetEdgeAntialiasing(ArkUINodeHandle node, ArkUI_Float32 edgeAntialiasing)
604 {
605     auto* frameNode = reinterpret_cast<FrameNode*>(node);
606     CHECK_NULL_VOID(frameNode);
607     ImageModelNG::SetSmoothEdge(frameNode, edgeAntialiasing);
608 }
609 
ResetEdgeAntialiasing(ArkUINodeHandle node)610 void ResetEdgeAntialiasing(ArkUINodeHandle node)
611 {
612     auto* frameNode = reinterpret_cast<FrameNode*>(node);
613     CHECK_NULL_VOID(frameNode);
614     ImageModelNG::SetSmoothEdge(frameNode, DEFAULT_IMAGE_EDGE_ANTIALIASING);
615 }
616 
SetResizable(ArkUINodeHandle node,const ArkUIStringAndFloat * options)617 void SetResizable(ArkUINodeHandle node, const ArkUIStringAndFloat* options)
618 {
619     auto* frameNode = reinterpret_cast<FrameNode*>(node);
620     CHECK_NULL_VOID(frameNode);
621     ImageResizableSlice resizable;
622     SetResizableFromVec(resizable, options);
623     ImageModelNG::SetResizableSlice(frameNode, resizable);
624 }
625 
ResetResizable(ArkUINodeHandle node)626 void ResetResizable(ArkUINodeHandle node)
627 {
628     auto* frameNode = reinterpret_cast<FrameNode*>(node);
629     CHECK_NULL_VOID(frameNode);
630     ImageModelNG::SetResizableSlice(frameNode, DEFAULT_IMAGE_SLICE);
631 }
632 
GetFitOriginalSize(ArkUINodeHandle node)633 int32_t GetFitOriginalSize(ArkUINodeHandle node)
634 {
635     auto* frameNode = reinterpret_cast<FrameNode*>(node);
636     CHECK_NULL_RETURN(frameNode, DEFAULT_FALSE);
637     return ImageModelNG::GetFitOriginalSize(frameNode);
638 }
639 
GetFillColor(ArkUINodeHandle node)640 uint32_t GetFillColor(ArkUINodeHandle node)
641 {
642     auto* frameNode = reinterpret_cast<FrameNode*>(node);
643     CHECK_NULL_RETURN(frameNode, ERROR_UINT_CODE);
644     return ImageModelNG::GetFillColor(frameNode);
645 }
646 
SetPixelMap(ArkUINodeHandle node,void * drawableDescriptor)647 void SetPixelMap(ArkUINodeHandle node, void* drawableDescriptor)
648 {
649     auto* frameNode = reinterpret_cast<FrameNode*>(node);
650     CHECK_NULL_VOID(frameNode);
651     ImageModelNG::SetPixelMap(frameNode, drawableDescriptor);
652 }
653 
SetPixelMapArray(ArkUINodeHandle node,void * animatedDrawableDescriptor)654 void SetPixelMapArray(ArkUINodeHandle node, void* animatedDrawableDescriptor)
655 {
656     auto* frameNode = reinterpret_cast<FrameNode*>(node);
657     CHECK_NULL_VOID(frameNode);
658     ImageModelNG::SetPixelMapArray(frameNode, animatedDrawableDescriptor);
659 }
660 
SetResourceSrc(ArkUINodeHandle node,void * resource)661 void SetResourceSrc(ArkUINodeHandle node, void* resource)
662 {
663     auto* frameNode = reinterpret_cast<FrameNode*>(node);
664     CHECK_NULL_VOID(frameNode);
665     ImageModelNG::SetResource(frameNode, resource);
666 }
667 
SetImageResizable(ArkUINodeHandle node,ArkUI_Float32 left,ArkUI_Float32 top,ArkUI_Float32 right,ArkUI_Float32 bottom)668 void SetImageResizable(ArkUINodeHandle node, ArkUI_Float32 left, ArkUI_Float32 top,
669     ArkUI_Float32 right, ArkUI_Float32 bottom)
670 {
671     auto* frameNode = reinterpret_cast<FrameNode*>(node);
672     CHECK_NULL_VOID(frameNode);
673     ImageResizableSlice resizable;
674     Dimension leftDimension(left, DimensionUnit::VP);
675     resizable.SetEdgeSlice(ResizableOption::LEFT, leftDimension);
676     Dimension topDimension(top, DimensionUnit::VP);
677     resizable.SetEdgeSlice(ResizableOption::TOP, topDimension);
678     Dimension rightDimension(right, DimensionUnit::VP);
679     resizable.SetEdgeSlice(ResizableOption::RIGHT, rightDimension);
680     Dimension bottomDimension(bottom, DimensionUnit::VP);
681     resizable.SetEdgeSlice(ResizableOption::BOTTOM, bottomDimension);
682     ImageModelNG::SetResizableSlice(frameNode, resizable);
683 }
684 
GetImageResizable(ArkUINodeHandle node,ArkUI_Float32 * arrayValue,ArkUI_Int32 size)685 void GetImageResizable(ArkUINodeHandle node, ArkUI_Float32* arrayValue, ArkUI_Int32 size)
686 {
687     auto* frameNode = reinterpret_cast<FrameNode*>(node);
688     CHECK_NULL_VOID(frameNode);
689     auto resizable = ImageModelNG::GetResizableSlice(frameNode);
690     if (0 < size) {
691         arrayValue[0] = resizable.left.Value();
692     }
693     if (NUM_1 < size) {
694         arrayValue[NUM_1] = resizable.top.Value();
695     }
696     if (NUM_2 < size) {
697         arrayValue[NUM_2] = resizable.right.Value();
698     }
699     if (NUM_3 < size) {
700         arrayValue[NUM_3] = resizable.bottom.Value();
701     }
702 }
703 
SetDynamicRangeMode(ArkUINodeHandle node,ArkUI_Int32 dynamicRangeMode)704 void SetDynamicRangeMode(ArkUINodeHandle node, ArkUI_Int32 dynamicRangeMode)
705 {
706     auto* frameNode = reinterpret_cast<FrameNode*>(node);
707     CHECK_NULL_VOID(frameNode);
708     DynamicRangeMode dynamicRangeModeValue = static_cast<DynamicRangeMode>(dynamicRangeMode);
709     if (dynamicRangeModeValue < DynamicRangeMode::HIGH || dynamicRangeModeValue > DynamicRangeMode::STANDARD) {
710         dynamicRangeModeValue = DynamicRangeMode::STANDARD;
711     }
712     ImageModelNG::SetDynamicRangeMode(frameNode, dynamicRangeModeValue);
713 }
714 
SetAltSourceInfo(ArkUINodeHandle node,const ArkUIImageSourceInfo * sourceInfo)715 void SetAltSourceInfo(ArkUINodeHandle node, const ArkUIImageSourceInfo* sourceInfo)
716 {
717     auto* frameNode = reinterpret_cast<FrameNode*>(node);
718     CHECK_NULL_VOID(frameNode);
719     CHECK_NULL_VOID(sourceInfo);
720     if (sourceInfo->url) {
721         if (ImageSourceInfo::ResolveURIType(sourceInfo->url) == SrcType::NETWORK) {
722             return;
723         }
724         ImageModelNG::SetAlt(frameNode, ImageSourceInfo { sourceInfo->url, "", "" });
725         return;
726     }
727     if (sourceInfo->resource) {
728         ImageModelNG::SetAltResource(frameNode, sourceInfo->resource);
729         return;
730     }
731     if (sourceInfo->pixelMap) {
732         ImageModelNG::SetAltPixelMap(frameNode, sourceInfo->pixelMap);
733         return;
734     }
735 }
736 
ResetDynamicRangeMode(ArkUINodeHandle node)737 void ResetDynamicRangeMode(ArkUINodeHandle node)
738 {
739     auto* frameNode = reinterpret_cast<FrameNode*>(node);
740     CHECK_NULL_VOID(frameNode);
741     ImageModelNG::SetDynamicRangeMode(frameNode, DynamicRangeMode::STANDARD);
742 }
743 
SetEnhancedImageQuality(ArkUINodeHandle node,ArkUI_Int32 imageQuality)744 void SetEnhancedImageQuality(ArkUINodeHandle node, ArkUI_Int32 imageQuality)
745 {
746     auto* frameNode = reinterpret_cast<FrameNode*>(node);
747     CHECK_NULL_VOID(frameNode);
748     AIImageQuality imageQualityValue = static_cast<AIImageQuality>(imageQuality);
749     if (imageQualityValue < AIImageQuality::NONE || imageQualityValue > AIImageQuality::HIGH) {
750         imageQualityValue = AIImageQuality::NONE;
751     }
752     ImageModelNG::SetEnhancedImageQuality(frameNode, imageQualityValue);
753 }
754 
ResetEnhancedImageQuality(ArkUINodeHandle node)755 void ResetEnhancedImageQuality(ArkUINodeHandle node)
756 {
757     auto* frameNode = reinterpret_cast<FrameNode*>(node);
758     CHECK_NULL_VOID(frameNode);
759     ImageModelNG::SetEnhancedImageQuality(frameNode, AIImageQuality::NONE);
760 }
761 
EnableAnalyzer(ArkUINodeHandle node,ArkUI_Bool enable)762 void EnableAnalyzer(ArkUINodeHandle node, ArkUI_Bool enable)
763 {
764     auto* frameNode = reinterpret_cast<FrameNode*>(node);
765     CHECK_NULL_VOID(frameNode);
766     ImageModelNG::EnableAnalyzer(frameNode, enable);
767 }
768 
SetImagePrivacySensitve(ArkUINodeHandle node,ArkUI_Int32 sensitive)769 void SetImagePrivacySensitve(ArkUINodeHandle node, ArkUI_Int32 sensitive)
770 {
771     auto* frameNode = reinterpret_cast<FrameNode*>(node);
772     CHECK_NULL_VOID(frameNode);
773     frameNode->SetPrivacySensitive(static_cast<bool>(sensitive));
774     frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
775 }
776 
ResetImagePrivacySensitve(ArkUINodeHandle node)777 void ResetImagePrivacySensitve(ArkUINodeHandle node)
778 {
779     auto* frameNode = reinterpret_cast<FrameNode*>(node);
780     CHECK_NULL_VOID(frameNode);
781     frameNode->SetPrivacySensitive(DEFAULT_IMAGE_SENSITIVE);
782     frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
783 }
784 
AnalyzerConfig(ArkUINodeHandle node,void * config)785 void AnalyzerConfig(ArkUINodeHandle node, void* config)
786 {
787     auto* frameNode = reinterpret_cast<FrameNode*>(node);
788     CHECK_NULL_VOID(frameNode);
789     ImageModelNG::SetImageAnalyzerConfig(frameNode, config);
790 }
791 
ResetImageContent(ArkUINodeHandle node)792 void ResetImageContent(ArkUINodeHandle node)
793 {
794     auto* frameNode = reinterpret_cast<FrameNode*>(node);
795     CHECK_NULL_VOID(frameNode);
796     ImageModelNG::ResetImage(frameNode);
797 }
798 
ResetImageSrc(ArkUINodeHandle node)799 void ResetImageSrc(ArkUINodeHandle node)
800 {
801     auto* frameNode = reinterpret_cast<FrameNode*>(node);
802     CHECK_NULL_VOID(frameNode);
803     ImageModelNG::ResetImageSrc(frameNode);
804 }
805 
SetInitialPixelMap(ArkUINodeHandle node,ArkUI_Int64 pixelMap)806 void SetInitialPixelMap(ArkUINodeHandle node, ArkUI_Int64 pixelMap)
807 {
808     auto* frameNode = reinterpret_cast<FrameNode*>(node);
809     CHECK_NULL_VOID(frameNode);
810     void* rawPtr = reinterpret_cast<void*>(pixelMap);
811     CHECK_NULL_VOID(rawPtr);
812     RefPtr<PixelMap> pixelMapRef = PixelMap::CreatePixelMap(rawPtr);
813     ImageModelNG::SetInitialPixelMap(frameNode, pixelMapRef);
814 }
815 
SetOnComplete(ArkUINodeHandle node,void * callback)816 void SetOnComplete(ArkUINodeHandle node, void* callback)
817 {
818     auto* frameNode = reinterpret_cast<FrameNode*>(node);
819     CHECK_NULL_VOID(frameNode);
820     if (callback) {
821         auto onComplete = reinterpret_cast<std::function<void(const LoadImageSuccessEvent&)>*>(callback);
822         ImageModelNG::SetOnComplete(frameNode, std::move(*onComplete));
823     } else {
824         ImageModelNG::SetOnComplete(frameNode, nullptr);
825     }
826 }
827 
SetOnError(ArkUINodeHandle node,void * callback)828 void SetOnError(ArkUINodeHandle node, void* callback)
829 {
830     auto* frameNode = reinterpret_cast<FrameNode*>(node);
831     CHECK_NULL_VOID(frameNode);
832     if (callback) {
833         auto onError = reinterpret_cast<std::function<void(const LoadImageFailEvent&)>*>(callback);
834         ImageModelNG::SetOnError(frameNode, std::move(*onError));
835     } else {
836         ImageModelNG::SetOnError(frameNode, nullptr);
837     }
838 }
839 
ResetOnError(ArkUINodeHandle node)840 void ResetOnError(ArkUINodeHandle node)
841 {
842     auto* frameNode = reinterpret_cast<FrameNode*>(node);
843     CHECK_NULL_VOID(frameNode);
844     ImageModelNG::SetOnError(frameNode, nullptr);
845 }
846 
SetImageOnFinish(ArkUINodeHandle node,void * callback)847 void SetImageOnFinish(ArkUINodeHandle node, void* callback)
848 {
849     auto* frameNode = reinterpret_cast<FrameNode*>(node);
850     CHECK_NULL_VOID(frameNode);
851     if (callback) {
852         auto onFinish = reinterpret_cast<std::function<void()>*>(callback);
853         ImageModelNG::SetOnSvgPlayFinish(frameNode, std::move(*onFinish));
854     } else {
855         ImageModelNG::SetOnSvgPlayFinish(frameNode, nullptr);
856     }
857 }
858 
ResetImageOnFinish(ArkUINodeHandle node)859 void ResetImageOnFinish(ArkUINodeHandle node)
860 {
861     auto* frameNode = reinterpret_cast<FrameNode*>(node);
862     CHECK_NULL_VOID(frameNode);
863     ImageModelNG::SetOnSvgPlayFinish(frameNode, nullptr);
864 }
865 
SetImageRotateOrientation(ArkUINodeHandle node,ArkUI_Int32 orientation)866 void SetImageRotateOrientation(ArkUINodeHandle node, ArkUI_Int32 orientation)
867 {
868     auto* frameNode = reinterpret_cast<FrameNode*>(node);
869     CHECK_NULL_VOID(frameNode);
870     auto orientationValue = static_cast<ImageRotateOrientation>(orientation);
871     if (orientationValue < ImageRotateOrientation::AUTO || orientationValue > ImageRotateOrientation::LEFT) {
872         orientationValue = ImageRotateOrientation::UP;
873     }
874     ImageModelNG::SetOrientation(frameNode, orientationValue);
875 }
876 
ResetImageRotateOrientation(ArkUINodeHandle node)877 void ResetImageRotateOrientation(ArkUINodeHandle node)
878 {
879     auto* frameNode = reinterpret_cast<FrameNode*>(node);
880     CHECK_NULL_VOID(frameNode);
881     ImageModelNG::SetOrientation(frameNode, ImageRotateOrientation::UP);
882 }
883 } // namespace
884 
885 namespace NodeModifier {
GetImageModifier()886 const ArkUIImageModifier* GetImageModifier()
887 {
888     static const ArkUIImageModifier modifier = { SetImageSrc, SetImageShowSrc, SetCopyOption, ResetCopyOption,
889         SetAutoResize, ResetAutoResize, SetObjectRepeat, ResetObjectRepeat, SetRenderMode, ResetRenderMode, SetSyncLoad,
890         ResetSyncLoad, SetObjectFit, ResetObjectFit, SetFitOriginalSize, ResetFitOriginalSize, SetSourceSize,
891         ResetSourceSize, SetMatchTextDirection, ResetMatchTextDirection, SetFillColor, ResetFillColor, SetAlt, ResetAlt,
892         SetImageInterpolation, ResetImageInterpolation, SetColorFilter, ResetColorFilter, SetImageSyncLoad,
893         ResetImageSyncLoad, SetImageObjectFit, ResetImageObjectFit, SetImageFitOriginalSize, ResetImageFitOriginalSize,
894         SetImageDraggable, ResetImageDraggable, SetImageBorderRadius, ResetImageBorderRadius, SetImageBorder,
895         SetImageBorderWithValues, ResetImageBorder, SetImageOpacity, ResetImageOpacity, SetEdgeAntialiasing,
896         ResetEdgeAntialiasing, SetResizable, ResetResizable, SetDynamicRangeMode, ResetDynamicRangeMode,
897         SetImageRotateOrientation, ResetImageRotateOrientation, SetEnhancedImageQuality, ResetEnhancedImageQuality,
898         GetImageSrc, GetAutoResize, GetObjectRepeat, GetObjectFit, GetImageInterpolation, GetColorFilter, GetAlt,
899         GetImageDraggable, GetRenderMode, SetImageResizable, GetImageResizable, GetFitOriginalSize, GetFillColor,
900         SetPixelMap, SetPixelMapArray, SetResourceSrc, EnableAnalyzer, SetImagePrivacySensitve,
901         ResetImagePrivacySensitve, AnalyzerConfig, SetDrawingColorFilter, GetDrawingColorFilter, ResetImageContent,
902         ResetImageSrc, SetInitialPixelMap, SetAltSourceInfo, SetOnComplete, SetOnError, ResetOnError, SetImageOnFinish,
903         ResetImageOnFinish };
904     return &modifier;
905 }
906 
GetCJUIImageModifier()907 const CJUIImageModifier* GetCJUIImageModifier()
908 {
909     static const CJUIImageModifier modifier = {
910         SetImageSrc, SetImageShowSrc, SetCopyOption, ResetCopyOption, SetAutoResize,
911         ResetAutoResize, SetObjectRepeat, ResetObjectRepeat, SetRenderMode, ResetRenderMode, SetSyncLoad, ResetSyncLoad,
912         SetObjectFit, ResetObjectFit, SetFitOriginalSize, ResetFitOriginalSize, SetSourceSize, ResetSourceSize,
913         SetMatchTextDirection, ResetMatchTextDirection, SetFillColor, ResetFillColor, SetAlt, ResetAlt,
914         SetImageInterpolation, ResetImageInterpolation, SetColorFilter, ResetColorFilter, SetImageSyncLoad,
915         ResetImageSyncLoad, SetImageObjectFit, ResetImageObjectFit, SetImageFitOriginalSize, ResetImageFitOriginalSize,
916         SetImageDraggable, ResetImageDraggable, SetImageBorderRadius, ResetImageBorderRadius, SetImageBorder,
917         ResetImageBorder, SetImageOpacity, ResetImageOpacity, SetEdgeAntialiasing, ResetEdgeAntialiasing, SetResizable,
918         ResetResizable, SetDynamicRangeMode, ResetDynamicRangeMode, SetEnhancedImageQuality,
919         ResetEnhancedImageQuality, GetImageSrc, GetAutoResize, GetObjectRepeat, GetObjectFit,
920         GetImageInterpolation, GetColorFilter, GetAlt, GetImageDraggable, GetRenderMode, SetImageResizable,
921         GetImageResizable, GetFitOriginalSize, GetFillColor, SetPixelMap, SetPixelMapArray, SetResourceSrc,
922         EnableAnalyzer, SetImagePrivacySensitve, ResetImagePrivacySensitve, AnalyzerConfig, SetDrawingColorFilter,
923         GetDrawingColorFilter, ResetImageSrc, SetInitialPixelMap, SetOnComplete, SetOnError,
924         ResetOnError, SetImageOnFinish, ResetImageOnFinish };
925     return &modifier;
926 }
927 
SetImageOnComplete(ArkUINodeHandle node,void * extraParam)928 void SetImageOnComplete(ArkUINodeHandle node, void* extraParam)
929 {
930     auto* frameNode = reinterpret_cast<FrameNode*>(node);
931     CHECK_NULL_VOID(frameNode);
932     auto onEvent = [node, extraParam](const LoadImageSuccessEvent& info) {
933         ArkUINodeEvent event;
934         event.kind = COMPONENT_ASYNC_EVENT;
935         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
936         event.componentAsyncEvent.subKind = ON_IMAGE_COMPLETE;
937         event.componentAsyncEvent.data[IMAGE_LOAD_STATUS_INDEX].i32 = info.GetLoadingStatus();
938         event.componentAsyncEvent.data[IMAGE_WIDTH_INDEX].f32 = info.GetWidth();
939         event.componentAsyncEvent.data[IMAGE_HEIGHT_INDEX].f32 = info.GetHeight();
940         event.componentAsyncEvent.data[IMAGE_COMPONENT_WIDTH_INDEX].f32 = info.GetComponentWidth();
941         event.componentAsyncEvent.data[IMAGE_COMPONENT_HEIGHT_INDEX].f32 = info.GetComponentHeight();
942         event.componentAsyncEvent.data[IMAGE_CONTENT_OFFSET_X_INDEX].f32 = info.GetContentOffsetX();
943         event.componentAsyncEvent.data[IMAGE_CONTENT_OFFSET_Y_INDEX].f32 = info.GetContentOffsetY();
944         event.componentAsyncEvent.data[IMAGE_CONTENT_WIDTH_INDEX].f32 = info.GetContentWidth();
945         event.componentAsyncEvent.data[IMAGE_CONTENT_HEIGHT_INDEX].f32 = info.GetContentHeight();
946         SendArkUIAsyncEvent(&event);
947     };
948     ImageModelNG::SetOnComplete(frameNode, std::move(onEvent));
949 }
950 
SetImageOnError(ArkUINodeHandle node,void * extraParam)951 void SetImageOnError(ArkUINodeHandle node, void* extraParam)
952 {
953     auto* frameNode = reinterpret_cast<FrameNode*>(node);
954     CHECK_NULL_VOID(frameNode);
955     auto onEvent = [node, extraParam](const LoadImageFailEvent& info) {
956         ArkUINodeEvent event;
957         event.kind = COMPONENT_ASYNC_EVENT;
958         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
959         event.componentAsyncEvent.subKind = ON_IMAGE_ERROR;
960         event.componentAsyncEvent.data[0].i32 = LOAD_ERROR_CODE;
961         SendArkUIAsyncEvent(&event);
962     };
963     ImageModelNG::SetOnError(frameNode, std::move(onEvent));
964 }
965 
SetImageOnSvgPlayFinish(ArkUINodeHandle node,void * extraParam)966 void SetImageOnSvgPlayFinish(ArkUINodeHandle node, void* extraParam)
967 {
968     auto* frameNode = reinterpret_cast<FrameNode*>(node);
969     CHECK_NULL_VOID(frameNode);
970     auto onSvgPlayFinishEvent = [node, extraParam]() {
971         ArkUINodeEvent event;
972         event.kind = COMPONENT_ASYNC_EVENT;
973         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
974         event.componentAsyncEvent.subKind = ON_IMAGE_SVG_PLAY_FINISH;
975         SendArkUIAsyncEvent(&event);
976     };
977     ImageModelNG::SetOnSvgPlayFinish(frameNode, std::move(onSvgPlayFinishEvent));
978 }
979 
SetImageOnDownloadProgress(ArkUINodeHandle node,void * extraParam)980 void SetImageOnDownloadProgress(ArkUINodeHandle node, void* extraParam)
981 {
982     auto* frameNode = reinterpret_cast<FrameNode*>(node);
983     CHECK_NULL_VOID(frameNode);
984     auto onDownloadProgress = [node, extraParam](const uint32_t& dlNow, const uint32_t& dlTotal) {
985         ArkUINodeEvent event;
986         event.kind = COMPONENT_ASYNC_EVENT;
987         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
988         event.componentAsyncEvent.subKind = ON_IMAGE_DOWNLOAD_PROGRESS;
989         event.componentAsyncEvent.data[0].u32 = dlNow;
990         event.componentAsyncEvent.data[1].u32 = dlTotal;
991         SendArkUIAsyncEvent(&event);
992     };
993     ImageModelNG::SetOnDownloadProgress(frameNode, std::move(onDownloadProgress));
994 }
995 
ResetImageOnComplete(ArkUINodeHandle node)996 void ResetImageOnComplete(ArkUINodeHandle node)
997 {
998     auto* frameNode = reinterpret_cast<FrameNode*>(node);
999     CHECK_NULL_VOID(frameNode);
1000     ImageModelNG::SetOnComplete(frameNode, nullptr);
1001 }
ResetImageOnError(ArkUINodeHandle node)1002 void ResetImageOnError(ArkUINodeHandle node)
1003 {
1004     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1005     CHECK_NULL_VOID(frameNode);
1006     ImageModelNG::SetOnError(frameNode, nullptr);
1007 }
ResetImageOnSvgPlayFinish(ArkUINodeHandle node)1008 void ResetImageOnSvgPlayFinish(ArkUINodeHandle node)
1009 {
1010     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1011     CHECK_NULL_VOID(frameNode);
1012     ImageModelNG::SetOnSvgPlayFinish(frameNode, nullptr);
1013 }
ResetImageOnDownloadProgress(ArkUINodeHandle node)1014 void ResetImageOnDownloadProgress(ArkUINodeHandle node)
1015 {
1016     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1017     CHECK_NULL_VOID(frameNode);
1018     ImageModelNG::SetOnDownloadProgress(frameNode, nullptr);
1019 }
1020 } // namespace NodeModifier
1021 } // namespace OHOS::Ace::NG
1022