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