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