• 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_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 
SetImageMatrix(ArkUINodeHandle node,const ArkUI_Float32 * matrix)245 void SetImageMatrix(ArkUINodeHandle node, const ArkUI_Float32* matrix)
246 {
247     auto* frameNode = reinterpret_cast<FrameNode*>(node);
248     CHECK_NULL_VOID(frameNode);
249     Matrix4 matrix4Value = Matrix4(
250         matrix[0], matrix[4], matrix[8], matrix[12],
251         matrix[1], matrix[5], matrix[9], matrix[13],
252         matrix[2], matrix[6], matrix[10], matrix[14],
253         matrix[3], matrix[7], matrix[11], matrix[15]);
254     ImageModelNG::SetImageMatrix(frameNode, matrix4Value);
255 }
256 
ResetImageMatrix(ArkUINodeHandle node)257 void ResetImageMatrix(ArkUINodeHandle node)
258 {
259     auto* frameNode = reinterpret_cast<FrameNode*>(node);
260     CHECK_NULL_VOID(frameNode);
261     const auto matrix4Len = Matrix4::DIMENSION * Matrix4::DIMENSION;
262     std::vector<float> matrix(matrix4Len);
263     const int32_t initPosition = 5;
264     for (int32_t i = 0; i < matrix4Len; i = i + initPosition) {
265         matrix[i] = 1.0f;
266     }
267     Matrix4 defaultValue = Matrix4(
268         matrix[0], matrix[4], matrix[8], matrix[12],
269         matrix[1], matrix[5], matrix[9], matrix[13],
270         matrix[2], matrix[6], matrix[10], matrix[14],
271         matrix[3], matrix[7], matrix[11], matrix[15]);
272     ImageModelNG::SetImageMatrix(frameNode, defaultValue);
273 }
274 
SetObjectFit(ArkUINodeHandle node,ArkUI_Int32 objectFitNumber)275 void SetObjectFit(ArkUINodeHandle node, ArkUI_Int32 objectFitNumber)
276 {
277     auto* frameNode = reinterpret_cast<FrameNode*>(node);
278     CHECK_NULL_VOID(frameNode);
279     ImageFit objectFitValue = static_cast<ImageFit>(objectFitNumber);
280     ImageModelNG::SetImageFit(frameNode, objectFitValue);
281 }
282 
GetObjectFit(ArkUINodeHandle node)283 int32_t GetObjectFit(ArkUINodeHandle node)
284 {
285     int32_t defaultObjectFit = static_cast<int32_t>(ImageFit::COVER);
286     auto* frameNode = reinterpret_cast<FrameNode*>(node);
287     CHECK_NULL_RETURN(frameNode, defaultObjectFit);
288     return static_cast<int32_t>(ImageModelNG::GetObjectFit(frameNode));
289 }
290 
ResetObjectFit(ArkUINodeHandle node)291 void ResetObjectFit(ArkUINodeHandle node)
292 {
293     auto* frameNode = reinterpret_cast<FrameNode*>(node);
294     CHECK_NULL_VOID(frameNode);
295     ImageModelNG::SetImageFit(frameNode, DEFAULT_OBJECT_FIT_VALUE);
296 }
297 
SetFitOriginalSize(ArkUINodeHandle node,ArkUI_Bool fitOriginalSizeValue)298 void SetFitOriginalSize(ArkUINodeHandle node, ArkUI_Bool fitOriginalSizeValue)
299 {
300     auto* frameNode = reinterpret_cast<FrameNode*>(node);
301     CHECK_NULL_VOID(frameNode);
302     ImageModelNG::SetFitOriginSize(frameNode, fitOriginalSizeValue);
303 }
304 
ResetFitOriginalSize(ArkUINodeHandle node)305 void ResetFitOriginalSize(ArkUINodeHandle node)
306 {
307     auto* frameNode = reinterpret_cast<FrameNode*>(node);
308     CHECK_NULL_VOID(frameNode);
309     ImageModelNG::SetFitOriginSize(frameNode, DEFAULT_FIT_ORIGINAL_SIZE);
310 }
311 
SetSourceSize(ArkUINodeHandle node,ArkUI_Float32 width,ArkUI_Float32 height)312 void SetSourceSize(ArkUINodeHandle node, ArkUI_Float32 width, ArkUI_Float32 height)
313 {
314     auto* frameNode = reinterpret_cast<FrameNode*>(node);
315     CHECK_NULL_VOID(frameNode);
316     CalcDimension widthObj(width, DimensionUnit::VP);
317     CalcDimension heightObj(height, DimensionUnit::VP);
318     ImageModelNG::SetImageSourceSize(frameNode, std::pair<CalcDimension, CalcDimension>(widthObj, heightObj));
319 }
320 
ResetSourceSize(ArkUINodeHandle node)321 void ResetSourceSize(ArkUINodeHandle node)
322 {
323     auto* frameNode = reinterpret_cast<FrameNode*>(node);
324     CHECK_NULL_VOID(frameNode);
325     ImageModelNG::SetImageSourceSize(frameNode, std::pair<CalcDimension, CalcDimension>());
326 }
327 
SetMatchTextDirection(ArkUINodeHandle node,ArkUI_Uint32 value)328 void SetMatchTextDirection(ArkUINodeHandle node, ArkUI_Uint32 value)
329 {
330     auto* frameNode = reinterpret_cast<FrameNode*>(node);
331     CHECK_NULL_VOID(frameNode);
332     ImageModelNG::SetMatchTextDirection(frameNode, static_cast<bool>(value));
333 }
334 
ResetMatchTextDirection(ArkUINodeHandle node)335 void ResetMatchTextDirection(ArkUINodeHandle node)
336 {
337     auto* frameNode = reinterpret_cast<FrameNode*>(node);
338     CHECK_NULL_VOID(frameNode);
339     ImageModelNG::SetMatchTextDirection(frameNode, false);
340 }
341 
SetFillColor(ArkUINodeHandle node,ArkUI_Uint32 value)342 void SetFillColor(ArkUINodeHandle node, ArkUI_Uint32 value)
343 {
344     auto* frameNode = reinterpret_cast<FrameNode*>(node);
345     CHECK_NULL_VOID(frameNode);
346     ImageModelNG::SetImageFill(frameNode, Color(value));
347 }
348 
ResetImageFill(ArkUINodeHandle node)349 void ResetImageFill(ArkUINodeHandle node)
350 {
351     auto* frameNode = reinterpret_cast<FrameNode*>(node);
352     CHECK_NULL_VOID(frameNode);
353     ImageModelNG::ResetImageFill(frameNode);
354 }
355 
ResetFillColor(ArkUINodeHandle node)356 void ResetFillColor(ArkUINodeHandle node)
357 {
358     auto* frameNode = reinterpret_cast<FrameNode*>(node);
359     CHECK_NULL_VOID(frameNode);
360     auto pipelineContext = frameNode->GetContext();
361     CHECK_NULL_VOID(pipelineContext);
362     auto theme = pipelineContext->GetTheme<ImageTheme>();
363     CHECK_NULL_VOID(theme);
364     ImageModelNG::SetImageFill(frameNode, theme->GetFillColor());
365 }
366 
SetAlt(ArkUINodeHandle node,const char * src,const char * bundleName,const char * moduleName)367 void SetAlt(ArkUINodeHandle node, const char* src, const char* bundleName, const char* moduleName)
368 {
369     if (ImageSourceInfo::ResolveURIType(src) == SrcType::NETWORK) {
370         return;
371     }
372 
373     auto* frameNode = reinterpret_cast<FrameNode*>(node);
374     CHECK_NULL_VOID(frameNode);
375     ImageModelNG::SetAlt(frameNode, ImageSourceInfo { src, bundleName, moduleName });
376 }
377 
GetAlt(ArkUINodeHandle node)378 const char* GetAlt(ArkUINodeHandle node)
379 {
380     auto* frameNode = reinterpret_cast<FrameNode*>(node);
381     CHECK_NULL_RETURN(frameNode, nullptr);
382     g_strValue = ImageModelNG::GetAlt(frameNode).GetSrc();
383     return g_strValue.c_str();
384 }
385 
ResetAlt(ArkUINodeHandle node)386 void ResetAlt(ArkUINodeHandle node)
387 {
388     auto* frameNode = reinterpret_cast<FrameNode*>(node);
389     CHECK_NULL_VOID(frameNode);
390     ImageModelNG::ResetImageAlt(frameNode);
391 }
392 
SetImageInterpolation(ArkUINodeHandle node,ArkUI_Int32 value)393 void SetImageInterpolation(ArkUINodeHandle node, ArkUI_Int32 value)
394 {
395     auto* frameNode = reinterpret_cast<FrameNode*>(node);
396     CHECK_NULL_VOID(frameNode);
397     auto interpolation = static_cast<Ace::ImageInterpolation>(value);
398     if (interpolation < Ace::ImageInterpolation::NONE || interpolation > Ace::ImageInterpolation::HIGH) {
399         interpolation = Ace::ImageInterpolation::NONE;
400     }
401     ImageModelNG::SetImageInterpolation(frameNode, interpolation);
402 }
403 
GetImageInterpolation(ArkUINodeHandle node)404 int32_t GetImageInterpolation(ArkUINodeHandle node)
405 {
406     int32_t defaultInterpolation = static_cast<int32_t>(ImageInterpolation::NONE);
407     auto* frameNode = reinterpret_cast<FrameNode*>(node);
408     CHECK_NULL_RETURN(frameNode, defaultInterpolation);
409     return static_cast<int32_t>(ImageModelNG::GetInterpolation(frameNode));
410 }
411 
ResetImageInterpolation(ArkUINodeHandle node)412 void ResetImageInterpolation(ArkUINodeHandle node)
413 {
414     auto* frameNode = reinterpret_cast<FrameNode*>(node);
415     CHECK_NULL_VOID(frameNode);
416     ImageModelNG::ResetImageInterpolation(frameNode);
417 }
418 
SetColorFilter(ArkUINodeHandle node,const ArkUI_Float32 * array,int length)419 void SetColorFilter(ArkUINodeHandle node, const ArkUI_Float32* array, int length)
420 {
421     CHECK_NULL_VOID(array);
422     if (length != COLOR_FILTER_MATRIX_SIZE) {
423         return;
424     }
425     auto* frameNode = reinterpret_cast<FrameNode*>(node);
426     CHECK_NULL_VOID(frameNode);
427     ImageModelNG::SetColorFilterMatrix(frameNode, std::vector<float>(array, array + length));
428 }
429 
GetColorFilter(ArkUINodeHandle node,ArkUIFilterColorType * colorFilter)430 void GetColorFilter(ArkUINodeHandle node, ArkUIFilterColorType* colorFilter)
431 {
432     CHECK_NULL_VOID(colorFilter);
433     auto* frameNode = reinterpret_cast<FrameNode*>(node);
434     CHECK_NULL_VOID(frameNode);
435     auto filterFloatArray = ImageModelNG::GetColorFilter(frameNode);
436     colorFilter->filterSize = filterFloatArray.size() < MAX_COLOR_FILTER_SIZE
437                                   ? static_cast<int32_t>(filterFloatArray.size())
438                                   : static_cast<int32_t>(MAX_COLOR_FILTER_SIZE);
439     for (size_t i = 0; i < static_cast<size_t>(colorFilter->filterSize) && i < MAX_COLOR_FILTER_SIZE; i++) {
440         *(colorFilter->filterArray+i) = filterFloatArray[i];
441     }
442 }
443 
ResetColorFilter(ArkUINodeHandle node)444 void ResetColorFilter(ArkUINodeHandle node)
445 {
446     auto* frameNode = reinterpret_cast<FrameNode*>(node);
447     CHECK_NULL_VOID(frameNode);
448     ImageModelNG::SetColorFilterMatrix(frameNode, DEFAULT_COLOR_FILTER);
449 }
450 
SetDrawingColorFilter(ArkUINodeHandle node,void * colorFilter)451 void SetDrawingColorFilter(ArkUINodeHandle node, void* colorFilter)
452 {
453     auto* frameNode = reinterpret_cast<FrameNode*>(node);
454     CHECK_NULL_VOID(frameNode);
455     auto filter = reinterpret_cast<OHOS::Rosen::Drawing::ColorFilter*>(colorFilter);
456     auto filterPtr = std::make_shared<OHOS::Rosen::Drawing::ColorFilter>(*filter);
457     auto drawingColorFilter = DrawingColorFilter::CreateDrawingColorFilterFromNative(static_cast<void*>(&filterPtr));
458     ImageModelNG::SetDrawingColorFilter(frameNode, drawingColorFilter);
459 }
460 
GetDrawingColorFilter(ArkUINodeHandle node)461 void* GetDrawingColorFilter(ArkUINodeHandle node)
462 {
463     auto* frameNode = reinterpret_cast<FrameNode*>(node);
464     CHECK_NULL_RETURN(frameNode, nullptr);
465     auto drawingColorFilter = ImageModelNG::GetDrawingColorFilter(frameNode);
466     CHECK_NULL_RETURN(drawingColorFilter, nullptr);
467     auto filterSptr = reinterpret_cast<std::shared_ptr<OHOS::Rosen::Drawing::ColorFilter>*>(
468         drawingColorFilter->GetDrawingColorFilterSptrAddr());
469     CHECK_NULL_RETURN(filterSptr, nullptr);
470     return (*filterSptr).get();
471 }
472 
SetImageSyncLoad(ArkUINodeHandle node,ArkUI_Bool syncLoadValue)473 void SetImageSyncLoad(ArkUINodeHandle node, ArkUI_Bool syncLoadValue)
474 {
475     auto* frameNode = reinterpret_cast<FrameNode*>(node);
476     CHECK_NULL_VOID(frameNode);
477     ImageModelNG::SetSyncMode(frameNode, syncLoadValue);
478 }
479 
ResetImageSyncLoad(ArkUINodeHandle node)480 void ResetImageSyncLoad(ArkUINodeHandle node)
481 {
482     auto* frameNode = reinterpret_cast<FrameNode*>(node);
483     CHECK_NULL_VOID(frameNode);
484     ImageModelNG::SetSyncMode(frameNode, DEFAULT_SYNC_LOAD_VALUE);
485 }
486 
SetImageObjectFit(ArkUINodeHandle node,ArkUI_Int32 objectFitNumber)487 void SetImageObjectFit(ArkUINodeHandle node, ArkUI_Int32 objectFitNumber)
488 {
489     auto* frameNode = reinterpret_cast<FrameNode*>(node);
490     CHECK_NULL_VOID(frameNode);
491     ImageFit objectFitValue = static_cast<ImageFit>(objectFitNumber);
492     ImageModelNG::SetImageFit(frameNode, objectFitValue);
493 }
494 
ResetImageObjectFit(ArkUINodeHandle node)495 void ResetImageObjectFit(ArkUINodeHandle node)
496 {
497     auto* frameNode = reinterpret_cast<FrameNode*>(node);
498     CHECK_NULL_VOID(frameNode);
499     ImageModelNG::SetImageFit(frameNode, DEFAULT_OBJECT_FIT_VALUE);
500 }
501 
SetImageFitOriginalSize(ArkUINodeHandle node,ArkUI_Bool fitOriginalSizeValue)502 void SetImageFitOriginalSize(ArkUINodeHandle node, ArkUI_Bool fitOriginalSizeValue)
503 {
504     auto* frameNode = reinterpret_cast<FrameNode*>(node);
505     CHECK_NULL_VOID(frameNode);
506     ImageModelNG::SetFitOriginSize(frameNode, fitOriginalSizeValue);
507 }
508 
ResetImageFitOriginalSize(ArkUINodeHandle node)509 void ResetImageFitOriginalSize(ArkUINodeHandle node)
510 {
511     auto* frameNode = reinterpret_cast<FrameNode*>(node);
512     CHECK_NULL_VOID(frameNode);
513     ImageModelNG::SetFitOriginSize(frameNode, DEFAULT_FIT_ORIGINAL_SIZE);
514 }
515 
SetImageDraggable(ArkUINodeHandle node,ArkUI_Bool value)516 void SetImageDraggable(ArkUINodeHandle node, ArkUI_Bool value)
517 {
518     auto* frameNode = reinterpret_cast<FrameNode*>(node);
519     CHECK_NULL_VOID(frameNode);
520     ImageModelNG::SetDraggable(frameNode, value);
521 }
522 
ResetImageDraggable(ArkUINodeHandle node)523 void ResetImageDraggable(ArkUINodeHandle node)
524 {
525     auto* frameNode = reinterpret_cast<FrameNode*>(node);
526     CHECK_NULL_VOID(frameNode);
527     ImageModelNG::SetDraggable(frameNode, DEFAULT_DRAGGABLE);
528 }
529 
GetImageDraggable(ArkUINodeHandle node)530 int32_t GetImageDraggable(ArkUINodeHandle node)
531 {
532     auto* frameNode = reinterpret_cast<FrameNode*>(node);
533     CHECK_NULL_RETURN(frameNode, DEFAULT_DRAGGABLE);
534     return ImageModelNG::GetDraggable(frameNode);
535 }
536 
537 /**
538  * @param values radius values
539  * value[0] : radius value for TopLeft,value[1] : radius value for TopRight
540  * value[2] : radius value for BottomLeft,value[3] : radius value for BottomRight
541  * @param units radius units
542  * units[0]: radius unit for TopLeft ,units[1] : radius unit for TopRight
543  * units[2]: radius unit for BottomLeft, units[3] : radius unit for TopRight
544  */
SetImageBorderRadius(ArkUINodeHandle node,const ArkUI_Float32 * values,const int * units,ArkUI_Int32 length)545 void SetImageBorderRadius(ArkUINodeHandle node, const ArkUI_Float32* values, const int* units, ArkUI_Int32 length)
546 {
547     GetArkUINodeModifiers()->getCommonModifier()->setBorderRadius(node, values, units, length);
548     auto* frameNode = reinterpret_cast<FrameNode*>(node);
549     CHECK_NULL_VOID(frameNode);
550     if (!Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_FOURTEEN)) {
551         ImageModelNG::SetBackBorder(frameNode);
552         return;
553     }
554     if (length != DEFAULT_LENGTH) {
555         return;
556     }
557     NG::BorderRadiusProperty borderRadius;
558     borderRadius.radiusTopLeft = Dimension(values[NUM_0], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_0]));
559     borderRadius.radiusTopRight = Dimension(values[NUM_1], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_1]));
560     borderRadius.radiusBottomLeft = Dimension(values[NUM_2], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_2]));
561     borderRadius.radiusBottomRight = Dimension(values[NUM_3], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_3]));
562     borderRadius.multiValued = true;
563     ImageModelNG::SetBorderRadius(frameNode, borderRadius);
564 }
565 
566 
ResetImageBorderRadius(ArkUINodeHandle node)567 void ResetImageBorderRadius(ArkUINodeHandle node)
568 {
569     GetArkUINodeModifiers()->getCommonModifier()->resetBorderRadius(node);
570     auto* frameNode = reinterpret_cast<FrameNode*>(node);
571     CHECK_NULL_VOID(frameNode);
572     if (!Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_FOURTEEN)) {
573         ImageModelNG::SetBackBorder(frameNode);
574         return;
575     }
576     OHOS::Ace::CalcDimension reset;
577     ImageModelNG::SetBorderRadius(frameNode, reset);
578 }
579 
SetImageBorderWithValues(ArkUINodeHandle node,const ArkUI_Float32 * values,ArkUI_Int32 valuesSize)580 void SetImageBorderWithValues(ArkUINodeHandle node, const ArkUI_Float32* values, ArkUI_Int32 valuesSize)
581 {
582     auto* frameNode = reinterpret_cast<FrameNode*>(node);
583     CHECK_NULL_VOID(frameNode);
584     if ((values == nullptr) || (valuesSize != NUM_12)) {
585         return;
586     }
587 
588     int32_t offset = NUM_0;
589     NG::BorderRadiusProperty borderRadius;
590     SetOptionalBorder(borderRadius.radiusTopLeft, values, valuesSize, offset);
591     SetOptionalBorder(borderRadius.radiusTopRight, values, valuesSize, offset);
592     SetOptionalBorder(borderRadius.radiusBottomLeft, values, valuesSize, offset);
593     SetOptionalBorder(borderRadius.radiusBottomRight, values, valuesSize, offset);
594 
595     borderRadius.multiValued = true;
596     if (borderRadius.radiusTopLeft.has_value() || borderRadius.radiusTopRight.has_value() ||
597         borderRadius.radiusBottomLeft.has_value() || borderRadius.radiusBottomRight.has_value()) {
598         ImageModelNG::SetBorderRadius(frameNode, borderRadius);
599     }
600 }
601 
SetImageBorder(ArkUINodeHandle node)602 void SetImageBorder(ArkUINodeHandle node)
603 {
604     auto* frameNode = reinterpret_cast<FrameNode*>(node);
605     CHECK_NULL_VOID(frameNode);
606     ImageModelNG::SetBackBorder(frameNode);
607 }
608 
ResetImageBorder(ArkUINodeHandle node)609 void ResetImageBorder(ArkUINodeHandle node)
610 {
611     auto* frameNode = reinterpret_cast<FrameNode*>(node);
612     CHECK_NULL_VOID(frameNode);
613     if (!Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_FOURTEEN)) {
614         ImageModelNG::SetBackBorder(frameNode);
615         return;
616     }
617     GetArkUINodeModifiers()->getCommonModifier()->resetBorder(node);
618     CalcDimension borderRadius;
619     ImageModelNG::SetBorderRadius(frameNode, borderRadius);
620 }
621 
SetImageOpacity(ArkUINodeHandle node,ArkUI_Float32 opacity)622 void SetImageOpacity(ArkUINodeHandle node, ArkUI_Float32 opacity)
623 {
624     auto* frameNode = reinterpret_cast<FrameNode*>(node);
625     CHECK_NULL_VOID(frameNode);
626     auto opacityValue = static_cast<float>(opacity);
627     if ((LessNotEqual(opacityValue, 0.0)) || GreatNotEqual(opacityValue, 1.0)) {
628         opacityValue = 0.0f;
629     }
630     ViewAbstract::SetOpacity(frameNode, opacityValue);
631 }
632 
ResetImageOpacity(ArkUINodeHandle node)633 void ResetImageOpacity(ArkUINodeHandle node)
634 {
635     auto* frameNode = reinterpret_cast<FrameNode*>(node);
636     CHECK_NULL_VOID(frameNode);
637     ViewAbstract::SetOpacity(frameNode, 0.0f);
638 }
639 
SetEdgeAntialiasing(ArkUINodeHandle node,ArkUI_Float32 edgeAntialiasing)640 void SetEdgeAntialiasing(ArkUINodeHandle node, ArkUI_Float32 edgeAntialiasing)
641 {
642     auto* frameNode = reinterpret_cast<FrameNode*>(node);
643     CHECK_NULL_VOID(frameNode);
644     ImageModelNG::SetSmoothEdge(frameNode, edgeAntialiasing);
645 }
646 
ResetEdgeAntialiasing(ArkUINodeHandle node)647 void ResetEdgeAntialiasing(ArkUINodeHandle node)
648 {
649     auto* frameNode = reinterpret_cast<FrameNode*>(node);
650     CHECK_NULL_VOID(frameNode);
651     ImageModelNG::SetSmoothEdge(frameNode, DEFAULT_IMAGE_EDGE_ANTIALIASING);
652 }
653 
SetResizable(ArkUINodeHandle node,const ArkUIStringAndFloat * options)654 void SetResizable(ArkUINodeHandle node, const ArkUIStringAndFloat* options)
655 {
656     auto* frameNode = reinterpret_cast<FrameNode*>(node);
657     CHECK_NULL_VOID(frameNode);
658     ImageResizableSlice resizable;
659     SetResizableFromVec(resizable, options);
660     ImageModelNG::SetResizableSlice(frameNode, resizable);
661 }
662 
ResetResizable(ArkUINodeHandle node)663 void ResetResizable(ArkUINodeHandle node)
664 {
665     auto* frameNode = reinterpret_cast<FrameNode*>(node);
666     CHECK_NULL_VOID(frameNode);
667     ImageModelNG::SetResizableSlice(frameNode, DEFAULT_IMAGE_SLICE);
668 }
669 
GetFitOriginalSize(ArkUINodeHandle node)670 int32_t GetFitOriginalSize(ArkUINodeHandle node)
671 {
672     auto* frameNode = reinterpret_cast<FrameNode*>(node);
673     CHECK_NULL_RETURN(frameNode, DEFAULT_FALSE);
674     return ImageModelNG::GetFitOriginalSize(frameNode);
675 }
676 
GetFillColor(ArkUINodeHandle node)677 uint32_t GetFillColor(ArkUINodeHandle node)
678 {
679     auto* frameNode = reinterpret_cast<FrameNode*>(node);
680     CHECK_NULL_RETURN(frameNode, ERROR_UINT_CODE);
681     return ImageModelNG::GetFillColor(frameNode);
682 }
683 
SetPixelMap(ArkUINodeHandle node,void * drawableDescriptor)684 void SetPixelMap(ArkUINodeHandle node, void* drawableDescriptor)
685 {
686     auto* frameNode = reinterpret_cast<FrameNode*>(node);
687     CHECK_NULL_VOID(frameNode);
688     ImageModelNG::SetPixelMap(frameNode, drawableDescriptor);
689 }
690 
SetPixelMapArray(ArkUINodeHandle node,void * animatedDrawableDescriptor)691 void SetPixelMapArray(ArkUINodeHandle node, void* animatedDrawableDescriptor)
692 {
693     auto* frameNode = reinterpret_cast<FrameNode*>(node);
694     CHECK_NULL_VOID(frameNode);
695     ImageModelNG::SetPixelMapArray(frameNode, animatedDrawableDescriptor);
696 }
697 
SetResourceSrc(ArkUINodeHandle node,void * resource)698 void SetResourceSrc(ArkUINodeHandle node, void* resource)
699 {
700     auto* frameNode = reinterpret_cast<FrameNode*>(node);
701     CHECK_NULL_VOID(frameNode);
702     ImageModelNG::SetResource(frameNode, resource);
703 }
704 
SetImageResizable(ArkUINodeHandle node,ArkUI_Float32 left,ArkUI_Float32 top,ArkUI_Float32 right,ArkUI_Float32 bottom)705 void SetImageResizable(ArkUINodeHandle node, ArkUI_Float32 left, ArkUI_Float32 top,
706     ArkUI_Float32 right, ArkUI_Float32 bottom)
707 {
708     auto* frameNode = reinterpret_cast<FrameNode*>(node);
709     CHECK_NULL_VOID(frameNode);
710     ImageResizableSlice resizable;
711     Dimension leftDimension(left, DimensionUnit::VP);
712     resizable.SetEdgeSlice(ResizableOption::LEFT, leftDimension);
713     Dimension topDimension(top, DimensionUnit::VP);
714     resizable.SetEdgeSlice(ResizableOption::TOP, topDimension);
715     Dimension rightDimension(right, DimensionUnit::VP);
716     resizable.SetEdgeSlice(ResizableOption::RIGHT, rightDimension);
717     Dimension bottomDimension(bottom, DimensionUnit::VP);
718     resizable.SetEdgeSlice(ResizableOption::BOTTOM, bottomDimension);
719     ImageModelNG::SetResizableSlice(frameNode, resizable);
720 }
721 
GetImageResizable(ArkUINodeHandle node,ArkUI_Float32 * arrayValue,ArkUI_Int32 size)722 void GetImageResizable(ArkUINodeHandle node, ArkUI_Float32* arrayValue, ArkUI_Int32 size)
723 {
724     auto* frameNode = reinterpret_cast<FrameNode*>(node);
725     CHECK_NULL_VOID(frameNode);
726     auto resizable = ImageModelNG::GetResizableSlice(frameNode);
727     if (0 < size) {
728         arrayValue[0] = resizable.left.Value();
729     }
730     if (NUM_1 < size) {
731         arrayValue[NUM_1] = resizable.top.Value();
732     }
733     if (NUM_2 < size) {
734         arrayValue[NUM_2] = resizable.right.Value();
735     }
736     if (NUM_3 < size) {
737         arrayValue[NUM_3] = resizable.bottom.Value();
738     }
739 }
740 
SetDynamicRangeMode(ArkUINodeHandle node,ArkUI_Int32 dynamicRangeMode)741 void SetDynamicRangeMode(ArkUINodeHandle node, ArkUI_Int32 dynamicRangeMode)
742 {
743     auto* frameNode = reinterpret_cast<FrameNode*>(node);
744     CHECK_NULL_VOID(frameNode);
745     DynamicRangeMode dynamicRangeModeValue = static_cast<DynamicRangeMode>(dynamicRangeMode);
746     if (dynamicRangeModeValue < DynamicRangeMode::HIGH || dynamicRangeModeValue > DynamicRangeMode::STANDARD) {
747         dynamicRangeModeValue = DynamicRangeMode::STANDARD;
748     }
749     ImageModelNG::SetDynamicRangeMode(frameNode, dynamicRangeModeValue);
750 }
751 
SetAltSourceInfo(ArkUINodeHandle node,const ArkUIImageSourceInfo * sourceInfo)752 void SetAltSourceInfo(ArkUINodeHandle node, const ArkUIImageSourceInfo* sourceInfo)
753 {
754     auto* frameNode = reinterpret_cast<FrameNode*>(node);
755     CHECK_NULL_VOID(frameNode);
756     CHECK_NULL_VOID(sourceInfo);
757     if (sourceInfo->url) {
758         if (ImageSourceInfo::ResolveURIType(sourceInfo->url) == SrcType::NETWORK) {
759             return;
760         }
761         ImageModelNG::SetAlt(frameNode, ImageSourceInfo { sourceInfo->url, "", "" });
762         return;
763     }
764     if (sourceInfo->resource) {
765         ImageModelNG::SetAltResource(frameNode, sourceInfo->resource);
766         return;
767     }
768     if (sourceInfo->pixelMap) {
769         ImageModelNG::SetAltPixelMap(frameNode, sourceInfo->pixelMap);
770         return;
771     }
772 }
773 
ResetDynamicRangeMode(ArkUINodeHandle node)774 void ResetDynamicRangeMode(ArkUINodeHandle node)
775 {
776     auto* frameNode = reinterpret_cast<FrameNode*>(node);
777     CHECK_NULL_VOID(frameNode);
778     ImageModelNG::SetDynamicRangeMode(frameNode, DynamicRangeMode::STANDARD);
779 }
780 
SetEnhancedImageQuality(ArkUINodeHandle node,ArkUI_Int32 imageQuality)781 void SetEnhancedImageQuality(ArkUINodeHandle node, ArkUI_Int32 imageQuality)
782 {
783     auto* frameNode = reinterpret_cast<FrameNode*>(node);
784     CHECK_NULL_VOID(frameNode);
785     AIImageQuality imageQualityValue = static_cast<AIImageQuality>(imageQuality);
786     if (imageQualityValue < AIImageQuality::NONE || imageQualityValue > AIImageQuality::HIGH) {
787         imageQualityValue = AIImageQuality::NONE;
788     }
789     ImageModelNG::SetEnhancedImageQuality(frameNode, imageQualityValue);
790 }
791 
ResetEnhancedImageQuality(ArkUINodeHandle node)792 void ResetEnhancedImageQuality(ArkUINodeHandle node)
793 {
794     auto* frameNode = reinterpret_cast<FrameNode*>(node);
795     CHECK_NULL_VOID(frameNode);
796     ImageModelNG::SetEnhancedImageQuality(frameNode, AIImageQuality::NONE);
797 }
798 
EnableAnalyzer(ArkUINodeHandle node,ArkUI_Bool enable)799 void EnableAnalyzer(ArkUINodeHandle node, ArkUI_Bool enable)
800 {
801     auto* frameNode = reinterpret_cast<FrameNode*>(node);
802     CHECK_NULL_VOID(frameNode);
803     ImageModelNG::EnableAnalyzer(frameNode, enable);
804 }
805 
SetImagePrivacySensitve(ArkUINodeHandle node,ArkUI_Int32 sensitive)806 void SetImagePrivacySensitve(ArkUINodeHandle node, ArkUI_Int32 sensitive)
807 {
808     auto* frameNode = reinterpret_cast<FrameNode*>(node);
809     CHECK_NULL_VOID(frameNode);
810     frameNode->SetPrivacySensitive(static_cast<bool>(sensitive));
811     frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
812 }
813 
ResetImagePrivacySensitve(ArkUINodeHandle node)814 void ResetImagePrivacySensitve(ArkUINodeHandle node)
815 {
816     auto* frameNode = reinterpret_cast<FrameNode*>(node);
817     CHECK_NULL_VOID(frameNode);
818     frameNode->SetPrivacySensitive(DEFAULT_IMAGE_SENSITIVE);
819     frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
820 }
821 
AnalyzerConfig(ArkUINodeHandle node,void * config)822 void AnalyzerConfig(ArkUINodeHandle node, void* config)
823 {
824     auto* frameNode = reinterpret_cast<FrameNode*>(node);
825     CHECK_NULL_VOID(frameNode);
826     ImageModelNG::SetImageAnalyzerConfig(frameNode, config);
827 }
828 
ResetImageContent(ArkUINodeHandle node)829 void ResetImageContent(ArkUINodeHandle node)
830 {
831     auto* frameNode = reinterpret_cast<FrameNode*>(node);
832     CHECK_NULL_VOID(frameNode);
833     ImageModelNG::ResetImage(frameNode);
834 }
835 
ResetImageSrc(ArkUINodeHandle node)836 void ResetImageSrc(ArkUINodeHandle node)
837 {
838     auto* frameNode = reinterpret_cast<FrameNode*>(node);
839     CHECK_NULL_VOID(frameNode);
840     ImageModelNG::ResetImageSrc(frameNode);
841 }
842 
SetInitialPixelMap(ArkUINodeHandle node,ArkUI_Int64 pixelMap)843 void SetInitialPixelMap(ArkUINodeHandle node, ArkUI_Int64 pixelMap)
844 {
845     auto* frameNode = reinterpret_cast<FrameNode*>(node);
846     CHECK_NULL_VOID(frameNode);
847     void* rawPtr = reinterpret_cast<void*>(pixelMap);
848     CHECK_NULL_VOID(rawPtr);
849     RefPtr<PixelMap> pixelMapRef = PixelMap::CreatePixelMap(rawPtr);
850     ImageModelNG::SetInitialPixelMap(frameNode, pixelMapRef);
851 }
852 
SetOnComplete(ArkUINodeHandle node,void * callback)853 void SetOnComplete(ArkUINodeHandle node, void* callback)
854 {
855     auto* frameNode = reinterpret_cast<FrameNode*>(node);
856     CHECK_NULL_VOID(frameNode);
857     if (callback) {
858         auto onComplete = reinterpret_cast<std::function<void(const LoadImageSuccessEvent&)>*>(callback);
859         ImageModelNG::SetOnComplete(frameNode, std::move(*onComplete));
860     } else {
861         ImageModelNG::SetOnComplete(frameNode, nullptr);
862     }
863 }
864 
SetOnError(ArkUINodeHandle node,void * callback)865 void SetOnError(ArkUINodeHandle node, void* callback)
866 {
867     auto* frameNode = reinterpret_cast<FrameNode*>(node);
868     CHECK_NULL_VOID(frameNode);
869     if (callback) {
870         auto onError = reinterpret_cast<std::function<void(const LoadImageFailEvent&)>*>(callback);
871         ImageModelNG::SetOnError(frameNode, std::move(*onError));
872     } else {
873         ImageModelNG::SetOnError(frameNode, nullptr);
874     }
875 }
876 
ResetOnError(ArkUINodeHandle node)877 void ResetOnError(ArkUINodeHandle node)
878 {
879     auto* frameNode = reinterpret_cast<FrameNode*>(node);
880     CHECK_NULL_VOID(frameNode);
881     ImageModelNG::SetOnError(frameNode, nullptr);
882 }
883 
SetImageOnFinish(ArkUINodeHandle node,void * callback)884 void SetImageOnFinish(ArkUINodeHandle node, void* callback)
885 {
886     auto* frameNode = reinterpret_cast<FrameNode*>(node);
887     CHECK_NULL_VOID(frameNode);
888     if (callback) {
889         auto onFinish = reinterpret_cast<std::function<void()>*>(callback);
890         ImageModelNG::SetOnSvgPlayFinish(frameNode, std::move(*onFinish));
891     } else {
892         ImageModelNG::SetOnSvgPlayFinish(frameNode, nullptr);
893     }
894 }
895 
ResetImageOnFinish(ArkUINodeHandle node)896 void ResetImageOnFinish(ArkUINodeHandle node)
897 {
898     auto* frameNode = reinterpret_cast<FrameNode*>(node);
899     CHECK_NULL_VOID(frameNode);
900     ImageModelNG::SetOnSvgPlayFinish(frameNode, nullptr);
901 }
902 
SetImageRotateOrientation(ArkUINodeHandle node,ArkUI_Int32 orientation)903 void SetImageRotateOrientation(ArkUINodeHandle node, ArkUI_Int32 orientation)
904 {
905     auto* frameNode = reinterpret_cast<FrameNode*>(node);
906     CHECK_NULL_VOID(frameNode);
907     auto orientationValue = static_cast<ImageRotateOrientation>(orientation);
908     if (orientationValue < ImageRotateOrientation::AUTO || orientationValue > ImageRotateOrientation::LEFT) {
909         orientationValue = ImageRotateOrientation::UP;
910     }
911     ImageModelNG::SetOrientation(frameNode, orientationValue);
912 }
913 
ResetImageRotateOrientation(ArkUINodeHandle node)914 void ResetImageRotateOrientation(ArkUINodeHandle node)
915 {
916     auto* frameNode = reinterpret_cast<FrameNode*>(node);
917     CHECK_NULL_VOID(frameNode);
918     ImageModelNG::SetOrientation(frameNode, ImageRotateOrientation::UP);
919 }
920 } // namespace
921 
922 namespace NodeModifier {
GetImageModifier()923 const ArkUIImageModifier* GetImageModifier()
924 {
925     static const ArkUIImageModifier modifier = { SetImageSrc, SetImageShowSrc, SetCopyOption, ResetCopyOption,
926         SetAutoResize, ResetAutoResize, SetObjectRepeat, ResetObjectRepeat, SetRenderMode, ResetRenderMode, SetSyncLoad,
927         ResetSyncLoad, SetImageMatrix, ResetImageMatrix, SetObjectFit, ResetObjectFit, SetFitOriginalSize,
928         ResetFitOriginalSize, SetSourceSize, ResetSourceSize, SetMatchTextDirection, ResetMatchTextDirection,
929         SetFillColor, ResetImageFill, ResetFillColor, SetAlt, ResetAlt, SetImageInterpolation, ResetImageInterpolation,
930         SetColorFilter, ResetColorFilter, SetImageSyncLoad, ResetImageSyncLoad, SetImageObjectFit, ResetImageObjectFit,
931         SetImageFitOriginalSize, ResetImageFitOriginalSize, SetImageDraggable, ResetImageDraggable,
932         SetImageBorderRadius, ResetImageBorderRadius, SetImageBorder, SetImageBorderWithValues, ResetImageBorder,
933         SetImageOpacity, ResetImageOpacity, SetEdgeAntialiasing, ResetEdgeAntialiasing, SetResizable, ResetResizable,
934         SetDynamicRangeMode, ResetDynamicRangeMode, SetImageRotateOrientation, ResetImageRotateOrientation,
935         SetEnhancedImageQuality, ResetEnhancedImageQuality, GetImageSrc, GetAutoResize, GetObjectRepeat, GetObjectFit,
936         GetImageInterpolation, GetColorFilter, GetAlt, GetImageDraggable, GetRenderMode, SetImageResizable,
937         GetImageResizable, GetFitOriginalSize, GetFillColor, SetPixelMap, SetPixelMapArray, SetResourceSrc,
938         EnableAnalyzer, SetImagePrivacySensitve, ResetImagePrivacySensitve, AnalyzerConfig, SetDrawingColorFilter,
939         GetDrawingColorFilter, ResetImageContent, ResetImageSrc, SetInitialPixelMap, SetAltSourceInfo, SetOnComplete,
940         SetOnError, ResetOnError, SetImageOnFinish, ResetImageOnFinish };
941     return &modifier;
942 }
943 
GetCJUIImageModifier()944 const CJUIImageModifier* GetCJUIImageModifier()
945 {
946     static const CJUIImageModifier modifier = {
947         SetImageSrc, SetImageShowSrc, SetCopyOption, ResetCopyOption, SetAutoResize,
948         ResetAutoResize, SetObjectRepeat, ResetObjectRepeat, SetRenderMode, ResetRenderMode, SetSyncLoad, ResetSyncLoad,
949         SetObjectFit, ResetObjectFit, SetFitOriginalSize, ResetFitOriginalSize, SetSourceSize, ResetSourceSize,
950         SetMatchTextDirection, ResetMatchTextDirection, SetFillColor, ResetFillColor, SetAlt, ResetAlt,
951         SetImageInterpolation, ResetImageInterpolation, SetColorFilter, ResetColorFilter, SetImageSyncLoad,
952         ResetImageSyncLoad, SetImageObjectFit, ResetImageObjectFit, SetImageFitOriginalSize, ResetImageFitOriginalSize,
953         SetImageDraggable, ResetImageDraggable, SetImageBorderRadius, ResetImageBorderRadius, SetImageBorder,
954         ResetImageBorder, SetImageOpacity, ResetImageOpacity, SetEdgeAntialiasing, ResetEdgeAntialiasing, SetResizable,
955         ResetResizable, SetDynamicRangeMode, ResetDynamicRangeMode, SetEnhancedImageQuality,
956         ResetEnhancedImageQuality, GetImageSrc, GetAutoResize, GetObjectRepeat, GetObjectFit,
957         GetImageInterpolation, GetColorFilter, GetAlt, GetImageDraggable, GetRenderMode, SetImageResizable,
958         GetImageResizable, GetFitOriginalSize, GetFillColor, SetPixelMap, SetPixelMapArray, SetResourceSrc,
959         EnableAnalyzer, SetImagePrivacySensitve, ResetImagePrivacySensitve, AnalyzerConfig, SetDrawingColorFilter,
960         GetDrawingColorFilter, ResetImageSrc, SetInitialPixelMap, SetOnComplete, SetOnError,
961         ResetOnError, SetImageOnFinish, ResetImageOnFinish };
962     return &modifier;
963 }
964 
SetImageOnComplete(ArkUINodeHandle node,void * extraParam)965 void SetImageOnComplete(ArkUINodeHandle node, void* extraParam)
966 {
967     auto* frameNode = reinterpret_cast<FrameNode*>(node);
968     CHECK_NULL_VOID(frameNode);
969     auto onEvent = [node, extraParam](const LoadImageSuccessEvent& info) {
970         ArkUINodeEvent event;
971         event.kind = COMPONENT_ASYNC_EVENT;
972         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
973         event.componentAsyncEvent.subKind = ON_IMAGE_COMPLETE;
974         event.componentAsyncEvent.data[IMAGE_LOAD_STATUS_INDEX].i32 = info.GetLoadingStatus();
975         event.componentAsyncEvent.data[IMAGE_WIDTH_INDEX].f32 = info.GetWidth();
976         event.componentAsyncEvent.data[IMAGE_HEIGHT_INDEX].f32 = info.GetHeight();
977         event.componentAsyncEvent.data[IMAGE_COMPONENT_WIDTH_INDEX].f32 = info.GetComponentWidth();
978         event.componentAsyncEvent.data[IMAGE_COMPONENT_HEIGHT_INDEX].f32 = info.GetComponentHeight();
979         event.componentAsyncEvent.data[IMAGE_CONTENT_OFFSET_X_INDEX].f32 = info.GetContentOffsetX();
980         event.componentAsyncEvent.data[IMAGE_CONTENT_OFFSET_Y_INDEX].f32 = info.GetContentOffsetY();
981         event.componentAsyncEvent.data[IMAGE_CONTENT_WIDTH_INDEX].f32 = info.GetContentWidth();
982         event.componentAsyncEvent.data[IMAGE_CONTENT_HEIGHT_INDEX].f32 = info.GetContentHeight();
983         SendArkUIAsyncEvent(&event);
984     };
985     ImageModelNG::SetOnComplete(frameNode, std::move(onEvent));
986 }
987 
SetImageOnError(ArkUINodeHandle node,void * extraParam)988 void SetImageOnError(ArkUINodeHandle node, void* extraParam)
989 {
990     auto* frameNode = reinterpret_cast<FrameNode*>(node);
991     CHECK_NULL_VOID(frameNode);
992     auto onEvent = [node, extraParam](const LoadImageFailEvent& info) {
993         ArkUINodeEvent event;
994         event.kind = COMPONENT_ASYNC_EVENT;
995         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
996         event.componentAsyncEvent.subKind = ON_IMAGE_ERROR;
997         event.componentAsyncEvent.data[0].i32 = LOAD_ERROR_CODE;
998         SendArkUIAsyncEvent(&event);
999     };
1000     ImageModelNG::SetOnError(frameNode, std::move(onEvent));
1001 }
1002 
SetImageOnSvgPlayFinish(ArkUINodeHandle node,void * extraParam)1003 void SetImageOnSvgPlayFinish(ArkUINodeHandle node, void* extraParam)
1004 {
1005     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1006     CHECK_NULL_VOID(frameNode);
1007     auto onSvgPlayFinishEvent = [node, extraParam]() {
1008         ArkUINodeEvent event;
1009         event.kind = COMPONENT_ASYNC_EVENT;
1010         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
1011         event.componentAsyncEvent.subKind = ON_IMAGE_SVG_PLAY_FINISH;
1012         SendArkUIAsyncEvent(&event);
1013     };
1014     ImageModelNG::SetOnSvgPlayFinish(frameNode, std::move(onSvgPlayFinishEvent));
1015 }
1016 
SetImageOnDownloadProgress(ArkUINodeHandle node,void * extraParam)1017 void SetImageOnDownloadProgress(ArkUINodeHandle node, void* extraParam)
1018 {
1019     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1020     CHECK_NULL_VOID(frameNode);
1021     auto onDownloadProgress = [node, extraParam](const uint32_t& dlNow, const uint32_t& dlTotal) {
1022         ArkUINodeEvent event;
1023         event.kind = COMPONENT_ASYNC_EVENT;
1024         event.extraParam = reinterpret_cast<intptr_t>(extraParam);
1025         event.componentAsyncEvent.subKind = ON_IMAGE_DOWNLOAD_PROGRESS;
1026         event.componentAsyncEvent.data[0].u32 = dlNow;
1027         event.componentAsyncEvent.data[1].u32 = dlTotal;
1028         SendArkUIAsyncEvent(&event);
1029     };
1030     ImageModelNG::SetOnDownloadProgress(frameNode, std::move(onDownloadProgress));
1031 }
1032 
ResetImageOnComplete(ArkUINodeHandle node)1033 void ResetImageOnComplete(ArkUINodeHandle node)
1034 {
1035     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1036     CHECK_NULL_VOID(frameNode);
1037     ImageModelNG::SetOnComplete(frameNode, nullptr);
1038 }
ResetImageOnError(ArkUINodeHandle node)1039 void ResetImageOnError(ArkUINodeHandle node)
1040 {
1041     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1042     CHECK_NULL_VOID(frameNode);
1043     ImageModelNG::SetOnError(frameNode, nullptr);
1044 }
ResetImageOnSvgPlayFinish(ArkUINodeHandle node)1045 void ResetImageOnSvgPlayFinish(ArkUINodeHandle node)
1046 {
1047     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1048     CHECK_NULL_VOID(frameNode);
1049     ImageModelNG::SetOnSvgPlayFinish(frameNode, nullptr);
1050 }
ResetImageOnDownloadProgress(ArkUINodeHandle node)1051 void ResetImageOnDownloadProgress(ArkUINodeHandle node)
1052 {
1053     auto* frameNode = reinterpret_cast<FrameNode*>(node);
1054     CHECK_NULL_VOID(frameNode);
1055     ImageModelNG::SetOnDownloadProgress(frameNode, nullptr);
1056 }
1057 } // namespace NodeModifier
1058 } // namespace OHOS::Ace::NG
1059