• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 "pixelmap_native.h"
17 
18 #include "common_utils.h"
19 #include "image_type.h"
20 #include "image_utils.h"
21 #include "image_pixel_map_napi_kits.h"
22 #include "pixel_map_napi.h"
23 #include "pixelmap_native_impl.h"
24 #include "image_format_convert.h"
25 #include "surface_buffer.h"
26 
27 #include "vpe_utils.h"
28 #include "refbase.h"
29 #include "securec.h"
30 #include "color_utils.h"
31 #include "media_errors.h"
32 #include "memory.h"
33 #include "image_log.h"
34 
35 #include "native_color_space_manager.h"
36 #include "ndk_color_space.h"
37 
38 using namespace OHOS::Media;
39 #ifdef __cplusplus
40 extern "C" {
41 #endif
42 
43 constexpr int32_t IMAGE_BASE = 62980096;
44 static constexpr int32_t IMAGE_BASE_19 = 19;
45 static constexpr int32_t IMAGE_BASE_16 = 16;
46 static constexpr int32_t IMAGE_BASE_17 = 17;
47 static constexpr int32_t IMAGE_BASE_26 = 26;
48 static constexpr int32_t IMAGE_BASE_31 = 31;
49 static constexpr int32_t IMAGE_BASE_152 = 152;
50 static constexpr int32_t IMAGE_BASE_27 = 27;
51 static constexpr int32_t IMAGE_BASE_12 = 12;
52 static constexpr int32_t IMAGE_BASE_13 = 13;
53 static constexpr int32_t IMAGE_BASE_6 = 6;
54 static constexpr int32_t IMAGE_BASE_14 = 14;
55 static constexpr int32_t IMAGE_BASE_4 = 4;
56 static constexpr int32_t IMAGE_BASE_9 = 9;
57 static constexpr int32_t IMAGE_BASE_20 = 20;
58 static constexpr int32_t IMAGE_BASE_22 = 22;
59 static constexpr int32_t IMAGE_BASE_23 = 23;
60 
61 struct OH_Pixelmap_InitializationOptions {
62     uint32_t width;
63     uint32_t height;
64     PIXEL_FORMAT srcPixelFormat = PIXEL_FORMAT::PIXEL_FORMAT_BGRA_8888;
65     PIXEL_FORMAT pixelFormat = PIXEL_FORMAT::PIXEL_FORMAT_UNKNOWN;
66     bool editable = true;
67     PIXELMAP_ALPHA_TYPE alphaType = PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_UNKNOWN;
68     int32_t srcRowStride = 0;
69 };
70 
71 struct OH_Pixelmap_ImageInfo {
72     uint32_t width;
73     uint32_t height;
74     uint32_t rowStride;
75     int32_t pixelFormat = PIXEL_FORMAT::PIXEL_FORMAT_UNKNOWN;
76     PIXELMAP_ALPHA_TYPE alphaMode = PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_UNKNOWN;
77     PIXELMAP_ALPHA_TYPE alphaType = PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_UNKNOWN;
78     bool isHdr = false;
79     Image_MimeType mimeType;
80 };
81 
ParsePixelForamt(int32_t val)82 static PIXEL_FORMAT ParsePixelForamt(int32_t val)
83 {
84     if (val <= static_cast<int32_t>(PIXEL_FORMAT::PIXEL_FORMAT_YCRCB_P010)) {
85         return PIXEL_FORMAT(val);
86     }
87 
88     return PIXEL_FORMAT::PIXEL_FORMAT_UNKNOWN;
89 }
90 
ParseAlphaType(int32_t val)91 static PIXELMAP_ALPHA_TYPE ParseAlphaType(int32_t val)
92 {
93     if (val <= static_cast<int32_t>(PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_UNPREMULTIPLIED)) {
94         return PIXELMAP_ALPHA_TYPE(val);
95     }
96 
97     return PIXELMAP_ALPHA_TYPE::PIXELMAP_ALPHA_TYPE_UNKNOWN;
98 }
99 
ToNewErrorCode(int code)100 static Image_ErrorCode ToNewErrorCode(int code)
101 {
102     switch (code) {
103         case 0:
104             return IMAGE_SUCCESS;
105         case IMAGE_BASE + IMAGE_BASE_19:
106             return IMAGE_BAD_PARAMETER;
107         case IMAGE_BASE + IMAGE_BASE_16:
108         case IMAGE_BASE + IMAGE_BASE_17:
109         case IMAGE_BASE + IMAGE_BASE_26:
110             return IMAGE_UNKNOWN_MIME_TYPE;
111         case IMAGE_BASE + IMAGE_BASE_31:
112             return IMAGE_TOO_LARGE;
113         case IMAGE_BASE + IMAGE_BASE_152:
114             return IMAGE_UNSUPPORTED_OPERATION;
115         case IMAGE_BASE + IMAGE_BASE_27:
116             return IMAGE_UNSUPPORTED_METADATA;
117         case IMAGE_BASE + IMAGE_BASE_12:
118             return IMAGE_UNSUPPORTED_CONVERSION;
119         case IMAGE_BASE + IMAGE_BASE_13:
120             return IMAGE_INVALID_REGION;
121         case IMAGE_BASE + IMAGE_BASE_6:
122             return IMAGE_ALLOC_FAILED;
123         case IMAGE_BASE + IMAGE_BASE_14:
124             return IMAGE_BAD_SOURCE;
125         case IMAGE_BASE + IMAGE_BASE_4:
126         case IMAGE_BASE + IMAGE_BASE_9:
127         case IMAGE_BASE + IMAGE_BASE_20:
128         case IMAGE_BASE + IMAGE_BASE_22:
129             return IMAGE_DECODE_FAILED;
130         case IMAGE_BASE + IMAGE_BASE_23:
131             return IMAGE_ENCODE_FAILED;
132         default:
133             return IMAGE_UNKNOWN_ERROR;
134     }
135 };
136 
IsMatchType(IMAGE_FORMAT type,PixelFormat format)137 static bool IsMatchType(IMAGE_FORMAT type, PixelFormat format)
138 {
139     if (type == IMAGE_FORMAT::IMAGE_FORMAT_YUV_TYPE) {
140         switch (format) {
141             case PixelFormat::NV12:
142             case PixelFormat::NV21:{
143                 return true;
144             }
145             default:{
146                 return false;
147             }
148         }
149     } else if (type == IMAGE_FORMAT::IMAGE_FORMAT_RGB_TYPE) {
150         switch (format) {
151             case PixelFormat::RGB_565:
152             case PixelFormat::RGBA_8888:
153             case PixelFormat::BGRA_8888:
154             case PixelFormat::RGB_888:
155             case PixelFormat::RGBA_F16:{
156                 return true;
157             }
158             default:{
159                 return false;
160             }
161         }
162     } else {
163         return false;
164     }
165 }
166 
releaseMimeType(Image_MimeType * mimeType)167 static void releaseMimeType(Image_MimeType *mimeType)
168 {
169     if (mimeType->data != nullptr) {
170         free(mimeType->data);
171         mimeType->data = nullptr;
172     }
173     mimeType->size = 0;
174 }
175 
176 MIDK_EXPORT
OH_PixelmapInitializationOptions_Create(OH_Pixelmap_InitializationOptions ** ops)177 Image_ErrorCode OH_PixelmapInitializationOptions_Create(OH_Pixelmap_InitializationOptions **ops)
178 {
179     if (ops == nullptr) {
180         return IMAGE_BAD_PARAMETER;
181     }
182     *ops = new OH_Pixelmap_InitializationOptions();
183     if (*ops == nullptr) {
184         return IMAGE_BAD_PARAMETER;
185     }
186     return IMAGE_SUCCESS;
187 }
188 
189 MIDK_EXPORT
OH_PixelmapInitializationOptions_GetWidth(OH_Pixelmap_InitializationOptions * ops,uint32_t * width)190 Image_ErrorCode OH_PixelmapInitializationOptions_GetWidth(OH_Pixelmap_InitializationOptions *ops,
191     uint32_t *width)
192 {
193     if (ops == nullptr || width == nullptr) {
194         return IMAGE_BAD_PARAMETER;
195     }
196     *width = ops->width;
197     return IMAGE_SUCCESS;
198 }
199 
200 MIDK_EXPORT
OH_PixelmapInitializationOptions_SetWidth(OH_Pixelmap_InitializationOptions * ops,uint32_t width)201 Image_ErrorCode OH_PixelmapInitializationOptions_SetWidth(OH_Pixelmap_InitializationOptions *ops,
202     uint32_t width)
203 {
204     if (ops == nullptr) {
205         return IMAGE_BAD_PARAMETER;
206     }
207     ops->width = width;
208     return IMAGE_SUCCESS;
209 }
210 
211 MIDK_EXPORT
OH_PixelmapInitializationOptions_GetHeight(OH_Pixelmap_InitializationOptions * ops,uint32_t * height)212 Image_ErrorCode OH_PixelmapInitializationOptions_GetHeight(OH_Pixelmap_InitializationOptions *ops,
213     uint32_t *height)
214 {
215     if (ops == nullptr || height == nullptr) {
216         return IMAGE_BAD_PARAMETER;
217     }
218     *height = ops->height;
219     return IMAGE_SUCCESS;
220 }
221 
222 MIDK_EXPORT
OH_PixelmapInitializationOptions_SetHeight(OH_Pixelmap_InitializationOptions * ops,uint32_t height)223 Image_ErrorCode OH_PixelmapInitializationOptions_SetHeight(OH_Pixelmap_InitializationOptions *ops,
224     uint32_t height)
225 {
226     if (ops == nullptr) {
227         return IMAGE_BAD_PARAMETER;
228     }
229     ops->height = height;
230     return IMAGE_SUCCESS;
231 }
232 
233 MIDK_EXPORT
OH_PixelmapInitializationOptions_GetPixelFormat(OH_Pixelmap_InitializationOptions * ops,int32_t * pixelFormat)234 Image_ErrorCode OH_PixelmapInitializationOptions_GetPixelFormat(OH_Pixelmap_InitializationOptions *ops,
235     int32_t *pixelFormat)
236 {
237     if (ops == nullptr || pixelFormat == nullptr) {
238         return IMAGE_BAD_PARAMETER;
239     }
240     *pixelFormat = static_cast<int32_t>(ops->pixelFormat);
241     return IMAGE_SUCCESS;
242 }
243 
244 MIDK_EXPORT
OH_PixelmapInitializationOptions_SetPixelFormat(OH_Pixelmap_InitializationOptions * ops,int32_t pixelFormat)245 Image_ErrorCode OH_PixelmapInitializationOptions_SetPixelFormat(OH_Pixelmap_InitializationOptions *ops,
246     int32_t pixelFormat)
247 {
248     if (ops == nullptr) {
249         return IMAGE_BAD_PARAMETER;
250     }
251     ops->pixelFormat = ParsePixelForamt(pixelFormat);
252     return IMAGE_SUCCESS;
253 }
254 
255 MIDK_EXPORT
OH_PixelmapInitializationOptions_GetSrcPixelFormat(OH_Pixelmap_InitializationOptions * ops,int32_t * srcpixelFormat)256 Image_ErrorCode OH_PixelmapInitializationOptions_GetSrcPixelFormat(OH_Pixelmap_InitializationOptions *ops,
257     int32_t *srcpixelFormat)
258 {
259     if (ops == nullptr || srcpixelFormat == nullptr) {
260         return IMAGE_BAD_PARAMETER;
261     }
262     *srcpixelFormat = static_cast<int32_t>(ops->srcPixelFormat);
263     return IMAGE_SUCCESS;
264 }
265 
266 MIDK_EXPORT
OH_PixelmapInitializationOptions_SetSrcPixelFormat(OH_Pixelmap_InitializationOptions * ops,int32_t srcpixelFormat)267 Image_ErrorCode OH_PixelmapInitializationOptions_SetSrcPixelFormat(OH_Pixelmap_InitializationOptions *ops,
268     int32_t srcpixelFormat)
269 {
270     if (ops == nullptr) {
271         return IMAGE_BAD_PARAMETER;
272     }
273     ops->srcPixelFormat = ParsePixelForamt(srcpixelFormat);
274     return IMAGE_SUCCESS;
275 }
276 
277 MIDK_EXPORT
OH_PixelmapInitializationOptions_GetAlphaType(OH_Pixelmap_InitializationOptions * ops,int32_t * alphaType)278 Image_ErrorCode OH_PixelmapInitializationOptions_GetAlphaType(OH_Pixelmap_InitializationOptions *ops,
279     int32_t *alphaType)
280 {
281     if (ops == nullptr || alphaType == nullptr) {
282         return IMAGE_BAD_PARAMETER;
283     }
284     *alphaType = static_cast<int32_t>(ops->alphaType);
285     return IMAGE_SUCCESS;
286 }
287 
288 MIDK_EXPORT
OH_PixelmapInitializationOptions_SetAlphaType(OH_Pixelmap_InitializationOptions * ops,int32_t alphaType)289 Image_ErrorCode OH_PixelmapInitializationOptions_SetAlphaType(OH_Pixelmap_InitializationOptions *ops,
290     int32_t alphaType)
291 {
292     if (ops == nullptr) {
293         return IMAGE_BAD_PARAMETER;
294     }
295     ops->alphaType = ParseAlphaType(alphaType);
296     return IMAGE_SUCCESS;
297 }
298 
299 MIDK_EXPORT
OH_PixelmapInitializationOptions_GetEditable(OH_Pixelmap_InitializationOptions * options,bool * editable)300 Image_ErrorCode OH_PixelmapInitializationOptions_GetEditable(OH_Pixelmap_InitializationOptions *options,
301     bool *editable)
302 {
303     if (options == nullptr || editable == nullptr) {
304         return IMAGE_BAD_PARAMETER;
305     }
306     *editable = options->editable;
307     return IMAGE_SUCCESS;
308 }
309 
310 MIDK_EXPORT
OH_PixelmapInitializationOptions_SetEditable(OH_Pixelmap_InitializationOptions * options,bool editable)311 Image_ErrorCode OH_PixelmapInitializationOptions_SetEditable(OH_Pixelmap_InitializationOptions *options,
312     bool editable)
313 {
314     if (options == nullptr) {
315         return IMAGE_BAD_PARAMETER;
316     }
317     options->editable = editable;
318     return IMAGE_SUCCESS;
319 }
320 
321 MIDK_EXPORT
OH_PixelmapInitializationOptions_GetRowStride(OH_Pixelmap_InitializationOptions * options,int32_t * rowStride)322 Image_ErrorCode OH_PixelmapInitializationOptions_GetRowStride(OH_Pixelmap_InitializationOptions *options,
323     int32_t *rowStride)
324 {
325     if (options == nullptr || rowStride == nullptr) {
326         return IMAGE_BAD_PARAMETER;
327     }
328     *rowStride = options->srcRowStride;
329     return IMAGE_SUCCESS;
330 }
331 
332 MIDK_EXPORT
OH_PixelmapInitializationOptions_SetRowStride(OH_Pixelmap_InitializationOptions * options,int32_t rowStride)333 Image_ErrorCode OH_PixelmapInitializationOptions_SetRowStride(OH_Pixelmap_InitializationOptions *options,
334     int32_t rowStride)
335 {
336     if (options == nullptr) {
337         return IMAGE_BAD_PARAMETER;
338     }
339     options->srcRowStride = rowStride;
340     return IMAGE_SUCCESS;
341 }
342 
343 MIDK_EXPORT
OH_PixelmapInitializationOptions_Release(OH_Pixelmap_InitializationOptions * ops)344 Image_ErrorCode OH_PixelmapInitializationOptions_Release(OH_Pixelmap_InitializationOptions *ops)
345 {
346     if (ops == nullptr) {
347         return IMAGE_BAD_PARAMETER;
348     }
349     delete ops;
350     ops = nullptr;
351     return IMAGE_SUCCESS;
352 }
353 
354 MIDK_EXPORT
OH_PixelmapImageInfo_Create(OH_Pixelmap_ImageInfo ** info)355 Image_ErrorCode OH_PixelmapImageInfo_Create(OH_Pixelmap_ImageInfo **info)
356 {
357     if (info == nullptr) {
358         return IMAGE_BAD_PARAMETER;
359     }
360     *info = new OH_Pixelmap_ImageInfo();
361     if (*info == nullptr) {
362         return IMAGE_BAD_PARAMETER;
363     }
364     return IMAGE_SUCCESS;
365 }
366 
367 MIDK_EXPORT
OH_PixelmapImageInfo_GetWidth(OH_Pixelmap_ImageInfo * info,uint32_t * width)368 Image_ErrorCode OH_PixelmapImageInfo_GetWidth(OH_Pixelmap_ImageInfo *info, uint32_t *width)
369 {
370     if (info == nullptr || width == nullptr) {
371         return IMAGE_BAD_PARAMETER;
372     }
373     *width =  info->width;
374     return IMAGE_SUCCESS;
375 }
376 
377 MIDK_EXPORT
OH_PixelmapImageInfo_GetHeight(OH_Pixelmap_ImageInfo * info,uint32_t * height)378 Image_ErrorCode OH_PixelmapImageInfo_GetHeight(OH_Pixelmap_ImageInfo *info, uint32_t *height)
379 {
380     if (info == nullptr || height == nullptr) {
381         return IMAGE_BAD_PARAMETER;
382     }
383     *height =  info->height;
384     return IMAGE_SUCCESS;
385 }
386 
387 MIDK_EXPORT
OH_PixelmapImageInfo_GetAlphaMode(OH_Pixelmap_ImageInfo * info,int32_t * alphaMode)388 Image_ErrorCode OH_PixelmapImageInfo_GetAlphaMode(OH_Pixelmap_ImageInfo *info, int32_t *alphaMode)
389 {
390     if (info == nullptr || alphaMode == nullptr) {
391         return IMAGE_BAD_PARAMETER;
392     }
393     *alphaMode = static_cast<int32_t>(info->alphaMode);
394     return IMAGE_SUCCESS;
395 }
396 
397 MIDK_EXPORT
OH_PixelmapImageInfo_GetRowStride(OH_Pixelmap_ImageInfo * info,uint32_t * rowStride)398 Image_ErrorCode OH_PixelmapImageInfo_GetRowStride(OH_Pixelmap_ImageInfo *info, uint32_t *rowStride)
399 {
400     if (info == nullptr || rowStride == nullptr) {
401         return IMAGE_BAD_PARAMETER;
402     }
403     *rowStride =  info->rowStride;
404     return IMAGE_SUCCESS;
405 }
406 
407 MIDK_EXPORT
OH_PixelmapImageInfo_GetPixelFormat(OH_Pixelmap_ImageInfo * info,int32_t * pixelFormat)408 Image_ErrorCode OH_PixelmapImageInfo_GetPixelFormat(OH_Pixelmap_ImageInfo *info, int32_t *pixelFormat)
409 {
410     if (info == nullptr || pixelFormat == nullptr) {
411         return IMAGE_BAD_PARAMETER;
412     }
413     *pixelFormat =  info->pixelFormat;
414     return IMAGE_SUCCESS;
415 }
416 
417 MIDK_EXPORT
OH_PixelmapImageInfo_GetAlphaType(OH_Pixelmap_ImageInfo * info,int32_t * alphaType)418 Image_ErrorCode OH_PixelmapImageInfo_GetAlphaType(OH_Pixelmap_ImageInfo *info, int32_t *alphaType)
419 {
420     if (info == nullptr || alphaType == nullptr) {
421         return IMAGE_BAD_PARAMETER;
422     }
423     *alphaType = static_cast<int32_t>(info->alphaType);
424     return IMAGE_SUCCESS;
425 }
426 
427 MIDK_EXPORT
OH_PixelmapImageInfo_GetDynamicRange(OH_Pixelmap_ImageInfo * info,bool * isHdr)428 Image_ErrorCode OH_PixelmapImageInfo_GetDynamicRange(OH_Pixelmap_ImageInfo *info, bool *isHdr)
429 {
430     if (info == nullptr || isHdr == nullptr) {
431         return IMAGE_BAD_PARAMETER;
432     }
433     *isHdr = info->isHdr;
434     return IMAGE_SUCCESS;
435 }
436 
437 MIDK_EXPORT
OH_PixelmapImageInfo_Release(OH_Pixelmap_ImageInfo * info)438 Image_ErrorCode OH_PixelmapImageInfo_Release(OH_Pixelmap_ImageInfo *info)
439 {
440     if (info == nullptr) {
441         return IMAGE_BAD_PARAMETER;
442     }
443     releaseMimeType(&info->mimeType);
444     delete  info;
445     info = nullptr;
446     return IMAGE_SUCCESS;
447 }
448 
449 MIDK_EXPORT
OH_PixelmapNative_CreatePixelmap(uint8_t * data,size_t dataLength,OH_Pixelmap_InitializationOptions * options,OH_PixelmapNative ** pixelmap)450 Image_ErrorCode OH_PixelmapNative_CreatePixelmap(uint8_t *data, size_t dataLength,
451     OH_Pixelmap_InitializationOptions *options, OH_PixelmapNative **pixelmap)
452 {
453     if (data == nullptr || options == nullptr || pixelmap == nullptr) {
454         return IMAGE_BAD_PARAMETER;
455     }
456     InitializationOptions info;
457     info.editable = options->editable;
458     info.alphaType = static_cast<AlphaType>(options->alphaType);
459     info.srcPixelFormat = static_cast<PixelFormat>(options->srcPixelFormat);
460     info.pixelFormat = static_cast<PixelFormat>(options->pixelFormat);
461     info.srcRowStride = options->srcRowStride;
462     info.size.height = static_cast<int32_t>(options->height);
463     info.size.width = static_cast<int32_t>(options->width);
464 
465     auto pixelmap2 = new OH_PixelmapNative(reinterpret_cast<uint32_t*>(data), static_cast<uint32_t>(dataLength), info);
466     if (pixelmap2 == nullptr || pixelmap2->GetInnerPixelmap() == nullptr) {
467         if (pixelmap2) {
468             delete pixelmap2;
469         }
470         return IMAGE_BAD_PARAMETER;
471     }
472     *pixelmap = pixelmap2;
473     return IMAGE_SUCCESS;
474 }
475 
UsingAllocatorPixelFormatCheck(PixelFormat srcPixelFormat,PixelFormat dstPixelFormat,bool isSupportYUV10Bit=false)476 static bool UsingAllocatorPixelFormatCheck(PixelFormat srcPixelFormat,
477     PixelFormat dstPixelFormat, bool isSupportYUV10Bit = false)
478 {
479     if (dstPixelFormat >= PixelFormat::EXTERNAL_MAX ||
480         dstPixelFormat <= PixelFormat::UNKNOWN ||
481         srcPixelFormat >= PixelFormat::EXTERNAL_MAX ||
482         srcPixelFormat <= PixelFormat::UNKNOWN) {
483         IMAGE_LOGE("%{public}s PixelFormat type is unspport %{public}d,%{public}d.", __func__,
484             dstPixelFormat, srcPixelFormat);
485         return false;
486     }
487     if (!isSupportYUV10Bit &&
488         (srcPixelFormat == PixelFormat::YCBCR_P010 ||
489         srcPixelFormat == PixelFormat::YCRCB_P010 ||
490         dstPixelFormat == PixelFormat::YCBCR_P010 ||
491         dstPixelFormat == PixelFormat::YCRCB_P010)) {
492         IMAGE_LOGE("%{public}s PixelFormat type is unspport %{public}d,%{public}d.", __func__,
493             dstPixelFormat, srcPixelFormat);
494         return false;
495     }
496     return true;
497 }
498 
499 MIDK_EXPORT
OH_PixelmapNative_CreatePixelmapUsingAllocator(uint8_t * data,size_t dataLength,OH_Pixelmap_InitializationOptions * options,IMAGE_ALLOCATOR_MODE allocator,OH_PixelmapNative ** pixelmap)500 Image_ErrorCode OH_PixelmapNative_CreatePixelmapUsingAllocator(uint8_t *data, size_t dataLength,
501     OH_Pixelmap_InitializationOptions *options, IMAGE_ALLOCATOR_MODE allocator, OH_PixelmapNative **pixelmap)
502 {
503     if (data == nullptr || options == nullptr || pixelmap == nullptr) {
504         return IMAGE_BAD_PARAMETER;
505     }
506     InitializationOptions info;
507     info.editable = options->editable;
508     info.alphaType = static_cast<AlphaType>(options->alphaType);
509     info.srcPixelFormat = static_cast<PixelFormat>(options->srcPixelFormat);
510     info.pixelFormat = static_cast<PixelFormat>(options->pixelFormat);
511     info.srcRowStride = options->srcRowStride;
512     info.size.height = static_cast<int32_t>(options->height);
513     info.size.width = static_cast<int32_t>(options->width);
514     if (!UsingAllocatorPixelFormatCheck(info.srcPixelFormat, info.pixelFormat)) {
515         return IMAGE_UNSUPPORTED_OPERATION;
516     }
517     if (allocator < IMAGE_ALLOCATOR_MODE_AUTO ||
518         allocator > IMAGE_ALLOCATOR_MODE_SHARED_MEMORY) {
519         IMAGE_LOGE("%{public}s allocator type is unspport:%{public}d.", __func__, allocator);
520         return IMAGE_ALLOCATOR_MODE_UNSUPPROTED;
521     }
522     if (!ImageUtils::SetInitializationOptionAllocatorType(info, static_cast<int32_t>(allocator))) {
523         IMAGE_LOGE("%{public}s allocator type failed %{public}d,%{public}d.", __func__,
524             allocator, info.allocatorType);
525         return IMAGE_UNSUPPORTED_OPERATION;
526     }
527     IMAGE_LOGD("%{public}s allocator type is %{public}d,%{public}d.", __func__,
528         allocator, info.allocatorType);
529     auto pixelmap2 =
530         new OH_PixelmapNative(reinterpret_cast<uint32_t*>(data), static_cast<uint32_t>(dataLength), info, allocator);
531     if (pixelmap2 == nullptr || pixelmap2->GetInnerPixelmap() == nullptr) {
532         if (pixelmap2) {
533             delete pixelmap2;
534         }
535         return IMAGE_BAD_PARAMETER;
536     }
537     *pixelmap = pixelmap2;
538     return IMAGE_SUCCESS;
539 }
540 
541 MIDK_EXPORT
OH_PixelmapNative_CreateEmptyPixelmap(OH_Pixelmap_InitializationOptions * options,OH_PixelmapNative ** pixelmap)542 Image_ErrorCode OH_PixelmapNative_CreateEmptyPixelmap(
543     OH_Pixelmap_InitializationOptions *options, OH_PixelmapNative **pixelmap)
544 {
545     if (options == nullptr) {
546         return IMAGE_BAD_PARAMETER;
547     }
548     InitializationOptions info;
549     info.editable = options->editable;
550     info.alphaType = static_cast<AlphaType>(options->alphaType);
551     info.srcPixelFormat = static_cast<PixelFormat>(options->srcPixelFormat);
552     info.pixelFormat = static_cast<PixelFormat>(options->pixelFormat);
553     info.size.height = options->height;
554     info.size.width = options->width;
555 
556     auto pixelmap2 = new OH_PixelmapNative(info);
557     if (pixelmap2 == nullptr || pixelmap2->GetInnerPixelmap() == nullptr) {
558         if (pixelmap2) {
559             delete pixelmap2;
560         }
561         return IMAGE_BAD_PARAMETER;
562     }
563     *pixelmap = pixelmap2;
564     return IMAGE_SUCCESS;
565 }
566 
567 MIDK_EXPORT
OH_PixelmapNative_CreateEmptyPixelmapUsingAllocator(OH_Pixelmap_InitializationOptions * options,IMAGE_ALLOCATOR_MODE allocator,OH_PixelmapNative ** pixelmap)568 Image_ErrorCode OH_PixelmapNative_CreateEmptyPixelmapUsingAllocator(
569     OH_Pixelmap_InitializationOptions *options, IMAGE_ALLOCATOR_MODE allocator, OH_PixelmapNative **pixelmap)
570 {
571     if (options == nullptr || pixelmap == nullptr) {
572         return IMAGE_BAD_PARAMETER;
573     }
574     InitializationOptions info;
575     info.editable = options->editable;
576     info.alphaType = static_cast<AlphaType>(options->alphaType);
577     info.srcPixelFormat = static_cast<PixelFormat>(options->srcPixelFormat);
578     info.pixelFormat = static_cast<PixelFormat>(options->pixelFormat);
579     info.size.height = options->height;
580     info.size.width = options->width;
581     if (!UsingAllocatorPixelFormatCheck(info.srcPixelFormat, info.pixelFormat, true)) {
582         return IMAGE_UNSUPPORTED_OPERATION;
583     }
584     if (allocator < IMAGE_ALLOCATOR_MODE_AUTO ||
585         allocator > IMAGE_ALLOCATOR_MODE_SHARED_MEMORY) {
586         IMAGE_LOGE("%{public}s allocator type is unspport:%{public}d.", __func__, allocator);
587         return IMAGE_ALLOCATOR_MODE_UNSUPPROTED;
588     }
589     if (!ImageUtils::SetInitializationOptionAllocatorType(info, static_cast<int32_t>(allocator))) {
590         IMAGE_LOGE("%{public}s allocator type failed %{public}d,%{public}d.", __func__,
591             allocator, info.allocatorType);
592         return IMAGE_UNSUPPORTED_OPERATION;
593     }
594     IMAGE_LOGD("%{public}s allocator type is %{public}d,%{public}d.", __func__,
595         allocator, info.allocatorType);
596     auto pixelmap2 = new OH_PixelmapNative(info, allocator);
597     if (pixelmap2 == nullptr || pixelmap2->GetInnerPixelmap() == nullptr) {
598         if (pixelmap2) {
599             delete pixelmap2;
600         }
601         return IMAGE_BAD_PARAMETER;
602     }
603     *pixelmap = pixelmap2;
604     return IMAGE_SUCCESS;
605 }
606 
607 MIDK_EXPORT
OH_PixelmapNative_ConvertPixelmapNativeToNapi(napi_env env,OH_PixelmapNative * pixelmapNative,napi_value * pixelmapNapi)608 Image_ErrorCode OH_PixelmapNative_ConvertPixelmapNativeToNapi(napi_env env, OH_PixelmapNative *pixelmapNative,
609     napi_value *pixelmapNapi)
610 {
611     if (pixelmapNative == nullptr || pixelmapNative->GetInnerPixelmap() == nullptr) {
612         return IMAGE_BAD_PARAMETER;
613     }
614     std::shared_ptr<OHOS::Media::PixelMap> pixelMap = pixelmapNative->GetInnerPixelmap();
615     *pixelmapNapi = PixelMapNapi::CreatePixelMap(env, pixelMap);
616     napi_valuetype valueType = napi_undefined;
617     napi_typeof(env, *pixelmapNapi, &valueType);
618     return (valueType == napi_undefined) ? IMAGE_BAD_PARAMETER : IMAGE_SUCCESS;
619 }
620 
621 MIDK_EXPORT
OH_PixelmapNative_ConvertPixelmapNativeFromNapi(napi_env env,napi_value pixelmapNapi,OH_PixelmapNative ** pixelmapNative)622 Image_ErrorCode OH_PixelmapNative_ConvertPixelmapNativeFromNapi(napi_env env, napi_value pixelmapNapi,
623     OH_PixelmapNative **pixelmapNative)
624 {
625     PixelMapNapi* napi = PixelMapNapi_Unwrap(env, pixelmapNapi);
626     if (napi == nullptr || napi->GetPixelNapiInner() == nullptr) {
627         return IMAGE_BAD_PARAMETER;
628     }
629     auto pixelmap = new OH_PixelmapNative(napi->GetPixelNapiInner());
630     if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr) {
631         if (pixelmap) {
632             delete pixelmap;
633         }
634         return IMAGE_ALLOC_FAILED;
635     }
636     *pixelmapNative = pixelmap;
637     return IMAGE_SUCCESS;
638 }
639 
640 MIDK_EXPORT
OH_PixelmapNative_ReadPixels(OH_PixelmapNative * pixelmap,uint8_t * destination,size_t * bufferSize)641 Image_ErrorCode OH_PixelmapNative_ReadPixels(OH_PixelmapNative *pixelmap, uint8_t *destination, size_t *bufferSize)
642 {
643     if (pixelmap == nullptr || destination == nullptr || bufferSize == nullptr || !pixelmap->GetInnerPixelmap()) {
644         return IMAGE_BAD_PARAMETER;
645     }
646     return ToNewErrorCode(pixelmap->GetInnerPixelmap()->ReadPixels(*bufferSize, destination));
647 }
648 
649 MIDK_EXPORT
OH_PixelmapNative_WritePixels(OH_PixelmapNative * pixelmap,uint8_t * source,size_t bufferSize)650 Image_ErrorCode OH_PixelmapNative_WritePixels(OH_PixelmapNative *pixelmap, uint8_t *source, size_t bufferSize)
651 {
652     if (pixelmap == nullptr || source == nullptr || !pixelmap->GetInnerPixelmap()) {
653         return IMAGE_BAD_PARAMETER;
654     }
655     return ToNewErrorCode(pixelmap->GetInnerPixelmap()->WritePixels(source, bufferSize));
656 }
657 
658 MIDK_EXPORT
OH_PixelmapNative_GetArgbPixels(OH_PixelmapNative * pixelmap,uint8_t * destination,size_t * bufferSize)659 Image_ErrorCode OH_PixelmapNative_GetArgbPixels(OH_PixelmapNative *pixelmap, uint8_t *destination, size_t *bufferSize)
660 {
661     if (pixelmap == nullptr || destination == nullptr || bufferSize == nullptr || !pixelmap->GetInnerPixelmap()) {
662         return IMAGE_BAD_PARAMETER;
663     }
664     return ToNewErrorCode(pixelmap->GetInnerPixelmap()->ReadARGBPixels(*bufferSize, destination));
665 }
666 
667 MIDK_EXPORT
OH_PixelmapNative_ToSdr(OH_PixelmapNative * pixelmap)668 Image_ErrorCode OH_PixelmapNative_ToSdr(OH_PixelmapNative *pixelmap)
669 {
670     if (pixelmap == nullptr || !pixelmap->GetInnerPixelmap()) {
671         return IMAGE_BAD_PARAMETER;
672     }
673     if (pixelmap->GetInnerPixelmap()->ToSdr() != IMAGE_SUCCESS) {
674         return IMAGE_UNSUPPORTED_OPERATION;
675     }
676     return IMAGE_SUCCESS;
677 }
678 
679 MIDK_EXPORT
OH_PixelmapNative_GetImageInfo(OH_PixelmapNative * pixelmap,OH_Pixelmap_ImageInfo * imageInfo)680 Image_ErrorCode OH_PixelmapNative_GetImageInfo(OH_PixelmapNative *pixelmap, OH_Pixelmap_ImageInfo *imageInfo)
681 {
682     if (pixelmap == nullptr || imageInfo == nullptr || !pixelmap->GetInnerPixelmap()) {
683         return IMAGE_BAD_PARAMETER;
684     }
685     ImageInfo srcInfo;
686     pixelmap->GetInnerPixelmap()->GetImageInfo(srcInfo);
687     imageInfo->alphaMode = (PIXELMAP_ALPHA_TYPE)(pixelmap->GetInnerPixelmap()->GetAlphaType());
688     imageInfo->width = static_cast<uint32_t>(srcInfo.size.width);
689     imageInfo->height = static_cast<uint32_t>(srcInfo.size.height);
690     imageInfo->rowStride = static_cast<uint32_t>(pixelmap->GetInnerPixelmap()->GetRowStride());
691     imageInfo->pixelFormat = static_cast<int32_t>(srcInfo.pixelFormat);
692     imageInfo->isHdr = pixelmap->GetInnerPixelmap()->IsHdr();
693 
694     if (!srcInfo.encodedFormat.empty() && imageInfo->mimeType.data == nullptr) {
695         imageInfo->mimeType.size = srcInfo.encodedFormat.size();
696         imageInfo->mimeType.data = static_cast<char *>(malloc(imageInfo->mimeType.size));
697         if (memcpy_s(imageInfo->mimeType.data, imageInfo->mimeType.size, srcInfo.encodedFormat.c_str(),
698             srcInfo.encodedFormat.size()) != 0) {
699             releaseMimeType(&imageInfo->mimeType);
700         }
701     }
702 
703     return IMAGE_SUCCESS;
704 }
705 
706 MIDK_EXPORT
OH_PixelmapNative_GetPixelMapImageInfo(OH_PixelmapNative * pixelmap,OH_Pixelmap_ImageInfo * imageInfo)707 Image_ErrorCode OH_PixelmapNative_GetPixelMapImageInfo(OH_PixelmapNative *pixelmap, OH_Pixelmap_ImageInfo *imageInfo)
708 {
709     if (pixelmap == nullptr || imageInfo == nullptr || !pixelmap->GetInnerPixelmap()) {
710         return IMAGE_BAD_PARAMETER;
711     }
712     ImageInfo srcInfo;
713     pixelmap->GetInnerPixelmap()->GetImageInfo(srcInfo);
714     imageInfo->width = static_cast<uint32_t>(srcInfo.size.width);
715     imageInfo->height = static_cast<uint32_t>(srcInfo.size.height);
716     imageInfo->rowStride = static_cast<uint32_t>(pixelmap->GetInnerPixelmap()->GetRowStride());
717     imageInfo->pixelFormat = static_cast<int32_t>(srcInfo.pixelFormat);
718     imageInfo->isHdr = pixelmap->GetInnerPixelmap()->IsHdr();
719     imageInfo->alphaType = static_cast<PIXELMAP_ALPHA_TYPE>(srcInfo.alphaType);
720 
721     if (!srcInfo.encodedFormat.empty() && imageInfo->mimeType.data == nullptr) {
722         imageInfo->mimeType.size = srcInfo.encodedFormat.size();
723         imageInfo->mimeType.data = static_cast<char *>(malloc(imageInfo->mimeType.size));
724         if (memcpy_s(imageInfo->mimeType.data, imageInfo->mimeType.size, srcInfo.encodedFormat.c_str(),
725             srcInfo.encodedFormat.size()) != 0) {
726             releaseMimeType(&imageInfo->mimeType);
727         }
728     }
729 
730     return IMAGE_SUCCESS;
731 }
732 
733 MIDK_EXPORT
OH_PixelmapNative_Opacity(OH_PixelmapNative * pixelmap,float rate)734 Image_ErrorCode OH_PixelmapNative_Opacity(OH_PixelmapNative *pixelmap, float rate)
735 {
736     if (pixelmap == nullptr || !pixelmap->GetInnerPixelmap()) {
737         return IMAGE_BAD_PARAMETER;
738     }
739     pixelmap->GetInnerPixelmap()->SetAlpha(rate);
740     return IMAGE_SUCCESS;
741 }
742 
743 MIDK_EXPORT
OH_PixelmapNative_Scale(OH_PixelmapNative * pixelmap,float scaleX,float scaleY)744 Image_ErrorCode OH_PixelmapNative_Scale(OH_PixelmapNative *pixelmap, float scaleX, float scaleY)
745 {
746     if (pixelmap == nullptr || !pixelmap->GetInnerPixelmap()) {
747         return IMAGE_BAD_PARAMETER;
748     }
749     pixelmap->GetInnerPixelmap()->scale(scaleX, scaleY);
750     return IMAGE_SUCCESS;
751 }
752 
753 MIDK_EXPORT
OH_PixelmapNative_ScaleWithAntiAliasing(OH_PixelmapNative * pixelmap,float scaleX,float scaleY,OH_PixelmapNative_AntiAliasingLevel level)754 Image_ErrorCode OH_PixelmapNative_ScaleWithAntiAliasing(OH_PixelmapNative *pixelmap, float scaleX, float scaleY,
755     OH_PixelmapNative_AntiAliasingLevel level)
756 {
757     if (pixelmap == nullptr) {
758         return IMAGE_BAD_PARAMETER;
759     }
760     pixelmap->GetInnerPixelmap()->scale(scaleX, scaleY, static_cast<AntiAliasingOption>(level));
761     return IMAGE_SUCCESS;
762 }
763 
764 MIDK_EXPORT
OH_PixelmapNative_CreateScaledPixelMap(OH_PixelmapNative * srcPixelmap,OH_PixelmapNative ** dstPixelmap,float scaleX,float scaleY)765 Image_ErrorCode OH_PixelmapNative_CreateScaledPixelMap(OH_PixelmapNative *srcPixelmap, OH_PixelmapNative **dstPixelmap,
766     float scaleX, float scaleY)
767 {
768     if (srcPixelmap == nullptr || !srcPixelmap->GetInnerPixelmap() || dstPixelmap == nullptr) {
769         return IMAGE_BAD_PARAMETER;
770     }
771     InitializationOptions opts;
772     std::unique_ptr<PixelMap> clonePixelmap = PixelMap::Create(*(srcPixelmap->GetInnerPixelmap()), opts);
773     if (clonePixelmap == nullptr) {
774         return IMAGE_BAD_PARAMETER;
775     }
776     clonePixelmap->scale(scaleX, scaleY);
777     *dstPixelmap = new(std::nothrow) OH_PixelmapNative(std::move(clonePixelmap));
778     return IMAGE_SUCCESS;
779 }
780 
781 MIDK_EXPORT
OH_PixelmapNative_CreateScaledPixelMapWithAntiAliasing(OH_PixelmapNative * srcPixelmap,OH_PixelmapNative ** dstPixelmap,float scaleX,float scaleY,OH_PixelmapNative_AntiAliasingLevel level)782 Image_ErrorCode OH_PixelmapNative_CreateScaledPixelMapWithAntiAliasing(OH_PixelmapNative *srcPixelmap,
783     OH_PixelmapNative **dstPixelmap, float scaleX, float scaleY, OH_PixelmapNative_AntiAliasingLevel level)
784 {
785     if (srcPixelmap == nullptr || !srcPixelmap->GetInnerPixelmap() || dstPixelmap == nullptr) {
786         return IMAGE_BAD_PARAMETER;
787     }
788     InitializationOptions opts;
789     std::unique_ptr<PixelMap> clonePixelmap = PixelMap::Create(*(srcPixelmap->GetInnerPixelmap()), opts);
790     if (clonePixelmap == nullptr) {
791         return IMAGE_BAD_PARAMETER;
792     }
793     clonePixelmap->scale(scaleX, scaleY, static_cast<AntiAliasingOption>(level));
794     *dstPixelmap = new(std::nothrow) OH_PixelmapNative(std::move(clonePixelmap));
795     return IMAGE_SUCCESS;
796 }
797 
798 MIDK_EXPORT
OH_PixelmapNative_Translate(OH_PixelmapNative * pixelmap,float x,float y)799 Image_ErrorCode OH_PixelmapNative_Translate(OH_PixelmapNative *pixelmap, float x, float y)
800 {
801     if (pixelmap == nullptr || !pixelmap->GetInnerPixelmap()) {
802         return IMAGE_BAD_PARAMETER;
803     }
804     pixelmap->GetInnerPixelmap()->translate(x, y);
805     return IMAGE_SUCCESS;
806 }
807 
808 MIDK_EXPORT
OH_PixelmapNative_Rotate(OH_PixelmapNative * pixelmap,float angle)809 Image_ErrorCode OH_PixelmapNative_Rotate(OH_PixelmapNative *pixelmap, float angle)
810 {
811     if (pixelmap == nullptr || !pixelmap->GetInnerPixelmap()) {
812         return IMAGE_BAD_PARAMETER;
813     }
814     pixelmap->GetInnerPixelmap()->rotate(angle);
815     return IMAGE_SUCCESS;
816 }
817 
818 MIDK_EXPORT
OH_PixelmapNative_Flip(OH_PixelmapNative * pixelmap,bool shouldFilpHorizontally,bool shouldFilpVertically)819 Image_ErrorCode OH_PixelmapNative_Flip(OH_PixelmapNative *pixelmap, bool shouldFilpHorizontally,
820     bool shouldFilpVertically)
821 {
822     if (pixelmap == nullptr || !pixelmap->GetInnerPixelmap()) {
823         return IMAGE_BAD_PARAMETER;
824     }
825     pixelmap->GetInnerPixelmap()->flip(shouldFilpHorizontally, shouldFilpVertically);
826     return IMAGE_SUCCESS;
827 }
828 
829 MIDK_EXPORT
OH_PixelmapNative_Crop(OH_PixelmapNative * pixelmap,Image_Region * region)830 Image_ErrorCode OH_PixelmapNative_Crop(OH_PixelmapNative *pixelmap, Image_Region *region)
831 {
832     if (pixelmap == nullptr || region == nullptr || !pixelmap->GetInnerPixelmap()) {
833         return IMAGE_BAD_PARAMETER;
834     }
835     OHOS::Media::Rect rect;
836     rect.left = static_cast<int32_t>(region->x);
837     rect.top = static_cast<int32_t>(region->y);
838     rect.width = static_cast<int32_t>(region->width);
839     rect.height = static_cast<int32_t>(region->height);
840     pixelmap->GetInnerPixelmap()->crop(rect);
841     return IMAGE_SUCCESS;
842 }
843 
844 MIDK_EXPORT
OH_PixelmapNative_Release(OH_PixelmapNative * pixelmap)845 Image_ErrorCode OH_PixelmapNative_Release(OH_PixelmapNative *pixelmap)
846 {
847     if (pixelmap == nullptr || (pixelmap->GetInnerPixelmap() != nullptr &&
848         !pixelmap->GetInnerPixelmap()->IsModifiable())) {
849         return IMAGE_BAD_PARAMETER;
850     }
851     pixelmap->~OH_PixelmapNative();
852     return IMAGE_SUCCESS;
853 }
854 
855 MIDK_EXPORT
OH_PixelmapNative_Destroy(OH_PixelmapNative ** pixelmap)856 Image_ErrorCode OH_PixelmapNative_Destroy(OH_PixelmapNative **pixelmap)
857 {
858     if (pixelmap == nullptr || *pixelmap == nullptr) {
859         return IMAGE_BAD_PARAMETER;
860     }
861     delete *pixelmap;
862     *pixelmap = nullptr;
863     return IMAGE_SUCCESS;
864 }
865 
866 MIDK_EXPORT
OH_PixelmapNative_ConvertAlphaFormat(OH_PixelmapNative * srcpixelmap,OH_PixelmapNative * dstpixelmap,const bool isPremul)867 Image_ErrorCode OH_PixelmapNative_ConvertAlphaFormat(OH_PixelmapNative* srcpixelmap,
868     OH_PixelmapNative* dstpixelmap, const bool isPremul)
869 {
870     if (srcpixelmap == nullptr || dstpixelmap == nullptr ||
871         !srcpixelmap->GetInnerPixelmap() || !dstpixelmap->GetInnerPixelmap()) {
872         return IMAGE_BAD_PARAMETER;
873     }
874     srcpixelmap->GetInnerPixelmap()->ConvertAlphaFormat(*(dstpixelmap->GetInnerPixelmap()), isPremul);
875     return IMAGE_SUCCESS;
876 }
877 
ImageConvert_YuvToRgb(OH_PixelmapNative * srcPixelMap,OH_PixelmapNative ** destPixelMap,int32_t destPixelFormat)878 static uint32_t ImageConvert_YuvToRgb(OH_PixelmapNative *srcPixelMap, OH_PixelmapNative **destPixelMap,
879                                       int32_t destPixelFormat)
880 {
881     if (srcPixelMap == nullptr) {
882         return IMAGE_BAD_PARAMETER;
883     }
884     PixelFormat srcPixelFormat = srcPixelMap->GetInnerPixelmap()->GetPixelFormat();
885     PixelFormat destFormat = static_cast<PixelFormat>(destPixelFormat);
886     if (!IsMatchType(IMAGE_FORMAT::IMAGE_FORMAT_YUV_TYPE, srcPixelFormat) ||
887         !IsMatchType(IMAGE_FORMAT::IMAGE_FORMAT_RGB_TYPE, destFormat)) {
888         return IMAGE_BAD_PARAMETER;
889     }
890 
891     std::shared_ptr<OHOS::Media::PixelMap> innerPixelMap = srcPixelMap->GetInnerPixelmap();
892     std::shared_ptr<PixelMap> pixelMap = std::static_pointer_cast<PixelMap>(innerPixelMap);
893     uint32_t ret = ImageFormatConvert::ConvertImageFormat(pixelMap, destFormat);
894     *destPixelMap = new OH_PixelmapNative(pixelMap);
895 
896     return ret;
897 }
898 
ImageConvert_RgbToYuv(OH_PixelmapNative * srcPixelMap,OH_PixelmapNative ** destPixelMap,int32_t destPixelFormat)899 static uint32_t ImageConvert_RgbToYuv(OH_PixelmapNative *srcPixelMap, OH_PixelmapNative **destPixelMap,
900                                       int32_t destPixelFormat)
901 {
902     if (srcPixelMap == nullptr) {
903         return IMAGE_BAD_PARAMETER;
904     }
905 
906     PixelFormat srcPixelFormat = srcPixelMap->GetInnerPixelmap()->GetPixelFormat();
907     PixelFormat destFormat = static_cast<PixelFormat>(destPixelFormat);
908     if (!IsMatchType(IMAGE_FORMAT::IMAGE_FORMAT_RGB_TYPE, srcPixelFormat) ||
909         !IsMatchType(IMAGE_FORMAT::IMAGE_FORMAT_YUV_TYPE, destFormat)) {
910         return IMAGE_BAD_PARAMETER;
911     }
912 
913     std::shared_ptr<OHOS::Media::PixelMap> innerPixelMap = srcPixelMap->GetInnerPixelmap();
914     std::shared_ptr<PixelMap> pixelMap = std::static_pointer_cast<PixelMap>(innerPixelMap);
915     uint32_t ret = ImageFormatConvert::ConvertImageFormat(pixelMap, destFormat);
916     *destPixelMap = new OH_PixelmapNative(pixelMap);
917     return ret;
918 }
919 
920 MIDK_EXPORT
OH_PixelMapNative_ConvertPixelFormat(OH_PixelmapNative * srcPixelMap,OH_PixelmapNative ** destPixelMap,int32_t destPixelFormat)921 Image_ErrorCode OH_PixelMapNative_ConvertPixelFormat(OH_PixelmapNative *srcPixelMap, OH_PixelmapNative **destPixelMap,
922                                                      int32_t destPixelFormat)
923 {
924     if (srcPixelMap == nullptr) {
925         return IMAGE_BAD_PARAMETER;
926     }
927 
928     PixelFormat srcPixelFormat = srcPixelMap->GetInnerPixelmap()->GetPixelFormat();
929     const uint32_t SUCCESS = 0;
930     if (IsMatchType(IMAGE_FORMAT::IMAGE_FORMAT_YUV_TYPE, srcPixelFormat)) {
931         if (ImageConvert_YuvToRgb(srcPixelMap, destPixelMap, destPixelFormat) != SUCCESS) {
932             return IMAGE_BAD_PARAMETER;
933         }
934     } else if (IsMatchType(IMAGE_FORMAT::IMAGE_FORMAT_RGB_TYPE, srcPixelFormat)) {
935         if (ImageConvert_RgbToYuv(srcPixelMap, destPixelMap, destPixelFormat) != SUCCESS) {
936             return IMAGE_BAD_PARAMETER;
937         }
938     } else {
939         return IMAGE_BAD_PARAMETER;
940     }
941     return IMAGE_SUCCESS;
942 }
943 constexpr uint8_t INDEX_ZERO = 0;
944 constexpr uint8_t INDEX_ONE = 1;
945 constexpr uint8_t INDEX_TWO = 2;
946 static std::map<OH_Pixelmap_HdrMetadataType, const CM_HDR_Metadata_Type> NdkMetadataTypeMap = {
947     {HDR_METADATA_TYPE_NONE, CM_METADATA_NONE},
948     {HDR_METADATA_TYPE_BASE, CM_IMAGE_HDR_VIVID_DUAL},
949     {HDR_METADATA_TYPE_GAINMAP, CM_METADATA_NONE},
950     {HDR_METADATA_TYPE_ALTERNATE, CM_IMAGE_HDR_VIVID_SINGLE},
951 };
952 
953 static std::map<CM_HDR_Metadata_Type, OH_Pixelmap_HdrMetadataType> MetadataNdkTypeMap = {
954     {CM_METADATA_NONE, HDR_METADATA_TYPE_NONE},
955     {CM_IMAGE_HDR_VIVID_DUAL, HDR_METADATA_TYPE_BASE},
956     {CM_METADATA_NONE, HDR_METADATA_TYPE_GAINMAP},
957     {CM_IMAGE_HDR_VIVID_SINGLE, HDR_METADATA_TYPE_ALTERNATE},
958 };
959 
ConvertStaticMetadata(const OH_Pixelmap_HdrStaticMetadata & metadata,std::vector<uint8_t> & staticMetadataVec)960 static bool ConvertStaticMetadata(const OH_Pixelmap_HdrStaticMetadata &metadata,
961     std::vector<uint8_t> &staticMetadataVec)
962 {
963 #if defined(_WIN32) || defined(_APPLE) || defined(IOS_PLATFORM) || defined(ANDROID_PLATFORM)
964     return {};
965 #else
966     HDI::Display::Graphic::Common::V1_0::HdrStaticMetadata staticMetadata{};
967     staticMetadata.smpte2086.displayPrimaryRed.x = metadata.displayPrimariesX[INDEX_ZERO];
968     staticMetadata.smpte2086.displayPrimaryRed.y = metadata.displayPrimariesY[INDEX_ZERO];
969     staticMetadata.smpte2086.displayPrimaryGreen.x = metadata.displayPrimariesX[INDEX_ONE];
970     staticMetadata.smpte2086.displayPrimaryGreen.y = metadata.displayPrimariesY[INDEX_ONE];
971     staticMetadata.smpte2086.displayPrimaryBlue.x = metadata.displayPrimariesX[INDEX_TWO];
972     staticMetadata.smpte2086.displayPrimaryBlue.y = metadata.displayPrimariesY[INDEX_TWO];
973     staticMetadata.smpte2086.whitePoint.x = metadata.whitePointX;
974     staticMetadata.smpte2086.whitePoint.y = metadata.whitePointY;
975     staticMetadata.smpte2086.maxLuminance = metadata.maxLuminance;
976     staticMetadata.smpte2086.minLuminance = metadata.minLuminance;
977     staticMetadata.cta861.maxContentLightLevel = metadata.maxContentLightLevel;
978     staticMetadata.cta861.maxFrameAverageLightLevel = metadata.maxFrameAverageLightLevel;
979     uint32_t vecSize = sizeof(HDI::Display::Graphic::Common::V1_0::HdrStaticMetadata);
980     if (memcpy_s(staticMetadataVec.data(), vecSize, &staticMetadata, vecSize) != EOK) {
981         return false;
982     }
983     return true;
984 #endif
985 }
986 
ConvertGainmapMetadata(OH_Pixelmap_HdrGainmapMetadata & metadata,HDRVividExtendMetadata & extendMetadata)987 static void ConvertGainmapMetadata(OH_Pixelmap_HdrGainmapMetadata &metadata, HDRVividExtendMetadata &extendMetadata)
988 {
989     extendMetadata.metaISO.writeVersion = metadata.writerVersion;
990     extendMetadata.metaISO.miniVersion = metadata.minVersion;
991     extendMetadata.metaISO.gainmapChannelNum = metadata.gainmapChannelNum;
992     extendMetadata.metaISO.useBaseColorFlag = metadata.useBaseColorFlag;
993     extendMetadata.metaISO.baseHeadroom = metadata.baseHdrHeadroom;
994     extendMetadata.metaISO.alternateHeadroom = metadata.alternateHdrHeadroom;
995 
996     extendMetadata.metaISO.enhanceClippedThreholdMaxGainmap[INDEX_ZERO] = metadata.gainmapMax[INDEX_ZERO];
997     extendMetadata.metaISO.enhanceClippedThreholdMaxGainmap[INDEX_ONE] = metadata.gainmapMax[INDEX_ONE];
998     extendMetadata.metaISO.enhanceClippedThreholdMaxGainmap[INDEX_TWO] = metadata.gainmapMax[INDEX_TWO];
999 
1000     extendMetadata.metaISO.enhanceClippedThreholdMinGainmap[INDEX_ZERO] = metadata.gainmapMin[INDEX_ZERO];
1001     extendMetadata.metaISO.enhanceClippedThreholdMinGainmap[INDEX_ONE] = metadata.gainmapMin[INDEX_ONE];
1002     extendMetadata.metaISO.enhanceClippedThreholdMinGainmap[INDEX_TWO] = metadata.gainmapMin[INDEX_TWO];
1003 
1004     extendMetadata.metaISO.enhanceMappingGamma[INDEX_ZERO] = metadata.gamma[INDEX_ZERO];
1005     extendMetadata.metaISO.enhanceMappingGamma[INDEX_ONE] = metadata.gamma[INDEX_ONE];
1006     extendMetadata.metaISO.enhanceMappingGamma[INDEX_TWO] = metadata.gamma[INDEX_TWO];
1007 
1008     extendMetadata.metaISO.enhanceMappingBaselineOffset[INDEX_ZERO] = metadata.baselineOffset[INDEX_ZERO];
1009     extendMetadata.metaISO.enhanceMappingBaselineOffset[INDEX_ONE] = metadata.baselineOffset[INDEX_ONE];
1010     extendMetadata.metaISO.enhanceMappingBaselineOffset[INDEX_TWO] = metadata.baselineOffset[INDEX_TWO];
1011 
1012     extendMetadata.metaISO.enhanceMappingAlternateOffset[INDEX_ZERO] = metadata.alternateOffset[INDEX_ZERO];
1013     extendMetadata.metaISO.enhanceMappingAlternateOffset[INDEX_ONE] = metadata.alternateOffset[INDEX_ONE];
1014     extendMetadata.metaISO.enhanceMappingAlternateOffset[INDEX_TWO] = metadata.alternateOffset[INDEX_TWO];
1015 }
1016 
BuildGainmapMetadata(OHOS::Media::PixelMap & pixelmap,OH_Pixelmap_HdrGainmapMetadata & metadata,std::vector<uint8_t> & extendMetadataVec)1017 static bool BuildGainmapMetadata(OHOS::Media::PixelMap &pixelmap, OH_Pixelmap_HdrGainmapMetadata &metadata,
1018     std::vector<uint8_t> &extendMetadataVec)
1019 {
1020     HDRVividExtendMetadata extendMetadata;
1021     #ifdef IMAGE_COLORSPACE_FLAG
1022     OHOS::ColorManager::ColorSpace colorSpace = pixelmap.InnerGetGrColorSpace();
1023     uint16_t SS = ColorUtils::GetPrimaries(colorSpace.GetColorSpaceName());
1024     #else
1025     uint16_t SS = 0;
1026     #endif
1027     extendMetadata.baseColorMeta.baseColorPrimary = SS;
1028     extendMetadata.gainmapColorMeta.combineColorPrimary = metadata.useBaseColorFlag ? SS: (uint8_t)CM_BT2020_HLG_FULL;
1029     extendMetadata.gainmapColorMeta.enhanceDataColorModel = metadata.useBaseColorFlag ? SS: (uint8_t)CM_BT2020_HLG_FULL;
1030     extendMetadata.gainmapColorMeta.alternateColorPrimary = (uint8_t)CM_BT2020_HLG_FULL;
1031     ConvertGainmapMetadata(metadata, extendMetadata);
1032     uint32_t vecSize = sizeof(HDRVividExtendMetadata);
1033     if (memcpy_s(extendMetadataVec.data(), vecSize, &extendMetadata, vecSize) != EOK) {
1034         return false;
1035     }
1036     return true;
1037 }
1038 
SetHdrMetadata(OHOS::Media::PixelMap & pixelmap,OHOS::sptr<OHOS::SurfaceBuffer> & buffer,OH_Pixelmap_HdrMetadataKey key,OH_Pixelmap_HdrMetadataValue & value)1039 static bool SetHdrMetadata(OHOS::Media::PixelMap &pixelmap, OHOS::sptr<OHOS::SurfaceBuffer> &buffer,
1040     OH_Pixelmap_HdrMetadataKey key, OH_Pixelmap_HdrMetadataValue &value)
1041 {
1042     switch (key) {
1043         case OH_Pixelmap_HdrMetadataKey::HDR_METADATA_TYPE:
1044             if (NdkMetadataTypeMap.find(value.type) != NdkMetadataTypeMap.end()) {
1045                 VpeUtils::SetSbMetadataType(buffer, NdkMetadataTypeMap[value.type]);
1046             }
1047             break;
1048         case OH_Pixelmap_HdrMetadataKey::HDR_STATIC_METADATA:
1049             {
1050                 OH_Pixelmap_HdrStaticMetadata &staticMetadata = value.staticMetadata;
1051                 uint32_t vecSize = sizeof(HDI::Display::Graphic::Common::V1_0::HdrStaticMetadata);
1052                 std::vector<uint8_t> metadataVec(vecSize);
1053                 if (!ConvertStaticMetadata(staticMetadata, metadataVec)) {
1054                     return false;
1055                 }
1056                 if (!VpeUtils::SetSbStaticMetadata(buffer, metadataVec)) {
1057                     return false;
1058                 }
1059             }
1060             break;
1061         case OH_Pixelmap_HdrMetadataKey::HDR_DYNAMIC_METADATA:
1062             {
1063                 std::vector<uint8_t> metadataVec(value.dynamicMetadata.length);
1064                 if (memcpy_s(metadataVec.data(), value.dynamicMetadata.length, value.dynamicMetadata.data,
1065                     value.dynamicMetadata.length) != EOK) {
1066                     return false;
1067                 }
1068                 if (!VpeUtils::SetSbDynamicMetadata(buffer, metadataVec)) {
1069                     return false;
1070                 }
1071             }
1072             break;
1073         case OH_Pixelmap_HdrMetadataKey::HDR_GAINMAP_METADATA:
1074             {
1075                 std::vector<uint8_t> extendMetadataVec(sizeof(HDRVividExtendMetadata));
1076                 if (!BuildGainmapMetadata(pixelmap, value.gainmapMetadata, extendMetadataVec)) {
1077                     return false;
1078                 }
1079                 if (!VpeUtils::SetSbDynamicMetadata(buffer, extendMetadataVec)) {
1080                     return false;
1081                 }
1082             }
1083             break;
1084         default:
1085             break;
1086     }
1087 
1088     return true;
1089 }
1090 
1091 MIDK_EXPORT
OH_PixelmapNative_SetMetadata(OH_PixelmapNative * pixelmap,OH_Pixelmap_HdrMetadataKey key,OH_Pixelmap_HdrMetadataValue * value)1092 Image_ErrorCode OH_PixelmapNative_SetMetadata(OH_PixelmapNative *pixelmap, OH_Pixelmap_HdrMetadataKey key,
1093     OH_Pixelmap_HdrMetadataValue *value)
1094 {
1095     if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr || value == nullptr) {
1096         return IMAGE_BAD_PARAMETER;
1097     }
1098 
1099     if (pixelmap->GetInnerPixelmap()->GetAllocatorType() != AllocatorType::DMA_ALLOC) {
1100         return IMAGE_DMA_NOT_EXIST;
1101     }
1102 
1103     OHOS::sptr<OHOS::SurfaceBuffer> surfaceBuffer(
1104         reinterpret_cast<OHOS::SurfaceBuffer*>(pixelmap->GetInnerPixelmap()->GetFd()));
1105     if (!SetHdrMetadata(*(pixelmap->GetInnerPixelmap().get()), surfaceBuffer, key, *value)) {
1106         return IMAGE_COPY_FAILED;
1107     }
1108 
1109     return IMAGE_SUCCESS;
1110 }
1111 
ConvertToOHGainmapMetadata(HDRVividExtendMetadata & src,OH_Pixelmap_HdrGainmapMetadata & dst)1112 static void ConvertToOHGainmapMetadata(HDRVividExtendMetadata &src, OH_Pixelmap_HdrGainmapMetadata &dst)
1113 {
1114     dst.writerVersion = src.metaISO.writeVersion;
1115     dst.minVersion = src.metaISO.miniVersion;
1116     dst.gainmapChannelNum = src.metaISO.gainmapChannelNum;
1117     dst.useBaseColorFlag = src.metaISO.useBaseColorFlag;
1118     dst.baseHdrHeadroom = src.metaISO.baseHeadroom;
1119     dst.alternateHdrHeadroom = src.metaISO.alternateHeadroom;
1120 
1121     dst.gainmapMax[INDEX_ZERO] = src.metaISO.enhanceClippedThreholdMaxGainmap[INDEX_ZERO];
1122     dst.gainmapMax[INDEX_ONE] = src.metaISO.enhanceClippedThreholdMaxGainmap[INDEX_ONE];
1123     dst.gainmapMax[INDEX_TWO] = src.metaISO.enhanceClippedThreholdMaxGainmap[INDEX_TWO];
1124 
1125     dst.gainmapMin[INDEX_ZERO] = src.metaISO.enhanceClippedThreholdMinGainmap[INDEX_ZERO];
1126     dst.gainmapMin[INDEX_ONE] = src.metaISO.enhanceClippedThreholdMinGainmap[INDEX_ONE];
1127     dst.gainmapMin[INDEX_TWO] = src.metaISO.enhanceClippedThreholdMinGainmap[INDEX_TWO];
1128 
1129     dst.gamma[INDEX_ZERO] = src.metaISO.enhanceMappingGamma[INDEX_ZERO];
1130     dst.gamma[INDEX_ONE] = src.metaISO.enhanceMappingGamma[INDEX_ONE];
1131     dst.gamma[INDEX_TWO] = src.metaISO.enhanceMappingGamma[INDEX_TWO];
1132 
1133     dst.baselineOffset[INDEX_ZERO] = src.metaISO.enhanceMappingBaselineOffset[INDEX_ZERO];
1134     dst.baselineOffset[INDEX_ONE] = src.metaISO.enhanceMappingBaselineOffset[INDEX_ONE];
1135     dst.baselineOffset[INDEX_TWO] = src.metaISO.enhanceMappingBaselineOffset[INDEX_TWO];
1136 
1137     dst.alternateOffset[INDEX_ZERO] = src.metaISO.enhanceMappingAlternateOffset[INDEX_ZERO];
1138     dst.alternateOffset[INDEX_ONE] = src.metaISO.enhanceMappingAlternateOffset[INDEX_ONE];
1139     dst.alternateOffset[INDEX_TWO] = src.metaISO.enhanceMappingAlternateOffset[INDEX_TWO];
1140 }
1141 
ConvertTONdkStaticMetadata(HdrStaticMetadata & src,OH_Pixelmap_HdrStaticMetadata & dst)1142 static bool ConvertTONdkStaticMetadata(HdrStaticMetadata &src,
1143     OH_Pixelmap_HdrStaticMetadata &dst)
1144 {
1145     dst.displayPrimariesX[INDEX_ZERO] = src.smpte2086.displayPrimaryRed.x;
1146     dst.displayPrimariesY[INDEX_ZERO] = src.smpte2086.displayPrimaryRed.y;
1147     dst.displayPrimariesX[INDEX_ONE] = src.smpte2086.displayPrimaryGreen.x;
1148     dst.displayPrimariesY[INDEX_ONE] = src.smpte2086.displayPrimaryGreen.y;
1149     dst.displayPrimariesX[INDEX_TWO] = src.smpte2086.displayPrimaryBlue.x;
1150     dst.displayPrimariesY[INDEX_TWO] = src.smpte2086.displayPrimaryBlue.y;
1151     dst.whitePointX = src.smpte2086.whitePoint.x;
1152     dst.whitePointY = src.smpte2086.whitePoint.y;
1153     dst.maxLuminance = src.smpte2086.maxLuminance;
1154     dst.minLuminance = src.smpte2086.minLuminance;
1155     dst.maxContentLightLevel = src.cta861.maxContentLightLevel;
1156     dst.maxFrameAverageLightLevel = src.cta861.maxFrameAverageLightLevel;
1157     return true;
1158 }
1159 
GetStaticMetadata(const OHOS::sptr<OHOS::SurfaceBuffer> & buffer,OH_Pixelmap_HdrMetadataValue * metadataValue)1160 static bool GetStaticMetadata(const OHOS::sptr<OHOS::SurfaceBuffer> &buffer,
1161     OH_Pixelmap_HdrMetadataValue *metadataValue)
1162 {
1163     std::vector<uint8_t> staticData;
1164     uint32_t vecSize = sizeof(HDI::Display::Graphic::Common::V1_0::HdrStaticMetadata);
1165     if (VpeUtils::GetSbStaticMetadata(buffer, staticData) &&
1166         (staticData.size() == vecSize)) {
1167         OH_Pixelmap_HdrStaticMetadata &dst = metadataValue->staticMetadata;
1168         HdrStaticMetadata &src = *(reinterpret_cast<HdrStaticMetadata*>(staticData.data()));
1169         return ConvertTONdkStaticMetadata(src, dst);
1170     }
1171     return false;
1172 }
1173 
GetHdrMetadata(const OHOS::sptr<OHOS::SurfaceBuffer> & buffer,OH_Pixelmap_HdrMetadataKey key,OH_Pixelmap_HdrMetadataValue * metadataValue)1174 static bool GetHdrMetadata(const OHOS::sptr<OHOS::SurfaceBuffer> &buffer,
1175     OH_Pixelmap_HdrMetadataKey key, OH_Pixelmap_HdrMetadataValue *metadataValue)
1176 {
1177     if (buffer == nullptr || metadataValue == nullptr) {
1178         IMAGE_LOGE("GetHdrMetadata buffer is nullptr");
1179         return false;
1180     }
1181     switch (key) {
1182         case OH_Pixelmap_HdrMetadataKey::HDR_METADATA_TYPE:
1183             {
1184                 CM_HDR_Metadata_Type type;
1185                 VpeUtils::GetSbMetadataType(buffer, type);
1186                 if (MetadataNdkTypeMap.find(type) != MetadataNdkTypeMap.end()) {
1187                     metadataValue->type = MetadataNdkTypeMap[type];
1188                     return true;
1189                 }
1190             }
1191             break;
1192         case OH_Pixelmap_HdrMetadataKey::HDR_STATIC_METADATA:
1193             return GetStaticMetadata(buffer, metadataValue);
1194             break;
1195         case OH_Pixelmap_HdrMetadataKey::HDR_DYNAMIC_METADATA:
1196             {
1197                 std::vector<uint8_t> dynamicData;
1198                 if (VpeUtils::GetSbDynamicMetadata(buffer, dynamicData) && (dynamicData.size() > 0)) {
1199                     metadataValue->dynamicMetadata.data = (uint8_t*)malloc(dynamicData.size());
1200                     if (metadataValue->dynamicMetadata.data == nullptr || memcpy_s(metadataValue->dynamicMetadata.data,
1201                         dynamicData.size(), dynamicData.data(), dynamicData.size()) != EOK) {
1202                         return false;
1203                     }
1204                     metadataValue->dynamicMetadata.length = dynamicData.size();
1205                     return true;
1206                 }
1207             }
1208             break;
1209         case OH_Pixelmap_HdrMetadataKey::HDR_GAINMAP_METADATA:
1210             {
1211                 std::vector<uint8_t> gainmapData;
1212                 if (VpeUtils::GetSbDynamicMetadata(buffer, gainmapData) &&
1213                     (gainmapData.size() == sizeof(HDRVividExtendMetadata))) {
1214                     OH_Pixelmap_HdrGainmapMetadata &dst = metadataValue->gainmapMetadata;
1215                     HDRVividExtendMetadata &src = *(reinterpret_cast<HDRVividExtendMetadata*>(gainmapData.data()));
1216                     ConvertToOHGainmapMetadata(src, dst);
1217                     return true;
1218                 }
1219             }
1220             break;
1221         default:
1222             break;
1223     }
1224 
1225     return false;
1226 }
1227 
1228 MIDK_EXPORT
OH_PixelmapNative_GetMetadata(OH_PixelmapNative * pixelmap,OH_Pixelmap_HdrMetadataKey key,OH_Pixelmap_HdrMetadataValue ** value)1229 Image_ErrorCode OH_PixelmapNative_GetMetadata(OH_PixelmapNative *pixelmap, OH_Pixelmap_HdrMetadataKey key,
1230     OH_Pixelmap_HdrMetadataValue **value)
1231 {
1232     if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr || value == nullptr || *value == nullptr) {
1233         return IMAGE_BAD_PARAMETER;
1234     }
1235 
1236     if (pixelmap->GetInnerPixelmap()->GetAllocatorType() != AllocatorType::DMA_ALLOC) {
1237         return IMAGE_DMA_NOT_EXIST;
1238     }
1239 
1240     OHOS::sptr<OHOS::SurfaceBuffer> sourceSurfaceBuffer(
1241         reinterpret_cast<OHOS::SurfaceBuffer*>(pixelmap->GetInnerPixelmap()->GetFd()));
1242     if (!GetHdrMetadata(sourceSurfaceBuffer, key, *value)) {
1243         return IMAGE_COPY_FAILED;
1244     }
1245     return IMAGE_SUCCESS;
1246 }
1247 
1248 MIDK_EXPORT
OH_PixelmapNative_GetNativeBuffer(OH_PixelmapNative * pixelmap,OH_NativeBuffer ** nativeBuffer)1249 Image_ErrorCode OH_PixelmapNative_GetNativeBuffer(OH_PixelmapNative *pixelmap, OH_NativeBuffer **nativeBuffer)
1250 {
1251     if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr || nativeBuffer == nullptr) {
1252         return IMAGE_BAD_PARAMETER;
1253     }
1254 
1255     if (pixelmap->GetInnerPixelmap()->GetAllocatorType() != AllocatorType::DMA_ALLOC) {
1256         return IMAGE_DMA_NOT_EXIST;
1257     }
1258 
1259     OHOS::SurfaceBuffer *buffer = reinterpret_cast<OHOS::SurfaceBuffer*>(pixelmap->GetInnerPixelmap()->GetFd());
1260     if (buffer == nullptr) {
1261         return IMAGE_BAD_PARAMETER;
1262     }
1263     *nativeBuffer = buffer->SurfaceBufferToNativeBuffer();
1264     int32_t err = OH_NativeBuffer_Reference(*nativeBuffer);
1265     if (err != OHOS::SURFACE_ERROR_OK) {
1266         return IMAGE_DMA_OPERATION_FAILED;
1267     }
1268     return IMAGE_SUCCESS;
1269 }
1270 
1271 MIDK_EXPORT
OH_PixelmapNative_GetColorSpaceNative(OH_PixelmapNative * pixelmap,OH_NativeColorSpaceManager ** colorSpaceNative)1272 Image_ErrorCode OH_PixelmapNative_GetColorSpaceNative(OH_PixelmapNative *pixelmap,
1273     OH_NativeColorSpaceManager **colorSpaceNative)
1274 {
1275     if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr || colorSpaceNative == nullptr) {
1276         return IMAGE_BAD_PARAMETER;
1277     }
1278 
1279     if (pixelmap->GetInnerPixelmap()->InnerGetGrColorSpacePtr() == nullptr) {
1280         return IMAGE_BAD_PARAMETER;
1281     }
1282 
1283     std::shared_ptr<OHOS::ColorManager::ColorSpace> colorSpace =
1284         pixelmap->GetInnerPixelmap()->InnerGetGrColorSpacePtr();
1285     NativeColorSpaceManager* nativeColorspace = new NativeColorSpaceManager(*(colorSpace.get()));
1286 
1287     *colorSpaceNative = reinterpret_cast<OH_NativeColorSpaceManager*>(nativeColorspace);
1288     return IMAGE_SUCCESS;
1289 }
1290 
1291 MIDK_EXPORT
OH_PixelmapNative_SetColorSpaceNative(OH_PixelmapNative * pixelmap,OH_NativeColorSpaceManager * colorSpaceNative)1292 Image_ErrorCode OH_PixelmapNative_SetColorSpaceNative(OH_PixelmapNative *pixelmap,
1293     OH_NativeColorSpaceManager *colorSpaceNative)
1294 {
1295     if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr || colorSpaceNative == nullptr) {
1296         return IMAGE_BAD_PARAMETER;
1297     }
1298 
1299     ColorManager::ColorSpace nativeColorspace =
1300         reinterpret_cast<NativeColorSpaceManager*>(colorSpaceNative)->GetInnerColorSpace();
1301 
1302     pixelmap->GetInnerPixelmap()->InnerSetColorSpace(nativeColorspace, true);
1303     return IMAGE_SUCCESS;
1304 }
1305 
1306 MIDK_EXPORT
OH_PixelmapNative_SetMemoryName(OH_PixelmapNative * pixelmap,char * name,size_t * size)1307 Image_ErrorCode OH_PixelmapNative_SetMemoryName(OH_PixelmapNative *pixelmap, char *name, size_t *size)
1308 {
1309     if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr || name == nullptr || size == nullptr) {
1310         return IMAGE_BAD_PARAMETER;
1311     }
1312     uint32_t ret = pixelmap->GetInnerPixelmap()->SetMemoryName(std::string(name, *size));
1313     if (ret == SUCCESS) {
1314         return IMAGE_SUCCESS;
1315     } else if (ret == COMMON_ERR_INVALID_PARAMETER) {
1316         return IMAGE_BAD_PARAMETER;
1317     } else if (ret == ERR_MEMORY_NOT_SUPPORT) {
1318         return IMAGE_UNSUPPORTED_MEMORY_FORMAT;
1319     }
1320     return IMAGE_SUCCESS;
1321 }
1322 
1323 MIDK_EXPORT
OH_PixelmapNative_GetByteCount(OH_PixelmapNative * pixelmap,uint32_t * byteCount)1324 Image_ErrorCode OH_PixelmapNative_GetByteCount(OH_PixelmapNative *pixelmap, uint32_t *byteCount)
1325 {
1326     if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr || byteCount == nullptr) {
1327         return IMAGE_BAD_PARAMETER;
1328     }
1329     int32_t rawByteCount = pixelmap->GetInnerPixelmap()->GetByteCount();
1330     if (rawByteCount <= 0) {
1331         return IMAGE_BAD_PARAMETER;
1332     }
1333     *byteCount = static_cast<uint32_t>(rawByteCount);
1334     return IMAGE_SUCCESS;
1335 }
1336 
1337 MIDK_EXPORT
OH_PixelmapNative_GetAllocationByteCount(OH_PixelmapNative * pixelmap,uint32_t * allocationByteCount)1338 Image_ErrorCode OH_PixelmapNative_GetAllocationByteCount(OH_PixelmapNative *pixelmap, uint32_t *allocationByteCount)
1339 {
1340     if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr || allocationByteCount == nullptr) {
1341         return IMAGE_BAD_PARAMETER;
1342     }
1343     uint32_t rawByteCount = pixelmap->GetInnerPixelmap()->GetAllocationByteCount();
1344     if (rawByteCount == 0) {
1345         return IMAGE_BAD_PARAMETER;
1346     }
1347     *allocationByteCount = rawByteCount;
1348     return IMAGE_SUCCESS;
1349 }
1350 
1351 MIDK_EXPORT
OH_PixelmapNative_AccessPixels(OH_PixelmapNative * pixelmap,void ** addr)1352 Image_ErrorCode OH_PixelmapNative_AccessPixels(OH_PixelmapNative *pixelmap, void **addr)
1353 {
1354     if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr || addr == nullptr) {
1355         return IMAGE_BAD_PARAMETER;
1356     }
1357     pixelmap->GetInnerPixelmap()->SetModifiable(false);
1358     *addr = pixelmap->GetInnerPixelmap()->GetWritablePixels();
1359     return IMAGE_SUCCESS;
1360 }
1361 
1362 MIDK_EXPORT
OH_PixelmapNative_UnaccessPixels(OH_PixelmapNative * pixelmap)1363 Image_ErrorCode OH_PixelmapNative_UnaccessPixels(OH_PixelmapNative *pixelmap)
1364 {
1365     if (pixelmap == nullptr || pixelmap->GetInnerPixelmap() == nullptr) {
1366         return IMAGE_BAD_PARAMETER;
1367     }
1368     pixelmap->GetInnerPixelmap()->SetModifiable(true);
1369     return IMAGE_SUCCESS;
1370 }
1371 
1372 #ifdef __cplusplus
1373 };
1374 #endif