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 "hilog/log.h"
21
22#define SUCCESS 0
23#define FAIL (-1)
24
25static napi_value OHFilterCreateEffect(napi_env env, napi_callback_info info)
26{
27    napi_value result = nullptr;
28    OH_PixelmapNative *pixmap = nullptr;
29    OH_PixelmapNative **pixMap = &pixmap;
30    OH_Filter *filter = nullptr;
31    EffectErrorCode effectErrorCode = OH_Filter_CreateEffect(*pixMap, &filter);
32    if (effectErrorCode != EffectErrorCode::EFFECT_SUCCESS) {
33        napi_create_int32(env, SUCCESS, &result);
34    } else {
35        napi_create_int32(env, FAIL, &result);
36    }
37    return result;
38}
39
40static napi_value OHFilterInvert(napi_env env, napi_callback_info info)
41{
42    napi_value result = nullptr;
43    OH_Filter *filter = nullptr;
44    EffectErrorCode effectErrorCode = OH_Filter_Invert(filter);
45    if (effectErrorCode != EffectErrorCode::EFFECT_SUCCESS) {
46        napi_create_int32(env, SUCCESS, &result);
47    } else {
48        napi_create_int32(env, FAIL, &result);
49    }
50    return result;
51}
52
53static napi_value OHFilterBlur(napi_env env, napi_callback_info info)
54{
55    napi_value result = nullptr;
56    OH_Filter *filter = nullptr;
57    EffectErrorCode effectErrorCode = OH_Filter_Blur(filter, 0.5f);
58    if (effectErrorCode != EffectErrorCode::EFFECT_SUCCESS) {
59        napi_create_int32(env, SUCCESS, &result);
60    } else {
61        napi_create_int32(env, FAIL, &result);
62    }
63    return result;
64}
65
66static napi_value OHFilterGrayScale(napi_env env, napi_callback_info info)
67{
68    napi_value result = nullptr;
69    OH_Filter *filter = nullptr;
70    EffectErrorCode effectErrorCode = OH_Filter_GrayScale(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    return result;
77}
78
79static napi_value OHFilterBrighten(napi_env env, napi_callback_info info)
80{
81    napi_value result = nullptr;
82    OH_Filter *filter = nullptr;
83    EffectErrorCode effectErrorCode = OH_Filter_Brighten(filter, 0.5);
84    if (effectErrorCode != EffectErrorCode::EFFECT_SUCCESS) {
85        napi_create_int32(env, SUCCESS, &result);
86    } else {
87        napi_create_int32(env, FAIL, &result);
88    }
89    return result;
90}
91
92static napi_value OHFilterSetColorMatrix(napi_env env, napi_callback_info info)
93{
94    napi_value result = nullptr;
95    OH_Filter *filter = nullptr;
96    OH_Filter_ColorMatrix matrix {
97        -1.0, 0, 0, 0, 1,
98        0, -1.0, 0, 0, 1,
99        0, 0, -1.0, 0, 1,
100        0, 0, 0, 1, 0
101    };
102    EffectErrorCode effectErrorCode = OH_Filter_SetColorMatrix(filter, &matrix);
103    if (effectErrorCode != EffectErrorCode::EFFECT_SUCCESS) {
104        napi_create_int32(env, SUCCESS, &result);
105    } else {
106        napi_create_int32(env, FAIL, &result);
107    }
108    return result;
109}
110
111static napi_value OHFilterGetEffectPixelMap(napi_env env, napi_callback_info info)
112{
113    napi_value result = nullptr;
114    OH_PixelmapNative *pixmap = nullptr;
115    OH_Filter *filter = nullptr;
116    EffectErrorCode effectErrorCode = OH_Filter_GetEffectPixelMap(filter, &pixmap);
117    if (effectErrorCode != EffectErrorCode::EFFECT_SUCCESS) {
118        napi_create_int32(env, SUCCESS, &result);
119    } else {
120        napi_create_int32(env, FAIL, &result);
121    }
122    return result;
123}
124
125static napi_value OHFilterRelease(napi_env env, napi_callback_info info)
126{
127    napi_value result = nullptr;
128    OH_Filter *filter = nullptr;
129    EffectErrorCode effectErrorCode = OH_Filter_Release(filter);
130    if (effectErrorCode != EffectErrorCode::EFFECT_SUCCESS) {
131        napi_create_int32(env, SUCCESS, &result);
132    } else {
133        napi_create_int32(env, FAIL, &result);
134    }
135    return result;
136}
137
138EXTERN_C_START
139static napi_value Init(napi_env env, napi_value exports)
140{
141    napi_property_descriptor desc[] = {
142        {"oHFilterCreateEffect", nullptr, OHFilterCreateEffect, nullptr, nullptr, nullptr,
143         napi_default, nullptr},
144        {"oHFilterInvert", nullptr, OHFilterInvert, nullptr, nullptr, nullptr,
145         napi_default, nullptr},
146        {"oHFilterBlur", nullptr, OHFilterBlur, nullptr, nullptr, nullptr,
147         napi_default, nullptr},
148        {"oHFilterGrayScale", nullptr, OHFilterGrayScale, nullptr, nullptr, nullptr,
149         napi_default, nullptr},
150        {"oHFilterBrighten", nullptr, OHFilterBrighten, nullptr, nullptr, nullptr,
151         napi_default, nullptr},
152        {"oHFilterSetColorMatrix", nullptr, OHFilterSetColorMatrix, nullptr, nullptr, nullptr,
153         napi_default, nullptr},
154        {"oHFilterGetEffectPixelMap", nullptr, OHFilterGetEffectPixelMap, nullptr, nullptr, nullptr,
155         napi_default, nullptr},
156        {"oHFilterRelease", nullptr, OHFilterRelease, nullptr, nullptr, nullptr,
157         napi_default, nullptr},
158    };
159    napi_define_properties(env, exports, sizeof(desc) / sizeof(desc[0]), desc);
160    return exports;
161}
162
163EXTERN_C_END
164
165static napi_module demoModule = {
166    .nm_version = 1,
167    .nm_flags = 0,
168    .nm_filename = nullptr,
169    .nm_register_func = Init,
170    .nm_modname = "nativeEffectNdk",
171    .nm_priv = ((void *)0),
172    .reserved = {0},
173};
174
175extern "C" __attribute__((constructor)) void RegisterEntryModule(void) { napi_module_register(&demoModule); }