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