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 "effect/color_filter.h"
18
19 #include "core/common/card_scope.h"
20 #include "core/components/image/image_component.h"
21 #include "core/components/image/image_theme.h"
22 #include "core/components_ng/base/view_abstract.h"
23 #include "core/components_ng/pattern/image/image_model_ng.h"
24 #include "core/pipeline_ng/pipeline_context.h"
25
26 namespace OHOS::Ace::NG {
27 namespace {
28 constexpr int NUM_0 = 1;
29 constexpr int NUM_1 = 1;
30 constexpr int NUM_2 = 2;
31 constexpr int NUM_3 = 3;
32 constexpr int NUM_12 = 12;
33 constexpr int DEFAULT_LENGTH = 4;
34 constexpr int RESIZEABLE_VEC_LENGTH = 12;
35 constexpr CopyOptions DEFAULT_IMAGE_COPYOPTION = CopyOptions::None;
36 constexpr bool DEFAULT_SYNC_LOAD_VALUE = false;
37 constexpr ImageFit DEFAULT_OBJECT_FIT_VALUE = ImageFit::COVER;
38 constexpr bool DEFAULT_FIT_ORIGINAL_SIZE = false;
39 constexpr bool DEFAULT_DRAGGABLE = false;
40 constexpr bool DEFAULT_IMAGE_SENSITIVE = false;
41 constexpr ArkUI_Float32 DEFAULT_IMAGE_EDGE_ANTIALIASING = 0;
42 constexpr ImageResizableSlice DEFAULT_IMAGE_SLICE;
43 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 };
44 constexpr int32_t LOAD_ERROR_CODE = 401;
45 constexpr int32_t IMAGE_LOAD_STATUS_INDEX = 0;
46 constexpr int32_t IMAGE_WIDTH_INDEX = 1;
47 constexpr int32_t IMAGE_HEIGHT_INDEX = 2;
48 constexpr int32_t IMAGE_COMPONENT_WIDTH_INDEX = 3;
49 constexpr int32_t IMAGE_COMPONENT_HEIGHT_INDEX = 4;
50 constexpr int32_t IMAGE_CONTENT_OFFSET_X_INDEX = 5;
51 constexpr int32_t IMAGE_CONTENT_OFFSET_Y_INDEX = 6;
52 constexpr int32_t IMAGE_CONTENT_WIDTH_INDEX = 7;
53 constexpr int32_t IMAGE_CONTENT_HEIGHT_INDEX = 8;
54 constexpr uint32_t MAX_COLOR_FILTER_SIZE = 20;
55 constexpr uint32_t ERROR_UINT_CODE = -1;
56 constexpr int32_t DEFAULT_FALSE = 0;
57 const std::vector<ResizableOption> directions = { ResizableOption::TOP, ResizableOption::RIGHT,
58 ResizableOption::BOTTOM, ResizableOption::LEFT };
59 std::string g_strValue;
60
61 enum class ResourceType : uint32_t {
62 COLOR = 10001,
63 FLOAT,
64 STRING,
65 PLURAL,
66 BOOLEAN,
67 INTARRAY,
68 INTEGER,
69 PATTERN,
70 STRARRAY,
71 MEDIA = 20000,
72 RAWFILE = 30000
73 };
74
SetOptionalBorder(std::optional<Dimension> & optionalDimension,const ArkUI_Float32 * values,ArkUI_Int32 valuesSize,ArkUI_Int32 & offset)75 void SetOptionalBorder(std::optional<Dimension>& optionalDimension, const ArkUI_Float32* values, ArkUI_Int32 valuesSize,
76 ArkUI_Int32& offset)
77 {
78 bool hasValue = static_cast<bool>(values[offset]);
79 if (hasValue) {
80 optionalDimension =
81 Dimension(values[offset + NUM_1], static_cast<OHOS::Ace::DimensionUnit>(values[offset + NUM_2]));
82 }
83 offset = offset + NUM_3;
84 }
85
SetCalcDimension(std::optional<CalcDimension> & optDimension,const ArkUIStringAndFloat * options,ArkUI_Int32 optionsLength,ArkUI_Int32 offset)86 bool SetCalcDimension(std::optional<CalcDimension>& optDimension, const ArkUIStringAndFloat* options,
87 ArkUI_Int32 optionsLength, ArkUI_Int32 offset)
88 {
89 if ((options == nullptr) || (offset < 0) || ((offset + NUM_3) > optionsLength)) {
90 return false;
91 }
92 auto hasValue = options[offset];
93 auto value = options[offset + NUM_1];
94 auto unit = options[offset + NUM_2];
95 if (static_cast<bool>(hasValue.value)) {
96 auto unitValue = static_cast<DimensionUnit>(unit.value);
97 if (unitValue == DimensionUnit::CALC) {
98 std::string str;
99 if (value.valueStr != nullptr) {
100 str = value.valueStr;
101 }
102 CalcDimension calcDimension(str, unitValue);
103 optDimension = calcDimension;
104 } else {
105 CalcDimension calcDimension(value.value, unitValue);
106 optDimension = calcDimension;
107 }
108 }
109 return true;
110 }
111
SetResizableFromVec(ImageResizableSlice & resizable,const ArkUIStringAndFloat * options)112 void SetResizableFromVec(ImageResizableSlice& resizable, const ArkUIStringAndFloat* options)
113 {
114 for (unsigned int index = 0; index < RESIZEABLE_VEC_LENGTH; index += NUM_3) {
115 std::optional<CalcDimension> optDimension;
116 SetCalcDimension(optDimension, options, RESIZEABLE_VEC_LENGTH, index);
117 if (optDimension.has_value()) {
118 auto direction = directions[index / NUM_3];
119 resizable.SetEdgeSlice(direction, optDimension.value());
120 }
121 }
122 }
123
SetImageSrc(ArkUINodeHandle node,const char * value)124 void SetImageSrc(ArkUINodeHandle node, const char* value)
125 {
126 auto* frameNode = reinterpret_cast<FrameNode*>(node);
127 CHECK_NULL_VOID(frameNode);
128 std::string src(value);
129 ImageModelNG::InitImage(frameNode, src);
130 }
131
GetImageSrc(ArkUINodeHandle node)132 const char* GetImageSrc(ArkUINodeHandle node)
133 {
134 auto* frameNode = reinterpret_cast<FrameNode*>(node);
135 CHECK_NULL_RETURN(frameNode, nullptr);
136 g_strValue = ImageModelNG::GetSrc(frameNode).GetSrc();
137 return g_strValue.c_str();
138 }
139
GetThemeConstants(const char * bundleName,const char * moduleName)140 RefPtr<ThemeConstants> GetThemeConstants(const char* bundleName, const char* moduleName)
141 {
142 auto cardId = CardScope::CurrentId();
143 if (cardId != INVALID_CARD_ID) {
144 auto container = Container::Current();
145 auto weak = container->GetCardPipeline(cardId);
146 auto cardPipelineContext = weak.Upgrade();
147 CHECK_NULL_RETURN(cardPipelineContext, nullptr);
148 auto cardThemeManager = cardPipelineContext->GetThemeManager();
149 CHECK_NULL_RETURN(cardThemeManager, nullptr);
150 return cardThemeManager->GetThemeConstants(bundleName, moduleName);
151 }
152 auto container = Container::Current();
153 CHECK_NULL_RETURN(container, nullptr);
154 auto pipelineContext = container->GetPipelineContext();
155 CHECK_NULL_RETURN(pipelineContext, nullptr);
156 auto themeManager = pipelineContext->GetThemeManager();
157 CHECK_NULL_RETURN(themeManager, nullptr);
158 return themeManager->GetThemeConstants(bundleName, moduleName);
159 }
160
SetImageResource(ArkUINodeHandle node,int id,int type,const char * name,const char * bundleName,const char * moduleName)161 void SetImageResource(
162 ArkUINodeHandle node, int id, int type, const char* name, const char* bundleName, const char* moduleName)
163 {
164 auto themeConstants = GetThemeConstants(bundleName, moduleName);
165 auto* frameNode = reinterpret_cast<FrameNode*>(node);
166 CHECK_NULL_VOID(frameNode);
167 if (!themeConstants) {
168 return;
169 }
170 std::optional<std::string> src;
171 if (type == static_cast<int32_t>(ResourceType::RAWFILE)) {
172 src = themeConstants->GetRawfile(name);
173 }
174 if (type == static_cast<int32_t>(ResourceType::MEDIA)) {
175 if (id == -1) {
176 src = themeConstants->GetMediaPathByName(name);
177 } else {
178 src = themeConstants->GetMediaPath(id);
179 }
180 }
181 if (!src.has_value()) {
182 return;
183 }
184
185 ImageModelNG::InitImage(frameNode, src.value());
186 }
187
SetCopyOption(ArkUINodeHandle node,ArkUI_Int32 copyOption)188 void SetCopyOption(ArkUINodeHandle node, ArkUI_Int32 copyOption)
189 {
190 auto* frameNode = reinterpret_cast<FrameNode*>(node);
191 CHECK_NULL_VOID(frameNode);
192 auto copyOptions = static_cast<CopyOptions>(copyOption);
193 if (copyOptions < CopyOptions::None || copyOptions > CopyOptions::Distributed) {
194 copyOptions = DEFAULT_IMAGE_COPYOPTION;
195 }
196 ImageModelNG::SetCopyOption(frameNode, copyOptions);
197 }
198
SetImageShowSrc(ArkUINodeHandle node,ArkUI_CharPtr src,ArkUI_CharPtr bundleName,ArkUI_CharPtr moduleName,ArkUI_Bool isUriPureNumber)199 void SetImageShowSrc(ArkUINodeHandle node, ArkUI_CharPtr src, ArkUI_CharPtr bundleName, ArkUI_CharPtr moduleName,
200 ArkUI_Bool isUriPureNumber)
201 {
202 auto* frameNode = reinterpret_cast<FrameNode*>(node);
203 CHECK_NULL_VOID(frameNode);
204 ImageModelNG::SetInitialSrc(frameNode, src, bundleName, moduleName, isUriPureNumber);
205 }
206
ResetCopyOption(ArkUINodeHandle node)207 void ResetCopyOption(ArkUINodeHandle node)
208 {
209 auto* frameNode = reinterpret_cast<FrameNode*>(node);
210 CHECK_NULL_VOID(frameNode);
211 ImageModelNG::SetCopyOption(frameNode, DEFAULT_IMAGE_COPYOPTION);
212 }
213
SetAutoResize(ArkUINodeHandle node,ArkUI_Bool autoResize)214 void SetAutoResize(ArkUINodeHandle node, ArkUI_Bool autoResize)
215 {
216 auto* frameNode = reinterpret_cast<FrameNode*>(node);
217 CHECK_NULL_VOID(frameNode);
218 ImageModelNG::SetAutoResize(frameNode, autoResize);
219 }
220
GetAutoResize(ArkUINodeHandle node)221 int32_t GetAutoResize(ArkUINodeHandle node)
222 {
223 auto* frameNode = reinterpret_cast<FrameNode*>(node);
224 CHECK_NULL_RETURN(frameNode, true);
225 return ImageModelNG::GetAutoResize(frameNode);
226 }
227
ResetAutoResize(ArkUINodeHandle node)228 void ResetAutoResize(ArkUINodeHandle node)
229 {
230 auto* frameNode = reinterpret_cast<FrameNode*>(node);
231 CHECK_NULL_VOID(frameNode);
232 ImageModelNG::ResetAutoResize(frameNode);
233 }
234
SetObjectRepeat(ArkUINodeHandle node,ArkUI_Int32 imageRepeat)235 void SetObjectRepeat(ArkUINodeHandle node, ArkUI_Int32 imageRepeat)
236 {
237 auto* frameNode = reinterpret_cast<FrameNode*>(node);
238 CHECK_NULL_VOID(frameNode);
239 auto repeat = static_cast<ImageRepeat>(imageRepeat);
240 if (repeat < ImageRepeat::NO_REPEAT || repeat > ImageRepeat::REPEAT) {
241 repeat = ImageRepeat::NO_REPEAT;
242 }
243 ImageModelNG::SetImageRepeat(frameNode, repeat);
244 }
245
GetObjectRepeat(ArkUINodeHandle node)246 int32_t GetObjectRepeat(ArkUINodeHandle node)
247 {
248 int32_t defaultObjectRepeat = static_cast<int32_t>(ImageRepeat::NO_REPEAT);
249 auto* frameNode = reinterpret_cast<FrameNode*>(node);
250 CHECK_NULL_RETURN(frameNode, defaultObjectRepeat);
251 return static_cast<int32_t>(ImageModelNG::GetObjectRepeat(frameNode));
252 }
253
ResetObjectRepeat(ArkUINodeHandle node)254 void ResetObjectRepeat(ArkUINodeHandle node)
255 {
256 auto* frameNode = reinterpret_cast<FrameNode*>(node);
257 CHECK_NULL_VOID(frameNode);
258 ImageModelNG::SetImageRepeat(frameNode, ImageRepeat::NO_REPEAT);
259 }
260
SetRenderMode(ArkUINodeHandle node,ArkUI_Int32 imageRenderMode)261 void SetRenderMode(ArkUINodeHandle node, ArkUI_Int32 imageRenderMode)
262 {
263 auto* frameNode = reinterpret_cast<FrameNode*>(node);
264 CHECK_NULL_VOID(frameNode);
265 auto renderMode = static_cast<ImageRenderMode>(imageRenderMode);
266 if (renderMode < ImageRenderMode::ORIGINAL || renderMode > ImageRenderMode::TEMPLATE) {
267 renderMode = ImageRenderMode::ORIGINAL;
268 }
269 ImageModelNG::SetImageRenderMode(frameNode, renderMode);
270 }
271
ResetRenderMode(ArkUINodeHandle node)272 void ResetRenderMode(ArkUINodeHandle node)
273 {
274 auto* frameNode = reinterpret_cast<FrameNode*>(node);
275 CHECK_NULL_VOID(frameNode);
276 ImageModelNG::SetImageRenderMode(frameNode, ImageRenderMode::ORIGINAL);
277 }
278
GetRenderMode(ArkUINodeHandle node)279 int32_t GetRenderMode(ArkUINodeHandle node)
280 {
281 int32_t defaultRenderMode = static_cast<int32_t>(ImageRenderMode::ORIGINAL);
282 auto* frameNode = reinterpret_cast<FrameNode*>(node);
283 CHECK_NULL_RETURN(frameNode, defaultRenderMode);
284 return static_cast<int32_t>(ImageModelNG::GetImageRenderMode(frameNode));
285 }
286
SetSyncLoad(ArkUINodeHandle node,ArkUI_Bool syncLoadValue)287 void SetSyncLoad(ArkUINodeHandle node, ArkUI_Bool syncLoadValue)
288 {
289 auto* frameNode = reinterpret_cast<FrameNode*>(node);
290 CHECK_NULL_VOID(frameNode);
291 ImageModelNG::SetSyncMode(frameNode, syncLoadValue);
292 }
293
ResetSyncLoad(ArkUINodeHandle node)294 void ResetSyncLoad(ArkUINodeHandle node)
295 {
296 auto* frameNode = reinterpret_cast<FrameNode*>(node);
297 CHECK_NULL_VOID(frameNode);
298 ImageModelNG::SetSyncMode(frameNode, DEFAULT_SYNC_LOAD_VALUE);
299 }
300
SetImageMatrix(ArkUINodeHandle node,const ArkUI_Float32 * matrix)301 void SetImageMatrix(ArkUINodeHandle node, const ArkUI_Float32* matrix)
302 {
303 auto* frameNode = reinterpret_cast<FrameNode*>(node);
304 CHECK_NULL_VOID(frameNode);
305 Matrix4 matrix4Value = Matrix4(
306 matrix[0], matrix[4], matrix[8], matrix[12],
307 matrix[1], matrix[5], matrix[9], matrix[13],
308 matrix[2], matrix[6], matrix[10], matrix[14],
309 matrix[3], matrix[7], matrix[11], matrix[15]);
310 ImageModelNG::SetImageMatrix(frameNode, matrix4Value);
311 }
312
ResetImageMatrix(ArkUINodeHandle node)313 void ResetImageMatrix(ArkUINodeHandle node)
314 {
315 auto* frameNode = reinterpret_cast<FrameNode*>(node);
316 CHECK_NULL_VOID(frameNode);
317 const auto matrix4Len = Matrix4::DIMENSION * Matrix4::DIMENSION;
318 std::vector<float> matrix(matrix4Len);
319 const int32_t initPosition = 5;
320 for (int32_t i = 0; i < matrix4Len; i = i + initPosition) {
321 matrix[i] = 1.0f;
322 }
323 Matrix4 defaultValue = Matrix4(
324 matrix[0], matrix[4], matrix[8], matrix[12],
325 matrix[1], matrix[5], matrix[9], matrix[13],
326 matrix[2], matrix[6], matrix[10], matrix[14],
327 matrix[3], matrix[7], matrix[11], matrix[15]);
328 ImageModelNG::SetImageMatrix(frameNode, defaultValue);
329 }
330
SetObjectFit(ArkUINodeHandle node,ArkUI_Int32 objectFitNumber)331 void SetObjectFit(ArkUINodeHandle node, ArkUI_Int32 objectFitNumber)
332 {
333 auto* frameNode = reinterpret_cast<FrameNode*>(node);
334 CHECK_NULL_VOID(frameNode);
335 ImageFit objectFitValue = static_cast<ImageFit>(objectFitNumber);
336 ImageModelNG::SetImageFit(frameNode, objectFitValue);
337 }
338
GetObjectFit(ArkUINodeHandle node)339 int32_t GetObjectFit(ArkUINodeHandle node)
340 {
341 int32_t defaultObjectFit = static_cast<int32_t>(ImageFit::COVER);
342 auto* frameNode = reinterpret_cast<FrameNode*>(node);
343 CHECK_NULL_RETURN(frameNode, defaultObjectFit);
344 return static_cast<int32_t>(ImageModelNG::GetObjectFit(frameNode));
345 }
346
ResetObjectFit(ArkUINodeHandle node)347 void ResetObjectFit(ArkUINodeHandle node)
348 {
349 auto* frameNode = reinterpret_cast<FrameNode*>(node);
350 CHECK_NULL_VOID(frameNode);
351 ImageModelNG::SetImageFit(frameNode, DEFAULT_OBJECT_FIT_VALUE);
352 }
353
SetFitOriginalSize(ArkUINodeHandle node,ArkUI_Bool fitOriginalSizeValue)354 void SetFitOriginalSize(ArkUINodeHandle node, ArkUI_Bool fitOriginalSizeValue)
355 {
356 auto* frameNode = reinterpret_cast<FrameNode*>(node);
357 CHECK_NULL_VOID(frameNode);
358 ImageModelNG::SetFitOriginSize(frameNode, fitOriginalSizeValue);
359 }
360
ResetFitOriginalSize(ArkUINodeHandle node)361 void ResetFitOriginalSize(ArkUINodeHandle node)
362 {
363 auto* frameNode = reinterpret_cast<FrameNode*>(node);
364 CHECK_NULL_VOID(frameNode);
365 ImageModelNG::SetFitOriginSize(frameNode, DEFAULT_FIT_ORIGINAL_SIZE);
366 }
367
SetSourceSize(ArkUINodeHandle node,ArkUI_Float32 width,ArkUI_Float32 height)368 void SetSourceSize(ArkUINodeHandle node, ArkUI_Float32 width, ArkUI_Float32 height)
369 {
370 auto* frameNode = reinterpret_cast<FrameNode*>(node);
371 CHECK_NULL_VOID(frameNode);
372 CalcDimension widthObj(width, DimensionUnit::VP);
373 CalcDimension heightObj(height, DimensionUnit::VP);
374 ImageModelNG::SetImageSourceSize(frameNode, std::pair<CalcDimension, CalcDimension>(widthObj, heightObj));
375 }
376
ResetSourceSize(ArkUINodeHandle node)377 void ResetSourceSize(ArkUINodeHandle node)
378 {
379 auto* frameNode = reinterpret_cast<FrameNode*>(node);
380 CHECK_NULL_VOID(frameNode);
381 ImageModelNG::SetImageSourceSize(frameNode, std::pair<CalcDimension, CalcDimension>());
382 }
383
SetMatchTextDirection(ArkUINodeHandle node,ArkUI_Uint32 value)384 void SetMatchTextDirection(ArkUINodeHandle node, ArkUI_Uint32 value)
385 {
386 auto* frameNode = reinterpret_cast<FrameNode*>(node);
387 CHECK_NULL_VOID(frameNode);
388 ImageModelNG::SetMatchTextDirection(frameNode, static_cast<bool>(value));
389 }
390
ResetMatchTextDirection(ArkUINodeHandle node)391 void ResetMatchTextDirection(ArkUINodeHandle node)
392 {
393 auto* frameNode = reinterpret_cast<FrameNode*>(node);
394 CHECK_NULL_VOID(frameNode);
395 ImageModelNG::SetMatchTextDirection(frameNode, false);
396 }
397
SetFillColor(ArkUINodeHandle node,ArkUI_Uint32 value)398 void SetFillColor(ArkUINodeHandle node, ArkUI_Uint32 value)
399 {
400 auto* frameNode = reinterpret_cast<FrameNode*>(node);
401 CHECK_NULL_VOID(frameNode);
402 ImageModelNG::SetImageFill(frameNode, Color(value));
403 }
404
ResetImageFill(ArkUINodeHandle node)405 void ResetImageFill(ArkUINodeHandle node)
406 {
407 auto* frameNode = reinterpret_cast<FrameNode*>(node);
408 CHECK_NULL_VOID(frameNode);
409 ImageModelNG::ResetImageFill(frameNode);
410 }
411
ResetFillColor(ArkUINodeHandle node)412 void ResetFillColor(ArkUINodeHandle node)
413 {
414 auto* frameNode = reinterpret_cast<FrameNode*>(node);
415 CHECK_NULL_VOID(frameNode);
416 auto pipelineContext = frameNode->GetContext();
417 CHECK_NULL_VOID(pipelineContext);
418 auto theme = pipelineContext->GetTheme<ImageTheme>();
419 CHECK_NULL_VOID(theme);
420 ImageModelNG::SetImageFill(frameNode, theme->GetFillColor());
421 }
422
SetAlt(ArkUINodeHandle node,const char * src,const char * bundleName,const char * moduleName)423 void SetAlt(ArkUINodeHandle node, const char* src, const char* bundleName, const char* moduleName)
424 {
425 if (ImageSourceInfo::ResolveURIType(src) == SrcType::NETWORK) {
426 return;
427 }
428
429 auto* frameNode = reinterpret_cast<FrameNode*>(node);
430 CHECK_NULL_VOID(frameNode);
431 ImageModelNG::SetAlt(frameNode, ImageSourceInfo { src, bundleName, moduleName });
432 }
433
GetAlt(ArkUINodeHandle node)434 const char* GetAlt(ArkUINodeHandle node)
435 {
436 auto* frameNode = reinterpret_cast<FrameNode*>(node);
437 CHECK_NULL_RETURN(frameNode, nullptr);
438 g_strValue = ImageModelNG::GetAlt(frameNode).GetSrc();
439 return g_strValue.c_str();
440 }
441
ResetAlt(ArkUINodeHandle node)442 void ResetAlt(ArkUINodeHandle node)
443 {
444 auto* frameNode = reinterpret_cast<FrameNode*>(node);
445 CHECK_NULL_VOID(frameNode);
446 ImageModelNG::ResetImageAlt(frameNode);
447 }
448
SetImageInterpolation(ArkUINodeHandle node,ArkUI_Int32 value)449 void SetImageInterpolation(ArkUINodeHandle node, ArkUI_Int32 value)
450 {
451 auto* frameNode = reinterpret_cast<FrameNode*>(node);
452 CHECK_NULL_VOID(frameNode);
453 auto interpolation = static_cast<Ace::ImageInterpolation>(value);
454 if (interpolation < Ace::ImageInterpolation::NONE || interpolation > Ace::ImageInterpolation::HIGH) {
455 interpolation = Ace::ImageInterpolation::NONE;
456 }
457 ImageModelNG::SetImageInterpolation(frameNode, interpolation);
458 }
459
GetImageInterpolation(ArkUINodeHandle node)460 int32_t GetImageInterpolation(ArkUINodeHandle node)
461 {
462 int32_t defaultInterpolation = static_cast<int32_t>(ImageInterpolation::NONE);
463 auto* frameNode = reinterpret_cast<FrameNode*>(node);
464 CHECK_NULL_RETURN(frameNode, defaultInterpolation);
465 return static_cast<int32_t>(ImageModelNG::GetInterpolation(frameNode));
466 }
467
ResetImageInterpolation(ArkUINodeHandle node)468 void ResetImageInterpolation(ArkUINodeHandle node)
469 {
470 auto* frameNode = reinterpret_cast<FrameNode*>(node);
471 CHECK_NULL_VOID(frameNode);
472 ImageModelNG::ResetImageInterpolation(frameNode);
473 }
474
SetColorFilter(ArkUINodeHandle node,const ArkUI_Float32 * array,int length)475 void SetColorFilter(ArkUINodeHandle node, const ArkUI_Float32* array, int length)
476 {
477 CHECK_NULL_VOID(array);
478 if (length != COLOR_FILTER_MATRIX_SIZE) {
479 return;
480 }
481 auto* frameNode = reinterpret_cast<FrameNode*>(node);
482 CHECK_NULL_VOID(frameNode);
483 ImageModelNG::SetColorFilterMatrix(frameNode, std::vector<float>(array, array + length));
484 }
485
GetColorFilter(ArkUINodeHandle node,ArkUIFilterColorType * colorFilter)486 void GetColorFilter(ArkUINodeHandle node, ArkUIFilterColorType* colorFilter)
487 {
488 CHECK_NULL_VOID(colorFilter);
489 auto* frameNode = reinterpret_cast<FrameNode*>(node);
490 CHECK_NULL_VOID(frameNode);
491 auto filterFloatArray = ImageModelNG::GetColorFilter(frameNode);
492 colorFilter->filterSize = filterFloatArray.size() < MAX_COLOR_FILTER_SIZE
493 ? static_cast<int32_t>(filterFloatArray.size())
494 : static_cast<int32_t>(MAX_COLOR_FILTER_SIZE);
495 for (size_t i = 0; i < static_cast<size_t>(colorFilter->filterSize) && i < MAX_COLOR_FILTER_SIZE; i++) {
496 *(colorFilter->filterArray+i) = filterFloatArray[i];
497 }
498 }
499
ResetColorFilter(ArkUINodeHandle node)500 void ResetColorFilter(ArkUINodeHandle node)
501 {
502 auto* frameNode = reinterpret_cast<FrameNode*>(node);
503 CHECK_NULL_VOID(frameNode);
504 ImageModelNG::SetColorFilterMatrix(frameNode, DEFAULT_COLOR_FILTER);
505 }
506
SetDrawingColorFilter(ArkUINodeHandle node,void * colorFilter)507 void SetDrawingColorFilter(ArkUINodeHandle node, void* colorFilter)
508 {
509 auto* frameNode = reinterpret_cast<FrameNode*>(node);
510 CHECK_NULL_VOID(frameNode);
511 auto filter = reinterpret_cast<OHOS::Rosen::Drawing::ColorFilter*>(colorFilter);
512 auto filterPtr = std::make_shared<OHOS::Rosen::Drawing::ColorFilter>(*filter);
513 auto drawingColorFilter = DrawingColorFilter::CreateDrawingColorFilterFromNative(static_cast<void*>(&filterPtr));
514 ImageModelNG::SetDrawingColorFilter(frameNode, drawingColorFilter);
515 }
516
GetDrawingColorFilter(ArkUINodeHandle node)517 void* GetDrawingColorFilter(ArkUINodeHandle node)
518 {
519 auto* frameNode = reinterpret_cast<FrameNode*>(node);
520 CHECK_NULL_RETURN(frameNode, nullptr);
521 auto drawingColorFilter = ImageModelNG::GetDrawingColorFilter(frameNode);
522 CHECK_NULL_RETURN(drawingColorFilter, nullptr);
523 auto filterSptr = reinterpret_cast<std::shared_ptr<OHOS::Rosen::Drawing::ColorFilter>*>(
524 drawingColorFilter->GetDrawingColorFilterSptrAddr());
525 CHECK_NULL_RETURN(filterSptr, nullptr);
526 return (*filterSptr).get();
527 }
528
SetImageSyncLoad(ArkUINodeHandle node,ArkUI_Bool syncLoadValue)529 void SetImageSyncLoad(ArkUINodeHandle node, ArkUI_Bool syncLoadValue)
530 {
531 auto* frameNode = reinterpret_cast<FrameNode*>(node);
532 CHECK_NULL_VOID(frameNode);
533 ImageModelNG::SetSyncMode(frameNode, syncLoadValue);
534 }
535
ResetImageSyncLoad(ArkUINodeHandle node)536 void ResetImageSyncLoad(ArkUINodeHandle node)
537 {
538 auto* frameNode = reinterpret_cast<FrameNode*>(node);
539 CHECK_NULL_VOID(frameNode);
540 ImageModelNG::SetSyncMode(frameNode, DEFAULT_SYNC_LOAD_VALUE);
541 }
542
SetImageObjectFit(ArkUINodeHandle node,ArkUI_Int32 objectFitNumber)543 void SetImageObjectFit(ArkUINodeHandle node, ArkUI_Int32 objectFitNumber)
544 {
545 auto* frameNode = reinterpret_cast<FrameNode*>(node);
546 CHECK_NULL_VOID(frameNode);
547 ImageFit objectFitValue = static_cast<ImageFit>(objectFitNumber);
548 ImageModelNG::SetImageFit(frameNode, objectFitValue);
549 }
550
ResetImageObjectFit(ArkUINodeHandle node)551 void ResetImageObjectFit(ArkUINodeHandle node)
552 {
553 auto* frameNode = reinterpret_cast<FrameNode*>(node);
554 CHECK_NULL_VOID(frameNode);
555 ImageModelNG::SetImageFit(frameNode, DEFAULT_OBJECT_FIT_VALUE);
556 }
557
SetImageFitOriginalSize(ArkUINodeHandle node,ArkUI_Bool fitOriginalSizeValue)558 void SetImageFitOriginalSize(ArkUINodeHandle node, ArkUI_Bool fitOriginalSizeValue)
559 {
560 auto* frameNode = reinterpret_cast<FrameNode*>(node);
561 CHECK_NULL_VOID(frameNode);
562 ImageModelNG::SetFitOriginSize(frameNode, fitOriginalSizeValue);
563 }
564
ResetImageFitOriginalSize(ArkUINodeHandle node)565 void ResetImageFitOriginalSize(ArkUINodeHandle node)
566 {
567 auto* frameNode = reinterpret_cast<FrameNode*>(node);
568 CHECK_NULL_VOID(frameNode);
569 ImageModelNG::SetFitOriginSize(frameNode, DEFAULT_FIT_ORIGINAL_SIZE);
570 }
571
SetImageDraggable(ArkUINodeHandle node,ArkUI_Bool value)572 void SetImageDraggable(ArkUINodeHandle node, ArkUI_Bool value)
573 {
574 auto* frameNode = reinterpret_cast<FrameNode*>(node);
575 CHECK_NULL_VOID(frameNode);
576 ImageModelNG::SetDraggable(frameNode, value);
577 }
578
ResetImageDraggable(ArkUINodeHandle node)579 void ResetImageDraggable(ArkUINodeHandle node)
580 {
581 auto* frameNode = reinterpret_cast<FrameNode*>(node);
582 CHECK_NULL_VOID(frameNode);
583 ImageModelNG::SetDraggable(frameNode, DEFAULT_DRAGGABLE);
584 }
585
GetImageDraggable(ArkUINodeHandle node)586 int32_t GetImageDraggable(ArkUINodeHandle node)
587 {
588 auto* frameNode = reinterpret_cast<FrameNode*>(node);
589 CHECK_NULL_RETURN(frameNode, DEFAULT_DRAGGABLE);
590 return ImageModelNG::GetDraggable(frameNode);
591 }
592
593 /**
594 * @param values radius values
595 * value[0] : radius value for TopLeft,value[1] : radius value for TopRight
596 * value[2] : radius value for BottomLeft,value[3] : radius value for BottomRight
597 * @param units radius units
598 * units[0]: radius unit for TopLeft ,units[1] : radius unit for TopRight
599 * units[2]: radius unit for BottomLeft, units[3] : radius unit for TopRight
600 */
SetImageBorderRadius(ArkUINodeHandle node,const ArkUI_Float32 * values,const int * units,ArkUI_Int32 length)601 void SetImageBorderRadius(ArkUINodeHandle node, const ArkUI_Float32* values, const int* units, ArkUI_Int32 length)
602 {
603 auto nodeModifiers = GetArkUINodeModifiers();
604 CHECK_NULL_VOID(nodeModifiers);
605 nodeModifiers->getCommonModifier()->setBorderRadius(node, values, units, length);
606 auto* frameNode = reinterpret_cast<FrameNode*>(node);
607 CHECK_NULL_VOID(frameNode);
608 if (!Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_FOURTEEN)) {
609 ImageModelNG::SetBackBorder(frameNode);
610 return;
611 }
612 if (length != DEFAULT_LENGTH) {
613 return;
614 }
615 NG::BorderRadiusProperty borderRadius;
616 borderRadius.radiusTopLeft = Dimension(values[NUM_0], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_0]));
617 borderRadius.radiusTopRight = Dimension(values[NUM_1], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_1]));
618 borderRadius.radiusBottomLeft = Dimension(values[NUM_2], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_2]));
619 borderRadius.radiusBottomRight = Dimension(values[NUM_3], static_cast<OHOS::Ace::DimensionUnit>(units[NUM_3]));
620 borderRadius.multiValued = true;
621 ImageModelNG::SetBorderRadius(frameNode, borderRadius);
622 }
623
624
ResetImageBorderRadius(ArkUINodeHandle node)625 void ResetImageBorderRadius(ArkUINodeHandle node)
626 {
627 auto nodeModifiers = GetArkUINodeModifiers();
628 CHECK_NULL_VOID(nodeModifiers);
629 nodeModifiers->getCommonModifier()->resetBorderRadius(node);
630 auto* frameNode = reinterpret_cast<FrameNode*>(node);
631 CHECK_NULL_VOID(frameNode);
632 if (!Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_FOURTEEN)) {
633 ImageModelNG::SetBackBorder(frameNode);
634 return;
635 }
636 OHOS::Ace::CalcDimension reset;
637 ImageModelNG::SetBorderRadius(frameNode, reset);
638 }
639
SetImageBorderWithValues(ArkUINodeHandle node,const ArkUI_Float32 * values,ArkUI_Int32 valuesSize)640 void SetImageBorderWithValues(ArkUINodeHandle node, const ArkUI_Float32* values, ArkUI_Int32 valuesSize)
641 {
642 auto* frameNode = reinterpret_cast<FrameNode*>(node);
643 CHECK_NULL_VOID(frameNode);
644 if ((values == nullptr) || (valuesSize != NUM_12)) {
645 return;
646 }
647
648 int32_t offset = NUM_0;
649 NG::BorderRadiusProperty borderRadius;
650 SetOptionalBorder(borderRadius.radiusTopLeft, values, valuesSize, offset);
651 SetOptionalBorder(borderRadius.radiusTopRight, values, valuesSize, offset);
652 SetOptionalBorder(borderRadius.radiusBottomLeft, values, valuesSize, offset);
653 SetOptionalBorder(borderRadius.radiusBottomRight, values, valuesSize, offset);
654
655 borderRadius.multiValued = true;
656 if (borderRadius.radiusTopLeft.has_value() || borderRadius.radiusTopRight.has_value() ||
657 borderRadius.radiusBottomLeft.has_value() || borderRadius.radiusBottomRight.has_value()) {
658 ImageModelNG::SetBorderRadius(frameNode, borderRadius);
659 }
660 }
661
SetImageBorder(ArkUINodeHandle node)662 void SetImageBorder(ArkUINodeHandle node)
663 {
664 auto* frameNode = reinterpret_cast<FrameNode*>(node);
665 CHECK_NULL_VOID(frameNode);
666 ImageModelNG::SetBackBorder(frameNode);
667 }
668
ResetImageBorder(ArkUINodeHandle node)669 void ResetImageBorder(ArkUINodeHandle node)
670 {
671 auto* frameNode = reinterpret_cast<FrameNode*>(node);
672 CHECK_NULL_VOID(frameNode);
673 if (!Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_FOURTEEN)) {
674 ImageModelNG::SetBackBorder(frameNode);
675 return;
676 }
677 auto nodeModifiers = GetArkUINodeModifiers();
678 CHECK_NULL_VOID(nodeModifiers);
679 nodeModifiers->getCommonModifier()->resetBorder(node);
680 CalcDimension borderRadius;
681 ImageModelNG::SetBorderRadius(frameNode, borderRadius);
682 }
683
SetImageOpacity(ArkUINodeHandle node,ArkUI_Float32 opacity)684 void SetImageOpacity(ArkUINodeHandle node, ArkUI_Float32 opacity)
685 {
686 auto* frameNode = reinterpret_cast<FrameNode*>(node);
687 CHECK_NULL_VOID(frameNode);
688 auto opacityValue = static_cast<float>(opacity);
689 if ((LessNotEqual(opacityValue, 0.0)) || GreatNotEqual(opacityValue, 1.0)) {
690 opacityValue = 1.0f;
691 }
692 ViewAbstract::SetOpacity(frameNode, opacityValue);
693 }
694
ResetImageOpacity(ArkUINodeHandle node)695 void ResetImageOpacity(ArkUINodeHandle node)
696 {
697 auto* frameNode = reinterpret_cast<FrameNode*>(node);
698 CHECK_NULL_VOID(frameNode);
699 ViewAbstract::SetOpacity(frameNode, 1.0f);
700 }
701
SetEdgeAntialiasing(ArkUINodeHandle node,ArkUI_Float32 edgeAntialiasing)702 void SetEdgeAntialiasing(ArkUINodeHandle node, ArkUI_Float32 edgeAntialiasing)
703 {
704 auto* frameNode = reinterpret_cast<FrameNode*>(node);
705 CHECK_NULL_VOID(frameNode);
706 ImageModelNG::SetSmoothEdge(frameNode, edgeAntialiasing);
707 }
708
ResetEdgeAntialiasing(ArkUINodeHandle node)709 void ResetEdgeAntialiasing(ArkUINodeHandle node)
710 {
711 auto* frameNode = reinterpret_cast<FrameNode*>(node);
712 CHECK_NULL_VOID(frameNode);
713 ImageModelNG::SetSmoothEdge(frameNode, DEFAULT_IMAGE_EDGE_ANTIALIASING);
714 }
715
SetResizable(ArkUINodeHandle node,const ArkUIStringAndFloat * options)716 void SetResizable(ArkUINodeHandle node, const ArkUIStringAndFloat* options)
717 {
718 auto* frameNode = reinterpret_cast<FrameNode*>(node);
719 CHECK_NULL_VOID(frameNode);
720 ImageResizableSlice resizable;
721 SetResizableFromVec(resizable, options);
722 ImageModelNG::SetResizableSlice(frameNode, resizable);
723 }
724
ResetResizable(ArkUINodeHandle node)725 void ResetResizable(ArkUINodeHandle node)
726 {
727 auto* frameNode = reinterpret_cast<FrameNode*>(node);
728 CHECK_NULL_VOID(frameNode);
729 ImageModelNG::SetResizableSlice(frameNode, DEFAULT_IMAGE_SLICE);
730 }
731
SetResizableLattice(ArkUINodeHandle node,void * lattice)732 void SetResizableLattice(ArkUINodeHandle node, void* lattice)
733 {
734 auto* frameNode = reinterpret_cast<FrameNode*>(node);
735 CHECK_NULL_VOID(frameNode);
736 auto drawingLattice = DrawingLattice::CreateDrawingLattice(lattice);
737 if (drawingLattice) {
738 ImageModelNG::SetResizableLattice(frameNode, drawingLattice);
739 } else {
740 ImageModelNG::ResetResizableLattice(frameNode);
741 }
742 }
743
ResetResizableLattice(ArkUINodeHandle node)744 void ResetResizableLattice(ArkUINodeHandle node)
745 {
746 auto* frameNode = reinterpret_cast<FrameNode*>(node);
747 CHECK_NULL_VOID(frameNode);
748 ImageModelNG::ResetResizableLattice(frameNode);
749 }
750
SetDynamicRangeMode(ArkUINodeHandle node,ArkUI_Int32 dynamicRangeMode)751 void SetDynamicRangeMode(ArkUINodeHandle node, ArkUI_Int32 dynamicRangeMode)
752 {
753 auto* frameNode = reinterpret_cast<FrameNode*>(node);
754 CHECK_NULL_VOID(frameNode);
755 DynamicRangeMode dynamicRangeModeValue = static_cast<DynamicRangeMode>(dynamicRangeMode);
756 if (dynamicRangeModeValue < DynamicRangeMode::HIGH || dynamicRangeModeValue > DynamicRangeMode::STANDARD) {
757 dynamicRangeModeValue = DynamicRangeMode::STANDARD;
758 }
759 ImageModelNG::SetDynamicRangeMode(frameNode, dynamicRangeModeValue);
760 }
761
GetFitOriginalSize(ArkUINodeHandle node)762 int32_t GetFitOriginalSize(ArkUINodeHandle node)
763 {
764 auto* frameNode = reinterpret_cast<FrameNode*>(node);
765 CHECK_NULL_RETURN(frameNode, DEFAULT_FALSE);
766 return ImageModelNG::GetFitOriginalSize(frameNode);
767 }
768
GetFillColor(ArkUINodeHandle node)769 uint32_t GetFillColor(ArkUINodeHandle node)
770 {
771 auto* frameNode = reinterpret_cast<FrameNode*>(node);
772 CHECK_NULL_RETURN(frameNode, ERROR_UINT_CODE);
773 return ImageModelNG::GetFillColor(frameNode);
774 }
775
SetPixelMap(ArkUINodeHandle node,void * drawableDescriptor)776 void SetPixelMap(ArkUINodeHandle node, void* drawableDescriptor)
777 {
778 auto* frameNode = reinterpret_cast<FrameNode*>(node);
779 CHECK_NULL_VOID(frameNode);
780 ImageModelNG::SetPixelMap(frameNode, drawableDescriptor);
781 }
782
SetPixelMapArray(ArkUINodeHandle node,void * animatedDrawableDescriptor)783 void SetPixelMapArray(ArkUINodeHandle node, void* animatedDrawableDescriptor)
784 {
785 auto* frameNode = reinterpret_cast<FrameNode*>(node);
786 CHECK_NULL_VOID(frameNode);
787 ImageModelNG::SetPixelMapArray(frameNode, animatedDrawableDescriptor);
788 }
789
SetResourceSrc(ArkUINodeHandle node,void * resource)790 void SetResourceSrc(ArkUINodeHandle node, void* resource)
791 {
792 auto* frameNode = reinterpret_cast<FrameNode*>(node);
793 CHECK_NULL_VOID(frameNode);
794 ImageModelNG::SetResource(frameNode, resource);
795 }
796
SetAltSourceInfo(ArkUINodeHandle node,const ArkUIImageSourceInfo * sourceInfo)797 void SetAltSourceInfo(ArkUINodeHandle node, const ArkUIImageSourceInfo* sourceInfo)
798 {
799 auto* frameNode = reinterpret_cast<FrameNode*>(node);
800 CHECK_NULL_VOID(frameNode);
801 CHECK_NULL_VOID(sourceInfo);
802 if (sourceInfo->url) {
803 if (ImageSourceInfo::ResolveURIType(sourceInfo->url) == SrcType::NETWORK) {
804 return;
805 }
806 ImageModelNG::SetAlt(frameNode, ImageSourceInfo { sourceInfo->url, "", "" });
807 return;
808 }
809 if (sourceInfo->resource) {
810 ImageModelNG::SetAltResource(frameNode, sourceInfo->resource);
811 return;
812 }
813 if (sourceInfo->pixelMap) {
814 ImageModelNG::SetAltPixelMap(frameNode, sourceInfo->pixelMap);
815 return;
816 }
817 }
818
ResetDynamicRangeMode(ArkUINodeHandle node)819 void ResetDynamicRangeMode(ArkUINodeHandle node)
820 {
821 auto* frameNode = reinterpret_cast<FrameNode*>(node);
822 CHECK_NULL_VOID(frameNode);
823 ImageModelNG::SetDynamicRangeMode(frameNode, DynamicRangeMode::STANDARD);
824 }
825
SetEnhancedImageQuality(ArkUINodeHandle node,ArkUI_Int32 imageQuality)826 void SetEnhancedImageQuality(ArkUINodeHandle node, ArkUI_Int32 imageQuality)
827 {
828 auto* frameNode = reinterpret_cast<FrameNode*>(node);
829 CHECK_NULL_VOID(frameNode);
830 AIImageQuality imageQualityValue = static_cast<AIImageQuality>(imageQuality);
831 if (imageQualityValue < AIImageQuality::NONE || imageQualityValue > AIImageQuality::HIGH) {
832 imageQualityValue = AIImageQuality::NONE;
833 }
834 ImageModelNG::SetEnhancedImageQuality(frameNode, imageQualityValue);
835 }
836
ResetEnhancedImageQuality(ArkUINodeHandle node)837 void ResetEnhancedImageQuality(ArkUINodeHandle node)
838 {
839 auto* frameNode = reinterpret_cast<FrameNode*>(node);
840 CHECK_NULL_VOID(frameNode);
841 ImageModelNG::SetEnhancedImageQuality(frameNode, AIImageQuality::NONE);
842 }
843
SetImageResizable(ArkUINodeHandle node,ArkUI_Float32 left,ArkUI_Float32 top,ArkUI_Float32 right,ArkUI_Float32 bottom)844 void SetImageResizable(ArkUINodeHandle node, ArkUI_Float32 left, ArkUI_Float32 top,
845 ArkUI_Float32 right, ArkUI_Float32 bottom)
846 {
847 auto* frameNode = reinterpret_cast<FrameNode*>(node);
848 CHECK_NULL_VOID(frameNode);
849 ImageResizableSlice resizable;
850 Dimension leftDimension(left, DimensionUnit::VP);
851 resizable.SetEdgeSlice(ResizableOption::LEFT, leftDimension);
852 Dimension topDimension(top, DimensionUnit::VP);
853 resizable.SetEdgeSlice(ResizableOption::TOP, topDimension);
854 Dimension rightDimension(right, DimensionUnit::VP);
855 resizable.SetEdgeSlice(ResizableOption::RIGHT, rightDimension);
856 Dimension bottomDimension(bottom, DimensionUnit::VP);
857 resizable.SetEdgeSlice(ResizableOption::BOTTOM, bottomDimension);
858 ImageModelNG::SetResizableSlice(frameNode, resizable);
859 }
860
GetImageResizable(ArkUINodeHandle node,ArkUI_Float32 * arrayValue,ArkUI_Int32 size)861 void GetImageResizable(ArkUINodeHandle node, ArkUI_Float32* arrayValue, ArkUI_Int32 size)
862 {
863 auto* frameNode = reinterpret_cast<FrameNode*>(node);
864 CHECK_NULL_VOID(frameNode);
865 auto resizable = ImageModelNG::GetResizableSlice(frameNode);
866 if (0 < size) {
867 arrayValue[0] = resizable.left.Value();
868 }
869 if (NUM_1 < size) {
870 arrayValue[NUM_1] = resizable.top.Value();
871 }
872 if (NUM_2 < size) {
873 arrayValue[NUM_2] = resizable.right.Value();
874 }
875 if (NUM_3 < size) {
876 arrayValue[NUM_3] = resizable.bottom.Value();
877 }
878 }
879
EnableAnalyzer(ArkUINodeHandle node,ArkUI_Bool enable)880 void EnableAnalyzer(ArkUINodeHandle node, ArkUI_Bool enable)
881 {
882 auto* frameNode = reinterpret_cast<FrameNode*>(node);
883 CHECK_NULL_VOID(frameNode);
884 ImageModelNG::EnableAnalyzer(frameNode, enable);
885 }
886
SetImagePrivacySensitve(ArkUINodeHandle node,ArkUI_Int32 sensitive)887 void SetImagePrivacySensitve(ArkUINodeHandle node, ArkUI_Int32 sensitive)
888 {
889 auto* frameNode = reinterpret_cast<FrameNode*>(node);
890 CHECK_NULL_VOID(frameNode);
891 frameNode->SetPrivacySensitive(static_cast<bool>(sensitive));
892 frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
893 }
894
ResetImagePrivacySensitve(ArkUINodeHandle node)895 void ResetImagePrivacySensitve(ArkUINodeHandle node)
896 {
897 auto* frameNode = reinterpret_cast<FrameNode*>(node);
898 CHECK_NULL_VOID(frameNode);
899 frameNode->SetPrivacySensitive(DEFAULT_IMAGE_SENSITIVE);
900 frameNode->MarkDirtyNode(PROPERTY_UPDATE_MEASURE);
901 }
902
AnalyzerConfig(ArkUINodeHandle node,void * config)903 void AnalyzerConfig(ArkUINodeHandle node, void* config)
904 {
905 auto* frameNode = reinterpret_cast<FrameNode*>(node);
906 CHECK_NULL_VOID(frameNode);
907 ImageModelNG::SetImageAnalyzerConfig(frameNode, config);
908 }
909
ResetImageContent(ArkUINodeHandle node)910 void ResetImageContent(ArkUINodeHandle node)
911 {
912 auto* frameNode = reinterpret_cast<FrameNode*>(node);
913 CHECK_NULL_VOID(frameNode);
914 ImageModelNG::ResetImage(frameNode);
915 }
916
ResetImageSrc(ArkUINodeHandle node)917 void ResetImageSrc(ArkUINodeHandle node)
918 {
919 auto* frameNode = reinterpret_cast<FrameNode*>(node);
920 CHECK_NULL_VOID(frameNode);
921 ImageModelNG::ResetImageSrc(frameNode);
922 }
923
SetInitialPixelMap(ArkUINodeHandle node,ArkUI_Int64 pixelMap)924 void SetInitialPixelMap(ArkUINodeHandle node, ArkUI_Int64 pixelMap)
925 {
926 auto* frameNode = reinterpret_cast<FrameNode*>(node);
927 CHECK_NULL_VOID(frameNode);
928 void* rawPtr = reinterpret_cast<void*>(pixelMap);
929 CHECK_NULL_VOID(rawPtr);
930 RefPtr<PixelMap> pixelMapRef = PixelMap::CreatePixelMap(rawPtr);
931 ImageModelNG::SetInitialPixelMap(frameNode, pixelMapRef);
932 }
933
SetOnComplete(ArkUINodeHandle node,void * callback)934 void SetOnComplete(ArkUINodeHandle node, void* callback)
935 {
936 auto* frameNode = reinterpret_cast<FrameNode*>(node);
937 CHECK_NULL_VOID(frameNode);
938 if (callback) {
939 auto onComplete = reinterpret_cast<std::function<void(const LoadImageSuccessEvent&)>*>(callback);
940 ImageModelNG::SetOnComplete(frameNode, std::move(*onComplete));
941 } else {
942 ImageModelNG::SetOnComplete(frameNode, nullptr);
943 }
944 }
945
SetOnError(ArkUINodeHandle node,void * callback)946 void SetOnError(ArkUINodeHandle node, void* callback)
947 {
948 auto* frameNode = reinterpret_cast<FrameNode*>(node);
949 CHECK_NULL_VOID(frameNode);
950 if (callback) {
951 auto onError = reinterpret_cast<std::function<void(const LoadImageFailEvent&)>*>(callback);
952 ImageModelNG::SetOnError(frameNode, std::move(*onError));
953 } else {
954 ImageModelNG::SetOnError(frameNode, nullptr);
955 }
956 }
957
ResetOnError(ArkUINodeHandle node)958 void ResetOnError(ArkUINodeHandle node)
959 {
960 auto* frameNode = reinterpret_cast<FrameNode*>(node);
961 CHECK_NULL_VOID(frameNode);
962 ImageModelNG::SetOnError(frameNode, nullptr);
963 }
964
SetImageOnFinish(ArkUINodeHandle node,void * callback)965 void SetImageOnFinish(ArkUINodeHandle node, void* callback)
966 {
967 auto* frameNode = reinterpret_cast<FrameNode*>(node);
968 CHECK_NULL_VOID(frameNode);
969 if (callback) {
970 auto onFinish = reinterpret_cast<std::function<void()>*>(callback);
971 ImageModelNG::SetOnSvgPlayFinish(frameNode, std::move(*onFinish));
972 } else {
973 ImageModelNG::SetOnSvgPlayFinish(frameNode, nullptr);
974 }
975 }
976
ResetImageOnFinish(ArkUINodeHandle node)977 void ResetImageOnFinish(ArkUINodeHandle node)
978 {
979 auto* frameNode = reinterpret_cast<FrameNode*>(node);
980 CHECK_NULL_VOID(frameNode);
981 ImageModelNG::SetOnSvgPlayFinish(frameNode, nullptr);
982 }
983
SetImageRotateOrientation(ArkUINodeHandle node,ArkUI_Int32 orientation)984 void SetImageRotateOrientation(ArkUINodeHandle node, ArkUI_Int32 orientation)
985 {
986 auto* frameNode = reinterpret_cast<FrameNode*>(node);
987 CHECK_NULL_VOID(frameNode);
988 auto orientationValue = static_cast<ImageRotateOrientation>(orientation);
989 if (orientationValue < ImageRotateOrientation::AUTO || orientationValue > ImageRotateOrientation::LEFT) {
990 orientationValue = ImageRotateOrientation::UP;
991 }
992 ImageModelNG::SetOrientation(frameNode, orientationValue);
993 }
994
ResetImageRotateOrientation(ArkUINodeHandle node)995 void ResetImageRotateOrientation(ArkUINodeHandle node)
996 {
997 auto* frameNode = reinterpret_cast<FrameNode*>(node);
998 CHECK_NULL_VOID(frameNode);
999 ImageModelNG::SetOrientation(frameNode, ImageRotateOrientation::UP);
1000 }
1001 } // namespace
1002
1003 namespace NodeModifier {
GetImageModifier()1004 const ArkUIImageModifier* GetImageModifier()
1005 {
1006 CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
1007 static const ArkUIImageModifier modifier = {
1008 .setSrc = SetImageSrc,
1009 .setImageShowSrc = SetImageShowSrc,
1010 .setImageResource = SetImageResource,
1011 .setCopyOption = SetCopyOption,
1012 .resetCopyOption = ResetCopyOption,
1013 .setAutoResize = SetAutoResize,
1014 .resetAutoResize = ResetAutoResize,
1015 .setObjectRepeat = SetObjectRepeat,
1016 .resetObjectRepeat = ResetObjectRepeat,
1017 .setRenderMode = SetRenderMode,
1018 .resetRenderMode = ResetRenderMode,
1019 .setSyncLoad = SetSyncLoad,
1020 .resetSyncLoad = ResetSyncLoad,
1021 .setImageMatrix = SetImageMatrix,
1022 .resetImageMatrix = ResetImageMatrix,
1023 .setObjectFit = SetObjectFit,
1024 .resetObjectFit = ResetObjectFit,
1025 .setFitOriginalSize = SetFitOriginalSize,
1026 .resetFitOriginalSize = ResetFitOriginalSize,
1027 .setSourceSize = SetSourceSize,
1028 .resetSourceSize = ResetSourceSize,
1029 .setMatchTextDirection = SetMatchTextDirection,
1030 .resetMatchTextDirection = ResetMatchTextDirection,
1031 .setFillColor = SetFillColor,
1032 .resetImageFill = ResetImageFill,
1033 .resetFillColor = ResetFillColor,
1034 .setAlt = SetAlt,
1035 .resetAlt = ResetAlt,
1036 .setImageInterpolation = SetImageInterpolation,
1037 .resetImageInterpolation = ResetImageInterpolation,
1038 .setColorFilter = SetColorFilter,
1039 .resetColorFilter = ResetColorFilter,
1040 .setImageSyncLoad = SetImageSyncLoad,
1041 .resetImageSyncLoad = ResetImageSyncLoad,
1042 .setImageObjectFit = SetImageObjectFit,
1043 .resetImageObjectFit = ResetImageObjectFit,
1044 .setImageFitOriginalSize = SetImageFitOriginalSize,
1045 .resetImageFitOriginalSize = ResetImageFitOriginalSize,
1046 .setImageDraggable = SetImageDraggable,
1047 .resetImageDraggable = ResetImageDraggable,
1048 .setImageBorderRadius = SetImageBorderRadius,
1049 .resetImageBorderRadius = ResetImageBorderRadius,
1050 .setImageBorder = SetImageBorder,
1051 .setImageBorderWithValues = SetImageBorderWithValues,
1052 .resetImageBorder = ResetImageBorder,
1053 .setImageOpacity = SetImageOpacity,
1054 .resetImageOpacity = ResetImageOpacity,
1055 .setEdgeAntialiasing = SetEdgeAntialiasing,
1056 .resetEdgeAntialiasing = ResetEdgeAntialiasing,
1057 .setResizable = SetResizable,
1058 .resetResizable = ResetResizable,
1059 .setDynamicRangeMode = SetDynamicRangeMode,
1060 .resetDynamicRangeMode = ResetDynamicRangeMode,
1061 .setImageRotateOrientation = SetImageRotateOrientation,
1062 .resetImageRotateOrientation = ResetImageRotateOrientation,
1063 .setEnhancedImageQuality = SetEnhancedImageQuality,
1064 .resetEnhancedImageQuality = ResetEnhancedImageQuality,
1065 .getImageSrc = GetImageSrc,
1066 .getAutoResize = GetAutoResize,
1067 .getObjectRepeat = GetObjectRepeat,
1068 .getObjectFit = GetObjectFit,
1069 .getImageInterpolation = GetImageInterpolation,
1070 .getColorFilter = GetColorFilter,
1071 .getAlt = GetAlt,
1072 .getImageDraggable = GetImageDraggable,
1073 .getRenderMode = GetRenderMode,
1074 .setImageResizable = SetImageResizable,
1075 .getImageResizable = GetImageResizable,
1076 .getFitOriginalSize = GetFitOriginalSize,
1077 .getFillColor = GetFillColor,
1078 .setPixelMap = SetPixelMap,
1079 .setPixelMapArray = SetPixelMapArray,
1080 .setResourceSrc = SetResourceSrc,
1081 .enableAnalyzer = EnableAnalyzer,
1082 .setImagePrivacySensitive = SetImagePrivacySensitve,
1083 .resetImagePrivacySensitive = ResetImagePrivacySensitve,
1084 .analyzerConfig = AnalyzerConfig,
1085 .setDrawingColorFilter = SetDrawingColorFilter,
1086 .getDrawingColorFilter = GetDrawingColorFilter,
1087 .resetImageContent = ResetImageContent,
1088 .resetImageSrc = ResetImageSrc,
1089 .setInitialPixelMap = SetInitialPixelMap,
1090 .setAltSourceInfo = SetAltSourceInfo,
1091 .setOnComplete = SetOnComplete,
1092 .setOnError = SetOnError,
1093 .resetOnError = ResetOnError,
1094 .setImageOnFinish = SetImageOnFinish,
1095 .resetImageOnFinish = ResetImageOnFinish,
1096 .setResizableLattice = SetResizableLattice,
1097 .resetResizableLattice = ResetResizableLattice,
1098 };
1099 CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
1100 return &modifier;
1101 }
1102
GetCJUIImageModifier()1103 const CJUIImageModifier* GetCJUIImageModifier()
1104 {
1105 CHECK_INITIALIZED_FIELDS_BEGIN(); // don't move this line
1106 static const CJUIImageModifier modifier = {
1107 .setSrc = SetImageSrc,
1108 .setImageShowSrc = SetImageShowSrc,
1109 .setCopyOption = SetCopyOption,
1110 .resetCopyOption = ResetCopyOption,
1111 .setAutoResize = SetAutoResize,
1112 .resetAutoResize = ResetAutoResize,
1113 .setObjectRepeat = SetObjectRepeat,
1114 .resetObjectRepeat = ResetObjectRepeat,
1115 .setRenderMode = SetRenderMode,
1116 .resetRenderMode = ResetRenderMode,
1117 .setSyncLoad = SetSyncLoad,
1118 .resetSyncLoad = ResetSyncLoad,
1119 .setObjectFit = SetObjectFit,
1120 .resetObjectFit = ResetObjectFit,
1121 .setFitOriginalSize = SetFitOriginalSize,
1122 .resetFitOriginalSize = ResetFitOriginalSize,
1123 .setSourceSize = SetSourceSize,
1124 .resetSourceSize = ResetSourceSize,
1125 .setMatchTextDirection = SetMatchTextDirection,
1126 .resetMatchTextDirection = ResetMatchTextDirection,
1127 .setFillColor = SetFillColor,
1128 .resetFillColor = ResetFillColor,
1129 .setAlt = SetAlt,
1130 .resetAlt = ResetAlt,
1131 .setImageInterpolation = SetImageInterpolation,
1132 .resetImageInterpolation = ResetImageInterpolation,
1133 .setColorFilter = SetColorFilter,
1134 .resetColorFilter = ResetColorFilter,
1135 .setImageSyncLoad = SetImageSyncLoad,
1136 .resetImageSyncLoad = ResetImageSyncLoad,
1137 .setImageObjectFit = SetImageObjectFit,
1138 .resetImageObjectFit = ResetImageObjectFit,
1139 .setImageFitOriginalSize = SetImageFitOriginalSize,
1140 .resetImageFitOriginalSize = ResetImageFitOriginalSize,
1141 .setImageDraggable = SetImageDraggable,
1142 .resetImageDraggable = ResetImageDraggable,
1143 .setImageBorderRadius = SetImageBorderRadius,
1144 .resetImageBorderRadius = ResetImageBorderRadius,
1145 .setImageBorder = SetImageBorder,
1146 .resetImageBorder = ResetImageBorder,
1147 .setImageOpacity = SetImageOpacity,
1148 .resetImageOpacity = ResetImageOpacity,
1149 .setEdgeAntialiasing = SetEdgeAntialiasing,
1150 .resetEdgeAntialiasing = ResetEdgeAntialiasing,
1151 .setResizable = SetResizable,
1152 .resetResizable = ResetResizable,
1153 .setDynamicRangeMode = SetDynamicRangeMode,
1154 .resetDynamicRangeMode = ResetDynamicRangeMode,
1155 .setEnhancedImageQuality = SetEnhancedImageQuality,
1156 .resetEnhancedImageQuality = ResetEnhancedImageQuality,
1157 .getImageSrc = GetImageSrc,
1158 .getAutoResize = GetAutoResize,
1159 .getObjectRepeat = GetObjectRepeat,
1160 .getObjectFit = GetObjectFit,
1161 .getImageInterpolation = GetImageInterpolation,
1162 .getColorFilter = GetColorFilter,
1163 .getAlt = GetAlt,
1164 .getImageDraggable = GetImageDraggable,
1165 .getRenderMode = GetRenderMode,
1166 .setImageResizable = SetImageResizable,
1167 .getImageResizable = GetImageResizable,
1168 .getFitOriginalSize = GetFitOriginalSize,
1169 .getFillColor = GetFillColor,
1170 .setPixelMap = SetPixelMap,
1171 .setPixelMapArray = SetPixelMapArray,
1172 .setResourceSrc = SetResourceSrc,
1173 .enableAnalyzer = EnableAnalyzer,
1174 .setImagePrivacySensitive = SetImagePrivacySensitve,
1175 .resetImagePrivacySensitive = ResetImagePrivacySensitve,
1176 .analyzerConfig = AnalyzerConfig,
1177 .setDrawingColorFilter = SetDrawingColorFilter,
1178 .getDrawingColorFilter = GetDrawingColorFilter,
1179 .resetImageSrc = ResetImageSrc,
1180 .setInitialPixelMap = SetInitialPixelMap,
1181 .setOnComplete = SetOnComplete,
1182 .setOnError = SetOnError,
1183 .resetOnError = ResetOnError,
1184 .setImageOnFinish = SetImageOnFinish,
1185 .resetImageOnFinish = ResetImageOnFinish,
1186 };
1187 CHECK_INITIALIZED_FIELDS_END(modifier, 0, 0, 0); // don't move this line
1188 return &modifier;
1189 }
1190
SetImageOnComplete(ArkUINodeHandle node,void * extraParam)1191 void SetImageOnComplete(ArkUINodeHandle node, void* extraParam)
1192 {
1193 auto* frameNode = reinterpret_cast<FrameNode*>(node);
1194 CHECK_NULL_VOID(frameNode);
1195 auto onEvent = [node, extraParam](const LoadImageSuccessEvent& info) {
1196 ArkUINodeEvent event;
1197 event.kind = COMPONENT_ASYNC_EVENT;
1198 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
1199 event.componentAsyncEvent.subKind = ON_IMAGE_COMPLETE;
1200 event.componentAsyncEvent.data[IMAGE_LOAD_STATUS_INDEX].i32 = info.GetLoadingStatus();
1201 event.componentAsyncEvent.data[IMAGE_WIDTH_INDEX].f32 = info.GetWidth();
1202 event.componentAsyncEvent.data[IMAGE_HEIGHT_INDEX].f32 = info.GetHeight();
1203 event.componentAsyncEvent.data[IMAGE_COMPONENT_WIDTH_INDEX].f32 = info.GetComponentWidth();
1204 event.componentAsyncEvent.data[IMAGE_COMPONENT_HEIGHT_INDEX].f32 = info.GetComponentHeight();
1205 event.componentAsyncEvent.data[IMAGE_CONTENT_OFFSET_X_INDEX].f32 = info.GetContentOffsetX();
1206 event.componentAsyncEvent.data[IMAGE_CONTENT_OFFSET_Y_INDEX].f32 = info.GetContentOffsetY();
1207 event.componentAsyncEvent.data[IMAGE_CONTENT_WIDTH_INDEX].f32 = info.GetContentWidth();
1208 event.componentAsyncEvent.data[IMAGE_CONTENT_HEIGHT_INDEX].f32 = info.GetContentHeight();
1209 SendArkUISyncEvent(&event);
1210 };
1211 ImageModelNG::SetOnComplete(frameNode, std::move(onEvent));
1212 }
1213
SetImageOnError(ArkUINodeHandle node,void * extraParam)1214 void SetImageOnError(ArkUINodeHandle node, void* extraParam)
1215 {
1216 auto* frameNode = reinterpret_cast<FrameNode*>(node);
1217 CHECK_NULL_VOID(frameNode);
1218 auto onEvent = [node, extraParam](const LoadImageFailEvent& info) {
1219 ArkUINodeEvent event;
1220 event.kind = COMPONENT_ASYNC_EVENT;
1221 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
1222 event.componentAsyncEvent.subKind = ON_IMAGE_ERROR;
1223 event.componentAsyncEvent.data[0].i32 = LOAD_ERROR_CODE;
1224 SendArkUISyncEvent(&event);
1225 };
1226 ImageModelNG::SetOnError(frameNode, std::move(onEvent));
1227 }
1228
SetImageOnSvgPlayFinish(ArkUINodeHandle node,void * extraParam)1229 void SetImageOnSvgPlayFinish(ArkUINodeHandle node, void* extraParam)
1230 {
1231 auto* frameNode = reinterpret_cast<FrameNode*>(node);
1232 CHECK_NULL_VOID(frameNode);
1233 auto onSvgPlayFinishEvent = [node, extraParam]() {
1234 ArkUINodeEvent event;
1235 event.kind = COMPONENT_ASYNC_EVENT;
1236 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
1237 event.componentAsyncEvent.subKind = ON_IMAGE_SVG_PLAY_FINISH;
1238 SendArkUISyncEvent(&event);
1239 };
1240 ImageModelNG::SetOnSvgPlayFinish(frameNode, std::move(onSvgPlayFinishEvent));
1241 }
1242
SetImageOnDownloadProgress(ArkUINodeHandle node,void * extraParam)1243 void SetImageOnDownloadProgress(ArkUINodeHandle node, void* extraParam)
1244 {
1245 auto* frameNode = reinterpret_cast<FrameNode*>(node);
1246 CHECK_NULL_VOID(frameNode);
1247 auto onDownloadProgress = [node, extraParam](const uint32_t& dlNow, const uint32_t& dlTotal) {
1248 ArkUINodeEvent event;
1249 event.kind = COMPONENT_ASYNC_EVENT;
1250 event.extraParam = reinterpret_cast<intptr_t>(extraParam);
1251 event.componentAsyncEvent.subKind = ON_IMAGE_DOWNLOAD_PROGRESS;
1252 event.componentAsyncEvent.data[0].u32 = dlNow;
1253 event.componentAsyncEvent.data[1].u32 = dlTotal;
1254 SendArkUISyncEvent(&event);
1255 };
1256 ImageModelNG::SetOnDownloadProgress(frameNode, std::move(onDownloadProgress));
1257 }
1258
ResetImageOnComplete(ArkUINodeHandle node)1259 void ResetImageOnComplete(ArkUINodeHandle node)
1260 {
1261 auto* frameNode = reinterpret_cast<FrameNode*>(node);
1262 CHECK_NULL_VOID(frameNode);
1263 ImageModelNG::SetOnComplete(frameNode, nullptr);
1264 }
ResetImageOnError(ArkUINodeHandle node)1265 void ResetImageOnError(ArkUINodeHandle node)
1266 {
1267 auto* frameNode = reinterpret_cast<FrameNode*>(node);
1268 CHECK_NULL_VOID(frameNode);
1269 ImageModelNG::SetOnError(frameNode, nullptr);
1270 }
ResetImageOnSvgPlayFinish(ArkUINodeHandle node)1271 void ResetImageOnSvgPlayFinish(ArkUINodeHandle node)
1272 {
1273 auto* frameNode = reinterpret_cast<FrameNode*>(node);
1274 CHECK_NULL_VOID(frameNode);
1275 ImageModelNG::SetOnSvgPlayFinish(frameNode, nullptr);
1276 }
ResetImageOnDownloadProgress(ArkUINodeHandle node)1277 void ResetImageOnDownloadProgress(ArkUINodeHandle node)
1278 {
1279 auto* frameNode = reinterpret_cast<FrameNode*>(node);
1280 CHECK_NULL_VOID(frameNode);
1281 ImageModelNG::SetOnDownloadProgress(frameNode, nullptr);
1282 }
1283 } // namespace NodeModifier
1284 } // namespace OHOS::Ace::NG
1285