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