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