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