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 <js_native_api.h>
17 #include "napi/native_api.h"
18 #include "native_effect/effect_filter.h"
19 #include "native_effect/effect_types.h"
20 #include <multimedia/image_framework/image/pixelmap_native.h>
21 #include <multimedia/image_framework/image/image_packer_native.h>
22 #include <multimedia/image_framework/image/image_source_native.h>
23 #include "multimedia/image_framework/image_pixel_map_mdk.h"
24 #include "hilog/log.h"
25
26 #define SUCCESS 0
27 #define FAIL (-1)
28 #define DOUBLE_NUM_05 0.5
29 #define DOUBLE_NUM_15 1.5
30 #define ARR_NUM_0 0
31 #define ARR_NUM_1 1
32 #define ARR_NUM_2 2
33 #define ARR_NUM_3 3
34
35 namespace {
36 constexpr int8_t ARGB_8888_BYTES = 4;
37 }
38
CreatePixelMap(OH_PixelmapNative *** pixelmap)39 static void CreatePixelMap(OH_PixelmapNative*** pixelmap)
40 {
41 OH_Pixelmap_InitializationOptions *ops = nullptr;
42 OH_PixelmapInitializationOptions_Create(&ops);
43 // 2 means alphaType
44 OH_PixelmapInitializationOptions_SetAlphaType(ops, 2);
45 // 4 means height
46 OH_PixelmapInitializationOptions_SetHeight(ops, 4);
47 // 4 means width
48 OH_PixelmapInitializationOptions_SetWidth(ops, 4);
49 // 4 means pixelFormat
50 OH_PixelmapInitializationOptions_SetPixelFormat(ops, 4);
51 // 255 means rgba data
52 uint8_t data[] = {
53 255, 255, 0, 255,
54 255, 255, 0, 255,
55 255, 255, 0, 255,
56 255, 255, 0, 255
57 };
58 // 16 means data length
59 size_t dataLength = 16;
60 OH_PixelmapNative_CreatePixelmap(data, dataLength, ops, *pixelmap);
61 }
62
OHFilterCreateEffect(napi_env env,napi_callback_info info)63 static napi_value OHFilterCreateEffect(napi_env env, napi_callback_info info)
64 {
65 napi_value result = nullptr;
66 OH_PixelmapNative *pixmap = nullptr;
67 OH_PixelmapNative **pixMap = &pixmap;
68 CreatePixelMap(&pixMap);
69 OH_Filter *filter = nullptr;
70 EffectErrorCode effectErrorCode = OH_Filter_CreateEffect(*pixMap, &filter);
71 if (effectErrorCode == EffectErrorCode::EFFECT_SUCCESS) {
72 napi_create_int32(env, SUCCESS, &result);
73 } else {
74 napi_create_int32(env, FAIL, &result);
75 }
76 OH_Filter_Release(filter);
77 OH_PixelmapNative_Release(*pixMap);
78 return result;
79 }
80
OHFilterCreateEffect001(napi_env env,napi_callback_info info)81 static napi_value OHFilterCreateEffect001(napi_env env, napi_callback_info info)
82 {
83 napi_value result = nullptr;
84 OH_PixelmapNative *pixmap = nullptr;
85 OH_PixelmapNative **pixMap = &pixmap;
86 CreatePixelMap(&pixMap);
87 OH_Filter *filter = nullptr;
88 if ((OH_Filter_CreateEffect(nullptr, &filter) != EffectErrorCode::EFFECT_SUCCESS) ||
89 (OH_Filter_CreateEffect(*pixMap, nullptr) != EffectErrorCode::EFFECT_SUCCESS)) {
90 napi_create_int32(env, SUCCESS, &result);
91 } else {
92 napi_create_int32(env, FAIL, &result);
93 }
94 OH_Filter_Release(filter);
95 OH_PixelmapNative_Release(*pixMap);
96 return result;
97 }
98
OHFilterInvert(napi_env env,napi_callback_info info)99 static napi_value OHFilterInvert(napi_env env, napi_callback_info info)
100 {
101 napi_value result = nullptr;
102 OH_PixelmapNative *pixmap = nullptr;
103 OH_PixelmapNative **pixMap = &pixmap;
104 CreatePixelMap(&pixMap);
105 OH_Filter *filter = nullptr;
106 OH_Filter_CreateEffect(*pixMap, &filter);
107 EffectErrorCode effectErrorCode = OH_Filter_Invert(nullptr);
108 if (effectErrorCode == EffectErrorCode::EFFECT_BAD_PARAMETER) {
109 napi_create_int32(env, SUCCESS, &result);
110 } else {
111 napi_create_int32(env, FAIL, &result);
112 }
113 OH_Filter_Release(filter);
114 OH_PixelmapNative_Release(*pixMap);
115 return result;
116 }
117
OHFilterInvert001(napi_env env,napi_callback_info info)118 static napi_value OHFilterInvert001(napi_env env, napi_callback_info info)
119 {
120 napi_value result = nullptr;
121 OH_PixelmapNative *pixmap = nullptr;
122 OH_PixelmapNative **pixMap = &pixmap;
123 CreatePixelMap(&pixMap);
124 OH_Filter *filter = nullptr;
125 OH_Filter_CreateEffect(*pixMap, &filter);
126 EffectErrorCode effectErrorCode = OH_Filter_Invert(filter);
127 if (effectErrorCode == EffectErrorCode::EFFECT_SUCCESS) {
128 napi_create_int32(env, SUCCESS, &result);
129 } else {
130 napi_create_int32(env, FAIL, &result);
131 }
132 OH_Filter_Release(filter);
133 OH_PixelmapNative_Release(*pixMap);
134 return result;
135 }
136
OHFilterBlur(napi_env env,napi_callback_info info)137 static napi_value OHFilterBlur(napi_env env, napi_callback_info info)
138 {
139 napi_value result = nullptr;
140 OH_PixelmapNative *pixmap = nullptr;
141 /** pixmap is necessary, otherwize can not create pixelmap*/
142 OH_PixelmapNative **pixMap = &pixmap;
143 CreatePixelMap(&pixMap);
144 OH_Filter *filter = nullptr;
145 OH_Filter_CreateEffect(*pixMap, &filter);
146 EffectErrorCode effectErrorCode = OH_Filter_Blur(filter, 0.5f);
147 if (effectErrorCode == EffectErrorCode::EFFECT_SUCCESS) {
148 napi_create_int32(env, SUCCESS, &result);
149 } else {
150 napi_create_int32(env, FAIL, &result);
151 }
152 OH_Filter_Release(filter);
153 OH_PixelmapNative_Release(*pixMap);
154 return result;
155 }
156
OHFilterBlur001(napi_env env,napi_callback_info info)157 static napi_value OHFilterBlur001(napi_env env, napi_callback_info info)
158 {
159 napi_value result = nullptr;
160 OH_PixelmapNative *pixmap = nullptr;
161 /** pixmap is necessary, otherwize can not create pixelmap*/
162 OH_PixelmapNative **pixMap = &pixmap;
163 CreatePixelMap(&pixMap);
164 OH_Filter *filter = nullptr;
165 OH_Filter_CreateEffect(*pixMap, &filter);
166 EffectErrorCode effectErrorCode = OH_Filter_Blur(nullptr, 0.5);
167 if (effectErrorCode == EffectErrorCode::EFFECT_BAD_PARAMETER) {
168 napi_create_int32(env, SUCCESS, &result);
169 } else {
170 napi_create_int32(env, FAIL, &result);
171 }
172 OH_Filter_Release(filter);
173 OH_PixelmapNative_Release(*pixMap);
174 return result;
175 }
176
OHFilterGrayScale(napi_env env,napi_callback_info info)177 static napi_value OHFilterGrayScale(napi_env env, napi_callback_info info)
178 {
179 napi_value result = nullptr;
180 OH_PixelmapNative *pixmap = nullptr;
181 /** pixmap is necessary, otherwize can not create pixelmap*/
182 OH_PixelmapNative **pixMap = &pixmap;
183 CreatePixelMap(&pixMap);
184 OH_Filter *filter = nullptr;
185 OH_Filter_CreateEffect(*pixMap, &filter);
186 EffectErrorCode effectErrorCode = OH_Filter_GrayScale(filter);
187 if (effectErrorCode == EffectErrorCode::EFFECT_SUCCESS) {
188 napi_create_int32(env, SUCCESS, &result);
189 } else {
190 napi_create_int32(env, FAIL, &result);
191 }
192 OH_Filter_Release(filter);
193 OH_PixelmapNative_Release(*pixMap);
194 return result;
195 }
196
OHFilterGrayScale001(napi_env env,napi_callback_info info)197 static napi_value OHFilterGrayScale001(napi_env env, napi_callback_info info)
198 {
199 napi_value result = nullptr;
200 OH_PixelmapNative *pixmap = nullptr;
201 /** pixmap is necessary, otherwize can not create pixelmap*/
202 OH_PixelmapNative **pixMap = &pixmap;
203 CreatePixelMap(&pixMap);
204 OH_Filter *filter = nullptr;
205 OH_Filter_CreateEffect(*pixMap, &filter);
206 EffectErrorCode effectErrorCode = OH_Filter_GrayScale(nullptr);
207 if (effectErrorCode == EffectErrorCode::EFFECT_BAD_PARAMETER) {
208 napi_create_int32(env, SUCCESS, &result);
209 } else {
210 napi_create_int32(env, FAIL, &result);
211 }
212 OH_Filter_Release(filter);
213 OH_PixelmapNative_Release(*pixMap);
214 return result;
215 }
216
OHFilterBrighten(napi_env env,napi_callback_info info)217 static napi_value OHFilterBrighten(napi_env env, napi_callback_info info)
218 {
219 napi_value result = nullptr;
220 OH_PixelmapNative *pixmap = nullptr;
221 /** pixmap is necessary, otherwize can not create pixelmap*/
222 OH_PixelmapNative **pixMap = &pixmap;
223 CreatePixelMap(&pixMap);
224 OH_Filter *filter = nullptr;
225 OH_Filter_CreateEffect(*pixMap, &filter);
226 EffectErrorCode effectErrorCode = OH_Filter_Brighten(filter, 0.5);
227 if (effectErrorCode == EffectErrorCode::EFFECT_SUCCESS) {
228 napi_create_int32(env, SUCCESS, &result);
229 } else {
230 napi_create_int32(env, FAIL, &result);
231 }
232 OH_Filter_Release(filter);
233 OH_PixelmapNative_Release(*pixMap);
234 return result;
235 }
236
OHFilterBrighten001(napi_env env,napi_callback_info info)237 static napi_value OHFilterBrighten001(napi_env env, napi_callback_info info)
238 {
239 napi_value result = nullptr;
240 OH_PixelmapNative *pixmap = nullptr;
241 /** pixmap is necessary, otherwize can not create pixelmap*/
242 OH_PixelmapNative **pixMap = &pixmap;
243 CreatePixelMap(&pixMap);
244 OH_Filter *filter = nullptr;
245 OH_Filter_CreateEffect(*pixMap, &filter);
246 EffectErrorCode effectErrorCode = OH_Filter_Brighten(nullptr, 0.5);
247 if (effectErrorCode == EffectErrorCode::EFFECT_BAD_PARAMETER) {
248 napi_create_int32(env, SUCCESS, &result);
249 } else {
250 napi_create_int32(env, FAIL, &result);
251 }
252 OH_Filter_Release(filter);
253 OH_PixelmapNative_Release(*pixMap);
254 return result;
255 }
256
OHFilterSetColorMatrix(napi_env env,napi_callback_info info)257 static napi_value OHFilterSetColorMatrix(napi_env env, napi_callback_info info)
258 {
259 napi_value result = nullptr;
260 OH_PixelmapNative *pixmap = nullptr;
261 /** pixmap is necessary, otherwize can not create pixelmap*/
262 OH_PixelmapNative **pixMap = &pixmap;
263 CreatePixelMap(&pixMap);
264 OH_Filter *filter = nullptr;
265 OH_Filter_CreateEffect(*pixMap, &filter);
266 OH_Filter_ColorMatrix matrix {
267 -1.0, 0, 0, 0, 1,
268 0, -1.0, 0, 0, 1,
269 0, 0, -1.0, 0, 1,
270 0, 0, 0, 1, 0
271 };
272 EffectErrorCode effectErrorCode = OH_Filter_SetColorMatrix(filter, &matrix);
273 if (effectErrorCode == EffectErrorCode::EFFECT_SUCCESS) {
274 napi_create_int32(env, SUCCESS, &result);
275 } else {
276 napi_create_int32(env, FAIL, &result);
277 }
278 OH_Filter_Release(filter);
279 OH_PixelmapNative_Release(*pixMap);
280 return result;
281 }
282
OHFilterSetColorMatrix001(napi_env env,napi_callback_info info)283 static napi_value OHFilterSetColorMatrix001(napi_env env, napi_callback_info info)
284 {
285 napi_value result = nullptr;
286 OH_PixelmapNative *pixmap = nullptr;
287 /** pixmap is necessary, otherwize can not create pixelmap*/
288 OH_PixelmapNative **pixMap = &pixmap;
289 CreatePixelMap(&pixMap);
290 OH_Filter *filter = nullptr;
291 OH_Filter_CreateEffect(*pixMap, &filter);
292 OH_Filter_ColorMatrix matrix {
293 -1.0, 0, 0, 0, 1,
294 0, -1.0, 0, 0, 1,
295 0, 0, -1.0, 0, 1,
296 0, 0, 0, 1, 0
297 };
298 EffectErrorCode effectErrorCode = OH_Filter_SetColorMatrix(nullptr, &matrix);
299 if (effectErrorCode == EffectErrorCode::EFFECT_BAD_PARAMETER) {
300 napi_create_int32(env, SUCCESS, &result);
301 } else {
302 napi_create_int32(env, FAIL, &result);
303 }
304 OH_Filter_Release(filter);
305 OH_PixelmapNative_Release(*pixMap);
306 return result;
307 }
308
OHFilterGetEffectPixelMap(napi_env env,napi_callback_info info)309 static napi_value OHFilterGetEffectPixelMap(napi_env env, napi_callback_info info)
310 {
311 napi_value result = nullptr;
312 OH_PixelmapNative *pixmap = nullptr;
313 /** pixmap is necessary, otherwize can not create pixelmap*/
314 OH_PixelmapNative **pixMap = &pixmap;
315 CreatePixelMap(&pixMap);
316 OH_Filter *filter = nullptr;
317 OH_Filter_CreateEffect(*pixMap, &filter);
318 OH_Filter_Invert(filter);
319 OH_PixelmapNative *pixelMap1 = nullptr;
320 EffectErrorCode effectErrorCode = OH_Filter_GetEffectPixelMap(filter, &pixelMap1);
321 if (effectErrorCode == EffectErrorCode::EFFECT_SUCCESS) {
322 napi_create_int32(env, SUCCESS, &result);
323 } else {
324 napi_create_int32(env, FAIL, &result);
325 }
326 OH_Filter_Release(filter);
327 OH_PixelmapNative_Release(*pixMap);
328 OH_PixelmapNative_Release(pixelMap1);
329 return result;
330 }
331
OHFilterRelease(napi_env env,napi_callback_info info)332 static napi_value OHFilterRelease(napi_env env, napi_callback_info info)
333 {
334 napi_value result = nullptr;
335 OH_PixelmapNative *pixmap = nullptr;
336 /** pixmap is necessary, otherwize can not create pixelmap*/
337 OH_PixelmapNative **pixMap = &pixmap;
338 CreatePixelMap(&pixMap);
339 OH_Filter *filter = nullptr;
340 OH_Filter_CreateEffect(*pixMap, &filter);
341 OH_Filter_Invert(filter);
342 EffectErrorCode effectErrorCode = OH_Filter_Release(filter);
343 if (effectErrorCode == EffectErrorCode::EFFECT_SUCCESS) {
344 napi_create_int32(env, SUCCESS, &result);
345 } else {
346 napi_create_int32(env, FAIL, &result);
347 }
348 OH_PixelmapNative_Release(*pixMap);
349 return result;
350 }
351
OHFilterRelease001(napi_env env,napi_callback_info info)352 static napi_value OHFilterRelease001(napi_env env, napi_callback_info info)
353 {
354 napi_value result = nullptr;
355 OH_PixelmapNative *pixmap = nullptr;
356 /** pixmap is necessary, otherwize can not create pixelmap*/
357 OH_PixelmapNative **pixMap = &pixmap;
358 CreatePixelMap(&pixMap);
359 OH_Filter *filter = nullptr;
360 OH_Filter_CreateEffect(*pixMap, &filter);
361 OH_Filter_Invert(filter);
362 EffectErrorCode effectErrorCode = OH_Filter_Release(nullptr);
363 if (effectErrorCode == EffectErrorCode::EFFECT_BAD_PARAMETER) {
364 napi_create_int32(env, SUCCESS, &result);
365 } else {
366 napi_create_int32(env, FAIL, &result);
367 }
368 OH_PixelmapNative_Release(*pixMap);
369 return result;
370 }
371
OHFilterBlurWithTileMode001(napi_env env,napi_callback_info info)372 static napi_value OHFilterBlurWithTileMode001(napi_env env, napi_callback_info info)
373 {
374 napi_value result = nullptr;
375 OH_PixelmapNative *pixmap = nullptr;
376 /** pixmap is necessary, otherwize can not create pixelmap*/
377 OH_PixelmapNative **pixMap = &pixmap;
378 CreatePixelMap(&pixMap);
379 OH_Filter *filter = nullptr;
380 if ((OH_Filter_CreateEffect(*pixMap, &filter) == EFFECT_SUCCESS) &&
381 (OH_Filter_BlurWithTileMode(filter, 0.5f, CLAMP) == EFFECT_SUCCESS) &&
382 (OH_Filter_BlurWithTileMode(nullptr, DOUBLE_NUM_05, CLAMP) == EFFECT_BAD_PARAMETER) &&
383 (OH_Filter_Release(filter) == EFFECT_SUCCESS)) {
384 napi_create_int32(env, SUCCESS, &result);
385 } else {
386 napi_create_int32(env, FAIL, &result);
387 }
388 OH_PixelmapNative_Release(*pixMap);
389 return result;
390 }
391
OHPixelmapNativeAccessPixels001(napi_env env,napi_callback_info info)392 static napi_value OHPixelmapNativeAccessPixels001(napi_env env, napi_callback_info info)
393 {
394 napi_value result = nullptr;
395 OH_Pixelmap_InitializationOptions *options = nullptr;
396 OH_PixelmapInitializationOptions_Create(&options);
397 OH_PixelmapInitializationOptions_SetWidth(options, 1);
398 OH_PixelmapInitializationOptions_SetHeight(options, 1);
399 OH_PixelmapNative *srcPixelmap = nullptr;
400 OH_PixelmapNative_CreateEmptyPixelmap(options, &srcPixelmap);
401 void *dstPixelmap = nullptr;
402 Image_ErrorCode ret = OH_PixelmapNative_AccessPixels(srcPixelmap, &dstPixelmap);
403 if (ret == IMAGE_SUCCESS) {
404 napi_create_int32(env, SUCCESS, &result);
405 } else {
406 napi_create_int32(env, FAIL, &result);
407 }
408 return result;
409 }
410
OHPixelmapNativeUnaccessPixels001(napi_env env,napi_callback_info info)411 static napi_value OHPixelmapNativeUnaccessPixels001(napi_env env, napi_callback_info info)
412 {
413 napi_value result = nullptr;
414 OH_Pixelmap_InitializationOptions *options = nullptr;
415 OH_PixelmapInitializationOptions_Create(&options);
416 OH_PixelmapInitializationOptions_SetWidth(options, 1);
417 OH_PixelmapInitializationOptions_SetHeight(options, 1);
418 OH_PixelmapNative *srcPixelmap = nullptr;
419 OH_PixelmapNative_CreateEmptyPixelmap(options, &srcPixelmap);
420 Image_ErrorCode ret = OH_PixelmapNative_UnaccessPixels(srcPixelmap);
421 if (ret == IMAGE_SUCCESS) {
422 napi_create_int32(env, SUCCESS, &result);
423 } else {
424 napi_create_int32(env, FAIL, &result);
425 }
426 return result;
427 }
428
429 EXTERN_C_START
Init(napi_env env,napi_value exports)430 static napi_value Init(napi_env env, napi_value exports)
431 {
432 napi_property_descriptor desc[] = {
433 {"oHFilterCreateEffect", nullptr, OHFilterCreateEffect, nullptr, nullptr, nullptr,
434 napi_default, nullptr},
435 {"oHFilterCreateEffect001", nullptr, OHFilterCreateEffect001, nullptr, nullptr, nullptr,
436 napi_default, nullptr},
437 {"oHFilterInvert", nullptr, OHFilterInvert, nullptr, nullptr, nullptr,
438 napi_default, nullptr},
439 {"oHFilterInvert001", nullptr, OHFilterInvert001, nullptr, nullptr, nullptr,
440 napi_default, nullptr},
441 {"oHFilterBlur", nullptr, OHFilterBlur, nullptr, nullptr, nullptr,
442 napi_default, nullptr},
443 {"oHFilterBlur001", nullptr, OHFilterBlur001, nullptr, nullptr, nullptr,
444 napi_default, nullptr},
445 {"oHFilterGrayScale", nullptr, OHFilterGrayScale, nullptr, nullptr, nullptr,
446 napi_default, nullptr},
447 {"oHFilterGrayScale001", nullptr, OHFilterGrayScale001, nullptr, nullptr, nullptr,
448 napi_default, nullptr},
449 {"oHFilterBrighten", nullptr, OHFilterBrighten, nullptr, nullptr, nullptr,
450 napi_default, nullptr},
451 {"oHFilterBrighten001", nullptr, OHFilterBrighten001, nullptr, nullptr, nullptr,
452 napi_default, nullptr},
453 {"oHFilterSetColorMatrix", nullptr, OHFilterSetColorMatrix, nullptr, nullptr, nullptr,
454 napi_default, nullptr},
455 {"oHFilterSetColorMatrix001", nullptr, OHFilterSetColorMatrix001, nullptr, nullptr, nullptr,
456 napi_default, nullptr},
457 {"oHFilterGetEffectPixelMap", nullptr, OHFilterGetEffectPixelMap, nullptr, nullptr, nullptr,
458 napi_default, nullptr},
459 {"oHFilterRelease", nullptr, OHFilterRelease, nullptr, nullptr, nullptr,
460 napi_default, nullptr},
461 {"oHFilterRelease001", nullptr, OHFilterRelease001, nullptr, nullptr, nullptr,
462 napi_default, nullptr},
463 {"oHFilterBlurWithTileMode001", nullptr, OHFilterBlurWithTileMode001, nullptr, nullptr, nullptr,
464 napi_default, nullptr},
465 {"oHPixelmapNativeAccessPixels001", nullptr, OHPixelmapNativeAccessPixels001,
466 nullptr, nullptr, nullptr, napi_default, nullptr},
467 {"oHPixelmapNativeUnaccessPixels001", nullptr, OHPixelmapNativeUnaccessPixels001,
468 nullptr, nullptr, nullptr, napi_default, nullptr},
469 };
470 napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
471 return exports;
472 }
473
474 EXTERN_C_END
475
476 static napi_module demoModule = {
477 .nm_version = 1,
478 .nm_flags = 0,
479 .nm_filename = nullptr,
480 .nm_register_func = Init,
481 .nm_modname = "nativeEffectNdk",
482 .nm_priv = ((void *)0),
483 .reserved = {0},
484 };
485
RegisterEntryModule(void)486 extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }