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 }