1 /*
2  * Copyright (C) 2024 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 
16 #include "imageEffect.h"
17 
18 #include "napi/native_api.h"
19 #include "utils/common_utils.h"
20 #include "utils/pixelmap_helper.h"
21 #include <bits/alltypes.h>
22 #include <hilog/log.h>
23 #include <multimedia/image_effect/image_effect.h>
24 #include <multimedia/image_effect/image_effect_errors.h>
25 #include <multimedia/image_effect/image_effect_filter.h>
26 #include <multimedia/image_framework/image_pixel_map_mdk.h>
27 #include <native_window/external_window.h>
28 #include <string>
29 
30 #define MY_LOG_DOMAIN 0x0000
31 #define MY_LOG_TAG "ImageEffectNDK"
32 #define LOG(fmt, ...) (void)OH_LOG_Print(LOG_APP, LOG_DEBUG, MY_LOG_DOMAIN, MY_LOG_TAG, fmt, ##__VA_ARGS__)
33 
34 #define OH_EFFECT_BRIGHTNESS_FILTER "Brightness"
35 #define OH_EFFECT_CONTRAST_FILTER "Contrast"
36 #define OH_EFFECT_CROP_FILTER "Crop"
37 #define KEY_FILTER_INTENSITY "FilterIntensity"
38 #define IMAGE_EFFECT_NAME "imageEdit"
39 #define CUSTOM_FILTER "CustomCrop"
40 
41 #define CASE_INDEX_1 1
42 #define CASE_INDEX_2 2
43 #define CASE_INDEX_3 3
44 #define CASE_INDEX_4 4
45 #define CASE_INDEX_5 5
46 #define CASE_INDEX_6 6
47 #define CASE_INDEX_7 7
48 #define CASE_INDEX_8 8
49 #define CASE_INDEX_9 9
50 #define CASE_INDEX_10 10
51 #define CASE_INDEX_11 11
52 
53 #define IMAGE_EFFECT_2 2
54 #define IMAGE_EFFECT_100 100
55 #define IMAGE_EFFECT_100F 100.f
56 #define IMAGE_EFFECT_50F 50.f
57 #define IMAGE_EFFECT_100D 100.0
58 #define IMAGE_EFFECT_1000 1000
59 #define IMAGE_EFFECT_1024 1024
60 #define IMAGE_EFFECT_1048576 1048576
61 #define IMAGE_EFFECT_1073741824 1073741824
62 #define IMAGE_EFFECT_1080 1080
63 #define IMAGE_EFFECT_4090 4090
64 #define IMAGE_EFFECT_5120 5120
65 #define IMAGE_EFFECT_CODE_401 401
66 #define IMAGE_EFFECT_1722514390000 1722514390000
67 
68 const std::string g_jpgUri = std::string("file:///data/test/resource/image_effect_1k_test1.jpg");
69 static std::string imagePath;
70 static std::string outImagePath;
71 
savePixelMapForPath(napi_env env, napi_callback_info info)72 napi_value savePixelMapForPath(napi_env env, napi_callback_info info)
73 {
74     napi_value result = nullptr;
75     napi_get_undefined(env, &result);
76     size_t argc = 1;
77     napi_value args[1] = {nullptr};
78     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
79     imagePath = CommonUtils::GetStringArgument(env, args[0]);
80     napi_value ret;
81     int status = -1;
82     if (imagePath.length() > 0) {
83         status = 0;
84     }
85     napi_create_int32(env, status, &ret);
86     return ret;
87 }
88 
creatOutPixeMapForPath(napi_env env, napi_callback_info info)89 napi_value creatOutPixeMapForPath(napi_env env, napi_callback_info info)
90 {
91     napi_value result = nullptr;
92     napi_get_undefined(env, &result);
93     size_t argc = 1;
94     napi_value args[1] = {nullptr};
95     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
96     outImagePath = CommonUtils::GetStringArgument(env, args[0]);
97     napi_value ret;
98     int status = -1;
99     if (outImagePath.length() > 0) {
100         status = 0;
101     }
102     napi_create_int32(env, status, &ret);
103     return ret;
104 }
105 
getFilterDelegate()106 ImageEffect_FilterDelegate getFilterDelegate()
107 {
108     ImageEffect_FilterDelegate filterDelegate = {
109         .setValue = [](OH_EffectFilter *filter, const char *key, const ImageEffect_Any *value) { return true; },
110         .render = [](OH_EffectFilter *filter, OH_EffectBufferInfo *info,
111     OH_EffectFilterDelegate_PushData pushData) { return true; },
112         .save = [](OH_EffectFilter *filter, char **info) { return true; },
113         .restore = [](const char *info) {
114         OH_EffectFilter *filter = OH_EffectFilter_Create(CUSTOM_FILTER);
115         return filter;
116         }
117     };
118     return filterDelegate;
119 }
120 
121 /**---------------------------------------------- EffectFilterRender ------------------------------------------------**/
OHEffectFilterRender(napi_env env, napi_callback_info info)122 napi_value OHEffectFilterRender(napi_env env, napi_callback_info info)
123 {
124     size_t argc = 1;
125     napi_value args[1] = {nullptr};
126     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
127     int32_t index;
128     napi_get_value_int32(env, args[0], &index);
129     std::shared_ptr<OH_PixelmapNative> pixelmapNativePtr = PixelMapHelper::Decode(imagePath);
130     OH_PixelmapNative *inputPixelmap = pixelmapNativePtr.get();
131     OH_PixelmapNative *outputPixelmap = inputPixelmap;
132     ImageEffect_FilterDelegate filterDelegate = getFilterDelegate();
133     // 创建 OH_EffectFilterInfo 实例
134     OH_EffectFilterInfo *customFilterInfo = OH_EffectFilterInfo_Create();
135     // 设置自定义滤镜滤镜名
136     OH_EffectFilterInfo_SetFilterName(customFilterInfo, CUSTOM_FILTER);
137     // 设置自定义滤镜所支持的内存类型
138     ImageEffect_BufferType bufferTypeArray[] = {ImageEffect_BufferType::EFFECT_BUFFER_TYPE_PIXEL};
139     OH_EffectFilterInfo_SetSupportedBufferTypes(
140         customFilterInfo, sizeof(bufferTypeArray) / sizeof(ImageEffect_BufferType), bufferTypeArray);
141     // 设置自定义滤镜所支持的像素格式
142     ImageEffect_Format formatArray[] = {ImageEffect_Format::EFFECT_PIXEL_FORMAT_RGBA8888};
143     OH_EffectFilterInfo_SetSupportedFormats(customFilterInfo, sizeof(formatArray) / sizeof(ImageEffect_Format),
144                                             formatArray);
145     // 注册自定义滤镜
146     ImageEffect_ErrorCode errorCode = OH_EffectFilter_Register(customFilterInfo, &filterDelegate);
147     // 创建滤镜。比如:创建对比度效果器
148     OH_EffectFilter *filter = OH_EffectFilter_Create(CUSTOM_FILTER);
149 
150     std::shared_ptr<OH_PixelmapNative> outPixePtr = PixelMapHelper::Decode(outImagePath);
151 
152     // 生效滤镜效果
153     switch (index) {
154     case CASE_INDEX_1:
155         outputPixelmap = nullptr;
156         break;
157     case CASE_INDEX_2:
158         outputPixelmap = inputPixelmap;
159         break;
160     case CASE_INDEX_3:
161         outputPixelmap = outPixePtr.get();
162         break;
163     default:
164         break;
165     }
166     errorCode = OH_EffectFilter_Render(filter, inputPixelmap, outputPixelmap);
167     OH_EffectFilter_Release(filter);
168     napi_value ret;
169     napi_create_int32(env, errorCode, &ret);
170     return ret;
171 }
172 
173 /**-------------------------------------------------- Effect -------------------------------------------------------**/
OHImageEffectCreate(napi_env env, napi_callback_info info)174 napi_value OHImageEffectCreate(napi_env env, napi_callback_info info)
175 {
176     size_t argc = 1;
177     napi_value args[1] = {nullptr};
178     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
179     int32_t index;
180     napi_get_value_int32(env, args[0], &index);
181 
182     OH_ImageEffect *imageEffect = nullptr;
183     switch (index) {
184     case CASE_INDEX_1:
185         imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
186         break;
187     case CASE_INDEX_2:
188         imageEffect = OH_ImageEffect_Create(nullptr);
189         break;
190     default:
191         break;
192     }
193 
194     int code = IMAGE_EFFECT_CODE_401;
195     if (imageEffect != nullptr) {
196         OH_ImageEffect_Release(imageEffect);
197         code = 0;
198     }
199     napi_value ret;
200     napi_create_int32(env, code, &ret);
201     return ret;
202 }
203 
OHImageEffectConfigure(napi_env env, napi_callback_info info)204 napi_value OHImageEffectConfigure(napi_env env, napi_callback_info info)
205 {
206     size_t argc = 1;
207     napi_value args[1] = {nullptr};
208     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
209     int32_t index;
210     napi_get_value_int32(env, args[0], &index);
211 
212     OH_ImageEffect *imageEffect = nullptr;
213     const char *key = nullptr;
214     ImageEffect_Any value;
215     switch (index) {
216     case CASE_INDEX_1:
217         imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
218         key = "runningType";
219         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_INT32;
220         value.dataValue.int32Value = IMAGE_EFFECT_2;
221         break;
222     case CASE_INDEX_2:
223         key = "runningType";
224         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_FLOAT;
225         value.dataValue.floatValue = IMAGE_EFFECT_100F;
226         imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
227         break;
228     case CASE_INDEX_3:
229         imageEffect = nullptr;
230         key = "runningType";
231         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_FLOAT;
232         value.dataValue.floatValue = IMAGE_EFFECT_100F;
233         break;
234     case CASE_INDEX_4:
235         imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
236         key = nullptr;
237         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_FLOAT;
238         value.dataValue.floatValue = IMAGE_EFFECT_100F;
239         break;
240     case CASE_INDEX_5:
241         imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
242         key = nullptr;
243     default:
244         break;
245     }
246     ImageEffect_ErrorCode code = OH_ImageEffect_Configure(imageEffect, key, &value);
247     OH_ImageEffect_Release(imageEffect);
248 
249     napi_value ret;
250     napi_create_int32(env, code, &ret);
251     return ret;
252 }
253 
OHImageEffectAddFilter(napi_env env, napi_callback_info info)254 napi_value OHImageEffectAddFilter(napi_env env, napi_callback_info info)
255 {
256     size_t argc = 1;
257     napi_value args[1] = {nullptr};
258     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
259     int32_t index;
260     napi_get_value_int32(env, args[0], &index);
261 
262     OH_ImageEffect *imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
263     OH_EffectFilter *filter = nullptr;
264     switch (index) {
265     case CASE_INDEX_1:
266         filter = OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_BRIGHTNESS_FILTER);
267         break;
268     case CASE_INDEX_2:
269         filter = OH_ImageEffect_AddFilter(nullptr, OH_EFFECT_BRIGHTNESS_FILTER);
270         break;
271     case CASE_INDEX_3:
272         filter = OH_ImageEffect_AddFilter(imageEffect, nullptr);
273         break;
274     default:
275         break;
276     }
277     OH_ImageEffect_Release(imageEffect);
278 
279     int code = IMAGE_EFFECT_CODE_401;
280     if (filter != nullptr) {
281         code = 0;
282     }
283     napi_value ret;
284     napi_create_int32(env, code, &ret);
285     return ret;
286 }
287 
OHImageEffectAddFilterByFilter(napi_env env, napi_callback_info info)288 napi_value OHImageEffectAddFilterByFilter(napi_env env, napi_callback_info info)
289 {
290     size_t argc = 1;
291     napi_value args[1] = {nullptr};
292     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
293     int32_t index;
294     napi_get_value_int32(env, args[0], &index);
295 
296     OH_ImageEffect *imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
297     ImageEffect_ErrorCode errorCode = ImageEffect_ErrorCode::EFFECT_SUCCESS;
298     OH_EffectFilter *filter = OH_EffectFilter_Create(OH_EFFECT_BRIGHTNESS_FILTER);
299     switch (index) {
300     case CASE_INDEX_1:
301         errorCode = OH_ImageEffect_AddFilterByFilter(imageEffect, filter);
302         break;
303     case CASE_INDEX_2:
304         errorCode = OH_ImageEffect_AddFilterByFilter(nullptr, filter);
305         break;
306     case CASE_INDEX_3:
307         errorCode = OH_ImageEffect_AddFilterByFilter(imageEffect, nullptr);
308         break;
309     default:
310         break;
311     }
312     OH_EffectFilter_Release(filter);
313     OH_ImageEffect_Release(imageEffect);
314 
315     napi_value ret;
316     napi_create_int32(env, errorCode, &ret);
317     return ret;
318 }
319 
OHImageEffectGetFilter(napi_env env, napi_callback_info info)320 napi_value OHImageEffectGetFilter(napi_env env, napi_callback_info info)
321 {
322     size_t argc = 1;
323     napi_value args[1] = {nullptr};
324     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
325     int32_t index;
326     napi_get_value_int32(env, args[0], &index);
327 
328     OH_ImageEffect *imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
329     OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_BRIGHTNESS_FILTER);
330     int32_t getFilterIndex;
331     switch (index) {
332     case CASE_INDEX_1:
333         getFilterIndex = 0;
334         break;
335     case CASE_INDEX_2:
336         getFilterIndex = 1;
337         break;
338     default:
339         break;
340     }
341     OH_EffectFilter *getFilter = OH_ImageEffect_GetFilter(imageEffect, getFilterIndex);
342     OH_ImageEffect_Release(imageEffect);
343 
344     int status = IMAGE_EFFECT_CODE_401;
345     if (getFilter != nullptr) {
346         status = 0;
347     }
348     napi_value ret;
349     napi_create_int32(env, status, &ret);
350     return ret;
351 }
352 
OHImageEffectGetFilterCount(napi_env env, napi_callback_info info)353 napi_value OHImageEffectGetFilterCount(napi_env env, napi_callback_info info)
354 {
355     size_t argc = 1;
356     napi_value args[1] = {nullptr};
357     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
358     int32_t index;
359     napi_get_value_int32(env, args[0], &index);
360 
361     OH_ImageEffect *imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
362     int32_t count = 0;
363     switch (index) {
364     case CASE_INDEX_1:
365         OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_BRIGHTNESS_FILTER);
366         count = OH_ImageEffect_GetFilterCount(imageEffect);
367         break;
368     case CASE_INDEX_2:
369         OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_BRIGHTNESS_FILTER);
370         OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_CONTRAST_FILTER);
371         count = OH_ImageEffect_GetFilterCount(imageEffect);
372         break;
373     case CASE_INDEX_3:
374         OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_BRIGHTNESS_FILTER);
375         OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_CONTRAST_FILTER);
376         OH_ImageEffect_RemoveFilter(imageEffect, OH_EFFECT_CONTRAST_FILTER);
377         count = OH_ImageEffect_GetFilterCount(imageEffect);
378         break;
379     case CASE_INDEX_4:
380         count = OH_ImageEffect_GetFilterCount(nullptr);
381         break;
382     default:
383         break;
384     }
385     OH_ImageEffect_Release(imageEffect);
386 
387     int status = IMAGE_EFFECT_CODE_401;
388     if (count >= 0) {
389         status = 0;
390     }
391     napi_value ret;
392     napi_create_int32(env, status, &ret);
393     return ret;
394 }
395 
OHImageEffectGetInputSurface(napi_env env, napi_callback_info info)396 napi_value OHImageEffectGetInputSurface(napi_env env, napi_callback_info info)
397 {
398     size_t argc = 1;
399     napi_value args[1] = {nullptr};
400     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
401     int32_t index;
402     napi_get_value_int32(env, args[0], &index);
403 
404     OH_ImageEffect *imageEffect = nullptr;
405     switch (index) {
406     case CASE_INDEX_1:
407         imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
408         break;
409     case CASE_INDEX_2:
410         imageEffect = nullptr;
411         break;
412     default:
413         break;
414     }
415     OHNativeWindow *nativeWindow = nullptr;
416     ImageEffect_ErrorCode code = OH_ImageEffect_GetInputSurface(imageEffect, &nativeWindow);
417     OH_ImageEffect_Release(imageEffect);
418 
419     napi_value ret;
420     napi_create_int32(env, code, &ret);
421     return ret;
422 }
423 
OHImageEffectInsertFilter(napi_env env, napi_callback_info info)424 napi_value OHImageEffectInsertFilter(napi_env env, napi_callback_info info)
425 {
426     size_t argc = 1;
427     napi_value args[1] = {nullptr};
428     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
429     int32_t index;
430     napi_get_value_int32(env, args[0], &index);
431 
432     OH_EffectFilter *insertFilter = nullptr;
433     OH_ImageEffect *imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
434     switch (index) {
435     case CASE_INDEX_1:
436         insertFilter = OH_ImageEffect_InsertFilter(imageEffect, 1, OH_EFFECT_BRIGHTNESS_FILTER);
437         break;
438     case CASE_INDEX_2:
439         insertFilter = OH_ImageEffect_InsertFilter(nullptr, 0, OH_EFFECT_BRIGHTNESS_FILTER);
440         break;
441     case CASE_INDEX_3:
442         insertFilter = OH_ImageEffect_InsertFilter(imageEffect, -1, OH_EFFECT_BRIGHTNESS_FILTER);
443         break;
444     case CASE_INDEX_4:
445         insertFilter = OH_ImageEffect_InsertFilter(imageEffect, 0, nullptr);
446         break;
447     default:
448         break;
449     }
450     OH_ImageEffect_Release(imageEffect);
451 
452     int status = IMAGE_EFFECT_CODE_401;
453     if (insertFilter != nullptr) {
454         status = 0;
455     }
456     napi_value ret;
457     napi_create_int32(env, status, &ret);
458     return ret;
459 }
460 
OHImageEffectInsertFilterByFilter(napi_env env, napi_callback_info info)461 napi_value OHImageEffectInsertFilterByFilter(napi_env env, napi_callback_info info)
462 {
463     size_t argc = 1;
464     napi_value args[1] = {nullptr};
465     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
466     int32_t index;
467     napi_get_value_int32(env, args[0], &index);
468 
469     OH_ImageEffect *imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
470     OH_EffectFilter *filter = OH_EffectFilter_Create(OH_EFFECT_BRIGHTNESS_FILTER);
471     ImageEffect_ErrorCode errorCode = ImageEffect_ErrorCode::EFFECT_SUCCESS;
472     switch (index) {
473     case CASE_INDEX_1:
474         errorCode = OH_ImageEffect_InsertFilterByFilter(imageEffect, 1, filter);
475         break;
476     case CASE_INDEX_2:
477         errorCode = OH_ImageEffect_InsertFilterByFilter(nullptr, 0, filter);
478         break;
479     case CASE_INDEX_3:
480         errorCode = OH_ImageEffect_InsertFilterByFilter(imageEffect, -1, filter);
481         break;
482     case CASE_INDEX_4:
483         errorCode = OH_ImageEffect_InsertFilterByFilter(imageEffect, 0, nullptr);
484         break;
485     default:
486         break;
487     }
488     OH_EffectFilter_Release(filter);
489     OH_ImageEffect_Release(imageEffect);
490 
491     napi_value ret;
492     napi_create_int32(env, errorCode, &ret);
493     return ret;
494 }
495 
OHImageEffectReplaceFilter(napi_env env, napi_callback_info info)496 napi_value OHImageEffectReplaceFilter(napi_env env, napi_callback_info info)
497 {
498     size_t argc = 1;
499     napi_value args[1] = {nullptr};
500     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
501     int32_t index;
502     napi_get_value_int32(env, args[0], &index);
503 
504     OH_EffectFilter *replaceFilter = nullptr;
505     OH_ImageEffect *imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
506     OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_CONTRAST_FILTER);
507     switch (index) {
508     case CASE_INDEX_1:
509         replaceFilter = OH_ImageEffect_ReplaceFilter(imageEffect, 0, OH_EFFECT_BRIGHTNESS_FILTER);
510         break;
511     case CASE_INDEX_2:
512         replaceFilter = OH_ImageEffect_ReplaceFilter(nullptr, 0, OH_EFFECT_BRIGHTNESS_FILTER);
513         break;
514     case CASE_INDEX_3:
515         replaceFilter = OH_ImageEffect_ReplaceFilter(imageEffect, -1, OH_EFFECT_BRIGHTNESS_FILTER);
516         break;
517     case CASE_INDEX_4:
518         replaceFilter = OH_ImageEffect_ReplaceFilter(imageEffect, 0, nullptr);
519         break;
520     default:
521         break;
522     }
523     OH_ImageEffect_Release(imageEffect);
524 
525     int status = IMAGE_EFFECT_CODE_401;
526     if (replaceFilter != nullptr) {
527         status = 0;
528     }
529     napi_value ret;
530     napi_create_int32(env, status, &ret);
531     return ret;
532 }
533 
OHImageEffectReplaceFilterByFilter(napi_env env, napi_callback_info info)534 napi_value OHImageEffectReplaceFilterByFilter(napi_env env, napi_callback_info info)
535 {
536     size_t argc = 1;
537     napi_value args[1] = {nullptr};
538     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
539     int32_t index;
540     napi_get_value_int32(env, args[0], &index);
541 
542     OH_ImageEffect *imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
543     OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_CONTRAST_FILTER);
544     OH_EffectFilter *filter = OH_EffectFilter_Create(OH_EFFECT_BRIGHTNESS_FILTER);
545     ImageEffect_ErrorCode errorCode = ImageEffect_ErrorCode::EFFECT_SUCCESS;
546     switch (index) {
547     case CASE_INDEX_1:
548         OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_CONTRAST_FILTER);
549         errorCode = OH_ImageEffect_ReplaceFilterByFilter(imageEffect, 0, filter);
550         break;
551     case CASE_INDEX_2:
552         errorCode = OH_ImageEffect_ReplaceFilterByFilter(nullptr, 0, filter);
553         break;
554     case CASE_INDEX_3:
555         errorCode = OH_ImageEffect_ReplaceFilterByFilter(imageEffect, -1, filter);
556         break;
557     case CASE_INDEX_4:
558         errorCode = OH_ImageEffect_ReplaceFilterByFilter(imageEffect, 0, nullptr);
559         break;
560     default:
561         break;
562     }
563     OH_EffectFilter_Release(filter);
564     OH_ImageEffect_Release(imageEffect);
565 
566     napi_value ret;
567     napi_create_int32(env, errorCode, &ret);
568     return ret;
569 }
570 
OHImageEffectRelease(napi_env env, napi_callback_info info)571 napi_value OHImageEffectRelease(napi_env env, napi_callback_info info)
572 {
573     size_t argc = 1;
574     napi_value args[1] = {nullptr};
575     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
576     int32_t index;
577     napi_get_value_int32(env, args[0], &index);
578 
579     OH_ImageEffect *imageEffect = nullptr;
580     switch (index) {
581     case CASE_INDEX_1:
582         imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
583         break;
584     case CASE_INDEX_2:
585         imageEffect = nullptr;
586         break;
587     default:
588         break;
589     }
590     ImageEffect_ErrorCode code = OH_ImageEffect_Release(imageEffect);
591     napi_value ret;
592     napi_create_int32(env, code, &ret);
593     return ret;
594 }
595 
OHImageEffectRemoveFilter(napi_env env, napi_callback_info info)596 napi_value OHImageEffectRemoveFilter(napi_env env, napi_callback_info info)
597 {
598     size_t argc = 1;
599     napi_value args[1] = {nullptr};
600     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
601     int32_t index;
602     napi_get_value_int32(env, args[0], &index);
603 
604     OH_ImageEffect *imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
605     int32_t result;
606     switch (index) {
607     case CASE_INDEX_1:
608         OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_BRIGHTNESS_FILTER);
609         result = OH_ImageEffect_RemoveFilter(imageEffect, OH_EFFECT_BRIGHTNESS_FILTER);
610         break;
611     case CASE_INDEX_2:
612         OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_BRIGHTNESS_FILTER);
613         OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_CROP_FILTER);
614         result = OH_ImageEffect_RemoveFilter(imageEffect, OH_EFFECT_CROP_FILTER);
615         break;
616     case CASE_INDEX_3:
617         result = OH_ImageEffect_RemoveFilter(imageEffect, OH_EFFECT_BRIGHTNESS_FILTER);
618         break;
619     default:
620         break;
621     }
622     OH_ImageEffect_Release(imageEffect);
623 
624     napi_value ret;
625     int32_t status = IMAGE_EFFECT_CODE_401;
626     if (result > 0) {
627         status = 0;
628     }
629     napi_create_int32(env, status, &ret);
630     return ret;
631 }
632 
OHImageEffectRemoveFilterByIndex(napi_env env, napi_callback_info info)633 napi_value OHImageEffectRemoveFilterByIndex(napi_env env, napi_callback_info info)
634 {
635     size_t argc = 1;
636     napi_value args[1] = {nullptr};
637     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
638     int32_t index;
639     napi_get_value_int32(env, args[0], &index);
640 
641     OH_ImageEffect *imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
642     int32_t errorCode = ImageEffect_ErrorCode::EFFECT_SUCCESS;
643     OH_EffectFilter *brightnessFilter = OH_EffectFilter_Create(OH_EFFECT_BRIGHTNESS_FILTER);
644     switch (index) {
645     case CASE_INDEX_1:
646         OH_ImageEffect_AddFilterByFilter(imageEffect, brightnessFilter);
647         errorCode = OH_ImageEffect_RemoveFilterByIndex(imageEffect, 0);
648         break;
649     case CASE_INDEX_2:
650         OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_CONTRAST_FILTER);
651         OH_ImageEffect_AddFilterByFilter(imageEffect, brightnessFilter);
652         errorCode = OH_ImageEffect_RemoveFilterByIndex(imageEffect, 1);
653         errorCode |= OH_ImageEffect_RemoveFilterByIndex(imageEffect, 0);
654         break;
655     case CASE_INDEX_3:
656         errorCode = OH_ImageEffect_RemoveFilterByIndex(imageEffect, 0);
657         break;
658     default:
659         break;
660     }
661     OH_EffectFilter_Release(brightnessFilter);
662     OH_ImageEffect_Release(imageEffect);
663 
664     napi_value ret;
665     napi_create_int32(env, errorCode, &ret);
666     return ret;
667 }
668 
OHImageEffectSave(napi_env env, napi_callback_info info)669 napi_value OHImageEffectSave(napi_env env, napi_callback_info info)
670 {
671     size_t argc = 1;
672     napi_value args[1] = {nullptr};
673     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
674     int32_t index;
675     napi_get_value_int32(env, args[0], &index);
676 
677     OH_ImageEffect *imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
678     ImageEffect_ErrorCode code;
679     char *imageEffectInfo = nullptr;
680     switch (index) {
681     case CASE_INDEX_1:
682         code = OH_ImageEffect_Save(imageEffect, &imageEffectInfo);
683         break;
684     case CASE_INDEX_2:
685         code = OH_ImageEffect_Save(nullptr, &imageEffectInfo);
686         break;
687     case CASE_INDEX_3:
688         code = OH_ImageEffect_Save(imageEffect, nullptr);
689         break;
690     default:
691         break;
692     }
693     OH_ImageEffect_Release(imageEffect);
694 
695     napi_value ret;
696     napi_create_int32(env, code, &ret);
697     return ret;
698 }
699 
OHImageEffectRestore(napi_env env, napi_callback_info info)700 napi_value OHImageEffectRestore(napi_env env, napi_callback_info info)
701 {
702     size_t argc = 1;
703     napi_value args[1] = {nullptr};
704     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
705     int32_t index;
706     napi_get_value_int32(env, args[0], &index);
707 
708     OH_ImageEffect *saveImageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
709     OH_ImageEffect *restoreImageEffect = nullptr;
710     char *imageEffectInfo = nullptr;
711     switch (index) {
712     case CASE_INDEX_1:
713         OH_ImageEffect_Save(saveImageEffect, &imageEffectInfo);
714         restoreImageEffect = OH_ImageEffect_Restore(imageEffectInfo);
715         break;
716     case CASE_INDEX_2:
717         restoreImageEffect = OH_ImageEffect_Restore("");
718         break;
719     case CASE_INDEX_3:
720         restoreImageEffect = OH_ImageEffect_Restore(nullptr);
721         break;
722     default:
723         break;
724     }
725 
726     int32_t code = 401;
727     if (restoreImageEffect != nullptr) {
728         code = 0;
729     }
730     napi_value ret = nullptr;
731     napi_create_int32(env, code, &ret);
732     return ret;
733 }
734 
735 OH_NativeBuffer_Config config{
736     .width = 0x100,
737     .height = 0x100,
738 };
739 
OHImageEffectSetInputNativeBuffer(napi_env env, napi_callback_info info)740 napi_value OHImageEffectSetInputNativeBuffer(napi_env env, napi_callback_info info)
741 {
742     OH_ImageEffect *imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
743     OH_EffectFilter *filter = OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_BRIGHTNESS_FILTER);
744 
745     ImageEffect_Any value;
746     value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_FLOAT;
747     value.dataValue.floatValue = IMAGE_EFFECT_100F;
748     ImageEffect_ErrorCode code = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
749 
750     OH_NativeBuffer *buffer = (OH_NativeBuffer *)0x1;
751     code = OH_ImageEffect_SetInputNativeBuffer(imageEffect, buffer);
752     napi_value ret;
753     napi_create_int32(env, code, &ret);
754     return ret;
755 }
756 
OHImageEffectSetInputPixelmap(napi_env env, napi_callback_info info)757 napi_value OHImageEffectSetInputPixelmap(napi_env env, napi_callback_info info)
758 {
759     size_t argc = 1;
760     napi_value args[1] = {nullptr};
761     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
762     int32_t index;
763     napi_get_value_int32(env, args[0], &index);
764 
765     std::shared_ptr<OH_PixelmapNative> pixelmapNativePtr = PixelMapHelper::Decode(imagePath);
766     OH_PixelmapNative *inputPixelmap = pixelmapNativePtr.get();
767     OH_ImageEffect *imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
768     ImageEffect_ErrorCode code = EFFECT_UNKNOWN;
769     switch (index) {
770     case CASE_INDEX_1:
771         code = OH_ImageEffect_SetInputPixelmap(imageEffect, inputPixelmap);
772         break;
773     case CASE_INDEX_2:
774         code = OH_ImageEffect_SetInputPixelmap(nullptr, inputPixelmap);
775         break;
776     case CASE_INDEX_3:
777         code = OH_ImageEffect_SetInputPixelmap(imageEffect, nullptr);
778         break;
779     default:
780         break;
781     }
782     OH_ImageEffect_Release(imageEffect);
783     napi_value ret;
784     napi_create_int32(env, code, &ret);
785     return ret;
786 }
787 
SetInputUri1(int32_t index, OH_ImageEffect *imageEffect, OH_EffectFilter *filter)788 ImageEffect_ErrorCode SetInputUri1(int32_t index, OH_ImageEffect *imageEffect, OH_EffectFilter *filter)
789 {
790     ImageEffect_Any value;
791     ImageEffect_ErrorCode code;
792     switch (index) {
793     case CASE_INDEX_1:
794         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_INT32;
795         value.dataValue.int32Value = INT32_MIN;
796         code = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
797         code = OH_ImageEffect_SetInputUri(imageEffect, g_jpgUri.c_str());
798         break;
799     case CASE_INDEX_2:
800         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_FLOAT;
801         value.dataValue.floatValue = IMAGE_EFFECT_100F;
802         code = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
803         code = OH_ImageEffect_SetInputUri(imageEffect, g_jpgUri.c_str());
804         break;
805     case CASE_INDEX_3:
806         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_DOUBLE;
807         value.dataValue.doubleValue = IMAGE_EFFECT_100D;
808         code = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
809         code = OH_ImageEffect_SetInputUri(imageEffect, g_jpgUri.c_str());
810         break;
811     case CASE_INDEX_4:
812         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_CHAR;
813         value.dataValue.charValue = 'A';
814         code = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
815         code = OH_ImageEffect_SetInputUri(imageEffect, g_jpgUri.c_str());
816         break;
817     default:
818         break;
819     }
820     return code;
821 }
822 
SetInputUri2(int32_t index, OH_ImageEffect *imageEffect, OH_EffectFilter *filter)823 ImageEffect_ErrorCode SetInputUri2(int32_t index, OH_ImageEffect *imageEffect, OH_EffectFilter *filter)
824 {
825     ImageEffect_Any value;
826     ImageEffect_ErrorCode code;
827     switch (index) {
828     case CASE_INDEX_5:
829         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_LONG;
830         value.dataValue.longValue = 100L;
831         code = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
832         code = OH_ImageEffect_SetInputUri(imageEffect, g_jpgUri.c_str());
833         break;
834     case CASE_INDEX_6:
835         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_BOOL;
836         value.dataValue.boolValue = true;
837         code = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
838         code = OH_ImageEffect_SetInputUri(imageEffect, g_jpgUri.c_str());
839         break;
840     case CASE_INDEX_7:
841         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_PTR;
842         value.dataValue.ptrValue = nullptr;
843         code = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
844         code = OH_ImageEffect_SetInputUri(imageEffect, g_jpgUri.c_str());
845         break;
846     case CASE_INDEX_8:
847         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_INT32;
848         value.dataValue.int32Value = IMAGE_EFFECT_100;
849         code = OH_EffectFilter_SetValue(filter, nullptr, &value);
850         code = OH_ImageEffect_SetInputUri(imageEffect, g_jpgUri.c_str());
851         break;
852     default:
853         break;
854     }
855     return code;
856 }
857 
OHImageEffectSetInputUri(napi_env env, napi_callback_info info)858 napi_value OHImageEffectSetInputUri(napi_env env, napi_callback_info info)
859 {
860     OH_ImageEffect *imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
861     OH_EffectFilter *filter = OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_BRIGHTNESS_FILTER);
862     size_t argc = 1;
863     napi_value args[1] = {nullptr};
864     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
865     int32_t index;
866     napi_get_value_int32(env, args[0], &index);
867     ImageEffect_Any value;
868     ImageEffect_ErrorCode code;
869     switch (index) {
870     case CASE_INDEX_1:
871     case CASE_INDEX_2:
872     case CASE_INDEX_3:
873     case CASE_INDEX_4:
874         code = SetInputUri1(index, imageEffect, filter);
875         break;
876     case CASE_INDEX_5:
877     case CASE_INDEX_6:
878     case CASE_INDEX_7:
879     case CASE_INDEX_8:
880         code = SetInputUri2(index, imageEffect, filter);
881         break;
882     case CASE_INDEX_9:
883         code = OH_ImageEffect_SetInputUri(nullptr, nullptr);
884         break;
885     case CASE_INDEX_10:
886         code = OH_ImageEffect_SetInputUri(nullptr, g_jpgUri.c_str());
887         break;
888     case CASE_INDEX_11:
889         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_INT32;
890         value.dataValue.int32Value = IMAGE_EFFECT_100;
891         code = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
892         code = OH_ImageEffect_SetInputUri(imageEffect, nullptr);
893         break;
894     default:
895         break;
896     }
897     OH_ImageEffect_Release(imageEffect);
898     napi_value ret;
899     napi_create_int32(env, code, &ret);
900     return ret;
901 }
902 
OHImageEffectSetOutputNativeBuffer(napi_env env, napi_callback_info info)903 napi_value OHImageEffectSetOutputNativeBuffer(napi_env env, napi_callback_info info)
904 {
905     OH_ImageEffect *imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
906     OH_EffectFilter *filter = OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_BRIGHTNESS_FILTER);
907 
908     ImageEffect_Any value;
909     value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_FLOAT;
910     value.dataValue.floatValue = IMAGE_EFFECT_100F;
911     ImageEffect_ErrorCode code = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
912 
913     OH_NativeBuffer *nativeBuffer = (OH_NativeBuffer *)0x1;
914     if (code == EFFECT_SUCCESS) {
915         code = OH_ImageEffect_SetInputNativeBuffer(imageEffect, nativeBuffer);
916     }
917     OH_NativeBuffer *outNativeBuffer = (OH_NativeBuffer *)0x2;
918     if (code == EFFECT_SUCCESS) {
919         code = OH_ImageEffect_SetOutputNativeBuffer(imageEffect, outNativeBuffer);
920     }
921     napi_value ret;
922     napi_create_int32(env, code, &ret);
923     return ret;
924 }
925 
OHImageEffectSetOutputPixelmap(napi_env env, napi_callback_info info)926 napi_value OHImageEffectSetOutputPixelmap(napi_env env, napi_callback_info info)
927 {
928     size_t argc = 1;
929     napi_value args[1] = {nullptr};
930     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
931     int32_t index;
932     napi_get_value_int32(env, args[0], &index);
933 
934     std::shared_ptr<OH_PixelmapNative> pixelmapNativePtr = PixelMapHelper::Decode(imagePath);
935     OH_PixelmapNative *outputPixelmap = pixelmapNativePtr.get();
936     OH_ImageEffect *imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
937     ImageEffect_ErrorCode code = EFFECT_UNKNOWN;
938     switch (index) {
939     case CASE_INDEX_1:
940         code = OH_ImageEffect_SetOutputPixelmap(imageEffect, outputPixelmap);
941         break;
942     case CASE_INDEX_2:
943         code = OH_ImageEffect_SetOutputPixelmap(nullptr, outputPixelmap);
944         break;
945     case CASE_INDEX_3:
946         code = OH_ImageEffect_SetOutputPixelmap(imageEffect, nullptr);
947         break;
948     default:
949         break;
950     }
951     OH_ImageEffect_Release(imageEffect);
952     napi_value ret;
953     napi_create_int32(env, code, &ret);
954     return ret;
955 }
956 
OHImageEffectSetOutputSurface(napi_env env, napi_callback_info info)957 napi_value OHImageEffectSetOutputSurface(napi_env env, napi_callback_info info)
958 {
959     size_t argc = 1;
960     napi_value args[1] = {nullptr};
961     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
962     int32_t index;
963     napi_get_value_int32(env, args[0], &index);
964 
965     OH_ImageEffect *imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
966     OHNativeWindow *nativeWindow = nullptr;
967     ImageEffect_ErrorCode code;
968     switch (index) {
969     case CASE_INDEX_1:
970         OH_ImageEffect_GetInputSurface(imageEffect, &nativeWindow);
971         code = OH_ImageEffect_SetOutputSurface(imageEffect, nativeWindow);
972         break;
973     case CASE_INDEX_2:
974         OH_ImageEffect_GetInputSurface(imageEffect, &nativeWindow);
975         code = OH_ImageEffect_SetOutputSurface(nullptr, nativeWindow);
976         break;
977     default:
978         break;
979     }
980 
981     napi_value ret;
982     napi_create_int32(env, code, &ret);
983     return ret;
984 }
985 
SetInputUri3(int32_t index, OH_ImageEffect *imageEffect, OH_EffectFilter *filter)986 ImageEffect_ErrorCode SetInputUri3(int32_t index, OH_ImageEffect *imageEffect, OH_EffectFilter *filter)
987 {
988     ImageEffect_Any value;
989     ImageEffect_ErrorCode code;
990     switch (index) {
991     case CASE_INDEX_1:
992         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_INT32;
993         value.dataValue.int32Value = INT32_MIN;
994         code = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
995         code = OH_ImageEffect_SetInputUri(imageEffect, g_jpgUri.c_str());
996         break;
997     case CASE_INDEX_2:
998         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_FLOAT;
999         value.dataValue.floatValue = IMAGE_EFFECT_100F;
1000         code = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
1001         code = OH_ImageEffect_SetInputUri(imageEffect, g_jpgUri.c_str());
1002         break;
1003     case CASE_INDEX_3:
1004         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_DOUBLE;
1005         value.dataValue.doubleValue = IMAGE_EFFECT_100D;
1006         code = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
1007         code = OH_ImageEffect_SetInputUri(imageEffect, g_jpgUri.c_str());
1008         break;
1009     case CASE_INDEX_4:
1010         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_CHAR;
1011         value.dataValue.charValue = 'A';
1012         code = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
1013         code = OH_ImageEffect_SetInputUri(imageEffect, g_jpgUri.c_str());
1014         break;
1015     default:
1016         break;
1017     }
1018     return code;
1019 }
1020 
SetInputUri4(int32_t index, OH_ImageEffect *imageEffect, OH_EffectFilter *filter)1021 ImageEffect_ErrorCode SetInputUri4(int32_t index, OH_ImageEffect *imageEffect, OH_EffectFilter *filter)
1022 {
1023     ImageEffect_Any value;
1024     ImageEffect_ErrorCode code;
1025     switch (index) {
1026     case CASE_INDEX_5:
1027         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_LONG;
1028         value.dataValue.longValue = 100L;
1029         code = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
1030         code = OH_ImageEffect_SetInputUri(imageEffect, g_jpgUri.c_str());
1031         break;
1032     case CASE_INDEX_6:
1033         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_BOOL;
1034         value.dataValue.boolValue = true;
1035         code = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
1036         code = OH_ImageEffect_SetInputUri(imageEffect, g_jpgUri.c_str());
1037         break;
1038     case CASE_INDEX_7:
1039         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_PTR;
1040         value.dataValue.ptrValue = nullptr;
1041         code = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
1042         code = OH_ImageEffect_SetInputUri(imageEffect, g_jpgUri.c_str());
1043         break;
1044     case CASE_INDEX_8:
1045         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_INT32;
1046         value.dataValue.int32Value = IMAGE_EFFECT_100;
1047         code = OH_EffectFilter_SetValue(filter, nullptr, &value);
1048         code = OH_ImageEffect_SetInputUri(imageEffect, g_jpgUri.c_str());
1049         break;
1050     default:
1051         break;
1052     }
1053     return code;
1054 }
1055 
OHImageEffectSetOutputUri(napi_env env, napi_callback_info info)1056 napi_value OHImageEffectSetOutputUri(napi_env env, napi_callback_info info)
1057 {
1058     OH_ImageEffect *imageEffect = OH_ImageEffect_Create(IMAGE_EFFECT_NAME);
1059     OH_EffectFilter *filter = OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_BRIGHTNESS_FILTER);
1060     size_t argc = 1;
1061     napi_value args[1] = {nullptr};
1062     napi_get_cb_info(env, info, &argc, args, nullptr, nullptr);
1063     int32_t index;
1064     napi_get_value_int32(env, args[0], &index);
1065     ImageEffect_Any value;
1066     ImageEffect_ErrorCode code;
1067     switch (index) {
1068     case CASE_INDEX_1:
1069     case CASE_INDEX_2:
1070     case CASE_INDEX_3:
1071     case CASE_INDEX_4:
1072         code = SetInputUri3(index, imageEffect, filter);
1073         break;
1074     case CASE_INDEX_5:
1075     case CASE_INDEX_6:
1076     case CASE_INDEX_7:
1077     case CASE_INDEX_8:
1078         code = SetInputUri4(index, imageEffect, filter);
1079         break;
1080     case CASE_INDEX_9:
1081         code = OH_ImageEffect_SetInputUri(nullptr, nullptr);
1082         break;
1083     case CASE_INDEX_10:
1084         code = OH_ImageEffect_SetInputUri(nullptr, g_jpgUri.c_str());
1085         break;
1086     case CASE_INDEX_11:
1087         value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_INT32;
1088         value.dataValue.int32Value = IMAGE_EFFECT_100;
1089         code = OH_EffectFilter_SetValue(filter, nullptr, &value);
1090         code = OH_ImageEffect_SetInputUri(imageEffect, nullptr);
1091         break;
1092     default:
1093         break;
1094     }
1095     if (code == EFFECT_SUCCESS) {
1096         code = OH_ImageEffect_SetOutputUri(imageEffect, g_jpgUri.c_str());
1097     }
1098     OH_ImageEffect_Release(imageEffect);
1099     napi_value ret;
1100     napi_create_int32(env, code, &ret);
1101     return ret;
1102 }
1103 
OHImageEffectStart(napi_env env, napi_callback_info info)1104 napi_value OHImageEffectStart(napi_env env, napi_callback_info info)
1105 {
1106     std::shared_ptr<OH_PixelmapNative> pixelmapNativePtr = PixelMapHelper::Decode(imagePath);
1107 
1108     OH_PixelmapNative *inputPixelmap = pixelmapNativePtr.get();
1109     OH_PixelmapNative *outputPixelmap = inputPixelmap;
1110 
1111     // 1、创建imageEffect实例,“ImageEdit”是imageEffect实例别名。
1112     OH_ImageEffect *imageEffect = OH_ImageEffect_Create("ImageEdit");
1113 
1114     // 2、添加滤镜,多次调用该接口可以添加多个滤镜,组成滤镜链。
1115     OH_EffectFilter *filter = OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_BRIGHTNESS_FILTER);
1116 
1117     // 3、设置滤镜参数, 滤镜强度设置为50
1118     ImageEffect_Any value;
1119     value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_FLOAT;
1120     value.dataValue.floatValue = IMAGE_EFFECT_50F;
1121     ImageEffect_ErrorCode errorCode = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
1122 
1123     // 4、设置输入的Pixelmap
1124     errorCode = OH_ImageEffect_SetInputPixelmap(imageEffect, inputPixelmap);
1125     if (errorCode != EFFECT_SUCCESS) {
1126         napi_value ret;
1127         napi_create_int32(env, errorCode, &ret);
1128         return ret;
1129     }
1130     // 5、设置输出的Pixelmap(可选),不调用该接口时会在输入Pixelmap上直接生效滤镜效果
1131     errorCode = OH_ImageEffect_SetOutputPixelmap(imageEffect, outputPixelmap);
1132     if (errorCode != EFFECT_SUCCESS) {
1133         napi_value ret;
1134         napi_create_int32(env, errorCode, &ret);
1135         return ret;
1136     }
1137     // 6、执行生效滤镜效果
1138     errorCode = OH_ImageEffect_Start(imageEffect);
1139     // 7、释放imageEffect实例资源
1140     OH_ImageEffect_Release(imageEffect);
1141     napi_value ret;
1142     napi_create_int32(env, errorCode, &ret);
1143     return ret;
1144 }
1145 
OHImageEffectStop(napi_env env, napi_callback_info info)1146 napi_value OHImageEffectStop(napi_env env, napi_callback_info info)
1147 {
1148     std::shared_ptr<OH_PixelmapNative> pixelmapNativePtr = PixelMapHelper::Decode(imagePath);
1149 
1150     OH_PixelmapNative *inputPixelmap = pixelmapNativePtr.get();
1151     OH_PixelmapNative *outputPixelmap = inputPixelmap;
1152 
1153     // 1、创建imageEffect实例,“ImageEdit”是imageEffect实例别名。
1154     OH_ImageEffect *imageEffect = OH_ImageEffect_Create("ImageEdit");
1155 
1156     // 2、添加滤镜,多次调用该接口可以添加多个滤镜,组成滤镜链。
1157     OH_EffectFilter *filter = OH_ImageEffect_AddFilter(imageEffect, OH_EFFECT_BRIGHTNESS_FILTER);
1158 
1159     // 3、设置滤镜参数, 滤镜强度设置为50
1160     ImageEffect_Any value;
1161     value.dataType = ImageEffect_DataType::EFFECT_DATA_TYPE_FLOAT;
1162     value.dataValue.floatValue = IMAGE_EFFECT_50F;
1163     ImageEffect_ErrorCode errorCode = OH_EffectFilter_SetValue(filter, KEY_FILTER_INTENSITY, &value);
1164 
1165     // 4、设置输入的Pixelmap
1166     errorCode = OH_ImageEffect_SetInputPixelmap(imageEffect, inputPixelmap);
1167     if (errorCode != EFFECT_SUCCESS) {
1168         napi_value ret;
1169         napi_create_int32(env, errorCode, &ret);
1170         return ret;
1171     }
1172     // 5、设置输出的Pixelmap(可选),不调用该接口时会在输入Pixelmap上直接生效滤镜效果
1173     errorCode = OH_ImageEffect_SetOutputPixelmap(imageEffect, outputPixelmap);
1174     if (errorCode != EFFECT_SUCCESS) {
1175         napi_value ret;
1176         napi_create_int32(env, errorCode, &ret);
1177         return ret;
1178     }
1179     // 6、执行生效滤镜效果
1180     errorCode = OH_ImageEffect_Start(imageEffect);
1181     if (errorCode != EFFECT_SUCCESS) {
1182         napi_value ret;
1183         napi_create_int32(env, errorCode, &ret);
1184         return ret;
1185     }
1186     // 7、执行生效滤镜效果
1187     errorCode = OH_ImageEffect_Stop(imageEffect);
1188 
1189     // 7、释放imageEffect实例资源
1190     OH_ImageEffect_Release(imageEffect);
1191 
1192     napi_value ret;
1193     napi_create_int32(env, errorCode, &ret);
1194     return ret;
1195 }
1196