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 "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_image_bridge.h"
16 
17 #include "base/image/pixel_map.h"
18 #include "base/memory/referenced.h"
19 #include "base/utils/utils.h"
20 #include "bridge/common/utils/engine_helper.h"
21 #include "bridge/declarative_frontend/engine/js_ref_ptr.h"
22 #include "bridge/declarative_frontend/engine/js_types.h"
23 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
24 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_api_bridge.h"
25 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.h"
26 #include "bridge/declarative_frontend/engine/jsi/jsi_types.h"
27 #include "bridge/declarative_frontend/jsview/js_image.h"
28 #include "bridge/declarative_frontend/jsview/js_utils.h"
29 #include "core/components/common/layout/constants.h"
30 #include "core/components/image/image_event.h"
31 #include "core/components/theme/theme_attributes.h"
32 #include "core/components_ng/pattern/image/image_model_ng.h"
33 #include "core/image/image_source_info.h"
34 #include "core/pipeline/base/constants.h"
35 
36 namespace OHOS::Ace::NG {
37 constexpr int32_t INDEX_0 = 0;      // Arg Index
38 constexpr int32_t INDEX_1 = 1;      // Arg Index
39 constexpr int32_t INDEX_2 = 2;      // Arg Index
40 constexpr int32_t INDEX_3 = 3;      // Arg Index
41 constexpr int32_t INDEX_4 = 4;      // Arg Index
42 constexpr int32_t SIZE_OF_FOUR = 4; // Border Radius array size
43 constexpr int32_t BORDER_RADIUS_INDEX_1 = 2;
44 constexpr int32_t BORDER_RADIUS_INDEX_2 = 3;
45 constexpr int32_t BORDER_RADIUS_INDEX_3 = 4;
46 constexpr int32_t BORDER_RADIUS_INDEX_4 = 4;
47 constexpr int32_t BORDER_RADIUS_VALUE = 0;
48 
PushOuterBorderDimensionVector(const std::optional<CalcDimension> & valueDim,std::vector<ArkUI_Float32> & options)49 void PushOuterBorderDimensionVector(const std::optional<CalcDimension>& valueDim, std::vector<ArkUI_Float32> &options)
50 {
51     options.push_back(static_cast<ArkUI_Float32>(valueDim.has_value()));
52     if (valueDim.has_value()) {
53         options.push_back(static_cast<ArkUI_Float32>(valueDim.value().Value()));
54         options.push_back(static_cast<ArkUI_Float32>(valueDim.value().Unit()));
55     } else {
56         options.push_back(BORDER_RADIUS_VALUE);
57         options.push_back(BORDER_RADIUS_VALUE);
58     }
59 }
60 
ParseOuterBorderRadius(ArkUIRuntimeCallInfo * runtimeCallInfo,EcmaVM * vm,std::vector<ArkUI_Float32> & values)61 void ParseOuterBorderRadius(
62     ArkUIRuntimeCallInfo* runtimeCallInfo, EcmaVM* vm, std::vector<ArkUI_Float32>& values)
63 {
64     Local<JSValueRef> topLeftArgs = runtimeCallInfo->GetCallArgRef(BORDER_RADIUS_INDEX_1);
65     Local<JSValueRef> topRightArgs = runtimeCallInfo->GetCallArgRef(BORDER_RADIUS_INDEX_2);
66     Local<JSValueRef> bottomLeftArgs = runtimeCallInfo->GetCallArgRef(BORDER_RADIUS_INDEX_3);
67     Local<JSValueRef> bottomRightArgs = runtimeCallInfo->GetCallArgRef(BORDER_RADIUS_INDEX_4);
68 
69     std::optional<CalcDimension> topLeftOptional;
70     std::optional<CalcDimension> topRightOptional;
71     std::optional<CalcDimension> bottomLeftOptional;
72     std::optional<CalcDimension> bottomRightOptional;
73 
74     ArkTSUtils::ParseOuterBorder(vm, topLeftArgs, topLeftOptional);
75     ArkTSUtils::ParseOuterBorder(vm, topRightArgs, topRightOptional);
76     ArkTSUtils::ParseOuterBorder(vm, bottomLeftArgs, bottomLeftOptional);
77     ArkTSUtils::ParseOuterBorder(vm, bottomRightArgs, bottomRightOptional);
78 
79     PushOuterBorderDimensionVector(topLeftOptional, values);
80     PushOuterBorderDimensionVector(topRightOptional, values);
81     PushOuterBorderDimensionVector(bottomLeftOptional, values);
82     PushOuterBorderDimensionVector(bottomRightOptional, values);
83 }
84 
85 const std::vector<float> DEFAULT_COLOR_FILTER_MATRIX = {
86     1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0
87 };
88 
ParseResizableCalcDimensions(ArkUIRuntimeCallInfo * runtimeCallInfo,uint32_t offset,uint32_t count,std::vector<std::optional<CalcDimension>> & results,const CalcDimension & defValue)89 void ParseResizableCalcDimensions(ArkUIRuntimeCallInfo* runtimeCallInfo, uint32_t offset, uint32_t count,
90     std::vector<std::optional<CalcDimension>>& results, const CalcDimension& defValue)
91 {
92     auto end = offset + count;
93     auto argsNumber = runtimeCallInfo->GetArgsNumber();
94     if (end > argsNumber) {
95         return;
96     }
97     CalcDimension defaultDimension(defValue);
98     EcmaVM* vm = runtimeCallInfo->GetVM();
99     for (uint32_t index = offset; index < end; index++) {
100         auto arg = runtimeCallInfo->GetCallArgRef(index);
101         std::optional<CalcDimension> optCalcDimension;
102         CalcDimension dimension(defValue);
103         if (ArkTSUtils::ParseJsDimensionVp(vm, arg, dimension, false)) {
104             optCalcDimension = dimension;
105         } else {
106             optCalcDimension = defaultDimension;
107         }
108         results.push_back(optCalcDimension);
109     }
110 }
111 
PushDimensionsToVector(std::vector<ArkUIStringAndFloat> & results,const std::vector<std::optional<CalcDimension>> & optDimensions)112 void PushDimensionsToVector(std::vector<ArkUIStringAndFloat>& results,
113     const std::vector<std::optional<CalcDimension>>& optDimensions)
114 {
115     for (uint32_t index = 0; index < optDimensions.size(); index++) {
116         auto optDimension = optDimensions[index];
117         auto hasValue = optDimension.has_value();
118         DimensionUnit unit = DimensionUnit::PX;
119         ArkUIStringAndFloat value = { 0.0, nullptr };
120         if (hasValue) {
121             unit = optDimension.value().Unit();
122             if (unit == DimensionUnit::CALC) {
123                 value.valueStr = optDimension.value().CalcValue().c_str();
124             } else {
125                 value.value = optDimension.value().Value();
126             }
127         }
128         results.push_back(ArkUIStringAndFloat { static_cast<double>(hasValue), nullptr });
129         results.push_back(value);
130         results.push_back(ArkUIStringAndFloat { static_cast<double>(unit), nullptr });
131     }
132 }
133 
CheckIsCard()134 bool ImageBridge::CheckIsCard()
135 {
136     auto container = Container::Current();
137     CHECK_NULL_RETURN(container, false);
138     auto context = PipelineBase::GetCurrentContext();
139     CHECK_NULL_RETURN(context, false);
140     return context->IsFormRender() && !container->IsDynamicRender();
141 }
142 
SetImageShowSrc(ArkUIRuntimeCallInfo * runtimeCallInfo)143 ArkUINativeModuleValue ImageBridge::SetImageShowSrc(ArkUIRuntimeCallInfo* runtimeCallInfo)
144 {
145     EcmaVM* vm = runtimeCallInfo->GetVM();
146     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
147     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
148     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
149     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
150     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
151 
152     bool isCard = CheckIsCard();
153     std::string src;
154     int32_t resId = 0;
155     if (info[1]->IsNumber()) {
156         GetArkUINodeModifiers()->getImageModifier()->resetImageContent(nativeNode);
157         return panda::JSValueRef::Undefined(vm);
158     }
159     if (info[0]->IsObject()) {
160         Framework::JSRef<Framework::JSObject> jsObj = Framework::JSRef<Framework::JSObject>::Cast(info[0]);
161         Framework::JSRef<Framework::JSVal> tmp = jsObj->GetProperty("id");
162         if (!tmp->IsNull() && tmp->IsNumber()) {
163             resId = tmp->ToNumber<int32_t>();
164         }
165     }
166     bool srcValid = ArkTSUtils::ParseJsMedia(vm, secondArg, src);
167     if (isCard && secondArg->IsString(vm)) {
168         SrcType srcType = ImageSourceInfo::ResolveURIType(src);
169         bool notSupport = (srcType == SrcType::NETWORK || srcType == SrcType::FILE || srcType == SrcType::DATA_ABILITY);
170         if (notSupport) {
171             src.clear();
172         }
173     }
174     std::string bundleName;
175     std::string moduleName;
176     ArkTSUtils::GetJsMediaBundleInfo(vm, secondArg, bundleName, moduleName);
177     RefPtr<PixelMap> pixmap = nullptr;
178     if (!srcValid && !isCard) {
179 #if defined (PIXEL_MAP_SUPPORTED)
180         if (Framework::IsDrawable(info[1])) {
181             pixmap = Framework::GetDrawablePixmap(info[1]);
182         } else {
183             pixmap = Framework::CreatePixelMapFromNapiValue(info[1]);
184         }
185 #endif
186     }
187     if (pixmap) {
188         ImageModelNG::SetInitialPixelMap(reinterpret_cast<FrameNode*>(nativeNode), pixmap);
189     } else {
190         GetArkUINodeModifiers()->getImageModifier()->setImageShowSrc(
191             nativeNode, src.c_str(), bundleName.c_str(), moduleName.c_str(), (resId == -1));
192     }
193     return panda::JSValueRef::Undefined(vm);
194 }
195 
SetCopyOption(ArkUIRuntimeCallInfo * runtimeCallInfo)196 ArkUINativeModuleValue ImageBridge::SetCopyOption(ArkUIRuntimeCallInfo* runtimeCallInfo)
197 {
198     EcmaVM* vm = runtimeCallInfo->GetVM();
199     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
200     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
201     Local<JSValueRef> optionArg = runtimeCallInfo->GetCallArgRef(1);
202     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
203     if (optionArg->IsNumber()) {
204         int32_t option = optionArg->Int32Value(vm);
205         GetArkUINodeModifiers()->getImageModifier()->setCopyOption(nativeNode, option);
206     } else {
207         GetArkUINodeModifiers()->getImageModifier()->resetCopyOption(nativeNode);
208     }
209     return panda::JSValueRef::Undefined(vm);
210 }
211 
ResetCopyOption(ArkUIRuntimeCallInfo * runtimeCallInfo)212 ArkUINativeModuleValue ImageBridge::ResetCopyOption(ArkUIRuntimeCallInfo* runtimeCallInfo)
213 {
214     EcmaVM* vm = runtimeCallInfo->GetVM();
215     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
216     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
217     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
218     GetArkUINodeModifiers()->getImageModifier()->resetCopyOption(nativeNode);
219     return panda::JSValueRef::Undefined(vm);
220 }
221 
SetAutoResize(ArkUIRuntimeCallInfo * runtimeCallInfo)222 ArkUINativeModuleValue ImageBridge::SetAutoResize(ArkUIRuntimeCallInfo* runtimeCallInfo)
223 {
224     EcmaVM* vm = runtimeCallInfo->GetVM();
225     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
226     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
227     Local<JSValueRef> autoResizeArg = runtimeCallInfo->GetCallArgRef(1);
228     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
229     if (autoResizeArg->IsBoolean()) {
230         bool autoResize = autoResizeArg->ToBoolean(vm)->Value();
231         GetArkUINodeModifiers()->getImageModifier()->setAutoResize(nativeNode, autoResize);
232     } else {
233         GetArkUINodeModifiers()->getImageModifier()->resetAutoResize(nativeNode);
234     }
235     return panda::JSValueRef::Undefined(vm);
236 }
237 
ResetAutoResize(ArkUIRuntimeCallInfo * runtimeCallInfo)238 ArkUINativeModuleValue ImageBridge::ResetAutoResize(ArkUIRuntimeCallInfo* runtimeCallInfo)
239 {
240     EcmaVM* vm = runtimeCallInfo->GetVM();
241     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
242     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
243     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
244     GetArkUINodeModifiers()->getImageModifier()->resetCopyOption(nativeNode);
245     return panda::JSValueRef::Undefined(vm);
246 }
247 
SetObjectRepeat(ArkUIRuntimeCallInfo * runtimeCallInfo)248 ArkUINativeModuleValue ImageBridge::SetObjectRepeat(ArkUIRuntimeCallInfo* runtimeCallInfo)
249 {
250     EcmaVM* vm = runtimeCallInfo->GetVM();
251     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
252     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
253     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
254     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
255     if (secondArg->IsNumber()) {
256         int32_t imageRepeat = secondArg->Int32Value(vm);
257         GetArkUINodeModifiers()->getImageModifier()->setObjectRepeat(nativeNode, imageRepeat);
258     } else {
259         GetArkUINodeModifiers()->getImageModifier()->resetObjectRepeat(nativeNode);
260     }
261     return panda::JSValueRef::Undefined(vm);
262 }
263 
ResetObjectRepeat(ArkUIRuntimeCallInfo * runtimeCallInfo)264 ArkUINativeModuleValue ImageBridge::ResetObjectRepeat(ArkUIRuntimeCallInfo* runtimeCallInfo)
265 {
266     EcmaVM* vm = runtimeCallInfo->GetVM();
267     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
268     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
269     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
270     GetArkUINodeModifiers()->getImageModifier()->resetObjectRepeat(nativeNode);
271     return panda::JSValueRef::Undefined(vm);
272 }
273 
SetEdgeAntialiasing(ArkUIRuntimeCallInfo * runtimeCallInfo)274 ArkUINativeModuleValue ImageBridge::SetEdgeAntialiasing(ArkUIRuntimeCallInfo* runtimeCallInfo)
275 {
276     EcmaVM* vm = runtimeCallInfo->GetVM();
277     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
278     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
279     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
280     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
281     if (secondArg->IsNumber()) {
282         float edgeAntialiasing = secondArg->ToNumber(vm)->Value();
283         GetArkUINodeModifiers()->getImageModifier()->setEdgeAntialiasing(nativeNode, edgeAntialiasing);
284     } else {
285         GetArkUINodeModifiers()->getImageModifier()->resetEdgeAntialiasing(nativeNode);
286     }
287     return panda::JSValueRef::Undefined(vm);
288 }
289 
ResetEdgeAntialiasing(ArkUIRuntimeCallInfo * runtimeCallInfo)290 ArkUINativeModuleValue ImageBridge::ResetEdgeAntialiasing(ArkUIRuntimeCallInfo* runtimeCallInfo)
291 {
292     EcmaVM* vm = runtimeCallInfo->GetVM();
293     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
294     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
295     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
296     GetArkUINodeModifiers()->getImageModifier()->resetEdgeAntialiasing(nativeNode);
297     return panda::JSValueRef::Undefined(vm);
298 }
299 
SetResizableLattice(ArkUIRuntimeCallInfo * runtimeCallInfo)300 ArkUINativeModuleValue ImageBridge::SetResizableLattice(ArkUIRuntimeCallInfo* runtimeCallInfo)
301 {
302     EcmaVM* vm = runtimeCallInfo->GetVM();
303     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
304     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
305     if (info.Length() > 1 && info[1]->IsObject()) {
306         auto drawingLattice = Ace::Framework::CreateDrawingLattice(info[1]);
307         if (drawingLattice) {
308             Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(INDEX_0);
309             auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
310             ImageModelNG::SetResizableLattice(reinterpret_cast<FrameNode*>(nativeNode), drawingLattice);
311         }
312     }
313     return panda::JSValueRef::Undefined(vm);
314 }
315 
SetResizable(ArkUIRuntimeCallInfo * runtimeCallInfo)316 ArkUINativeModuleValue ImageBridge::SetResizable(ArkUIRuntimeCallInfo* runtimeCallInfo)
317 {
318     EcmaVM* vm = runtimeCallInfo->GetVM();
319     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
320     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(INDEX_0);
321     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
322 
323     std::vector<ArkUIStringAndFloat> options;
324     std::vector<std::optional<CalcDimension>> sliceDimensions;
325     ParseResizableCalcDimensions(runtimeCallInfo, INDEX_1, INDEX_4, sliceDimensions, CalcDimension(0.0));
326     PushDimensionsToVector(options, sliceDimensions);
327 
328     GetArkUINodeModifiers()->getImageModifier()->setResizable(nativeNode, options.data());
329     return panda::JSValueRef::Undefined(vm);
330 }
331 
ResetResizable(ArkUIRuntimeCallInfo * runtimeCallInfo)332 ArkUINativeModuleValue ImageBridge::ResetResizable(ArkUIRuntimeCallInfo* runtimeCallInfo)
333 {
334     EcmaVM* vm = runtimeCallInfo->GetVM();
335     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
336     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
337     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
338     GetArkUINodeModifiers()->getImageModifier()->resetResizable(nativeNode);
339     return panda::JSValueRef::Undefined(vm);
340 }
341 
SetDynamicRangeMode(ArkUIRuntimeCallInfo * runtimeCallInfo)342 ArkUINativeModuleValue ImageBridge::SetDynamicRangeMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
343 {
344     EcmaVM* vm = runtimeCallInfo->GetVM();
345     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
346     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
347     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
348     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
349     if (secondArg->IsNumber()) {
350         int32_t objectFitValue = secondArg->Int32Value(vm);
351         GetArkUINodeModifiers()->getImageModifier()->setDynamicRangeMode(nativeNode, objectFitValue);
352     } else {
353         GetArkUINodeModifiers()->getImageModifier()->resetDynamicRangeMode(nativeNode);
354     }
355     return panda::JSValueRef::Undefined(vm);
356 }
357 
ResetDynamicRangeMode(ArkUIRuntimeCallInfo * runtimeCallInfo)358 ArkUINativeModuleValue ImageBridge::ResetDynamicRangeMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
359 {
360     EcmaVM* vm = runtimeCallInfo->GetVM();
361     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
362     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
363     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
364     GetArkUINodeModifiers()->getImageModifier()->resetDynamicRangeMode(nativeNode);
365     return panda::JSValueRef::Undefined(vm);
366 }
367 
SetEnhancedImageQuality(ArkUIRuntimeCallInfo * runtimeCallInfo)368 ArkUINativeModuleValue ImageBridge::SetEnhancedImageQuality(ArkUIRuntimeCallInfo* runtimeCallInfo)
369 {
370     EcmaVM* vm = runtimeCallInfo->GetVM();
371     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
372     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
373     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
374     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
375     if (secondArg->IsNumber()) {
376         int32_t objectFitValue = secondArg->Int32Value(vm);
377         GetArkUINodeModifiers()->getImageModifier()->setEnhancedImageQuality(nativeNode, objectFitValue);
378     } else {
379         GetArkUINodeModifiers()->getImageModifier()->resetEnhancedImageQuality(nativeNode);
380     }
381     return panda::JSValueRef::Undefined(vm);
382 }
383 
ResetEnhancedImageQuality(ArkUIRuntimeCallInfo * runtimeCallInfo)384 ArkUINativeModuleValue ImageBridge::ResetEnhancedImageQuality(ArkUIRuntimeCallInfo* runtimeCallInfo)
385 {
386     EcmaVM* vm = runtimeCallInfo->GetVM();
387     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
388     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
389     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
390     GetArkUINodeModifiers()->getImageModifier()->resetEnhancedImageQuality(nativeNode);
391     return panda::JSValueRef::Undefined(vm);
392 }
393 
SetPrivacySensitive(ArkUIRuntimeCallInfo * runtimeCallInfo)394 ArkUINativeModuleValue ImageBridge::SetPrivacySensitive(ArkUIRuntimeCallInfo* runtimeCallInfo)
395 {
396     EcmaVM* vm = runtimeCallInfo->GetVM();
397     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
398     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
399     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
400     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
401     uint32_t sensitive = false;
402     if (secondArg->IsBoolean()) {
403         sensitive = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
404     }
405     GetArkUINodeModifiers()->getImageModifier()->setImagePrivacySensitive(nativeNode, sensitive);
406     return panda::JSValueRef::Undefined(vm);
407 }
408 
ResetPrivacySensitive(ArkUIRuntimeCallInfo * runtimeCallInfo)409 ArkUINativeModuleValue ImageBridge::ResetPrivacySensitive(ArkUIRuntimeCallInfo* runtimeCallInfo)
410 {
411     EcmaVM* vm = runtimeCallInfo->GetVM();
412     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
413     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
414     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
415     GetArkUINodeModifiers()->getImageModifier()->resetImagePrivacySensitive(nativeNode);
416     return panda::JSValueRef::Undefined(vm);
417 }
418 
SetRenderMode(ArkUIRuntimeCallInfo * runtimeCallInfo)419 ArkUINativeModuleValue ImageBridge::SetRenderMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
420 {
421     EcmaVM* vm = runtimeCallInfo->GetVM();
422     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
423     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
424     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
425     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
426     if (secondArg->IsNumber()) {
427         int32_t imageRenderMode = secondArg->Int32Value(vm);
428         GetArkUINodeModifiers()->getImageModifier()->setRenderMode(nativeNode, imageRenderMode);
429     } else {
430         GetArkUINodeModifiers()->getImageModifier()->resetRenderMode(nativeNode);
431     }
432     return panda::JSValueRef::Undefined(vm);
433 }
434 
ResetRenderMode(ArkUIRuntimeCallInfo * runtimeCallInfo)435 ArkUINativeModuleValue ImageBridge::ResetRenderMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
436 {
437     EcmaVM* vm = runtimeCallInfo->GetVM();
438     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
439     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
440     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
441     GetArkUINodeModifiers()->getImageModifier()->resetRenderMode(nativeNode);
442     return panda::JSValueRef::Undefined(vm);
443 }
444 
SetSyncLoad(ArkUIRuntimeCallInfo * runtimeCallInfo)445 ArkUINativeModuleValue ImageBridge::SetSyncLoad(ArkUIRuntimeCallInfo* runtimeCallInfo)
446 {
447     EcmaVM* vm = runtimeCallInfo->GetVM();
448     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
449     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
450     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
451     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
452     if (secondArg->IsBoolean()) {
453         bool syncLoadValue = secondArg->ToBoolean(vm)->Value();
454         GetArkUINodeModifiers()->getImageModifier()->setSyncLoad(nativeNode, syncLoadValue);
455     } else {
456         GetArkUINodeModifiers()->getImageModifier()->resetSyncLoad(nativeNode);
457     }
458     return panda::JSValueRef::Undefined(vm);
459 }
460 
ResetSyncLoad(ArkUIRuntimeCallInfo * runtimeCallInfo)461 ArkUINativeModuleValue ImageBridge::ResetSyncLoad(ArkUIRuntimeCallInfo* runtimeCallInfo)
462 {
463     EcmaVM* vm = runtimeCallInfo->GetVM();
464     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
465     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
466     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
467     GetArkUINodeModifiers()->getImageModifier()->resetSyncLoad(nativeNode);
468     return panda::JSValueRef::Undefined(vm);
469 }
470 
SetObjectFit(ArkUIRuntimeCallInfo * runtimeCallInfo)471 ArkUINativeModuleValue ImageBridge::SetObjectFit(ArkUIRuntimeCallInfo* runtimeCallInfo)
472 {
473     EcmaVM* vm = runtimeCallInfo->GetVM();
474     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
475     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
476     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
477     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
478     if (secondArg->IsNumber()) {
479         int32_t objectFitValue = secondArg->Int32Value(vm);
480         GetArkUINodeModifiers()->getImageModifier()->setObjectFit(nativeNode, objectFitValue);
481     } else {
482         GetArkUINodeModifiers()->getImageModifier()->resetObjectFit(nativeNode);
483     }
484     return panda::JSValueRef::Undefined(vm);
485 }
486 
ResetObjectFit(ArkUIRuntimeCallInfo * runtimeCallInfo)487 ArkUINativeModuleValue ImageBridge::ResetObjectFit(ArkUIRuntimeCallInfo* runtimeCallInfo)
488 {
489     EcmaVM* vm = runtimeCallInfo->GetVM();
490     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
491     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
492     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
493     GetArkUINodeModifiers()->getImageModifier()->resetObjectFit(nativeNode);
494     return panda::JSValueRef::Undefined(vm);
495 }
496 
SetFitOriginalSize(ArkUIRuntimeCallInfo * runtimeCallInfo)497 ArkUINativeModuleValue ImageBridge::SetFitOriginalSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
498 {
499     EcmaVM* vm = runtimeCallInfo->GetVM();
500     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
501     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
502     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
503     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
504     if (secondArg->IsBoolean()) {
505         bool fitOriginalSize = secondArg->ToBoolean(vm)->Value();
506         GetArkUINodeModifiers()->getImageModifier()->setFitOriginalSize(nativeNode, fitOriginalSize);
507     } else {
508         GetArkUINodeModifiers()->getImageModifier()->resetFitOriginalSize(nativeNode);
509     }
510     return panda::JSValueRef::Undefined(vm);
511 }
512 
ResetFitOriginalSize(ArkUIRuntimeCallInfo * runtimeCallInfo)513 ArkUINativeModuleValue ImageBridge::ResetFitOriginalSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
514 {
515     EcmaVM* vm = runtimeCallInfo->GetVM();
516     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
517     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
518     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
519     GetArkUINodeModifiers()->getImageModifier()->resetFitOriginalSize(nativeNode);
520     return panda::JSValueRef::Undefined(vm);
521 }
522 
SetSourceSize(ArkUIRuntimeCallInfo * runtimeCallInfo)523 ArkUINativeModuleValue ImageBridge::SetSourceSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
524 {
525     EcmaVM* vm = runtimeCallInfo->GetVM();
526     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
527     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
528     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
529     Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(2);
530     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
531 
532     if (secondArg->IsNumber() && thirdArg->IsNumber() && secondArg->ToNumber(vm)->Value() >= 0 &&
533         thirdArg->ToNumber(vm)->Value() >= 0) {
534         double width = secondArg->ToNumber(vm)->Value();
535         double height = thirdArg->ToNumber(vm)->Value();
536         GetArkUINodeModifiers()->getImageModifier()->setSourceSize(nativeNode, width, height);
537     } else {
538         GetArkUINodeModifiers()->getImageModifier()->resetSourceSize(nativeNode);
539     }
540     return panda::JSValueRef::Undefined(vm);
541 }
542 
ResetSourceSize(ArkUIRuntimeCallInfo * runtimeCallInfo)543 ArkUINativeModuleValue ImageBridge::ResetSourceSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
544 {
545     EcmaVM* vm = runtimeCallInfo->GetVM();
546     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
547     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
548     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
549     GetArkUINodeModifiers()->getImageModifier()->resetSourceSize(nativeNode);
550     return panda::JSValueRef::Undefined(vm);
551 }
552 
SetMatchTextDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)553 ArkUINativeModuleValue ImageBridge::SetMatchTextDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
554 {
555     EcmaVM* vm = runtimeCallInfo->GetVM();
556     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
557     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
558     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
559     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
560 
561     if (secondArg->IsBoolean()) {
562         uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
563         GetArkUINodeModifiers()->getImageModifier()->setMatchTextDirection(nativeNode, value);
564     } else {
565         GetArkUINodeModifiers()->getImageModifier()->resetMatchTextDirection(nativeNode);
566     }
567     return panda::JSValueRef::Undefined(vm);
568 }
569 
ResetMatchTextDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)570 ArkUINativeModuleValue ImageBridge::ResetMatchTextDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
571 {
572     EcmaVM* vm = runtimeCallInfo->GetVM();
573     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
574     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
575     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
576     GetArkUINodeModifiers()->getImageModifier()->resetMatchTextDirection(nativeNode);
577     return panda::JSValueRef::Undefined(vm);
578 }
579 
SetFillColor(ArkUIRuntimeCallInfo * runtimeCallInfo)580 ArkUINativeModuleValue ImageBridge::SetFillColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
581 {
582     EcmaVM* vm = runtimeCallInfo->GetVM();
583     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
584     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
585     Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
586     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
587     Color color;
588     if (ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
589         GetArkUINodeModifiers()->getImageModifier()->setFillColor(nativeNode, color.GetValue());
590     } else {
591         GetArkUINodeModifiers()->getImageModifier()->resetFillColor(nativeNode);
592     }
593     return panda::JSValueRef::Undefined(vm);
594 }
595 
ResetFillColor(ArkUIRuntimeCallInfo * runtimeCallInfo)596 ArkUINativeModuleValue ImageBridge::ResetFillColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
597 {
598     EcmaVM* vm = runtimeCallInfo->GetVM();
599     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
600     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
601     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
602     GetArkUINodeModifiers()->getImageModifier()->resetFillColor(nativeNode);
603     return panda::JSValueRef::Undefined(vm);
604 }
605 
SetAlt(ArkUIRuntimeCallInfo * runtimeCallInfo)606 ArkUINativeModuleValue ImageBridge::SetAlt(ArkUIRuntimeCallInfo* runtimeCallInfo)
607 {
608     EcmaVM* vm = runtimeCallInfo->GetVM();
609     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
610     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
611     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
612     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
613     std::string src;
614     if (!ArkTSUtils::ParseJsMedia(vm, secondArg, src)) {
615         return panda::JSValueRef::Undefined(vm);
616     }
617     if (ImageSourceInfo::ResolveURIType(src) == SrcType::NETWORK) {
618         return panda::JSValueRef::Undefined(vm);
619     }
620     std::string bundleName;
621     std::string moduleName;
622     ArkTSUtils::GetJsMediaBundleInfo(vm, secondArg, bundleName, moduleName);
623     GetArkUINodeModifiers()->getImageModifier()->setAlt(
624         nativeNode, src.c_str(), bundleName.c_str(), moduleName.c_str());
625     return panda::JSValueRef::Undefined(vm);
626 }
627 
ResetAlt(ArkUIRuntimeCallInfo * runtimeCallInfo)628 ArkUINativeModuleValue ImageBridge::ResetAlt(ArkUIRuntimeCallInfo* runtimeCallInfo)
629 {
630     EcmaVM* vm = runtimeCallInfo->GetVM();
631     return panda::JSValueRef::Undefined(vm);
632 }
633 
SetImageInterpolation(ArkUIRuntimeCallInfo * runtimeCallInfo)634 ArkUINativeModuleValue ImageBridge::SetImageInterpolation(ArkUIRuntimeCallInfo* runtimeCallInfo)
635 {
636     EcmaVM* vm = runtimeCallInfo->GetVM();
637     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
638     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
639     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
640     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
641     if (secondArg->IsNumber()) {
642         int32_t value = secondArg->Int32Value(vm);
643         GetArkUINodeModifiers()->getImageModifier()->setImageInterpolation(nativeNode, value);
644     } else {
645         GetArkUINodeModifiers()->getImageModifier()->resetImageInterpolation(nativeNode);
646     }
647     return panda::JSValueRef::Undefined(vm);
648 }
649 
ResetImageInterpolation(ArkUIRuntimeCallInfo * runtimeCallInfo)650 ArkUINativeModuleValue ImageBridge::ResetImageInterpolation(ArkUIRuntimeCallInfo* runtimeCallInfo)
651 {
652     EcmaVM* vm = runtimeCallInfo->GetVM();
653     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
654     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
655     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
656     GetArkUINodeModifiers()->getImageModifier()->resetImageInterpolation(nativeNode);
657     return panda::JSValueRef::Undefined(vm);
658 }
659 
SetColorFilterObject(const EcmaVM * vm,const Local<JSValueRef> & jsObjArg,ArkUINodeHandle nativeNode)660 void SetColorFilterObject(const EcmaVM* vm, const Local<JSValueRef>& jsObjArg, ArkUINodeHandle nativeNode)
661 {
662     Framework::JSColorFilter* colorFilter;
663     if (!jsObjArg->IsUndefined() && !jsObjArg->IsNull()) {
664         colorFilter = static_cast<Framework::JSColorFilter*>(jsObjArg->ToObject(vm)->GetNativePointerField(vm, 0));
665     } else {
666         GetArkUINodeModifiers()->getImageModifier()->setColorFilter(
667             nativeNode, &(*DEFAULT_COLOR_FILTER_MATRIX.begin()), COLOR_FILTER_MATRIX_SIZE);
668         return;
669     }
670     if (colorFilter && colorFilter->GetColorFilterMatrix().size() == COLOR_FILTER_MATRIX_SIZE) {
671         GetArkUINodeModifiers()->getImageModifier()->setColorFilter(
672             nativeNode, &(*colorFilter->GetColorFilterMatrix().begin()), COLOR_FILTER_MATRIX_SIZE);
673     } else {
674         GetArkUINodeModifiers()->getImageModifier()->setColorFilter(
675             nativeNode, &(*DEFAULT_COLOR_FILTER_MATRIX.begin()), COLOR_FILTER_MATRIX_SIZE);
676         return;
677     }
678     GetArkUINodeModifiers()->getImageModifier()->setColorFilter(
679         nativeNode, &(*DEFAULT_COLOR_FILTER_MATRIX.begin()), COLOR_FILTER_MATRIX_SIZE);
680 }
681 
SetColorFilter(ArkUIRuntimeCallInfo * runtimeCallInfo)682 ArkUINativeModuleValue ImageBridge::SetColorFilter(ArkUIRuntimeCallInfo* runtimeCallInfo)
683 {
684     EcmaVM* vm = runtimeCallInfo->GetVM();
685     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
686     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
687     Local<JSValueRef> jsObjArg = runtimeCallInfo->GetCallArgRef(1);
688     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
689     Framework::JsiCallbackInfo info = Framework::JsiCallbackInfo(runtimeCallInfo);
690     if (!jsObjArg->IsArray(vm) && !jsObjArg->IsObject(vm)) {
691         GetArkUINodeModifiers()->getImageModifier()->setColorFilter(
692             nativeNode, &(*DEFAULT_COLOR_FILTER_MATRIX.begin()), COLOR_FILTER_MATRIX_SIZE);
693         return panda::JSValueRef::Undefined(vm);
694     }
695     if (jsObjArg->IsObject(vm) && !jsObjArg->IsArray(vm)) {
696         auto drawingColorFilter = Ace::Framework::CreateDrawingColorFilter(info[1]);
697         if (drawingColorFilter) {
698             ImageModelNG::SetDrawingColorFilter(reinterpret_cast<FrameNode*>(nativeNode), drawingColorFilter);
699             return panda::JSValueRef::Undefined(vm);
700         }
701 
702         SetColorFilterObject(vm, jsObjArg, nativeNode);
703         return panda::JSValueRef::Undefined(vm);
704     }
705     auto array = panda::CopyableGlobal<panda::ArrayRef>(vm, jsObjArg);
706     if (array->Length(vm) != COLOR_FILTER_MATRIX_SIZE) {
707         GetArkUINodeModifiers()->getImageModifier()->setColorFilter(
708             nativeNode, &(*DEFAULT_COLOR_FILTER_MATRIX.begin()), COLOR_FILTER_MATRIX_SIZE);
709         return panda::JSValueRef::Undefined(vm);
710     }
711     std::vector<float> colorFilter;
712     for (size_t i = 0; i < array->Length(vm); i++) {
713         auto value = array->GetValueAt(vm, jsObjArg, i);
714         if (value->IsNumber()) {
715             colorFilter.emplace_back(value->ToNumber(vm)->Value());
716         } else {
717             GetArkUINodeModifiers()->getImageModifier()->setColorFilter(
718                 nativeNode, &(*DEFAULT_COLOR_FILTER_MATRIX.begin()), COLOR_FILTER_MATRIX_SIZE);
719             return panda::JSValueRef::Undefined(vm);
720         }
721     }
722     GetArkUINodeModifiers()->getImageModifier()->setColorFilter(
723         nativeNode, &(*colorFilter.begin()), COLOR_FILTER_MATRIX_SIZE);
724     return panda::JSValueRef::Undefined(vm);
725 }
726 
ResetColorFilter(ArkUIRuntimeCallInfo * runtimeCallInfo)727 ArkUINativeModuleValue ImageBridge::ResetColorFilter(ArkUIRuntimeCallInfo* runtimeCallInfo)
728 {
729     EcmaVM* vm = runtimeCallInfo->GetVM();
730     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
731     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
732     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
733     GetArkUINodeModifiers()->getImageModifier()->resetColorFilter(nativeNode);
734     return panda::JSValueRef::Undefined(vm);
735 }
736 
SetDraggable(ArkUIRuntimeCallInfo * runtimeCallInfo)737 ArkUINativeModuleValue ImageBridge::SetDraggable(ArkUIRuntimeCallInfo* runtimeCallInfo)
738 {
739     EcmaVM* vm = runtimeCallInfo->GetVM();
740     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
741     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
742     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
743     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
744     bool value;
745     if (secondArg->IsBoolean()) {
746         value = secondArg->ToBoolean(vm)->Value();
747         GetArkUINodeModifiers()->getImageModifier()->setImageDraggable(nativeNode, value);
748     } else {
749         GetArkUINodeModifiers()->getImageModifier()->resetImageDraggable(nativeNode);
750     }
751 
752     return panda::JSValueRef::Undefined(vm);
753 }
754 
ResetDraggable(ArkUIRuntimeCallInfo * runtimeCallInfo)755 ArkUINativeModuleValue ImageBridge::ResetDraggable(ArkUIRuntimeCallInfo* runtimeCallInfo)
756 {
757     EcmaVM* vm = runtimeCallInfo->GetVM();
758     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
759     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
760     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
761     GetArkUINodeModifiers()->getImageModifier()->resetImageDraggable(nativeNode);
762     return panda::JSValueRef::Undefined(vm);
763 }
764 
SetBorderRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)765 ArkUINativeModuleValue ImageBridge::SetBorderRadius(ArkUIRuntimeCallInfo *runtimeCallInfo)
766 {
767     EcmaVM *vm = runtimeCallInfo->GetVM();
768     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
769     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
770     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
771     Local<JSValueRef> topLeftArgs = runtimeCallInfo->GetCallArgRef(INDEX_1);
772     Local<JSValueRef> topRightArgs = runtimeCallInfo->GetCallArgRef(INDEX_2);
773     Local<JSValueRef> bottomLeftArgs = runtimeCallInfo->GetCallArgRef(INDEX_3);
774     Local<JSValueRef> bottomRightArgs = runtimeCallInfo->GetCallArgRef(INDEX_4);
775     if (topLeftArgs->IsUndefined() && topRightArgs->IsUndefined() && bottomLeftArgs->IsUndefined() &&
776         bottomRightArgs->IsUndefined()) {
777         GetArkUINodeModifiers()->getCommonModifier()->resetBorderRadius(nativeNode);
778         return panda::JSValueRef::Undefined(vm);
779     }
780 
781     CalcDimension topLeft;
782     CalcDimension topRight;
783     CalcDimension bottomLeft;
784     CalcDimension bottomRight;
785 
786     bool isLengthMetrics = false;
787     if (ArkTSUtils::ParseJsLengthMetrics(vm, topLeftArgs, topLeft) ||
788         ArkTSUtils::ParseJsLengthMetrics(vm, topRightArgs, topRight) ||
789         ArkTSUtils::ParseJsLengthMetrics(vm, bottomLeftArgs, bottomLeft) ||
790         ArkTSUtils::ParseJsLengthMetrics(vm, bottomRightArgs, bottomRight)) {
791         isLengthMetrics = true;
792     } else {
793         ArkTSUtils::ParseAllBorder(vm, topLeftArgs, topLeft);
794         ArkTSUtils::ParseAllBorder(vm, topRightArgs, topRight);
795         ArkTSUtils::ParseAllBorder(vm, bottomLeftArgs, bottomLeft);
796         ArkTSUtils::ParseAllBorder(vm, bottomRightArgs, bottomRight);
797     }
798     auto isRightToLeft = AceApplicationInfo::GetInstance().IsRightToLeft();
799     auto directionChanged = isRightToLeft && isLengthMetrics;
800     uint32_t size = SIZE_OF_FOUR;
801     ArkUI_Float32 values[size];
802     int units[size];
803     values[INDEX_0] = directionChanged ? topRight.Value() : topLeft.Value();
804     units[INDEX_0] = directionChanged ? static_cast<int>(topRight.Unit()) : static_cast<int>(topLeft.Unit());
805     values[INDEX_1] = directionChanged ? topLeft.Value() : topRight.Value();
806     units[INDEX_1] = directionChanged ? static_cast<int>(topLeft.Unit()) : static_cast<int>(topRight.Unit());
807     values[INDEX_2] = directionChanged ? bottomRight.Value() : bottomLeft.Value();
808     units[INDEX_2] = directionChanged ? static_cast<int>(bottomRight.Unit()) : static_cast<int>(bottomLeft.Unit());
809     values[INDEX_3] = directionChanged ? bottomLeft.Value() : bottomRight.Value();
810     units[INDEX_3] = directionChanged ? static_cast<int>(bottomLeft.Unit()) : static_cast<int>(bottomRight.Unit());
811 
812     GetArkUINodeModifiers()->getImageModifier()->setImageBorderRadius(nativeNode, values, units, SIZE_OF_FOUR);
813 
814     return panda::JSValueRef::Undefined(vm);
815 }
816 
ResetBorderRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)817 ArkUINativeModuleValue ImageBridge::ResetBorderRadius(ArkUIRuntimeCallInfo *runtimeCallInfo)
818 {
819     EcmaVM *vm = runtimeCallInfo->GetVM();
820     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
821     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
822     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
823     GetArkUINodeModifiers()->getImageModifier()->resetImageBorderRadius(nativeNode);
824     return panda::JSValueRef::Undefined(vm);
825 }
826 
SetImageBorder(ArkUIRuntimeCallInfo * runtimeCallInfo)827 ArkUINativeModuleValue ImageBridge::SetImageBorder(ArkUIRuntimeCallInfo* runtimeCallInfo)
828 {
829     CommonBridge::SetBorder(runtimeCallInfo);
830     EcmaVM* vm = runtimeCallInfo->GetVM();
831     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
832     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // 0:node info
833     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
834     if (!Container::GreatOrEqualAPITargetVersion(PlatformVersion::VERSION_FOURTEEN)) {
835         GetArkUINodeModifiers()->getImageModifier()->setImageBorder(nativeNode);
836         return panda::JSValueRef::Undefined(vm);
837     }
838     std::vector<ArkUI_Float32> options;
839     ParseOuterBorderRadius(runtimeCallInfo, vm, options); // Border Radius args start index
840     GetArkUINodeModifiers()->getImageModifier()->setImageBorderWithValues(nativeNode, options.data(), options.size());
841     return panda::JSValueRef::Undefined(vm);
842 }
843 
ResetImageBorder(ArkUIRuntimeCallInfo * runtimeCallInfo)844 ArkUINativeModuleValue ImageBridge::ResetImageBorder(ArkUIRuntimeCallInfo* runtimeCallInfo)
845 {
846     EcmaVM* vm = runtimeCallInfo->GetVM();
847     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
848     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // 0:node info
849     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
850     GetArkUINodeModifiers()->getCommonModifier()->resetBorder(nativeNode);
851     return panda::JSValueRef::Undefined(vm);
852 }
853 
SetImageOpacity(ArkUIRuntimeCallInfo * runtimeCallInfo)854 ArkUINativeModuleValue ImageBridge::SetImageOpacity(ArkUIRuntimeCallInfo* runtimeCallInfo)
855 {
856     EcmaVM* vm = runtimeCallInfo->GetVM();
857     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
858     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // 0:node info
859     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
860     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
861     if (ImageModelNG::IsSrcSvgImage(frameNode)) {
862         CommonBridge::SetOpacity(runtimeCallInfo);
863     } else {
864         Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1); // 1:value info
865         double opacity;
866         if (!ArkTSUtils::ParseJsDouble(vm, valueArg, opacity)) {
867             GetArkUINodeModifiers()->getImageModifier()->resetImageOpacity(nativeNode);
868         } else {
869             GetArkUINodeModifiers()->getImageModifier()->setImageOpacity(nativeNode, opacity);
870         }
871     }
872     return panda::JSValueRef::Undefined(vm);
873 }
874 
ResetImageOpacity(ArkUIRuntimeCallInfo * runtimeCallInfo)875 ArkUINativeModuleValue ImageBridge::ResetImageOpacity(ArkUIRuntimeCallInfo* runtimeCallInfo)
876 {
877     EcmaVM* vm = runtimeCallInfo->GetVM();
878     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
879     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // 0:node info
880     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
881     GetArkUINodeModifiers()->getImageModifier()->resetImageOpacity(nativeNode);
882     return panda::JSValueRef::Undefined(vm);
883 }
884 
SetImageTransition(ArkUIRuntimeCallInfo * runtimeCallInfo)885 ArkUINativeModuleValue ImageBridge::SetImageTransition(ArkUIRuntimeCallInfo* runtimeCallInfo)
886 {
887     EcmaVM* vm = runtimeCallInfo->GetVM();
888     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
889     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // 0:node info
890     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
891     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
892     if (ImageModelNG::IsSrcSvgImage(frameNode)) {
893         CommonBridge::SetTransition(runtimeCallInfo);
894     } else {
895         CommonBridge::SetTransitionPassThrough(runtimeCallInfo);
896     }
897     return panda::JSValueRef::Undefined(vm);
898 }
899 
ResetImageTransition(ArkUIRuntimeCallInfo * runtimeCallInfo)900 ArkUINativeModuleValue ImageBridge::ResetImageTransition(ArkUIRuntimeCallInfo* runtimeCallInfo)
901 {
902     EcmaVM* vm = runtimeCallInfo->GetVM();
903     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
904     Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // 0:node info
905     auto nativeNode = nodePtr(nodeArg->ToNativePointer(vm)->Value());
906     auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
907     if (ImageModelNG::IsSrcSvgImage(frameNode)) {
908         CommonBridge::ResetTransition(runtimeCallInfo);
909     } else {
910         CommonBridge::ResetTransitionPassThrough(runtimeCallInfo);
911     }
912     return panda::JSValueRef::Undefined(vm);
913 }
914 
EnableAnalyzer(ArkUIRuntimeCallInfo * runtimeCallInfo)915 ArkUINativeModuleValue ImageBridge::EnableAnalyzer(ArkUIRuntimeCallInfo* runtimeCallInfo)
916 {
917     EcmaVM* vm = runtimeCallInfo->GetVM();
918     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
919     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(INDEX_0);
920     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
921     Local<JSValueRef> enableValue = runtimeCallInfo->GetCallArgRef(1);
922 
923     if (enableValue->IsBoolean()) {
924         bool enable = enableValue->ToBoolean(vm)->Value();
925         GetArkUINodeModifiers()->getImageModifier()->enableAnalyzer(nativeNode, enable);
926     }
927     return panda::JSValueRef::Undefined(vm);
928 }
929 
AnalyzerConfig(ArkUIRuntimeCallInfo * runtimeCallInfo)930 ArkUINativeModuleValue ImageBridge::AnalyzerConfig(ArkUIRuntimeCallInfo* runtimeCallInfo)
931 {
932     EcmaVM* vm = runtimeCallInfo->GetVM();
933     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
934     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(INDEX_0);
935     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
936     Local<JSValueRef> configValue = runtimeCallInfo->GetCallArgRef(1);
937     JSValueWrapper valueWrapper = configValue;
938     auto engine = EngineHelper::GetCurrentEngine();
939     CHECK_NULL_RETURN(engine, panda::NativePointerRef::New(vm, nullptr));
940     NativeEngine* nativeEngine = engine->GetNativeEngine();
941     Framework::ScopeRAII scope(reinterpret_cast<napi_env>(nativeEngine));
942     napi_value nativeValue = nativeEngine->ValueToNapiValue(valueWrapper);
943     GetArkUINodeModifiers()->getImageModifier()->analyzerConfig(nativeNode, nativeValue);
944     return panda::JSValueRef::Undefined(vm);
945 }
946 
SetOnComplete(ArkUIRuntimeCallInfo * runtimeCallInfo)947 ArkUINativeModuleValue ImageBridge::SetOnComplete(ArkUIRuntimeCallInfo *runtimeCallInfo)
948 {
949     EcmaVM *vm = runtimeCallInfo->GetVM();
950     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
951     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
952     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
953     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
954     CHECK_NULL_RETURN(frameNode, panda::JSValueRef::Undefined(vm));
955     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
956     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
957         GetArkUINodeModifiers()->getImageModifier()->setOnComplete(nativeNode, nullptr);
958         return panda::JSValueRef::Undefined(vm);
959     }
960     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
961     std::function<void(LoadImageSuccessEvent&)> callback = [vm, frameNode,
962         func = panda::CopyableGlobal(vm, func)](LoadImageSuccessEvent& event) {
963         panda::LocalScope pandaScope(vm);
964         panda::TryCatch trycatch(vm);
965         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
966         const char* keys[] = { "width", "height", "componentWidth", "componentHeight", "loadingStatus", "contentWidth",
967             "contentHeight", "contentOffsetX", "contentOffsetY" };
968         Local<JSValueRef> values[] = {
969             panda::NumberRef::New(vm, event.GetWidth()),
970             panda::NumberRef::New(vm, event.GetHeight()),
971             panda::NumberRef::New(vm, event.GetComponentWidth()),
972             panda::NumberRef::New(vm, event.GetComponentHeight()),
973             panda::NumberRef::New(vm, event.GetLoadingStatus()),
974             panda::NumberRef::New(vm, event.GetContentWidth()),
975             panda::NumberRef::New(vm, event.GetContentHeight()),
976             panda::NumberRef::New(vm, event.GetContentOffsetX()),
977             panda::NumberRef::New(vm, event.GetContentOffsetY())
978         };
979         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
980         eventObject->SetNativePointerFieldCount(vm, 1);
981         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
982         panda::Local<panda::JSValueRef> params[1] = { eventObject };
983         func->Call(vm, func.ToLocal(), params, 1);
984     };
985     GetArkUINodeModifiers()->getImageModifier()->setOnComplete(nativeNode, reinterpret_cast<void*>(&callback));
986     return panda::JSValueRef::Undefined(vm);
987 }
988 
ResetOnComplete(ArkUIRuntimeCallInfo * runtimeCallInfo)989 ArkUINativeModuleValue ImageBridge::ResetOnComplete(ArkUIRuntimeCallInfo* runtimeCallInfo)
990 {
991     EcmaVM* vm = runtimeCallInfo->GetVM();
992     CHECK_NULL_RETURN(vm, panda::JSValueRef::Undefined(vm));
993     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
994     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
995     GetArkUINodeModifiers()->getImageModifier()->setOnComplete(nativeNode, nullptr);
996     return panda::JSValueRef::Undefined(vm);
997 }
998 
SetOnError(ArkUIRuntimeCallInfo * runtimeCallInfo)999 ArkUINativeModuleValue ImageBridge::SetOnError(ArkUIRuntimeCallInfo* runtimeCallInfo)
1000 {
1001     EcmaVM* vm = runtimeCallInfo->GetVM();
1002     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1003     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(INDEX_0);
1004     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1005     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1006     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1007     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1008     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1009         GetArkUINodeModifiers()->getImageModifier()->resetOnError(nativeNode);
1010         return panda::JSValueRef::Undefined(vm);
1011     }
1012     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1013     std::function<void(LoadImageFailEvent&)> callback = [vm, frameNode,
1014         func = panda::CopyableGlobal(vm, func)](LoadImageFailEvent& event) {
1015         panda::LocalScope pandaScope(vm);
1016         panda::TryCatch trycatch(vm);
1017         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1018         const char* keys[] = { "componentWidth", "componentHeight", "message" };
1019         Local<JSValueRef> values[] = { panda::NumberRef::New(vm, event.GetComponentWidth()),
1020             panda::NumberRef::New(vm, event.GetComponentHeight()),
1021             panda::StringRef::NewFromUtf8(vm, event.GetErrorMessage().c_str()) };
1022         auto eventObject = panda::ObjectRef::NewWithNamedProperties(vm, ArraySize(keys), keys, values);
1023         eventObject->SetNativePointerFieldCount(vm, 1);
1024         eventObject->SetNativePointerField(vm, 0, static_cast<void*>(&event));
1025         panda::Local<panda::JSValueRef> params[1] = { eventObject };
1026         func->Call(vm, func.ToLocal(), params, 1);
1027     };
1028     GetArkUINodeModifiers()->getImageModifier()->setOnError(
1029         nativeNode, reinterpret_cast<void*>(&callback));
1030     return panda::JSValueRef::Undefined(vm);
1031 }
1032 
ResetOnError(ArkUIRuntimeCallInfo * runtimeCallInfo)1033 ArkUINativeModuleValue ImageBridge::ResetOnError(ArkUIRuntimeCallInfo* runtimeCallInfo)
1034 {
1035     EcmaVM* vm = runtimeCallInfo->GetVM();
1036     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1037     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(INDEX_0);
1038     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1039     GetArkUINodeModifiers()->getImageModifier()->resetOnError(nativeNode);
1040     return panda::JSValueRef::Undefined(vm);
1041 }
1042 
SetOnFinish(ArkUIRuntimeCallInfo * runtimeCallInfo)1043 ArkUINativeModuleValue ImageBridge::SetOnFinish(ArkUIRuntimeCallInfo* runtimeCallInfo)
1044 {
1045     EcmaVM *vm = runtimeCallInfo->GetVM();
1046     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1047     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1048     Local<JSValueRef> callbackArg = runtimeCallInfo->GetCallArgRef(1);
1049     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1050     if (callbackArg->IsUndefined() || callbackArg->IsNull() || !callbackArg->IsFunction(vm)) {
1051         GetArkUINodeModifiers()->getImageModifier()->resetImageOnFinish(nativeNode);
1052         return panda::JSValueRef::Undefined(vm);
1053     }
1054     auto frameNode = reinterpret_cast<FrameNode*>(nativeNode);
1055     CHECK_NULL_RETURN(frameNode, panda::NativePointerRef::New(vm, nullptr));
1056     panda::Local<panda::FunctionRef> func = callbackArg->ToObject(vm);
1057     std::function<void(void)> callback = [vm, frameNode, func = panda::CopyableGlobal(vm, func)]() {
1058         panda::LocalScope pandaScope(vm);
1059         panda::TryCatch trycatch(vm);
1060         PipelineContext::SetCallBackNode(AceType::WeakClaim(frameNode));
1061         func->Call(vm, func.ToLocal(), nullptr, 0);
1062     };
1063     GetArkUINodeModifiers()->getImageModifier()->setImageOnFinish(nativeNode, reinterpret_cast<void*>(&callback));
1064     return panda::JSValueRef::Undefined(vm);
1065 }
1066 
ResetOnFinish(ArkUIRuntimeCallInfo * runtimeCallInfo)1067 ArkUINativeModuleValue ImageBridge::ResetOnFinish(ArkUIRuntimeCallInfo* runtimeCallInfo)
1068 {
1069     EcmaVM* vm = runtimeCallInfo->GetVM();
1070     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1071     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1072     auto nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1073     GetArkUINodeModifiers()->getImageModifier()->resetImageOnFinish(nativeNode);
1074     return panda::JSValueRef::Undefined(vm);
1075 }
1076 
SetOrientation(ArkUIRuntimeCallInfo * runtimeCallInfo)1077 ArkUINativeModuleValue ImageBridge::SetOrientation(ArkUIRuntimeCallInfo* runtimeCallInfo)
1078 {
1079     EcmaVM* vm = runtimeCallInfo->GetVM();
1080     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1081     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1082     Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
1083     auto* nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1084     if (secondArg->IsNumber()) {
1085         int32_t value = secondArg->Int32Value(vm);
1086         GetArkUINodeModifiers()->getImageModifier()->setImageRotateOrientation(nativeNode, value);
1087     } else {
1088         GetArkUINodeModifiers()->getImageModifier()->resetImageRotateOrientation(nativeNode);
1089     }
1090     return panda::JSValueRef::Undefined(vm);
1091 }
1092 
ResetOrientation(ArkUIRuntimeCallInfo * runtimeCallInfo)1093 ArkUINativeModuleValue ImageBridge::ResetOrientation(ArkUIRuntimeCallInfo* runtimeCallInfo)
1094 {
1095     EcmaVM* vm = runtimeCallInfo->GetVM();
1096     CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
1097     Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
1098     auto* nativeNode = nodePtr(firstArg->ToNativePointer(vm)->Value());
1099     GetArkUINodeModifiers()->getImageModifier()->resetImageRotateOrientation(nativeNode);
1100     return panda::JSValueRef::Undefined(vm);
1101 }
1102 } // namespace OHOS::Ace::NG