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/memory/referenced.h"
18 #include "base/utils/utils.h"
19 #include "core/interfaces/native/node/api.h"
20 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_utils.h"
21 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_common_bridge.h"
22 #include "bridge/declarative_frontend/jsview/js_image.h"
23 #include "bridge/declarative_frontend/engine/jsi/jsi_types.h"
24 #include "core/components/common/layout/constants.h"
25 #include "core/components_ng/pattern/image/image_model_ng.h"
26
27 namespace OHOS::Ace::NG {
28 constexpr int32_t INDEX_0 = 0; // Arg Index
29 constexpr int32_t INDEX_1 = 1; // Arg Index
30 constexpr int32_t INDEX_2 = 2; // Arg Index
31 constexpr int32_t INDEX_3 = 3; // Arg Index
32 constexpr int32_t INDEX_4 = 4; // Arg Index
33 constexpr int32_t SIZE_OF_FOUR = 4; // Border Radius array size
34 const std::vector<float> DEFAULT_COLORFILTER_MATRIX = {
35 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0
36 };
SetCopyOption(ArkUIRuntimeCallInfo * runtimeCallInfo)37 ArkUINativeModuleValue ImageBridge::SetCopyOption(ArkUIRuntimeCallInfo* runtimeCallInfo)
38 {
39 EcmaVM* vm = runtimeCallInfo->GetVM();
40 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
41 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
42 Local<JSValueRef> optionArg = runtimeCallInfo->GetCallArgRef(1);
43 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
44 if (optionArg->IsNumber()) {
45 int32_t option = optionArg->Int32Value(vm);
46 GetArkUIInternalNodeAPI()->GetImageModifier().SetCopyOption(nativeNode, option);
47 } else {
48 GetArkUIInternalNodeAPI()->GetImageModifier().ResetCopyOption(nativeNode);
49 }
50 return panda::JSValueRef::Undefined(vm);
51 }
52
ResetCopyOption(ArkUIRuntimeCallInfo * runtimeCallInfo)53 ArkUINativeModuleValue ImageBridge::ResetCopyOption(ArkUIRuntimeCallInfo* runtimeCallInfo)
54 {
55 EcmaVM* vm = runtimeCallInfo->GetVM();
56 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
57 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
58 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
59 GetArkUIInternalNodeAPI()->GetImageModifier().ResetCopyOption(nativeNode);
60 return panda::JSValueRef::Undefined(vm);
61 }
62
SetAutoResize(ArkUIRuntimeCallInfo * runtimeCallInfo)63 ArkUINativeModuleValue ImageBridge::SetAutoResize(ArkUIRuntimeCallInfo* runtimeCallInfo)
64 {
65 EcmaVM* vm = runtimeCallInfo->GetVM();
66 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
67 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
68 Local<JSValueRef> autoResizeArg = runtimeCallInfo->GetCallArgRef(1);
69 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
70 if (autoResizeArg->IsBoolean()) {
71 bool autoResize = autoResizeArg->ToBoolean(vm)->Value();
72 GetArkUIInternalNodeAPI()->GetImageModifier().SetAutoResize(nativeNode, autoResize);
73 } else {
74 GetArkUIInternalNodeAPI()->GetImageModifier().ResetAutoResize(nativeNode);
75 }
76 return panda::JSValueRef::Undefined(vm);
77 }
78
ResetAutoResize(ArkUIRuntimeCallInfo * runtimeCallInfo)79 ArkUINativeModuleValue ImageBridge::ResetAutoResize(ArkUIRuntimeCallInfo* runtimeCallInfo)
80 {
81 EcmaVM* vm = runtimeCallInfo->GetVM();
82 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
83 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
84 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
85 GetArkUIInternalNodeAPI()->GetImageModifier().ResetCopyOption(nativeNode);
86 return panda::JSValueRef::Undefined(vm);
87 }
88
SetObjectRepeat(ArkUIRuntimeCallInfo * runtimeCallInfo)89 ArkUINativeModuleValue ImageBridge::SetObjectRepeat(ArkUIRuntimeCallInfo* runtimeCallInfo)
90 {
91 EcmaVM* vm = runtimeCallInfo->GetVM();
92 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
93 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
94 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
95 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
96 if (secondArg->IsNumber()) {
97 int32_t imageRepeat = secondArg->Int32Value(vm);
98 GetArkUIInternalNodeAPI()->GetImageModifier().SetObjectRepeat(nativeNode, imageRepeat);
99 } else {
100 GetArkUIInternalNodeAPI()->GetImageModifier().ResetObjectRepeat(nativeNode);
101 }
102 return panda::JSValueRef::Undefined(vm);
103 }
104
ResetObjectRepeat(ArkUIRuntimeCallInfo * runtimeCallInfo)105 ArkUINativeModuleValue ImageBridge::ResetObjectRepeat(ArkUIRuntimeCallInfo* runtimeCallInfo)
106 {
107 EcmaVM* vm = runtimeCallInfo->GetVM();
108 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
109 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
110 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
111 GetArkUIInternalNodeAPI()->GetImageModifier().ResetObjectRepeat(nativeNode);
112 return panda::JSValueRef::Undefined(vm);
113 }
114
SetEdgeAntialiasing(ArkUIRuntimeCallInfo * runtimeCallInfo)115 ArkUINativeModuleValue ImageBridge::SetEdgeAntialiasing(ArkUIRuntimeCallInfo* runtimeCallInfo)
116 {
117 EcmaVM* vm = runtimeCallInfo->GetVM();
118 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
119 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
120 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
121 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
122 if (secondArg->IsNumber()) {
123 float edgeAntialiasing = secondArg->ToNumber(vm)->Value();
124 GetArkUIInternalNodeAPI()->GetImageModifier().SetEdgeAntialiasing(nativeNode, edgeAntialiasing);
125 } else {
126 GetArkUIInternalNodeAPI()->GetImageModifier().ResetEdgeAntialiasing(nativeNode);
127 }
128 return panda::JSValueRef::Undefined(vm);
129 }
130
ResetEdgeAntialiasing(ArkUIRuntimeCallInfo * runtimeCallInfo)131 ArkUINativeModuleValue ImageBridge::ResetEdgeAntialiasing(ArkUIRuntimeCallInfo* runtimeCallInfo)
132 {
133 EcmaVM* vm = runtimeCallInfo->GetVM();
134 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
135 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
136 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
137 GetArkUIInternalNodeAPI()->GetImageModifier().ResetEdgeAntialiasing(nativeNode);
138 return panda::JSValueRef::Undefined(vm);
139 }
140
SetRenderMode(ArkUIRuntimeCallInfo * runtimeCallInfo)141 ArkUINativeModuleValue ImageBridge::SetRenderMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
142 {
143 EcmaVM* vm = runtimeCallInfo->GetVM();
144 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
145 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
146 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
147 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
148 if (secondArg->IsNumber()) {
149 int32_t imageRenderMode = secondArg->Int32Value(vm);
150 GetArkUIInternalNodeAPI()->GetImageModifier().SetRenderMode(nativeNode, imageRenderMode);
151 } else {
152 GetArkUIInternalNodeAPI()->GetImageModifier().ResetRenderMode(nativeNode);
153 }
154 return panda::JSValueRef::Undefined(vm);
155 }
156
ResetRenderMode(ArkUIRuntimeCallInfo * runtimeCallInfo)157 ArkUINativeModuleValue ImageBridge::ResetRenderMode(ArkUIRuntimeCallInfo* runtimeCallInfo)
158 {
159 EcmaVM* vm = runtimeCallInfo->GetVM();
160 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
161 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
162 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
163 GetArkUIInternalNodeAPI()->GetImageModifier().ResetRenderMode(nativeNode);
164 return panda::JSValueRef::Undefined(vm);
165 }
166
SetSyncLoad(ArkUIRuntimeCallInfo * runtimeCallInfo)167 ArkUINativeModuleValue ImageBridge::SetSyncLoad(ArkUIRuntimeCallInfo* runtimeCallInfo)
168 {
169 EcmaVM* vm = runtimeCallInfo->GetVM();
170 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
171 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
172 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
173 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
174 if (secondArg->IsBoolean()) {
175 bool syncLoadValue = secondArg->ToBoolean(vm)->Value();
176 GetArkUIInternalNodeAPI()->GetImageModifier().SetSyncLoad(nativeNode, syncLoadValue);
177 } else {
178 GetArkUIInternalNodeAPI()->GetImageModifier().ResetSyncLoad(nativeNode);
179 }
180 return panda::JSValueRef::Undefined(vm);
181 }
182
ResetSyncLoad(ArkUIRuntimeCallInfo * runtimeCallInfo)183 ArkUINativeModuleValue ImageBridge::ResetSyncLoad(ArkUIRuntimeCallInfo* runtimeCallInfo)
184 {
185 EcmaVM* vm = runtimeCallInfo->GetVM();
186 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
187 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
188 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
189 GetArkUIInternalNodeAPI()->GetImageModifier().ResetSyncLoad(nativeNode);
190 return panda::JSValueRef::Undefined(vm);
191 }
192
SetObjectFit(ArkUIRuntimeCallInfo * runtimeCallInfo)193 ArkUINativeModuleValue ImageBridge::SetObjectFit(ArkUIRuntimeCallInfo* runtimeCallInfo)
194 {
195 EcmaVM* vm = runtimeCallInfo->GetVM();
196 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
197 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
198 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
199 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
200 if (secondArg->IsNumber()) {
201 int32_t objectFitValue = secondArg->Int32Value(vm);
202 GetArkUIInternalNodeAPI()->GetImageModifier().SetObjectFit(nativeNode, objectFitValue);
203 } else {
204 GetArkUIInternalNodeAPI()->GetImageModifier().ResetObjectFit(nativeNode);
205 }
206 return panda::JSValueRef::Undefined(vm);
207 }
208
ResetObjectFit(ArkUIRuntimeCallInfo * runtimeCallInfo)209 ArkUINativeModuleValue ImageBridge::ResetObjectFit(ArkUIRuntimeCallInfo* runtimeCallInfo)
210 {
211 EcmaVM* vm = runtimeCallInfo->GetVM();
212 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
213 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
214 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
215 GetArkUIInternalNodeAPI()->GetImageModifier().ResetObjectFit(nativeNode);
216 return panda::JSValueRef::Undefined(vm);
217 }
218
SetFitOriginalSize(ArkUIRuntimeCallInfo * runtimeCallInfo)219 ArkUINativeModuleValue ImageBridge::SetFitOriginalSize(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 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
225 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
226 if (secondArg->IsBoolean()) {
227 bool fitOriginalSize = secondArg->ToBoolean(vm)->Value();
228 GetArkUIInternalNodeAPI()->GetImageModifier().SetFitOriginalSize(nativeNode, fitOriginalSize);
229 } else {
230 GetArkUIInternalNodeAPI()->GetImageModifier().ResetFitOriginalSize(nativeNode);
231 }
232 return panda::JSValueRef::Undefined(vm);
233 }
234
ResetFitOriginalSize(ArkUIRuntimeCallInfo * runtimeCallInfo)235 ArkUINativeModuleValue ImageBridge::ResetFitOriginalSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
236 {
237 EcmaVM* vm = runtimeCallInfo->GetVM();
238 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
239 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
240 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
241 GetArkUIInternalNodeAPI()->GetImageModifier().ResetFitOriginalSize(nativeNode);
242 return panda::JSValueRef::Undefined(vm);
243 }
244
SetSourceSize(ArkUIRuntimeCallInfo * runtimeCallInfo)245 ArkUINativeModuleValue ImageBridge::SetSourceSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
246 {
247 EcmaVM* vm = runtimeCallInfo->GetVM();
248 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
249 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
250 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
251 Local<JSValueRef> thirdArg = runtimeCallInfo->GetCallArgRef(2);
252 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
253
254 if (secondArg->IsNumber() && thirdArg->IsNumber() && secondArg->ToNumber(vm)->Value() >= 0 &&
255 thirdArg->ToNumber(vm)->Value() >= 0) {
256 double width = secondArg->ToNumber(vm)->Value();
257 double height = thirdArg->ToNumber(vm)->Value();
258 GetArkUIInternalNodeAPI()->GetImageModifier().SetSourceSize(nativeNode, width, height);
259 } else {
260 GetArkUIInternalNodeAPI()->GetImageModifier().ResetSourceSize(nativeNode);
261 }
262 return panda::JSValueRef::Undefined(vm);
263 }
264
ResetSourceSize(ArkUIRuntimeCallInfo * runtimeCallInfo)265 ArkUINativeModuleValue ImageBridge::ResetSourceSize(ArkUIRuntimeCallInfo* runtimeCallInfo)
266 {
267 EcmaVM* vm = runtimeCallInfo->GetVM();
268 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
269 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
270 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
271 GetArkUIInternalNodeAPI()->GetImageModifier().ResetSourceSize(nativeNode);
272 return panda::JSValueRef::Undefined(vm);
273 }
274
SetMatchTextDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)275 ArkUINativeModuleValue ImageBridge::SetMatchTextDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
276 {
277 EcmaVM* vm = runtimeCallInfo->GetVM();
278 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
279 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
280 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
281 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
282
283 if (secondArg->IsBoolean()) {
284 uint32_t value = static_cast<uint32_t>(secondArg->ToBoolean(vm)->Value());
285 GetArkUIInternalNodeAPI()->GetImageModifier().SetMatchTextDirection(nativeNode, value);
286 } else {
287 GetArkUIInternalNodeAPI()->GetImageModifier().ResetMatchTextDirection(nativeNode);
288 }
289 return panda::JSValueRef::Undefined(vm);
290 }
291
ResetMatchTextDirection(ArkUIRuntimeCallInfo * runtimeCallInfo)292 ArkUINativeModuleValue ImageBridge::ResetMatchTextDirection(ArkUIRuntimeCallInfo* runtimeCallInfo)
293 {
294 EcmaVM* vm = runtimeCallInfo->GetVM();
295 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
296 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
297 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
298 GetArkUIInternalNodeAPI()->GetImageModifier().ResetMatchTextDirection(nativeNode);
299 return panda::JSValueRef::Undefined(vm);
300 }
301
SetFillColor(ArkUIRuntimeCallInfo * runtimeCallInfo)302 ArkUINativeModuleValue ImageBridge::SetFillColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
303 {
304 EcmaVM* vm = runtimeCallInfo->GetVM();
305 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
306 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
307 Local<JSValueRef> colorArg = runtimeCallInfo->GetCallArgRef(1);
308 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
309 Color color;
310 if (ArkTSUtils::ParseJsColorAlpha(vm, colorArg, color)) {
311 GetArkUIInternalNodeAPI()->GetImageModifier().SetFillColor(nativeNode, color.GetValue());
312 } else {
313 GetArkUIInternalNodeAPI()->GetImageModifier().ResetFillColor(nativeNode);
314 }
315 return panda::JSValueRef::Undefined(vm);
316 }
317
ResetFillColor(ArkUIRuntimeCallInfo * runtimeCallInfo)318 ArkUINativeModuleValue ImageBridge::ResetFillColor(ArkUIRuntimeCallInfo* runtimeCallInfo)
319 {
320 EcmaVM* vm = runtimeCallInfo->GetVM();
321 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
322 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
323 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
324 GetArkUIInternalNodeAPI()->GetImageModifier().ResetFillColor(nativeNode);
325 return panda::JSValueRef::Undefined(vm);
326 }
327
SetAlt(ArkUIRuntimeCallInfo * runtimeCallInfo)328 ArkUINativeModuleValue ImageBridge::SetAlt(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 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
334 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
335 std::string src;
336 if (!ArkTSUtils::ParseJsMedia(vm, secondArg, src)) {
337 GetArkUIInternalNodeAPI()->GetImageModifier().ResetAlt(nativeNode);
338 return panda::JSValueRef::Undefined(vm);
339 }
340 if (ImageSourceInfo::ResolveURIType(src) == SrcType::NETWORK) {
341 GetArkUIInternalNodeAPI()->GetImageModifier().ResetAlt(nativeNode);
342 return panda::JSValueRef::Undefined(vm);
343 }
344 std::string bundleName;
345 std::string moduleName;
346 ArkTSUtils::GetJsMediaBundleInfo(vm, secondArg, bundleName, moduleName);
347 GetArkUIInternalNodeAPI()->GetImageModifier().SetAlt(
348 nativeNode, src.c_str(), bundleName.c_str(), moduleName.c_str());
349 return panda::JSValueRef::Undefined(vm);
350 }
351
ResetAlt(ArkUIRuntimeCallInfo * runtimeCallInfo)352 ArkUINativeModuleValue ImageBridge::ResetAlt(ArkUIRuntimeCallInfo* runtimeCallInfo)
353 {
354 EcmaVM* vm = runtimeCallInfo->GetVM();
355 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
356 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
357 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
358 GetArkUIInternalNodeAPI()->GetImageModifier().ResetAlt(nativeNode);
359 return panda::JSValueRef::Undefined(vm);
360 }
361
SetImageInterpolation(ArkUIRuntimeCallInfo * runtimeCallInfo)362 ArkUINativeModuleValue ImageBridge::SetImageInterpolation(ArkUIRuntimeCallInfo* runtimeCallInfo)
363 {
364 EcmaVM* vm = runtimeCallInfo->GetVM();
365 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
366 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
367 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
368 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
369 if (secondArg->IsNumber()) {
370 int32_t value = secondArg->Int32Value(vm);
371 GetArkUIInternalNodeAPI()->GetImageModifier().SetImageInterpolation(nativeNode, value);
372 } else {
373 GetArkUIInternalNodeAPI()->GetImageModifier().ResetImageInterpolation(nativeNode);
374 }
375 return panda::JSValueRef::Undefined(vm);
376 }
377
ResetImageInterpolation(ArkUIRuntimeCallInfo * runtimeCallInfo)378 ArkUINativeModuleValue ImageBridge::ResetImageInterpolation(ArkUIRuntimeCallInfo* runtimeCallInfo)
379 {
380 EcmaVM* vm = runtimeCallInfo->GetVM();
381 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
382 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
383 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
384 GetArkUIInternalNodeAPI()->GetImageModifier().ResetImageInterpolation(nativeNode);
385 return panda::JSValueRef::Undefined(vm);
386 }
387
SetColorFilterObject(const EcmaVM * vm,const Local<JSValueRef> & jsObjArg,NodeHandle nativeNode)388 void SetColorFilterObject(const EcmaVM* vm, const Local<JSValueRef>& jsObjArg, NodeHandle nativeNode)
389 {
390 Framework::JSColorFilter* colorFilter;
391 if (!jsObjArg->IsUndefined() && !jsObjArg->IsNull()) {
392 colorFilter = static_cast<Framework::JSColorFilter*>(jsObjArg->ToObject(vm)->GetNativePointerField(0));
393 } else {
394 GetArkUIInternalNodeAPI()->GetImageModifier().SetColorFilter(
395 nativeNode, &(*DEFAULT_COLORFILTER_MATRIX.begin()), COLOR_FILTER_MATRIX_SIZE);
396 return;
397 }
398 if (colorFilter && colorFilter->GetColorFilterMatrix().size() == COLOR_FILTER_MATRIX_SIZE) {
399 GetArkUIInternalNodeAPI()->GetImageModifier().SetColorFilter(
400 nativeNode, &(*colorFilter->GetColorFilterMatrix().begin()), COLOR_FILTER_MATRIX_SIZE);
401 } else {
402 GetArkUIInternalNodeAPI()->GetImageModifier().SetColorFilter(
403 nativeNode, &(*DEFAULT_COLORFILTER_MATRIX.begin()), COLOR_FILTER_MATRIX_SIZE);
404 return;
405 }
406 GetArkUIInternalNodeAPI()->GetImageModifier().SetColorFilter(
407 nativeNode, &(*DEFAULT_COLORFILTER_MATRIX.begin()), COLOR_FILTER_MATRIX_SIZE);
408 }
409
SetColorFilter(ArkUIRuntimeCallInfo * runtimeCallInfo)410 ArkUINativeModuleValue ImageBridge::SetColorFilter(ArkUIRuntimeCallInfo* runtimeCallInfo)
411 {
412 EcmaVM* vm = runtimeCallInfo->GetVM();
413 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
414 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
415 Local<JSValueRef> jsObjArg = runtimeCallInfo->GetCallArgRef(1);
416 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
417
418 if (!jsObjArg->IsArray(vm) && !jsObjArg->IsObject()) {
419 GetArkUIInternalNodeAPI()->GetImageModifier().SetColorFilter(
420 nativeNode, &(*DEFAULT_COLORFILTER_MATRIX.begin()), COLOR_FILTER_MATRIX_SIZE);
421 return panda::JSValueRef::Undefined(vm);
422 }
423 if (jsObjArg->IsObject() && !jsObjArg->IsArray(vm)) {
424 SetColorFilterObject(vm, jsObjArg, nativeNode);
425 return panda::JSValueRef::Undefined(vm);
426 }
427 auto array = panda::CopyableGlobal<panda::ArrayRef>(vm, jsObjArg);
428 if (array->Length(vm) != COLOR_FILTER_MATRIX_SIZE) {
429 GetArkUIInternalNodeAPI()->GetImageModifier().SetColorFilter(
430 nativeNode, &(*DEFAULT_COLORFILTER_MATRIX.begin()), COLOR_FILTER_MATRIX_SIZE);
431 return panda::JSValueRef::Undefined(vm);
432 }
433 std::vector<float> colorfilter;
434 for (size_t i = 0; i < array->Length(vm); i++) {
435 auto value = array->GetValueAt(vm, jsObjArg, i);
436 if (value->IsNumber()) {
437 colorfilter.emplace_back(value->ToNumber(vm)->Value());
438 } else {
439 GetArkUIInternalNodeAPI()->GetImageModifier().SetColorFilter(
440 nativeNode, &(*DEFAULT_COLORFILTER_MATRIX.begin()), COLOR_FILTER_MATRIX_SIZE);
441 return panda::JSValueRef::Undefined(vm);
442 }
443 }
444 GetArkUIInternalNodeAPI()->GetImageModifier().SetColorFilter(
445 nativeNode, &(*colorfilter.begin()), COLOR_FILTER_MATRIX_SIZE);
446 return panda::JSValueRef::Undefined(vm);
447 }
448
ResetColorFilter(ArkUIRuntimeCallInfo * runtimeCallInfo)449 ArkUINativeModuleValue ImageBridge::ResetColorFilter(ArkUIRuntimeCallInfo* runtimeCallInfo)
450 {
451 EcmaVM* vm = runtimeCallInfo->GetVM();
452 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
453 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
454 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
455 GetArkUIInternalNodeAPI()->GetImageModifier().ResetColorFilter(nativeNode);
456 return panda::JSValueRef::Undefined(vm);
457 }
458
SetDraggable(ArkUIRuntimeCallInfo * runtimeCallInfo)459 ArkUINativeModuleValue ImageBridge::SetDraggable(ArkUIRuntimeCallInfo* runtimeCallInfo)
460 {
461 EcmaVM* vm = runtimeCallInfo->GetVM();
462 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
463 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
464 Local<JSValueRef> secondArg = runtimeCallInfo->GetCallArgRef(1);
465 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
466 bool value;
467 if (secondArg->IsBoolean()) {
468 value = secondArg->ToBoolean(vm)->Value();
469 GetArkUIInternalNodeAPI()->GetImageModifier().SetImageDraggable(nativeNode, value);
470 } else {
471 GetArkUIInternalNodeAPI()->GetImageModifier().ResetImageDraggable(nativeNode);
472 }
473
474 return panda::JSValueRef::Undefined(vm);
475 }
476
ResetDraggable(ArkUIRuntimeCallInfo * runtimeCallInfo)477 ArkUINativeModuleValue ImageBridge::ResetDraggable(ArkUIRuntimeCallInfo* runtimeCallInfo)
478 {
479 EcmaVM* vm = runtimeCallInfo->GetVM();
480 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
481 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
482 void* nativeNode = firstArg->ToNativePointer(vm)->Value();
483 GetArkUIInternalNodeAPI()->GetImageModifier().ResetImageDraggable(nativeNode);
484 return panda::JSValueRef::Undefined(vm);
485 }
486
SetBorderRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)487 ArkUINativeModuleValue ImageBridge::SetBorderRadius(ArkUIRuntimeCallInfo *runtimeCallInfo)
488 {
489 EcmaVM *vm = runtimeCallInfo->GetVM();
490 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
491 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
492 void *nativeNode = firstArg->ToNativePointer(vm)->Value();
493 Local<JSValueRef> topLeftArgs = runtimeCallInfo->GetCallArgRef(INDEX_1);
494 Local<JSValueRef> topRightArgs = runtimeCallInfo->GetCallArgRef(INDEX_2);
495 Local<JSValueRef> bottomLeftArgs = runtimeCallInfo->GetCallArgRef(INDEX_3);
496 Local<JSValueRef> bottomRightArgs = runtimeCallInfo->GetCallArgRef(INDEX_4);
497 if (topLeftArgs->IsUndefined() && topRightArgs->IsUndefined() && bottomLeftArgs->IsUndefined() &&
498 bottomRightArgs->IsUndefined()) {
499 GetArkUIInternalNodeAPI()->GetCommonModifier().ResetBorderRadius(nativeNode);
500 return panda::JSValueRef::Undefined(vm);
501 }
502
503 CalcDimension topLeft;
504 CalcDimension topRight;
505 CalcDimension bottomLeft;
506 CalcDimension bottomRight;
507
508 ArkTSUtils::ParseAllBorder(vm, topLeftArgs, topLeft);
509 ArkTSUtils::ParseAllBorder(vm, topRightArgs, topRight);
510 ArkTSUtils::ParseAllBorder(vm, bottomLeftArgs, bottomLeft);
511 ArkTSUtils::ParseAllBorder(vm, bottomRightArgs, bottomRight);
512
513 uint32_t size = SIZE_OF_FOUR;
514 double values[size];
515 int units[size];
516
517 values[INDEX_0] = topLeft.Value();
518 units[INDEX_0] = static_cast<int>(topLeft.Unit());
519 values[INDEX_1] = topRight.Value();
520 units[INDEX_1] = static_cast<int>(topRight.Unit());
521 values[INDEX_2] = bottomLeft.Value();
522 units[INDEX_2] = static_cast<int>(bottomLeft.Unit());
523 values[INDEX_3] = bottomRight.Value();
524 units[INDEX_3] = static_cast<int>(bottomRight.Unit());
525
526 GetArkUIInternalNodeAPI()->GetImageModifier().SetImageBorderRadius(nativeNode, values, units, SIZE_OF_FOUR);
527
528 return panda::JSValueRef::Undefined(vm);
529 }
530
ResetBorderRadius(ArkUIRuntimeCallInfo * runtimeCallInfo)531 ArkUINativeModuleValue ImageBridge::ResetBorderRadius(ArkUIRuntimeCallInfo *runtimeCallInfo)
532 {
533 EcmaVM *vm = runtimeCallInfo->GetVM();
534 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
535 Local<JSValueRef> firstArg = runtimeCallInfo->GetCallArgRef(0);
536 void *nativeNode = firstArg->ToNativePointer(vm)->Value();
537 GetArkUIInternalNodeAPI()->GetImageModifier().ResetImageBorderRadius(nativeNode);
538 return panda::JSValueRef::Undefined(vm);
539 }
540
SetImageBorder(ArkUIRuntimeCallInfo * runtimeCallInfo)541 ArkUINativeModuleValue ImageBridge::SetImageBorder(ArkUIRuntimeCallInfo* runtimeCallInfo)
542 {
543 CommonBridge::SetBorder(runtimeCallInfo);
544 EcmaVM* vm = runtimeCallInfo->GetVM();
545 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
546 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // 0:node info
547 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
548 GetArkUIInternalNodeAPI()->GetImageModifier().SetImageBorder(nativeNode);
549 return panda::JSValueRef::Undefined(vm);
550 }
551
ResetImageBorder(ArkUIRuntimeCallInfo * runtimeCallInfo)552 ArkUINativeModuleValue ImageBridge::ResetImageBorder(ArkUIRuntimeCallInfo* runtimeCallInfo)
553 {
554 EcmaVM* vm = runtimeCallInfo->GetVM();
555 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
556 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // 0:node info
557 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
558 GetArkUIInternalNodeAPI()->GetCommonModifier().ResetBorder(nativeNode);
559 return panda::JSValueRef::Undefined(vm);
560 }
561
SetImageOpacity(ArkUIRuntimeCallInfo * runtimeCallInfo)562 ArkUINativeModuleValue ImageBridge::SetImageOpacity(ArkUIRuntimeCallInfo* runtimeCallInfo)
563 {
564 EcmaVM* vm = runtimeCallInfo->GetVM();
565 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
566 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // 0:node info
567 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
568 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
569 if (ImageModelNG::IsSrcSvgImage(frameNode)) {
570 CommonBridge::SetOpacity(runtimeCallInfo);
571 } else {
572 Local<JSValueRef> valueArg = runtimeCallInfo->GetCallArgRef(1); // 1:value info
573 double opacity;
574 if (!ArkTSUtils::ParseJsDouble(vm, valueArg, opacity)) {
575 GetArkUIInternalNodeAPI()->GetImageModifier().ResetImageOpacity(nativeNode);
576 } else {
577 GetArkUIInternalNodeAPI()->GetImageModifier().SetImageOpacity(nativeNode, opacity);
578 }
579 }
580 return panda::JSValueRef::Undefined(vm);
581 }
582
ResetImageOpacity(ArkUIRuntimeCallInfo * runtimeCallInfo)583 ArkUINativeModuleValue ImageBridge::ResetImageOpacity(ArkUIRuntimeCallInfo* runtimeCallInfo)
584 {
585 EcmaVM* vm = runtimeCallInfo->GetVM();
586 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
587 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // 0:node info
588 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
589 GetArkUIInternalNodeAPI()->GetImageModifier().ResetImageOpacity(nativeNode);
590 return panda::JSValueRef::Undefined(vm);
591 }
592
SetImageTransition(ArkUIRuntimeCallInfo * runtimeCallInfo)593 ArkUINativeModuleValue ImageBridge::SetImageTransition(ArkUIRuntimeCallInfo* runtimeCallInfo)
594 {
595 EcmaVM* vm = runtimeCallInfo->GetVM();
596 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
597 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // 0:node info
598 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
599 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
600 if (ImageModelNG::IsSrcSvgImage(frameNode)) {
601 CommonBridge::SetTransition(runtimeCallInfo);
602 } else {
603 CommonBridge::SetTransitionPassThrough(runtimeCallInfo);
604 }
605 return panda::JSValueRef::Undefined(vm);
606 }
607
ResetImageTransition(ArkUIRuntimeCallInfo * runtimeCallInfo)608 ArkUINativeModuleValue ImageBridge::ResetImageTransition(ArkUIRuntimeCallInfo* runtimeCallInfo)
609 {
610 EcmaVM* vm = runtimeCallInfo->GetVM();
611 CHECK_NULL_RETURN(vm, panda::NativePointerRef::New(vm, nullptr));
612 Local<JSValueRef> nodeArg = runtimeCallInfo->GetCallArgRef(0); // 0:node info
613 void* nativeNode = nodeArg->ToNativePointer(vm)->Value();
614 auto* frameNode = reinterpret_cast<FrameNode*>(nativeNode);
615 if (ImageModelNG::IsSrcSvgImage(frameNode)) {
616 CommonBridge::ResetTransition(runtimeCallInfo);
617 } else {
618 CommonBridge::ResetTransitionPassThrough(runtimeCallInfo);
619 }
620 return panda::JSValueRef::Undefined(vm);
621 }
622 } // namespace OHOS::Ace::NG