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