• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 Huawei Device Co., Ltd.
3  * Licensed under the Apache License, Version 2.0 (the "License");
4  * you may not use this file except in compliance with the License.
5  * You may obtain a copy of the License at
6  *
7  *     http://www.apache.org/licenses/LICENSE-2.0
8  *
9  * Unless required by applicable law or agreed to in writing, software
10  * distributed under the License is distributed on an "AS IS" BASIS,
11  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12  * See the License for the specific language governing permissions and
13  * limitations under the License.
14  */
15 #include "bridge/declarative_frontend/engine/jsi/nativeModule/arkts_native_image_bridge.h"
16 
17 #include "base/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