1 /*
2  * Copyright (C) 2022 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 "image_pixel_map_mdk.h"
17 #include "image_pixel_map_napi_kits.h"
18 #include "native_pixel_map.h"
19 #include "common_utils.h"
20 
21 using namespace OHOS::Media;
22 #ifdef __cplusplus
23 extern "C" {
24 #endif
25 
26 struct NativePixelMap_ {
27     PixelMapNapi* napi = nullptr;
28 };
29 
30 MIDK_EXPORT
OH_PixelMap_InitNativePixelMap(napi_env env,napi_value source)31 NativePixelMap* OH_PixelMap_InitNativePixelMap(napi_env env, napi_value source)
32 {
33     PixelMapNapi* napi = PixelMapNapi_Unwrap(env, source);
34     if (napi == nullptr) {
35         return nullptr;
36     }
37     std::unique_ptr<NativePixelMap> result = std::make_unique<NativePixelMap>();
38     result->napi = napi;
39     return result.release();
40 }
41 
42 MIDK_EXPORT
OH_PixelMap_CreatePixelMap(napi_env env,OhosPixelMapCreateOps info,void * buf,size_t len,napi_value * res)43 int32_t OH_PixelMap_CreatePixelMap(napi_env env, OhosPixelMapCreateOps info,
44     void* buf, size_t len, napi_value* res)
45 {
46     PixelMapNapiArgs args;
47     args.createOptions.width = info.width;
48     args.createOptions.height = info.height;
49     args.createOptions.pixelFormat = info.pixelFormat;
50     args.createOptions.editable = info.editable;
51     args.createOptions.alphaType = info.alphaType;
52     args.createOptions.scaleMode = info.scaleMode;
53     args.rowStride = 0;
54     args.inBuffer = buf;
55     args.bufferLen = len;
56     args.outValue = res;
57     args.useDMA = false;
58     return PixelMapNapiNativeEnvCall(ENV_FUNC_CREATE, env, &args);
59 }
60 
61 MIDK_EXPORT
OH_PixelMap_CreatePixelMapWithStride(napi_env env,OhosPixelMapCreateOps info,void * buf,size_t len,int32_t rowStride,napi_value * res)62 int32_t OH_PixelMap_CreatePixelMapWithStride(napi_env env, OhosPixelMapCreateOps info,
63     void* buf, size_t len, int32_t rowStride, napi_value* res)
64 {
65     PixelMapNapiArgs args;
66     args.createOptions.width = info.width;
67     args.createOptions.height = info.height;
68     args.createOptions.pixelFormat = info.pixelFormat;
69     args.createOptions.editable = info.editable;
70     args.createOptions.alphaType = info.alphaType;
71     args.createOptions.scaleMode = info.scaleMode;
72     args.rowStride = rowStride;
73     args.inBuffer = buf;
74     args.bufferLen = len;
75     args.outValue = res;
76     args.useDMA = true;
77     return PixelMapNapiNativeEnvCall(ENV_FUNC_CREATE, env, &args);
78 }
79 
80 MIDK_EXPORT
OH_PixelMap_CreateAlphaPixelMap(napi_env env,napi_value source,napi_value * alpha)81 int32_t OH_PixelMap_CreateAlphaPixelMap(napi_env env, napi_value source, napi_value* alpha)
82 {
83     PixelMapNapiArgs args;
84     args.inValue = source;
85     args.outValue = alpha;
86     return PixelMapNapiNativeEnvCall(ENV_FUNC_CREATE_ALPHA, env, &args);
87 }
88 
89 
90 MIDK_EXPORT
OH_PixelMap_GetBytesNumberPerRow(const NativePixelMap * native,int32_t * num)91 int32_t OH_PixelMap_GetBytesNumberPerRow(const NativePixelMap* native, int32_t* num)
92 {
93     if (native == nullptr || native->napi == nullptr) {
94         return IMAGE_RESULT_BAD_PARAMETER;
95     }
96     PixelMapNapiArgs args;
97     args.outNum = num;
98     return PixelMapNapiNativeCtxCall(CTX_FUNC_GET_ROW_BYTES, native->napi, &args);
99 }
100 
101 MIDK_EXPORT
OH_PixelMap_GetIsEditable(const NativePixelMap * native,int32_t * editable)102 int32_t OH_PixelMap_GetIsEditable(const NativePixelMap* native, int32_t* editable)
103 {
104     if (native == nullptr || native->napi == nullptr) {
105         return IMAGE_RESULT_BAD_PARAMETER;
106     }
107     PixelMapNapiArgs args;
108     args.outNum = editable;
109     return PixelMapNapiNativeCtxCall(CTX_FUNC_IS_EDITABLE, native->napi, &args);
110 }
111 
112 MIDK_EXPORT
OH_PixelMap_IsSupportAlpha(const NativePixelMap * native,int32_t * alpha)113 int32_t OH_PixelMap_IsSupportAlpha(const NativePixelMap* native, int32_t* alpha)
114 {
115     if (native == nullptr || native->napi == nullptr) {
116         return IMAGE_RESULT_BAD_PARAMETER;
117     }
118     PixelMapNapiArgs args;
119     args.outNum = alpha;
120     return PixelMapNapiNativeCtxCall(CTX_FUNC_IS_SUPPORT_ALPHA, native->napi, &args);
121 }
122 
123 MIDK_EXPORT
OH_PixelMap_SetAlphaAble(const NativePixelMap * native,int32_t alpha)124 int32_t OH_PixelMap_SetAlphaAble(const NativePixelMap* native, int32_t alpha)
125 {
126     if (native == nullptr || native->napi == nullptr) {
127         return IMAGE_RESULT_BAD_PARAMETER;
128     }
129     PixelMapNapiArgs args;
130     args.inNum0 = alpha;
131     return PixelMapNapiNativeCtxCall(CTX_FUNC_SET_ALPHAABLE, native->napi, &args);
132 }
133 
134 MIDK_EXPORT
OH_PixelMap_GetDensity(const NativePixelMap * native,int32_t * density)135 int32_t OH_PixelMap_GetDensity(const NativePixelMap* native, int32_t* density)
136 {
137     if (native == nullptr || native->napi == nullptr) {
138         return IMAGE_RESULT_BAD_PARAMETER;
139     }
140     PixelMapNapiArgs args;
141     args.outNum = density;
142     return PixelMapNapiNativeCtxCall(CTX_FUNC_GET_DENSITY, native->napi, &args);
143 }
144 
145 MIDK_EXPORT
OH_PixelMap_SetDensity(const NativePixelMap * native,int32_t density)146 int32_t OH_PixelMap_SetDensity(const NativePixelMap* native, int32_t density)
147 {
148     if (native == nullptr || native->napi == nullptr) {
149         return IMAGE_RESULT_BAD_PARAMETER;
150     }
151     PixelMapNapiArgs args;
152     args.inNum0 = density;
153     return PixelMapNapiNativeCtxCall(CTX_FUNC_SET_DENSITY, native->napi, &args);
154 }
155 
156 MIDK_EXPORT
OH_PixelMap_SetOpacity(const NativePixelMap * native,float opacity)157 int32_t OH_PixelMap_SetOpacity(const NativePixelMap* native, float opacity)
158 {
159     if (native == nullptr || native->napi == nullptr) {
160         return IMAGE_RESULT_BAD_PARAMETER;
161     }
162     PixelMapNapiArgs args;
163     args.inFloat0 = opacity;
164     return PixelMapNapiNativeCtxCall(CTX_FUNC_SET_OPACITY, native->napi, &args);
165 }
166 
167 MIDK_EXPORT
OH_PixelMap_Scale(const NativePixelMap * native,float x,float y)168 int32_t OH_PixelMap_Scale(const NativePixelMap* native, float x, float y)
169 {
170     if (native == nullptr || native->napi == nullptr) {
171         return IMAGE_RESULT_BAD_PARAMETER;
172     }
173     PixelMapNapiArgs args;
174     args.inFloat0 = x;
175     args.inFloat1 = y;
176     args.inNum0 = OH_PixelMap_AntiAliasingLevel::OH_PixelMap_AntiAliasing_NONE;
177     return PixelMapNapiNativeCtxCall(CTX_FUNC_SCALE, native->napi, &args);
178 }
179 
180 MIDK_EXPORT
OH_PixelMap_ScaleWithAntiAliasing(const NativePixelMap * native,float x,float y,OH_PixelMap_AntiAliasingLevel level)181 int32_t OH_PixelMap_ScaleWithAntiAliasing(const NativePixelMap* native, float x, float y,
182     OH_PixelMap_AntiAliasingLevel level)
183 {
184     if (native == nullptr || native->napi == nullptr) {
185         return IMAGE_RESULT_BAD_PARAMETER;
186     }
187     PixelMapNapiArgs args;
188     args.inFloat0 = x;
189     args.inFloat1 = y;
190     args.inNum0 = level;
191     return PixelMapNapiNativeCtxCall(CTX_FUNC_SCALE, native->napi, &args);
192 }
193 
194 MIDK_EXPORT
OH_PixelMap_Translate(const NativePixelMap * native,float x,float y)195 int32_t OH_PixelMap_Translate(const NativePixelMap* native, float x, float y)
196 {
197     if (native == nullptr || native->napi == nullptr) {
198         return IMAGE_RESULT_BAD_PARAMETER;
199     }
200     PixelMapNapiArgs args;
201     args.inFloat0 = x;
202     args.inFloat1 = y;
203     return PixelMapNapiNativeCtxCall(CTX_FUNC_TRANSLATE, native->napi, &args);
204 }
205 
206 MIDK_EXPORT
OH_PixelMap_Rotate(const NativePixelMap * native,float angle)207 int32_t OH_PixelMap_Rotate(const NativePixelMap* native, float angle)
208 {
209     if (native == nullptr || native->napi == nullptr) {
210         return IMAGE_RESULT_BAD_PARAMETER;
211     }
212     PixelMapNapiArgs args;
213     args.inFloat0 = angle;
214     return PixelMapNapiNativeCtxCall(CTX_FUNC_ROTATE, native->napi, &args);
215 }
216 
217 MIDK_EXPORT
OH_PixelMap_Flip(const NativePixelMap * native,int32_t x,int32_t y)218 int32_t OH_PixelMap_Flip(const NativePixelMap* native, int32_t x, int32_t y)
219 {
220     if (native == nullptr || native->napi == nullptr) {
221         return IMAGE_RESULT_BAD_PARAMETER;
222     }
223     PixelMapNapiArgs args;
224     args.inNum0 = x;
225     args.inNum1 = y;
226     return PixelMapNapiNativeCtxCall(CTX_FUNC_FLIP, native->napi, &args);
227 }
228 
229 MIDK_EXPORT
OH_PixelMap_Crop(const NativePixelMap * native,int32_t x,int32_t y,int32_t width,int32_t height)230 int32_t OH_PixelMap_Crop(const NativePixelMap* native, int32_t x, int32_t y, int32_t width, int32_t height)
231 {
232     if (native == nullptr || native->napi == nullptr) {
233         return IMAGE_RESULT_BAD_PARAMETER;
234     }
235     PixelMapNapiArgs args;
236     args.inNum0 = x;
237     args.inNum1 = y;
238     args.inNum2 = width;
239     args.inNum3 = height;
240     return PixelMapNapiNativeCtxCall(CTX_FUNC_CROP, native->napi, &args);
241 }
242 
243 MIDK_EXPORT
OH_PixelMap_GetImageInfo(const NativePixelMap * native,OhosPixelMapInfos * info)244 int32_t OH_PixelMap_GetImageInfo(const NativePixelMap* native, OhosPixelMapInfos *info)
245 {
246     if (native == nullptr || native->napi == nullptr) {
247         return IMAGE_RESULT_BAD_PARAMETER;
248     }
249     PixelMapNapiArgs args;
250     args.outInfo = info;
251     return PixelMapNapiNativeCtxCall(CTX_FUNC_GET_IMAGE_INFO, native->napi, &args);
252 }
253 
254 MIDK_EXPORT
OH_PixelMap_AccessPixels(const NativePixelMap * native,void ** addr)255 int32_t OH_PixelMap_AccessPixels(const NativePixelMap* native, void** addr)
256 {
257     if (native == nullptr || native->napi == nullptr) {
258         return IMAGE_RESULT_BAD_PARAMETER;
259     }
260     PixelMapNapiArgs args;
261     args.outAddr = addr;
262     return PixelMapNapiNativeCtxCall(CTX_FUNC_ACCESS_PIXELS, native->napi, &args);
263 }
264 
265 MIDK_EXPORT
OH_PixelMap_UnAccessPixels(const NativePixelMap * native)266 int32_t OH_PixelMap_UnAccessPixels(const NativePixelMap* native)
267 {
268     if (native == nullptr || native->napi == nullptr) {
269         return IMAGE_RESULT_BAD_PARAMETER;
270     }
271     PixelMapNapiArgs args;
272     return PixelMapNapiNativeCtxCall(CTX_FUNC_UNACCESS_PIXELS, native->napi, &args);
273 }
274 
275 #ifdef __cplusplus
276 };
277 #endif
278 
279 namespace OHOS {
280 namespace Media {
OH_PixelMapNative_GetPixelMapNapi(struct NativePixelMap_ * nativePixelMap)281 PixelMapNapi *OH_PixelMapNative_GetPixelMapNapi(struct NativePixelMap_ *nativePixelMap)
282 {
283     return nativePixelMap == nullptr ? nullptr : nativePixelMap->napi;
284 }
285 }
286 }