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