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