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