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