• 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 <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); }